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+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorVGhpcyBkcml2ZXIgcHJvdmlkZXMgZ2x1ZSBjb2RlIGNvbm5lY3RpbmcgYSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQCit0ZW1wZXJhdHVyZSBzZW5zb3IgZXZhbHVhdGlvbiBib2FyZCB0byB0aGUga2VybmVsJ3MgU1BJIGNvcmUgc3Vic3lzdGVtLgorCitJbiBlZmZlY3QsIHRoaXMgZHJpdmVyIHR1cm5zIHRoZSBwYXJhbGxlbCBwb3J0IGludGVyZmFjZSBvbiB0aGUgZXZhbCBib2FyZAoraW50byBhIFNQSSBidXMgd2l0aCBhIHNpbmdsZSBkZXZpY2UsIHdoaWNoIHdpbGwgYmUgZHJpdmVuIGJ5IHRoZSBnZW5lcmljCitMTTcwIGRyaXZlciAoZHJpdmVycy9od21vbi9sbTcwLmMpLgorCitUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKKworICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCisgICAtLS0tLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRDAgICAgIDIgICAgICAtICAgICAgICAgLQorICAgICAgRDEgICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDIgICAgIDQgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDMgICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDQgICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDUgICAgIDcgICAgIC0tPiAgICAgIG5DUyAgOAorICAgICAgRDYgICAgIDggICAgIC0tPiAgICAgIFNDTEsgMworICAgICAgRDcgICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICAgICBHTkQgICAgMjUgICAgICAtICAgICAgIEdORCAgNworICAgIFNlbGVjdCAgMTMgICAgIDwtLSAgICAgIFNJL08gMQorICAgLS0tLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHNpbmNlIHRoZSBMTTcwIHVzZXMgYSAiMy13aXJlIiB2YXJpYW50IG9mIFNQSSwgdGhlIFNJL1NPIHBpbgoraXMgY29ubmVjdGVkIHRvIGJvdGggcGluIEQ3IChhcyBNYXN0ZXIgT3V0KSBhbmQgU2VsZWN0IChhcyBNYXN0ZXIgSW4pCit1c2luZyBhbiBhcnJhbmdtZW50IHRoYXQgbGV0cyBlaXRoZXIgdGhlIHBhcnBvcnQgb3IgdGhlIExNNzAgcHVsbCB0aGUKK3BpbiBsb3cuICBUaGlzIGNhbid0IGJlIHNoYXJlZCB3aXRoIHRydWUgU1BJIGRldmljZXMsIGJ1dCBvdGhlciAzLXdpcmUKK2RldmljZXMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgU0kvU08gcGluLgorCitUaGUgYml0YmFuZ2VyIHJvdXRpbmUgaW4gdGhpcyBkcml2ZXIgKGxtNzBfdHhyeCkgaXMgY2FsbGVkIGJhY2sgZnJvbQordGhlIGJvdW5kICJod21vbi9sbTcwIiBwcm90b2NvbCBkcml2ZXIgdGhyb3VnaCBpdHMgc3lzZnMgaG9vaywgdXNpbmcgYQorc3BpX3dyaXRlX3RoZW5fcmVhZCgpIGNhbGwuICBJdCBwZXJmb3JtcyBNb2RlIDAgKFNQSS9NaWNyb3dpcmUpIGJpdGJhbmdpbmcuCitUaGUgbG03MCBkcml2ZXIgdGhlbiBpbnRlcHJldHMgdGhlIHJlc3VsdGluZyBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlCithbmQgZXhwb3J0cyBpdCB0aHJvdWdoIHN5c2ZzLgorCitBICJnb3RjaGEiOiBOYXRpb25hbCBTZW1pY29uZHVjdG9yJ3MgTE03MCBMTFAgZXZhbCBib2FyZCBjaXJjdWl0IHNjaGVtYXRpYworc2hvd3MgdGhhdCB0aGUgU0kvTyBsaW5lIGZyb20gdGhlIExNNzAgY2hpcCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJhc2Ugb2YgYQordHJhbnNpc3RvciBRMSAoYW5kIGFsc28gYSBwdWxsdXAsIGFuZCBhIHplbmVyIGRpb2RlIHRvIEQ3KTsgd2hpbGUgdGhlCitjb2xsZWN0b3IgaXMgdGllZCB0byBWQ0MuCisKK0ludGVycHJldGluZyB0aGlzIGNpcmN1aXQsIHdoZW4gdGhlIExNNzAgU0kvTyBsaW5lIGlzIEhpZ2ggKG9yIHRyaXN0YXRlCithbmQgbm90IGdyb3VuZGVkIGJ5IHRoZSBob3N0IHZpYSBENyksIHRoZSB0cmFuc2lzdG9yIGNvbmR1Y3RzIGFuZCBzd2l0Y2hlcwordGhlIGNvbGxlY3RvciB0byB6ZXJvLCB3aGljaCBpcyByZWZsZWN0ZWQgb24gcGluIDEzIG9mIHRoZSBEQjI1IHBhcnBvcnQKK2Nvbm5lY3Rvci4gIFdoZW4gU0kvTyBpcyBMb3cgKGRyaXZlbiBieSB0aGUgTE03MCBvciB0aGUgaG9zdCkgb24gdGhlIG90aGVyCitoYW5kLCB0aGUgdHJhbnNpc3RvciBpcyBjdXQgb2ZmIGFuZCB0aGUgdm9sdGFnZSB0aWVkIHRvIGl0J3MgY29sbGVjdG9yIGlzCityZWZsZWN0ZWQgb24gcGluIDEzIGFzIGEgSGlnaCBsZXZlbC4KKworU286IHRoZSBnZXRtaXNvIGlubGluZSByb3V0aW5lIGluIHRoaXMgZHJpdmVyIHRha2VzIHRoaXMgZmFjdCBpbnRvIGFjY291bnQsCitpbnZlcnRpbmcgdGhlIHZhbHVlIHJlYWQgYXQgcGluIDEzLgorCisKK1RoYW5rcyB0bworLS0tLS0tLS0tCitvIERhdmlkIEJyb3duZWxsIGZvciBtZW50b3JpbmcgdGhlIFNQSS1zaWRlIGRyaXZlciBkZXZlbG9wbWVudC4KK28gRHIuQ3JhaWcgSG9sbGFiYXVnaCBmb3IgdGhlIChlYXJseSkgIm1hbnVhbCIgYml0YmFuZ2luZyBkcml2ZXIgdmVyc2lvbi4KK28gTmFkaXIgQmlsbGltb3JpYSBmb3IgaGVscCBpbnRlcnByZXRpbmcgdGhlIGNpcmN1aXQgc2NoZW1hdGljLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IGE2NjFkNjguLjQ3MWU3NTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEsNyArMSwxMiBAQAotVVBEQVRFIE1hcmNoIDIxIDIwMDUgQW1pdCBHdWQgPGd1ZEBldGgubmV0PgorU1BJTl9MT0NLX1VOTE9DS0VEIGFuZCBSV19MT0NLX1VOTE9DS0VEIGRlZmVhdCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nIGFuZAorYXJlIGhlbmNlIGRlcHJlY2F0ZWQuCiAKLU1hY3JvcyBTUElOX0xPQ0tfVU5MT0NLRUQgYW5kIFJXX0xPQ0tfVU5MT0NLRUQgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUKLXJlbW92ZWQgc29vbi4gU28gZm9yIGFueSBuZXcgY29kZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSB1c2VkOgorUGxlYXNlIHVzZSBERUZJTkVfU1BJTkxPQ0soKS9ERUZJTkVfUldMT0NLKCkgb3IKK19fU1BJTl9MT0NLX1VOTE9DS0VEKCkvX19SV19MT0NLX1VOTE9DS0VEKCkgYXMgYXBwcm9wcmlhdGUgZm9yIHN0YXRpYworaW5pdGlhbGl6YXRpb24uCisKK0R5bmFtaWMgaW5pdGlhbGl6YXRpb24sIHdoZW4gbmVjZXNzYXJ5LCBtYXkgYmUgcGVyZm9ybWVkIGFzCitkZW1vbnN0cmF0ZWQgYmVsb3cuCiAKICAgIHNwaW5sb2NrX3QgeHh4X2xvY2s7CiAgICByd2xvY2tfdCB4eHhfcndfbG9jazsKQEAgLTE1LDEyICsyMCw5IEBACiAKICAgIG1vZHVsZV9pbml0KHh4eF9pbml0KTsKIAotUmVhc29ucyBmb3IgZGVwcmVjYXRpb24KLSAgLSBpdCBodXJ0cyBhdXRvbWF0aWMgbG9jayB2YWxpZGF0b3JzCi0gIC0gaXQgYmVjb21lcyBpbnRydXNpdmUgZm9yIHRoZSByZWFsdGltZSBwcmVlbXB0aW9uIHBhdGNoZXMKLQotRm9sbG93aW5nIGRpc2N1c3Npb24gaXMgc3RpbGwgdmFsaWQsIGhvd2V2ZXIsIHdpdGggdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24KLW9mIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIHN0YXRpYy4KK1RoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiBpcyBzdGlsbCB2YWxpZCwgaG93ZXZlciwgd2l0aCB0aGUgZHluYW1pYworaW5pdGlhbGl6YXRpb24gb2Ygc3BpbmxvY2tzIG9yIHdpdGggREVGSU5FX1NQSU5MT0NLLCBldGMuLCB1c2VkCitpbnN0ZWFkIG9mIFNQSU5fTE9DS19VTkxPQ0tFRC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDAzYThlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworRXhjZXB0IGZvciBhIGZldyBleHRyZW1lbHkgcmFyZSBleGNlcHRpb25zIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGRvIG5vdCB1c2UKK3RoZSBiaW5hcnkgc3lzY3RsIGludGVyZmFjZS4gIEluc3RlYWQgZXZlcnlvbmUgdXNlcyAvcHJvYy9zeXMvLi4uICB3aXRoCityZWFkYWJsZSBhc2NpaSBuYW1lcy4KKworUmVjZW50bHkgdGhlIGtlcm5lbCBoYXMgc3RhcnRlZCBzdXBwb3J0aW5nIHNldHRpbmcgdGhlIGJpbmFyeSBzeXNjdGwgdmFsdWUgdG8KK0NUTF9VTk5VTUJFUkVEIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIGFzc2lnbiBhIGJpbmFyeSBzeXNjdGwgcGF0aCB0byBhbGxvdworc3lzY3RscyB0byBzaG93IHVwIGluIC9wcm9jL3N5cy4KKworQXNzaWduaW5nIGJpbmFyeSBzeXNjdGwgbnVtYmVycyBpcyBhbiBlbmRsZXNzIHNvdXJjZSBvZiBjb25mbGljdHMgaW4gc3lzY3RsLmgsCiticmVha2luZyBvZiB0aGUgdXNlciBzcGFjZSBBQkkgKGJlY2F1c2Ugb2YgdGhvc2UgY29uZmxpY3RzKSwgYW5kIG1haW50ZW5hbmNlCitwcm9ibGVtcy4gIEEgY29tcGxldGUgcGFzcyB0aHJvdWdoIGFsbCBvZiB0aGUgc3lzY3RsIHVzZXJzIHJldmVhbGVkIG11bHRpcGxlCitpbnN0YW5jZXMgd2hlcmUgdGhlIHN5c2N0bCBiaW5hcnkgaW50ZXJmYWNlIHdhcyBicm9rZW4gYW5kIGhhZCBnb25lIHVuZGV0ZWN0ZWQKK2ZvciB5ZWFycy4KKworU28gcGxlYXNlIGRvIG5vdCBhZGQgbmV3IGJpbmFyeSBzeXNjdGwgbnVtYmVycy4gIFRoZXkgYXJlIHVubmVlZGVkIGFuZAorcHJvYmxlbWF0aWMuCisKK0lmIHlvdSByZWFsbHkgbmVlZCBhIG5ldyBiaW5hcnkgc3lzY3RsIG51bWJlciBwbGVhc2UgZmlyc3QgbWVyZ2UgeW91ciBzeXNjdGwKK2ludG8gdGhlIGtlcm5lbCBhbmQgdGhlbiBhcyBhIHNlcGFyYXRlIHBhdGNoIGFsbG9jYXRlIGEgYmluYXJ5IHN5c2N0bCBudW1iZXIuCisKKyhlYmllZGVybUB4bWlzc2lvbi5jb20sIEp1bmUgMjAwNykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCA4Y2ZjYTE3Li5hMGNjYzViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0zMiwxMiArMzIsMTQgQEAKIC0gbWluX3NsYWJfcmF0aW8KIC0gcGFuaWNfb25fb29tCiAtIG1tYXBfbWluX2FkZHJlc3MKKy0gbnVtYV96b25lbGlzdF9vcmRlcgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBkaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKIGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MsIHZmc19jYWNoZV9wcmVzc3VyZSwgbGFwdG9wX21vZGUsCi1ibG9ja19kdW1wLCBzd2FwX3Rva2VuX3RpbWVvdXQsIGRyb3AtY2FjaGVzOgorYmxvY2tfZHVtcCwgc3dhcF90b2tlbl90aW1lb3V0LCBkcm9wLWNhY2hlcywKK2h1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOgogCiBTZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAogCkBAIC0yMzEsMyArMjMzLDQ3IEBACiB2YXN0IG1ham9yaXR5IG9mIGFwcGxpY2F0aW9ucyB0byB3b3JrIGNvcnJlY3RseSBhbmQgcHJvdmlkZSBkZWZlbnNlIGluIGRlcHRoCiBhZ2FpbnN0IGZ1dHVyZSBwb3RlbnRpYWwga2VybmVsIGJ1Z3MuCiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK251bWFfem9uZWxpc3Rfb3JkZXIKKworVGhpcyBzeXNjdGwgaXMgb25seSBmb3IgTlVNQS4KKyd3aGVyZSB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBmcm9tJyBpcyBjb250cm9sbGVkIGJ5IHpvbmVsaXN0cy4KKyhUaGlzIGRvY3VtZW50YXRpb24gaWdub3JlcyBaT05FX0hJR0hNRU0vWk9ORV9ETUEzMiBmb3Igc2ltcGxlIGV4cGxhbmF0aW9uLgorIHlvdSBtYXkgYmUgYWJsZSB0byByZWFkIFpPTkVfRE1BIGFzIFpPTkVfRE1BMzIuLi4pCisKK0luIG5vbi1OVU1BIGNhc2UsIGEgem9uZWxpc3QgZm9yIEdGUF9LRVJORUwgaXMgb3JkZXJlZCBhcyBmb2xsb3dpbmcuCitaT05FX05PUk1BTCAtPiBaT05FX0RNQQorVGhpcyBtZWFucyB0aGF0IGEgbWVtb3J5IGFsbG9jYXRpb24gcmVxdWVzdCBmb3IgR0ZQX0tFUk5FTCB3aWxsCitnZXQgbWVtb3J5IGZyb20gWk9ORV9ETUEgb25seSB3aGVuIFpPTkVfTk9STUFMIGlzIG5vdCBhdmFpbGFibGUuCisKK0luIE5VTUEgY2FzZSwgeW91IGNhbiB0aGluayBvZiBmb2xsb3dpbmcgMiB0eXBlcyBvZiBvcmRlci4KK0Fzc3VtZSAyIG5vZGUgTlVNQSBhbmQgYmVsb3cgaXMgem9uZWxpc3Qgb2YgTm9kZSgwKSdzIEdGUF9LRVJORUwKKworKEEpIE5vZGUoMCkgWk9ORV9OT1JNQUwgLT4gTm9kZSgwKSBaT05FX0RNQSAtPiBOb2RlKDEpIFpPTkVfTk9STUFMCisoQikgTm9kZSgwKSBaT05FX05PUk1BTCAtPiBOb2RlKDEpIFpPTkVfTk9STUFMIC0+IE5vZGUoMCkgWk9ORV9ETUEuCisKK1R5cGUoQSkgb2ZmZXJzIHRoZSBiZXN0IGxvY2FsaXR5IGZvciBwcm9jZXNzZXMgb24gTm9kZSgwKSwgYnV0IFpPTkVfRE1BCit3aWxsIGJlIHVzZWQgYmVmb3JlIFpPTkVfTk9STUFMIGV4aGF1c3Rpb24uIFRoaXMgaW5jcmVhc2VzIHBvc3NpYmlsaXR5IG9mCitvdXQtb2YtbWVtb3J5KE9PTSkgb2YgWk9ORV9ETUEgYmVjYXVzZSBaT05FX0RNQSBpcyB0ZW5kIHRvIGJlIHNtYWxsLgorCitUeXBlKEIpIGNhbm5vdCBvZmZlciB0aGUgYmVzdCBsb2NhbGl0eSBidXQgaXMgbW9yZSByb2J1c3QgYWdhaW5zdCBPT00gb2YKK3RoZSBETUEgem9uZS4KKworVHlwZShBKSBpcyBjYWxsZWQgYXMgIk5vZGUiIG9yZGVyLiBUeXBlIChCKSBpcyAiWm9uZSIgb3JkZXIuCisKKyJOb2RlIG9yZGVyIiBvcmRlcnMgdGhlIHpvbmVsaXN0cyBieSBub2RlLCB0aGVuIGJ5IHpvbmUgd2l0aGluIGVhY2ggbm9kZS4KK1NwZWNpZnkgIltObl1vZGUiIGZvciB6b25lIG9yZGVyCisKKyJab25lIE9yZGVyIiBvcmRlcnMgdGhlIHpvbmVsaXN0cyBieSB6b25lIHR5cGUsIHRoZW4gYnkgbm9kZSB3aXRoaW4gZWFjaAorem9uZS4gIFNwZWNpZnkgIltael1vbmUiZm9yIHpvZGUgb3JkZXIuCisKK1NwZWNpZnkgIltEZF1lZmF1bHQiIHRvIHJlcXVlc3QgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uICBBdXRvY29uZmlndXJhdGlvbgord2lsbCBzZWxlY3QgIm5vZGUiIG9yZGVyIGluIGZvbGxvd2luZyBjYXNlLgorKDEpIGlmIHRoZSBETUEgem9uZSBkb2VzIG5vdCBleGlzdCBvcgorKDIpIGlmIHRoZSBETUEgem9uZSBjb21wcmlzZXMgZ3JlYXRlciB0aGFuIDUwJSBvZiB0aGUgYXZhaWxhYmxlIG1lbW9yeSBvcgorKDMpIGlmIGFueSBub2RlJ3MgRE1BIHpvbmUgY29tcHJpc2VzIGdyZWF0ZXIgdGhhbiA2MCUgb2YgaXRzIGxvY2FsIG1lbW9yeSBhbmQKKyAgICB0aGUgYW1vdW50IG9mIGxvY2FsIG1lbW9yeSBpcyBiaWcgZW5vdWdoLgorCitPdGhlcndpc2UsICJ6b25lIiBvcmRlciB3aWxsIGJlIHNlbGVjdGVkLiBEZWZhdWx0IG9yZGVyIGlzIHJlY29tbWVuZGVkIHVubGVzcwordGhpcyBpcyBjYXVzaW5nIHByb2JsZW1zIGZvciB5b3VyIHN5c3RlbS9hcHBsaWNhdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vaHVnZXRsYnBhZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKaW5kZXggNjg3MTA0Yi4uNTFjY2M0OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKQEAgLTc3LDggKzc3LDkgQEAKIGNhbGwsIHRoZW4gaXQgaXMgcmVxdWlyZWQgdGhhdCBzeXN0ZW0gYWRtaW5pc3RyYXRvciBtb3VudCBhIGZpbGUgc3lzdGVtIG9mCiB0eXBlIGh1Z2V0bGJmczoKIAotCW1vdW50IG5vbmUgL21udC9odWdlIC10IGh1Z2V0bGJmcyA8dWlkPXZhbHVlPiA8Z2lkPXZhbHVlPiA8bW9kZT12YWx1ZT4KLQkJIDxzaXplPXZhbHVlPiA8bnJfaW5vZGVzPXZhbHVlPgorICBtb3VudCAtdCBodWdldGxiZnMgXAorCS1vIHVpZD08dmFsdWU+LGdpZD08dmFsdWU+LG1vZGU9PHZhbHVlPixzaXplPTx2YWx1ZT4sbnJfaW5vZGVzPTx2YWx1ZT4gXAorCW5vbmUgL21udC9odWdlCiAKIFRoaXMgY29tbWFuZCBtb3VudHMgYSAocHNldWRvKSBmaWxlc3lzdGVtIG9mIHR5cGUgaHVnZXRsYmZzIG9uIHRoZSBkaXJlY3RvcnkKIC9tbnQvaHVnZS4gIEFueSBmaWxlcyBjcmVhdGVkIG9uIC9tbnQvaHVnZSB1c2VzIGh1Z2VwYWdlcy4gIFRoZSB1aWQgYW5kIGdpZApAQCAtODgsMTEgKzg5LDEwIEBACiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSAwNzU1IGlzIHBpY2tlZC4gVGhlIHNpemUgb3B0aW9uIHNldHMgdGhlIG1heGltdW0gdmFsdWUgb2YKIG1lbW9yeSAoaHVnZSBwYWdlcykgYWxsb3dlZCBmb3IgdGhhdCBmaWxlc3lzdGVtICgvbW50L2h1Z2UpLiBUaGUgc2l6ZSBpcwogcm91bmRlZCBkb3duIHRvIEhQQUdFX1NJWkUuICBUaGUgb3B0aW9uIG5yX2lub2RlcyBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotaW5vZGVzIHRoYXQgL21udC9odWdlIGNhbiB1c2UuICBJZiB0aGUgc2l6ZSBvciBucl9pbm9kZXMgb3B0aW9ucyBhcmUgbm90Citpbm9kZXMgdGhhdCAvbW50L2h1Z2UgY2FuIHVzZS4gIElmIHRoZSBzaXplIG9yIG5yX2lub2RlcyBvcHRpb24gaXMgbm90CiBwcm92aWRlZCBvbiBjb21tYW5kIGxpbmUgdGhlbiBubyBsaW1pdHMgYXJlIHNldC4gIEZvciBzaXplIGFuZCBucl9pbm9kZXMKIG9wdGlvbnMsIHlvdSBjYW4gdXNlIFtHfGddL1tNfG1dL1tLfGtdIHRvIHJlcHJlc2VudCBnaWdhL21lZ2Eva2lsby4gRm9yCi1leGFtcGxlLCBzaXplPTJLIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHNpemU9MjA0OC4gQW4gZXhhbXBsZSBpcyBnaXZlbiBhdAotdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50LgorZXhhbXBsZSwgc2l6ZT0ySyBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBzaXplPTIwNDguCiAKIHJlYWQgYW5kIHdyaXRlIHN5c3RlbSBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBvbiBmaWxlcyB0aGF0IHJlc2lkZSBvbiBodWdldGxiCiBmaWxlIHN5c3RlbXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0IGIvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dAppbmRleCAxNTIzMzIwLi5kMTdmMzI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQKQEAgLTQxLDYgKzQxLDggQEAKIAlQCQlQb2lzb25pbmcgKG9iamVjdCBhbmQgcGFkZGluZykKIAlVCQlVc2VyIHRyYWNraW5nIChmcmVlIGFuZCBhbGxvYykKIAlUCQlUcmFjZSAocGxlYXNlIG9ubHkgdXNlIG9uIHNpbmdsZSBzbGFicykKKwktCQlTd2l0Y2ggYWxsIGRlYnVnZ2luZyBvZmYgKHVzZWZ1bCBpZiB0aGUga2VybmVsIGlzCisJCQljb25maWd1cmVkIHdpdGggQ09ORklHX1NMVUJfREVCVUdfT04pCiAKIEYuZS4gaW4gb3JkZXIgdG8gYm9vdCBqdXN0IHdpdGggc2FuaXR5IGNoZWNrcyBhbmQgcmVkIHpvbmluZyBvbmUgd291bGQgc3BlY2lmeToKIApAQCAtMTI1LDEzICsxMjcsMjAgQEAKIAogSGVyZSBpcyBhIHNhbXBsZSBvZiBzbHViIGRlYnVnIG91dHB1dDoKIAotKioqIFNMVUIga21hbGxvYy04OiBSZWR6b25lIEFjdGl2ZUAweGM5MGY2ZDIwIHNsYWIgMHhjNTI4YzUzMCBvZmZzZXQ9MzM2MCBmbGFncz0weDQwMDAwMGMzIGludXNlPTYxIGZyZWVsaXN0PTB4YzkwZjZkNTgKLSAgQnl0ZXMgYjQgMHhjOTBmNmQxMDogIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhIC4uLi4uLi4uWlpaWlpaWloKLSAgICBPYmplY3QgMHhjOTBmNmQyMDogIDMxIDMwIDMxIDM5IDJlIDMwIDMwIDM1ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTkuMDA1Ci0gICBSZWR6b25lIDB4YzkwZjZkMjg6ICAwMCBjYyBjYyBjYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi1GcmVlUG9pbnRlciAweGM5MGY2ZDJjIC0+IDB4YzkwZjZkNTgKLUxhc3QgYWxsb2M6IGdldF9tb2RhbGlhcysweDYxLzB4ZjUgamlmZmllc19hZ289NTMgY3B1PTEgcGlkPTU1NAotRmlsbGVyIDB4YzkwZjZkNTA6ICA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICBaWlpaWlpaWgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JVRyBrbWFsbG9jLTg6IFJlZHpvbmUgb3ZlcndyaXR0ZW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lORk86IDB4YzkwZjZkMjgtMHhjOTBmNmQyYi4gRmlyc3QgYnl0ZSAweDAwIGluc3RlYWQgb2YgMHhjYworSU5GTzogU2xhYiAweGM1MjhjNTMwIGZsYWdzPTB4NDAwMDAwYzMgaW51c2U9NjEgZnA9MHhjOTBmNmQ1OAorSU5GTzogT2JqZWN0IDB4YzkwZjZkMjAgQG9mZnNldD0zMzYwIGZwPTB4YzkwZjZkNTgKK0lORk86IEFsbG9jYXRlZCBpbiBnZXRfbW9kYWxpYXMrMHg2MS8weGY1IGFnZT01MyBjcHU9MSBwaWQ9NTU0CisKK0J5dGVzIGI0IDB4YzkwZjZkMTA6ICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAuLi4uLi4uLlpaWlpaWlpaCisgIE9iamVjdCAweGM5MGY2ZDIwOiAgMzEgMzAgMzEgMzkgMmUgMzAgMzAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgMTAxOS4wMDUKKyBSZWR6b25lIDB4YzkwZjZkMjg6ICAwMCBjYyBjYyBjYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgUGFkZGluZyAweGM5MGY2ZDUwOiAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgICAgICAgICAgICAgICAgICAgICAgICAgWlpaWlpaWloKKwogICBbPGMwMTA1MjNkPl0gZHVtcF90cmFjZSsweDYzLzB4MWViCiAgIFs8YzAxMDUzZGY+XSBzaG93X3RyYWNlX2xvZ19sdmwrMHgxYS8weDJmCiAgIFs8YzAxMDYwMWQ+XSBzaG93X3RyYWNlKzB4MTIvMHgxNApAQCAtMTUzLDc0ICsxNjIsMTA4IEBACiAgIFs8YzAxMDQxMTI+XSBzeXNlbnRlcl9wYXN0X2VzcCsweDVmLzB4OTkKICAgWzxiN2Y3YjQxMD5dIDB4YjdmN2I0MTAKICAgPT09PT09PT09PT09PT09PT09PT09PT0KLUBAQCBTTFVCIGttYWxsb2MtODogUmVzdG9yaW5nIHJlZHpvbmUgKDB4Y2MpIGZyb20gMHhjOTBmNmQyOC0weGM5MGY2ZDJiCiAKK0ZJWCBrbWFsbG9jLTg6IFJlc3RvcmluZyBSZWR6b25lIDB4YzkwZjZkMjgtMHhjOTBmNmQyYj0weGNjCiAKK0lmIFNMVUIgZW5jb3VudGVycyBhIGNvcnJ1cHRlZCBvYmplY3QgKGZ1bGwgZGV0ZWN0aW9uIHJlcXVpcmVzIHRoZSBrZXJuZWwKK3RvIGJlIGJvb3RlZCB3aXRoIHNsdWJfZGVidWcpIHRoZW4gdGhlIGZvbGxvd2luZyBvdXRwdXQgd2lsbCBiZSBkdW1wZWQKK2ludG8gdGhlIHN5c2xvZzoKIAotSWYgU0xVQiBlbmNvdW50ZXJzIGEgY29ycnVwdGVkIG9iamVjdCB0aGVuIGl0IHdpbGwgcGVyZm9ybSB0aGUgZm9sbG93aW5nCi1hY3Rpb25zOgotCi0xLiBJc29sYXRpb24gYW5kIHJlcG9ydCBvZiB0aGUgaXNzdWUKKzEuIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIGVuY291bnRlcmVkCiAKIFRoaXMgd2lsbCBiZSBhIG1lc3NhZ2UgaW4gdGhlIHN5c3RlbSBsb2cgc3RhcnRpbmcgd2l0aAogCi0qKiogU0xVQiA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxXaGF0IHdlbnQgd3Jvbmc+QDxvYmplY3QgYWRkcmVzcz4KLW9mZnNldD08b2Zmc2V0IG9mIG9iamVjdCBpbnRvIHNsYWI+IGZsYWdzPTxzbGFiZmxhZ3M+Ci1pbnVzZT08b2JqZWN0cyBpbiB1c2UgaW4gdGhpcyBzbGFiPiBmcmVlbGlzdD08Zmlyc3QgZnJlZSBvYmplY3QgaW4gc2xhYj4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitCVUcgPHNsYWIgY2FjaGUgYWZmZWN0ZWQ+OiA8V2hhdCB3ZW50IHdyb25nPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotMi4gUmVwb3J0IG9uIGhvdyB0aGUgcHJvYmxlbSB3YXMgZGVhbHQgd2l0aCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGNvbnRpbnVlZAotb3BlcmF0aW9uIG9mIHRoZSBzeXN0ZW0uCitJTkZPOiA8Y29ycnVwdGlvbiBzdGFydD4tPGNvcnJ1cHRpb25fZW5kPiA8bW9yZSBpbmZvPgorSU5GTzogU2xhYiA8YWRkcmVzcz4gPHNsYWIgaW5mb3JtYXRpb24+CitJTkZPOiBPYmplY3QgPGFkZHJlc3M+IDxvYmplY3QgaW5mb3JtYXRpb24+CitJTkZPOiBBbGxvY2F0ZWQgaW4gPGtlcm5lbCBmdW5jdGlvbj4gYWdlPTxqaWZmaWVzIHNpbmNlIGFsbG9jPiBjcHU9PGFsbG9jYXRlZCBieQorCWNwdT4gcGlkPTxwaWQgb2YgdGhlIHByb2Nlc3M+CitJTkZPOiBGcmVlZCBpbiA8a2VybmVsIGZ1bmN0aW9uPiBhZ2U9PGppZmZpZXMgc2luY2UgZnJlZT4gY3B1PTxmcmVlZCBieSBjcHU+CisJIHBpZD08cGlkIG9mIHRoZSBwcm9jZXNzPgogCi1UaGVzZSBhcmUgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbSBsb2cgYmVnaW5uaW5nIHdpdGgKKyhPYmplY3QgYWxsb2NhdGlvbiAvIGZyZWUgaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgU0xBQl9TVE9SRV9VU0VSIGlzCitzZXQgZm9yIHRoZSBzbGFiLiBzbHViX2RlYnVnIHNldHMgdGhhdCBvcHRpb24pCiAKLUBAQCBTTFVCIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPGNvcnJlY3RpdmUgYWN0aW9uIHRha2VuPgorMi4gVGhlIG9iamVjdCBjb250ZW50cyBpZiBhbiBvYmplY3Qgd2FzIGludm9sdmVkLgogCi0KLUluIHRoZSBhYm92ZSBzYW1wbGUgU0xVQiBmb3VuZCB0aGF0IHRoZSBSZWR6b25lIG9mIGFuIGFjdGl2ZSBvYmplY3QgaGFzCi1iZWVuIG92ZXJ3cml0dGVuLiBIZXJlIGEgc3RyaW5nIG9mIDggY2hhcmFjdGVycyB3YXMgd3JpdHRlbiBpbnRvIGEgc2xhYiB0aGF0Ci1oYXMgdGhlIGxlbmd0aCBvZiA4IGNoYXJhY3RlcnMuIEhvd2V2ZXIsIGEgOCBjaGFyYWN0ZXIgc3RyaW5nIG5lZWRzIGEKLXRlcm1pbmF0aW5nIDAuIFRoYXQgemVybyBoYXMgb3ZlcndyaXR0ZW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFJlZHpvbmUgZmllbGQuCi1BZnRlciByZXBvcnRpbmcgdGhlIGRldGFpbHMgb2YgdGhlIGlzc3VlIGVuY291bnRlcmVkIHRoZSBAQEAgU0xVQiBtZXNzYWdlCi10ZWxsIHVzIHRoYXQgU0xVQiBoYXMgcmVzdG9yZWQgdGhlIHJlZHpvbmUgdG8gaXRzIHByb3BlciB2YWx1ZSBhbmQgdGhlbgotc3lzdGVtIG9wZXJhdGlvbnMgY29udGludWUuCi0KLVZhcmlvdXMgdHlwZXMgb2YgbGluZXMgY2FuIGZvbGxvdyB0aGUgQEBAIFNMVUIgbGluZToKK1ZhcmlvdXMgdHlwZXMgb2YgbGluZXMgY2FuIGZvbGxvdyB0aGUgQlVHIFNMVUIgbGluZToKIAogQnl0ZXMgYjQgPGFkZHJlc3M+IDogPGJ5dGVzPgotCVNob3cgYSBmZXcgYnl0ZXMgYmVmb3JlIHRoZSBvYmplY3Qgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGRldGVjdGVkLgorCVNob3dzIGEgZmV3IGJ5dGVzIGJlZm9yZSB0aGUgb2JqZWN0IHdoZXJlIHRoZSBwcm9ibGVtIHdhcyBkZXRlY3RlZC4KIAlDYW4gYmUgdXNlZnVsIGlmIHRoZSBjb3JydXB0aW9uIGRvZXMgbm90IHN0b3Agd2l0aCB0aGUgc3RhcnQgb2YgdGhlCiAJb2JqZWN0LgogCiBPYmplY3QgPGFkZHJlc3M+IDogPGJ5dGVzPgogCVRoZSBieXRlcyBvZiB0aGUgb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGlzIGluYWN0aXZlIHRoZW4gdGhlIGJ5dGVzCi0JdHlwaWNhbGx5IGNvbnRhaW4gcG9pc29uaW5nIHZhbHVlcy4gQW55IG5vbi1wb2lzb24gdmFsdWUgc2hvd3MgYQorCXR5cGljYWxseSBjb250YWluIHBvaXNvbiB2YWx1ZXMuIEFueSBub24tcG9pc29uIHZhbHVlIHNob3dzIGEKIAljb3JydXB0aW9uIGJ5IGEgd3JpdGUgYWZ0ZXIgZnJlZS4KIAogUmVkem9uZSA8YWRkcmVzcz4gOiA8Ynl0ZXM+Ci0JVGhlIHJlZHpvbmUgZm9sbG93aW5nIHRoZSBvYmplY3QuIFRoZSByZWR6b25lIGlzIHVzZWQgdG8gZGV0ZWN0CisJVGhlIFJlZHpvbmUgZm9sbG93aW5nIHRoZSBvYmplY3QuIFRoZSBSZWR6b25lIGlzIHVzZWQgdG8gZGV0ZWN0CiAJd3JpdGVzIGFmdGVyIHRoZSBvYmplY3QuIEFsbCBieXRlcyBzaG91bGQgYWx3YXlzIGhhdmUgdGhlIHNhbWUKIAl2YWx1ZS4gSWYgdGhlcmUgaXMgYW55IGRldmlhdGlvbiB0aGVuIGl0IGlzIGR1ZSB0byBhIHdyaXRlIGFmdGVyCiAJdGhlIG9iamVjdCBib3VuZGFyeS4KIAotRnJlZXBvaW50ZXIKLQlUaGUgcG9pbnRlciB0byB0aGUgbmV4dCBmcmVlIG9iamVjdCBpbiB0aGUgc2xhYi4gTWF5IGJlY29tZQotCWNvcnJ1cHRlZCBpZiBvdmVyd3JpdGluZyBjb250aW51ZXMgYWZ0ZXIgdGhlIHJlZCB6b25lLgorCShSZWR6b25lIGluZm9ybWF0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIFNMQUJfUkVEX1pPTkUgaXMgc2V0LgorCXNsdWJfZGVidWcgc2V0cyB0aGF0IG9wdGlvbikKIAotTGFzdCBhbGxvYzoKLUxhc3QgZnJlZToKLQlTaG93cyB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSBvYmplY3Qgd2FzIGFsbG9jYXRlZC9mcmVlZCBsYXN0LgotCVdlIG5vdGUgdGhlIHBpZCwgdGhlIHRpbWUgYW5kIHRoZSBDUFUgdGhhdCBkaWQgc28uIFRoaXMgaXMgdXN1YWxseQotCXRoZSBtb3N0IHVzZWZ1bCBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoZXJlIHRoaW5ncyB3ZW50IHdyb25nLgotCUhlcmUgZ2V0X21vZGFsaWFzKCkgZGlkIGFuIGttYWxsb2MoOCkgaW5zdGVhZCBvZiBhIGttYWxsb2MoOSkuCi0KLUZpbGxlciA8YWRkcmVzcz4gOiA8Ynl0ZXM+CitQYWRkaW5nIDxhZGRyZXNzPiA6IDxieXRlcz4KIAlVbnVzZWQgZGF0YSB0byBmaWxsIHVwIHRoZSBzcGFjZSBpbiBvcmRlciB0byBnZXQgdGhlIG5leHQgb2JqZWN0CiAJcHJvcGVybHkgYWxpZ25lZC4gSW4gdGhlIGRlYnVnIGNhc2Ugd2UgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlCi0JYXQgbGVhc3QgNCBieXRlcyBvZiBmaWxsZXIuIFRoaXMgYWxsb3cgZm9yIHRoZSBkZXRlY3Rpb24gb2Ygd3JpdGVzCisJYXQgbGVhc3QgNCBieXRlcyBvZiBwYWRkaW5nLiBUaGlzIGFsbG93cyB0aGUgZGV0ZWN0aW9uIG9mIHdyaXRlcwogCWJlZm9yZSB0aGUgb2JqZWN0LgogCi1Gb2xsb3dpbmcgdGhlIGZpbGxlciB3aWxsIGJlIGEgc3RhY2tkdW1wLiBUaGF0IHN0YWNrZHVtcCBkZXNjcmliZXMgdGhlCi1sb2NhdGlvbiB3aGVyZSB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLiBUaGUgY2F1c2Ugb2YgdGhlIGNvcnJ1cHRpb24gaXMgbW9yZQotbGlrZWx5IHRvIGJlIGZvdW5kIGJ5IGxvb2tpbmcgYXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGFsbG9jIC8gZnJlZS4KKzMuIEEgc3RhY2tkdW1wCiAKLUNocmlzdG9waCBMYW1ldGVyLCA8Y2xhbWV0ZXJAc2dpLmNvbT4sIE1heSAyMywgMjAwNworVGhlIHN0YWNrZHVtcCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuIFRoZSBjYXVzZQorb2YgdGhlIGNvcnJ1cHRpb24gaXMgbWF5IGJlIG1vcmUgbGlrZWx5IGZvdW5kIGJ5IGxvb2tpbmcgYXQgdGhlIGZ1bmN0aW9uIHRoYXQKK2FsbG9jYXRlZCBvciBmcmVlZCB0aGUgb2JqZWN0LgorCis0LiBSZXBvcnQgb24gaG93IHRoZSBwcm9ibGVtIHdhcyBkZWFsdCB3aXRoIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY29udGludWVkCitvcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KKworVGhlc2UgYXJlIG1lc3NhZ2VzIGluIHRoZSBzeXN0ZW0gbG9nIGJlZ2lubmluZyB3aXRoCisKK0ZJWCA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxjb3JyZWN0aXZlIGFjdGlvbiB0YWtlbj4KKworSW4gdGhlIGFib3ZlIHNhbXBsZSBTTFVCIGZvdW5kIHRoYXQgdGhlIFJlZHpvbmUgb2YgYW4gYWN0aXZlIG9iamVjdCBoYXMKK2JlZW4gb3ZlcndyaXR0ZW4uIEhlcmUgYSBzdHJpbmcgb2YgOCBjaGFyYWN0ZXJzIHdhcyB3cml0dGVuIGludG8gYSBzbGFiIHRoYXQKK2hhcyB0aGUgbGVuZ3RoIG9mIDggY2hhcmFjdGVycy4gSG93ZXZlciwgYSA4IGNoYXJhY3RlciBzdHJpbmcgbmVlZHMgYQordGVybWluYXRpbmcgMC4gVGhhdCB6ZXJvIGhhcyBvdmVyd3JpdHRlbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgUmVkem9uZSBmaWVsZC4KK0FmdGVyIHJlcG9ydGluZyB0aGUgZGV0YWlscyBvZiB0aGUgaXNzdWUgZW5jb3VudGVyZWQgdGhlIEZJWCBTTFVCIG1lc3NhZ2UKK3RlbGwgdXMgdGhhdCBTTFVCIGhhcyByZXN0b3JlZCB0aGUgUmVkem9uZSB0byBpdHMgcHJvcGVyIHZhbHVlIGFuZCB0aGVuCitzeXN0ZW0gb3BlcmF0aW9ucyBjb250aW51ZS4KKworRW1lcmdlbmN5IG9wZXJhdGlvbnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWluaW1hbCBkZWJ1Z2dpbmcgKHNhbml0eSBjaGVja3MgYWxvbmUpIGNhbiBiZSBlbmFibGVkIGJ5IGJvb3Rpbmcgd2l0aAorCisJc2x1Yl9kZWJ1Zz1GCisKK1RoaXMgd2lsbCBiZSBnZW5lcmFsbHkgYmUgZW5vdWdoIHRvIGVuYWJsZSB0aGUgcmVzaWxpZW5jeSBmZWF0dXJlcyBvZiBzbHViCit3aGljaCB3aWxsIGtlZXAgdGhlIHN5c3RlbSBydW5uaW5nIGV2ZW4gaWYgYSBiYWQga2VybmVsIGNvbXBvbmVudCB3aWxsCitrZWVwIGNvcnJ1cHRpbmcgb2JqZWN0cy4gVGhpcyBtYXkgYmUgaW1wb3J0YW50IGZvciBwcm9kdWN0aW9uIHN5c3RlbXMuCitQZXJmb3JtYW5jZSB3aWxsIGJlIGltcGFjdGVkIGJ5IHRoZSBzYW5pdHkgY2hlY2tzIGFuZCB0aGVyZSB3aWxsIGJlIGEKK2NvbnRpbnVhbCBzdHJlYW0gb2YgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN5c2xvZyBidXQgbm8gYWRkaXRpb25hbCBtZW1vcnkKK3dpbGwgYmUgdXNlZCAodW5saWtlIGZ1bGwgZGVidWdnaW5nKS4KKworTm8gZ3VhcmFudGVlcy4gVGhlIGtlcm5lbCBjb21wb25lbnQgc3RpbGwgbmVlZHMgdG8gYmUgZml4ZWQuIFBlcmZvcm1hbmNlCittYXkgYmUgb3B0aW1pemVkIGZ1cnRoZXIgYnkgbG9jYXRpbmcgdGhlIHNsYWIgdGhhdCBleHBlcmllbmNlcyBjb3JydXB0aW9uCithbmQgZW5hYmxpbmcgZGVidWdnaW5nIG9ubHkgZm9yIHRoYXQgY2FjaGUKKworSS5lLgorCisJc2x1Yl9kZWJ1Zz1GLGRlbnRyeQorCitJZiB0aGUgY29ycnVwdGlvbiBvY2N1cnMgYnkgd3JpdGluZyBhZnRlciB0aGUgZW5kIG9mIHRoZSBvYmplY3QgdGhlbiBpdAorbWF5IGJlIGFkdmlzYWJsZSB0byBlbmFibGUgYSBSZWR6b25lIHRvIGF2b2lkIGNvcnJ1cHRpbmcgdGhlIGJlZ2lubmluZworb2Ygb3RoZXIgb2JqZWN0cy4KKworCXNsdWJfZGVidWc9RlosZGVudHJ5CisKK0NocmlzdG9waCBMYW1ldGVyLCA8Y2xhbWV0ZXJAc2dpLmNvbT4sIE1heSAzMCwgMjAwNwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAzOTE0MjY5Li41YWJlYzE0IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTk0LDEzICsxOTQsNiBAQAogTDoJbGludXgtYWNlbmljQHN1bnNpdGUuZGsKIFM6CU1haW50YWluZWQKIAotQUNJIE1JWEVSIERSSVZFUgotUDoJUm9iZXJ0IFNpZW1lcgotTToJUm9iZXJ0LlNpZW1lckBnbXguZGUKLUw6CWxpbnV4LXNvdW5kQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL3d3dy5zdHVkLnVuaS1rYXJsc3J1aGUuZGUvfnVoMWIvCi1TOglNYWludGFpbmVkCi0KIElQUyBTQ1NJIFJBSUQgRFJJVkVSCiBQOglBZGFwdGVjIE9FTSBSYWlkIFNvbHV0aW9ucwogTToJYWFjcmFpZEBhZGFwdGVjLmNvbQpAQCAtMjcyLDIxICsyNjUsNiBAQAogVzoJaHR0cDovL2FjcGkuc291cmNlZm9yZ2UubmV0LwogUzoJU3VwcG9ydGVkCiAKLUFEMTgxNiBTT1VORCBEUklWRVIKLVA6CVRob3JzdGVuIEtuYWJlCi1NOglUaG9yc3RlbiBLbmFiZSA8bGludXhAdGhvcnN0ZW4ta25hYmUuZGU+Ci1XOglodHRwOi8vbGludXgudGhvcnN0ZW4ta25hYmUuZGUKLVM6CU1haW50YWluZWQKLQotQUQxODg5IFNPVU5EIERSSVZFUgotUDoJS3lsZSBNY01hcnRpbgotTToJa3lsZUBwYXJpc2MtbGludXgub3JnCi1QOglUaGliYXV0IFZhcmVuZQotTToJVC1Cb25lQHBhcmlzYy1saW51eC5vcmcKLVc6CWh0dHA6Ly93aWtpLnBhcmlzYy1saW51eC5vcmcvQUQxODg5Ci1MOglwYXJpc2MtbGludXhAbGlzdHMucGFyaXNjLWxpbnV4Lm9yZwotUzoJTWFpbnRhaW5lZAotCiBBRE0xMDI1IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCiBQOglKZWFuIERlbHZhcmUKIE06CWtoYWxpQGxpbnV4LWZyLm9yZwpAQCAtMTI3Niw2ICsxMjU0LDEyIEBACiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0RNQSBHRU5FUklDIE1FTUNQWSBTVUJTWVNURU0KK1A6CVNoYW5ub24gTmVsc29uCitNOglzaGFubm9uLm5lbHNvbkBpbnRlbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogRE9DQk9PSyBGT1IgRE9DVU1FTlRBVElPTgogUDoJUmFuZHkgRHVubGFwCiBNOglyZHVubGFwQHhlbm90aW1lLm5ldApAQCAtMTM5OCwxMyArMTM4Miw2IEBACiBMOglnZW5lcmFsQGxpc3RzLm9wZW5mYWJyaWNzLm9yZwogUzoJU3VwcG9ydGVkCiAKLUVNVTEwSzEgU09VTkQgRFJJVkVSCi1QOglKYW1lcyBDb3VydGllci1EdXR0b24KLU06CUphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrCi1MOgllbXUxMGsxLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lbXUxMGsxLwotUzoJTWFpbnRhaW5lZAotCiBFTVVMRVggTFBGQyBGQyBTQ1NJIERSSVZFUgogUDoJSmFtZXMgU21hcnQKIE06CWphbWVzLnNtYXJ0QGVtdWxleC5jb20KQEAgLTE5MDAsNiArMTg3NywxMiBAQAogTToJdGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrCiBTOglNYWludGFpbmVkCiAKK0lOVEVMIEkvT0FUIERNQSBEUklWRVIKK1A6CVNoYW5ub24gTmVsc29uCitNOglzaGFubm9uLm5lbHNvbkBpbnRlbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorCiBJTlRFTCBJWFA0WFggUkFORE9NIE5VTUJFUiBHRU5FUkFUT1IgU1VQUE9SVAogUDoJRGVlcGFrIFNheGVuYQogTToJZHNheGVuYUBwbGV4aXR5Lm5ldApAQCAtMjI5Nyw2ICsyMjgwLDE0IEBACiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCitNMzJSIEFSQ0hJVEVDVFVSRQorUDoJSGlyb2thenUgVGFrYXRhCitNOgl0YWthdGFAbGludXgtbTMyci5vcmcKK0w6CWxpbnV4LW0zMnJAbWwubGludXgtbTMyci5vcmcKK0w6CWxpbnV4LW0zMnItamFAbWwubGludXgtbTMyci5vcmcgKGluIEphcGFuZXNlKQorVzoJaHR0cDovL3d3dy5saW51eC1tMzJyLm9yZy8KK1M6CU1haW50YWluZWQKKwogTTY4SyBBUkNISVRFQ1RVUkUKIFA6CUdlZXJ0IFV5dHRlcmhvZXZlbgogTToJZ2VlcnRAbGludXgtbTY4ay5vcmcKQEAgLTI2MjIsMTIgKzI2MTMsNiBAQAogVzoJaHR0cDovL3d3dy5uZXRsYWIuaXMudHN1a3ViYS5hYy5qcC9+eW9rb3RhL2l6dW1pL25pbmphLwogUzoJTWFpbnRhaW5lZAogCi1OT04tSURFL05PTi1TQ1NJIENEUk9NIERSSVZFUlMgW0dFTkVSQUxdIChjb21lIG9uLCBjcmV3IC0gbWFyayB5b3VyIHJlc3BvbnNpYmlsaXR5KQotUDoJRWJlcmhhcmQgTW9lbmtlYmVyZwotTToJZW1vZW5rZUBnd2RnLmRlCi1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIE5URlMgRklMRVNZU1RFTQogUDoJQW50b24gQWx0YXBhcm1ha292CiBNOglhaWEyMUBjYW50YWIubmV0CkBAIC0yNzEwLDEyICsyNjk1LDYgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKLU9QTDMtU0EyLCBTQTMsIGFuZCBTQXggRFJJVkVSCi1QOglad2FuZSBNd2Fpa2FtYm8KLU06CXp3YW5lQGFybS5saW51eC5vcmcudWsKLUw6CWxpbnV4LXNvdW5kQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotCiBPUFJPRklMRQogUDoJUGhpbGlwcGUgRWxpZQogTToJcGhpbC5lbEB3YW5hZG9vLmZyCkBAIC0zMTIwLDEyICszMDk5LDYgQEAKIFc6CWh0dHA6Ly93d3cubWlodS5kZS9saW51eC9zYWE3MTQ2CiBTOglNYWludGFpbmVkCiAKLVNCUENEIENEUk9NIERSSVZFUgotUDoJRWJlcmhhcmQgTW9lbmtlYmVyZwotTToJZW1vZW5rZUBnd2RnLmRlCi1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIFNDMTIwMCBXRFQgRFJJVkVSCiBQOglad2FuZSBNd2Fpa2FtYm8KIE06CXp3YW5lQGFybS5saW51eC5vcmcudWsKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZGU0ZjhmNy4uZGRiZmNhYyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTMxMyw3ICszMTMsOCBAQAogQ1BQRkxBR1MgICAgICAgIDo9IC1EX19LRVJORUxfXyAkKExJTlVYSU5DTFVERSkKIAogQ0ZMQUdTICAgICAgICAgIDo9IC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyBcCi0gICAgICAgICAgICAgICAgICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24KKwkJICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gXAorCQkgICAtV2Vycm9yLWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uCiBBRkxBR1MgICAgICAgICAgOj0gLURfX0FTU0VNQkxZX18KIAogIyBSZWFkIEtFUk5FTFJFTEVBU0UgZnJvbSBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSAoaWYgaXQgZXhpc3RzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYwppbmRleCAwY2QwNjA1Li44M2E3ODE4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYwpAQCAtMzE1LDkgKzMxNSw3IEBACiAJLyogV2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQl0bXAgPSBkYXRhOwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDEpOwotCQlyZXQgPSAoY29waWVkID09IHNpemVvZih0bXApKSA/IDAgOiAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwppbmRleCA4MGNmYjc1Li5iMjg3MzE0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwpAQCAtNjUsNyArNjUsNyBAQAogfTsKIAogLyogU2V0IHRvIGEgc2Vjb25kYXJ5J3MgY3B1aWQgd2hlbiBpdCBjb21lcyBvbmxpbmUuICAqLwotc3RhdGljIGludCBzbXBfc2Vjb25kYXJ5X2FsaXZlIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBzbXBfc2Vjb25kYXJ5X2FsaXZlIF9fZGV2aW5pdGRhdGEgPSAwOwogCiAvKiBXaGljaCBjcHVzIGlkcyBjYW1lIG9ubGluZS4gICovCiBjcHVtYXNrX3QgY3B1X29ubGluZV9tYXA7CkBAIC0xNzMsNyArMTczLDcgQEAKIH0KIAogLyogV2FpdCB1bnRpbCBod3JwYi0+dHhyZHkgaXMgY2xlYXIgZm9yIGNwdS4gIFJldHVybiAtMSBvbiB0aW1lb3V0LiAgKi8KLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50IF9fZGV2aW5pdAogd2FpdF9mb3JfdHhyZHkgKHVuc2lnbmVkIGxvbmcgY3B1bWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CkBAIC0zNTgsNyArMzU4LDcgQEAKIC8qCiAgKiBCcmluZyBvbmUgY3B1IG9ubGluZS4KICAqLwotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiBzbXBfYm9vdF9vbmVfY3B1KGludCBjcHVpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMKaW5kZXggOTMwY2VkYy4uNzgzZjRlNSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3JtY29ucy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJcmV0dXJuIHNybWNvbnNfZHJpdmVyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludAogc3JtX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCmluZGV4IDBiY2I5NjguLjkyMjE0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQlpbzdfY2xlYXJfZXJyb3JzKGlvNyk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgdm9pZCBfX2luaXQKIG1hcnZlbF9pbml0X3J0Yyh2b2lkKQogewogCWluaXRfcnRjX2lycSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCmluZGV4IDQ3NDhlMTQuLjFkZDUwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZAordm9pZCBfX2luaXQKIGNvbW1vbl9pbml0X3J0Yyh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgeDsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCmluZGV4IGQ2ZTY2NWQuLmVjMGYwNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYwpAQCAtMTg0LDYgKzE4NCw3IEBACiAjZW5kaWYKIAlwcmludGsoIiVzKCVkKTogJXMgJWxkXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHN0ciwgZXJyKTsKIAlkaWtfc2hvd19yZWdzKHJlZ3MsIHI5XzE1KTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkaWtfc2hvd190cmFjZSgodW5zaWduZWQgbG9uZyAqKShyZWdzKzEpKTsKIAlkaWtfc2hvd19jb2RlKCh1bnNpZ25lZCBpbnQgKilyZWdzLT5wYyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCmluZGV4IGFiMzc2MWMuLjg2OThlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYwpAQCAtNjksNiArNjksNyBAQAogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwogCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3RjcHVkcF9ub2ZvbGQpOwogCiAvKgogICogRG8gYSA2NC1iaXQgY2hlY2tzdW0gb24gYW4gYXJiaXRyYXJ5IG1lbW9yeSBhcmVhLi4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwppbmRleCA2ZjJmNDZjLi43OGM5ZjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCkBAIC02NTcsNyArNjU3LDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKQEAgLTY2NiwxMiArNjY1LDcgQEAKIAkJICovCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgogCQljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwotCQkJZWxzZQotCQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtNjgzLDEyICs2NzcsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAxKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IDA7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCmluZGV4IDIzN2Y0OTkuLmYyMTE0YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCkBAIC0yNDksNiArMjQ5LDcgQEAKIAlidXN0X3NwaW5sb2NrcygxKTsKIAlfX2RpZShzdHIsIGVyciwgdGhyZWFkLCByZWdzKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYwppbmRleCBlMThhNDFlLi5kZGUwODk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KIApAQCAtODMsNiArODQsMTMgQEAKIAkucHVsbHVwX3Bpbgk9IEFUOTFfUElOX1BBMjQsCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgY3NiMzM3X2kyY19kZXZpY2VzW10gPSB7CisJeyBJMkNfQk9BUkRfSU5GTygicnRjLWRzMTMwNyIsIDB4NjgpLAorCSAgLnR5cGUgPSAiZHMxMzA3IiwKKwl9LAorfTsKKworCiBzdGF0aWMgc3RydWN0IGF0OTFfY2ZfZGF0YSBfX2luaXRkYXRhIGNzYjMzN19jZl9kYXRhID0gewogCS8qCiAJICogY29ubmVjdG9yIFA0IG9uIHRoZSBDU0IgMzM3IG1hdGVzIHRvCkBAIC0xNjEsNiArMTY5LDggQEAKIAlhdDkxX2FkZF9kZXZpY2VfdWRjKCZjc2IzMzdfdWRjX2RhdGEpOwogCS8qIEkyQyAqLwogCWF0OTFfYWRkX2RldmljZV9pMmMoKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBjc2IzMzdfaTJjX2RldmljZXMsCisJCQlBUlJBWV9TSVpFKGNzYjMzN19pMmNfZGV2aWNlcykpOwogCS8qIENvbXBhY3QgRmxhc2ggKi8KIAlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BCMjIsIDEpOwkJLyogSU9JUzE2ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2NmKCZjc2IzMzdfY2ZfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwppbmRleCAzOTBhOTdkLi4xODczYmQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KQEAgLTE5OSw2ICsyMDAsMTIgQEAKIAkucmVzb3VyY2UJPSAmbjIxMDBfdWFydF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBuMjEwMF9pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInJ0Yy1yczVjMzcyIiwgMHgzMiksCisJCS50eXBlID0gInJzNWMzNzJiIiwKKwl9LAorfTsKIAogLyoKICAqIFB1bGwgUENBOTUzMiBHUElPICM4IGxvdyB0byBwb3dlciBvZmYgdGhlIG1hY2hpbmUuCkBAIC0yNDgsNiArMjU1LDkgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMF9jaGFubmVsKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMV9jaGFubmVsKTsKIAorCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG4yMTAwX2kyY19kZXZpY2VzLAorCQlBUlJBWV9TSVpFKG4yMTAwX2kyY19kZXZpY2VzKSk7CisKIAlwbV9wb3dlcl9vZmYgPSBuMjEwMF9wb3dlcl9vZmY7CiAKIAlpbml0X3RpbWVyKCZwb3dlcl9idXR0b25fcG9sbF90aW1lcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L0tjb25maWcgYi9hcmNoL2FybTI2L0tjb25maWcKaW5kZXggMjA2ODhiYy4uOTA0NGYzMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9LY29uZmlnCisrKyBiL2FyY2gvYXJtMjYvS2NvbmZpZwpAQCAtMTcsNiArMTcsOSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sIHkKKwogY29uZmlnIEFSQ0hfQUNPUk4KICAgICAgICAgYm9vbAogICAgICAgICBkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvZGVmY29uZmlnIGIvYXJjaC9hcm0yNi9kZWZjb25maWcKaW5kZXggYzRhODk3MC4uMmI3ZDQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0yNi9kZWZjb25maWcKQEAgLTI0OCw3ICsyNDgsNiBAQAogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTVNET1NfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCmluZGV4IDQxNjkyNzkuLjBmZWZiODY5IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYwpAQCAtNTMxLDcgKzUzMSw2IEBACiAKIGxvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CkBAIC01NDAsMTIgKzUzOSw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QRUVLVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwKLQkJCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSwgMCk7Ci0JCQlpZiAocmV0ID09IHNpemVvZih1bnNpZ25lZCBsb25nKSkKLQkJCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQkJZWxzZQotCQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtNTU3LDEyICs1NTEsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAxKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IDA7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYwppbmRleCBkNTk0ZmI1Li4yOTExZTJlIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKQEAgLTE4NSw2ICsxODUsNyBAQAogCXByaW50aygiSW50ZXJuYWwgZXJyb3I6ICVzOiAleFxuIiwgc3RyLCBlcnIpOwogCXByaW50aygiQ1BVOiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzaG93X3JlZ3MocmVncyk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCBzdGFjayBsaW1pdCA9IDB4JXApXG4iLAogCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGVuZF9vZl9zdGFjayh0c2spKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9tbS9pbml0LmMgYi9hcmNoL2FybTI2L21tL2luaXQuYwppbmRleCA1NjJmYWMxLi4zNmU3ZWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L21tL2luaXQuYworKysgYi9hcmNoL2FybTI2L21tL2luaXQuYwpAQCAtMzMsOSArMzMsNiBAQAogCiAjaW5jbHVkZSA8YXNtL21hcC5oPgogCi0KLSNkZWZpbmUgVEFCTEVfU0laRQlQVFJTX1BFUl9QVEUgKiBzaXplb2YocHRlX3QpKQotCiBzdHJ1Y3QgbW11X2dhdGhlciBtbXVfZ2F0aGVyc1tOUl9DUFVTXTsKIAogZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCmluZGV4IDNjMzZjMmQuLjM5MDYwY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCkBAIC0xNTMsNyArMTUzLDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlwcl9kZWJ1ZygiYXJjaF9wdHJhY2UoJWxkLCAlZCwgJSNseCwgJSNseClcbiIsCkBAIC0xNjYsMTEgKzE2NSw3IEBACiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBjaGlsZCBwcm9jZXNzICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjoKQEAgLTE4MSwxMSArMTc2LDcgQEAKIAkvKiBXcml0ZSB0aGUgd29yZCBpbiBkYXRhIGF0IGxvY2F0aW9uIGFkZHIgKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOwotCQlpZiAocmV0ID09IHNpemVvZihkYXRhKSkKLQkJCXJldCA9IDA7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKaW5kZXggODZkMTA3NS4uOWE3M2NlNyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCkBAIC01Niw2ICs1Niw3IEBACiAJc2hvd19yZWdzX2xvZ19sdmwocmVncywgS0VSTl9FTUVSRyk7CiAJc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MtPnNwLCByZWdzLCBLRVJOX0VNRVJHKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKQEAgLTE4NCw3ICsxODUsNyBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmIChlY3IgPT0gRUNSX0lMTEVHQUxfT1BDT0RFKSkgewogCQllbnVtIGJ1Z190cmFwX3R5cGUgdHlwZTsKIAotCQl0eXBlID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJCXR5cGUgPSByZXBvcnRfYnVnKHJlZ3MtPnBjLCByZWdzKTsKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQlVHX1RSQVBfVFlQRV9OT05FOgogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RlZmNvbmZpZwppbmRleCAyYTM0MTFlYS4uNzEwYzIwYiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RlZmNvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCkBAIC00MjksNyArNDI5LDYgQEAKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVU1TRE9TX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZmQyMTI5YS4uZjRmOWRiNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwpAQCAtODMsMTkgKzgzLDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkJLyogUmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovIAogCQljYXNlIFBUUkFDRV9QRUVLVEVYVDoKLQkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCQkJaW50IGNvcGllZDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQkKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJYnJlYWs7Ci0JCQkKLQkJCXJldCA9IHB1dF91c2VyKHRtcCxkYXRhcCk7CisJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7Ci0JCX0KIAogCQkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTEzLDEyICsxMDMsNyBAQAogCQkvKiBXcml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyZXNzLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSAwOwotCQkJCi0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCQotCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogIAogIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvY3J5cHRvY29wLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYwppbmRleCAxYTA3MWYxLi5lODkxNGQ0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYwpAQCAtMjY3LDEwICsyNjcsMTAgQEAKIAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNyeXB0b2NvcF9mb3BzID0gewotCW93bmVyOiBUSElTX01PRFVMRSwKLQlvcGVuOiBjcnlwdG9jb3Bfb3BlbiwKLQlyZWxlYXNlOiBjcnlwdG9jb3BfcmVsZWFzZSwKLQlpb2N0bDogY3J5cHRvY29wX2lvY3RsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm9wZW4gPQkJY3J5cHRvY29wX29wZW4sCisJLnJlbGVhc2UgPQljcnlwdG9jb3BfcmVsZWFzZSwKKwkuaW9jdGwgPQljcnlwdG9jb3BfaW9jdGwKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaTJjLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYwppbmRleCA1ZDZjNTI3Li5lMTJmNmNjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYwpAQCAtNTc0LDEwICs1NzQsMTAgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJjX2ZvcHMgPSB7Ci0Jb3duZXI6ICAgIFRISVNfTU9EVUxFLAotCWlvY3RsOiAgICBpMmNfaW9jdGwsCi0Jb3BlbjogICAgIGkyY19vcGVuLAotCXJlbGVhc2U6ICBpMmNfcmVsZWFzZSwKKwkub3duZXIgPSAgICBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSAgICBpMmNfaW9jdGwsCisJLm9wZW4gPSAgICAgaTJjX29wZW4sCisJLnJlbGVhc2UgPSAgaTJjX3JlbGVhc2UsCiB9OwogCiBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMKaW5kZXggMjRiOTE5Yi4uZmE4ZDUwMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNmODU2My5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYwpAQCAtNTEsMTAgKzUxLDEwIEBACiBpbnQgcGNmODU2M19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGNmODU2M19mb3BzID0gewotCW93bmVyOiBUSElTX01PRFVMRSwKLQlpb2N0bDogcGNmODU2M19pb2N0bCwKLQlvcGVuOiBwY2Y4NTYzX29wZW4sCi0JcmVsZWFzZTogcGNmODU2M19yZWxlYXNlLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5pb2N0bCA9CXBjZjg1NjNfaW9jdGwsCisJLm9wZW4gPQkJcGNmODU2M19vcGVuLAorCS5yZWxlYXNlID0JcGNmODU2M19yZWxlYXNlLAogfTsKIAogdW5zaWduZWQgY2hhcgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZDRkNTdiNy4uMzhlY2UwYyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCkBAIC0xNDYsMTIgKzE0Niw3IEBACiAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0KLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCi0JCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKICAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MgaW4gdGhlIFVTRVIgYXJlYS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKaW5kZXggNDNkYzA4ZS4uMjc1NjczYyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKQEAgLTE0OTIsNiArMTQ5MiwxMCBAQAogCS5sb25nIHN5c19tb3ZlX3BhZ2VzCiAJLmxvbmcgc3lzX2dldGNwdQogCS5sb25nIHN5c19lcG9sbF9wd2FpdAorCS5sb25nIHN5c191dGltZW5zYXQJCS8qIDMyMCAqLworCS5sb25nIHN5c19zaWduYWxmZAorCS5sb25nIHN5c190aW1lcmZkCisJLmxvbmcgc3lzX2V2ZW50ZmQKIAogCiBzeXNjYWxsX3RhYmxlX3NpemUgPSAoLiAtIHN5c19jYWxsX3RhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMgYi9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYwppbmRleCAxZTdhMTAxLi5lODljYWQxIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYwpAQCAtNjQ3LDE3ICs2NDcsMTEgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0dEQlNUVUJfQ09OU09MRQotCi1zdGF0aWMga2Rldl90IGdkYnN0dWJfY29uc29sZV9kZXYoc3RydWN0IGNvbnNvbGUgKmNvbikKLXsKLQlyZXR1cm4gTUtERVYoMSwzKTsgLyogL2Rldi9udWxsICovCi19CisjaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCiAKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBnZGJzdHViX2NvbnNvbGUgPSB7CiAJLm5hbWUJPSAiZ2RiIiwKIAkud3JpdGUJPSBnZGJzdHViX2NvbnNvbGVfd3JpdGUsCS8qIGluIGJyZWFrLlMgKi8KLQkuZGV2aWNlCT0gZ2Ric3R1Yl9jb25zb2xlX2RldiwKIAkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCiAJLmluZGV4CT0gLTEsCiB9OwpAQCAtMjAyMSw3ICsyMDE1LDcgQEAKIAlwdHIgPSBtZW0yaGV4KGdkYnN0dWJfYmFubmVyLCBwdHIsIHNpemVvZihnZGJzdHViX2Jhbm5lcikgLSAxLCAwKTsKIAlnZGJzdHViX3NlbmRfcGFja2V0KG91dHB1dF9idWZmZXIpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19HREJfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUpCiAJcmVnaXN0ZXJfY29uc29sZSgmZ2Ric3R1Yl9jb25zb2xlKTsKICNlbmRpZgogCkBAIC0yMDMxLDcgKzIwMjUsNyBAQAogLyoKICAqIHJlZ2lzdGVyIHRoZSBjb25zb2xlIGF0IGEgbW9yZSBhcHByb3ByaWF0ZSB0aW1lCiAgKi8KLSNpZiBkZWZpbmVkIChDT05GSUdfR0RCU1RVQl9DT05TT0xFKSAmJiAhZGVmaW5lZChDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUpCisjaWYgZGVmaW5lZCAoQ09ORklHX0dEQl9DT05TT0xFKSAmJiAhZGVmaW5lZChDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUpCiBzdGF0aWMgaW50IF9faW5pdCBnZGJzdHViX3Bvc3Rpbml0KHZvaWQpCiB7CiAJcHJpbnRrKCJyZWdpc3RlcmluZyBjb25zb2xlXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYwppbmRleCBjZTg4ZmI5Li43MDllOWJkIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCkBAIC0xMTIsMjAgKzExMiwxMiBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCWludCBjb3BpZWQ7Ci0KKwljYXNlIFBUUkFDRV9QRUVLREFUQToKIAkJcmV0ID0gLUVJTzsKIAkJaWYgKGlzX3VzZXJfYWRkcl92YWxpZChjaGlsZCwgYWRkciwgc2l6ZW9mKHRtcCkpIDwgMCkKIAkJCWJyZWFrOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQotCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE3Niw5ICsxNjgsNyBAQAogCQlyZXQgPSAtRUlPOwogCQlpZiAoaXNfdXNlcl9hZGRyX3ZhbGlkKGNoaWxkLCBhZGRyLCBzaXplb2YodG1wKSkgPCAwKQogCQkJYnJlYWs7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgIT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IDA7CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKaW5kZXggYWEzYzc5NS4uYzFjMzJlNCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKQEAgLTYwLDEwICs2MCw2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfdWNsaW51eF9tZW1vcnkodm9pZCk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19DT05TT0xFCi1leHRlcm4gc3RydWN0IGNvbnN3ICpjb25zd2l0Y2hwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTUI5MzA5MF9NQjAwCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIG1iOTMwOTBfYmFubmVyW10gPSAiRkovUkggRlItViBMaW51eCI7CiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIG1iOTMwOTBfdmVyc2lvbltdID0gVVRTX1JFTEVBU0U7CkBAIC03OTUsMTMgKzc5MSw2IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0hSX0RFVl9GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9GTEFTSCkKLQkvKiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIEZsYXNocm9tIGRldmljZSBoZXJlIHNpbmNlIHdlIG1pZ2h0Ci0JICogZG8gdGhpbmdzIHdpdGggZmxhc2ggZWFybHkgb24gaW4gdGhlIGJvb3QKLQkgKi8KLQlmbGFzaF9wcm9iZSgpOwotI2VuZGlmCi0KIAkvKiBkZWFsIHdpdGggdGhlIGNvbW1hbmQgbGluZSAtIFJlZEJvb3QgbWF5IGhhdmUgcGFzc2VkIG9uZSB0byB0aGUga2VybmVsICovCiAJbWVtY3B5KGNvbW1hbmRfbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKIAkqY21kbGluZV9wID0gJmNvbW1hbmRfbGluZVswXTsKQEAgLTgzNywxMSArODI2LDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9CTEtNRU0KLQlST09UX0RFViA9IE1LREVWKEJMS01FTV9NQUpPUiwwKTsKLSNlbmRpZgotCS8qcm9tX2xlbmd0aCA9ICh1bnNpZ25lZCBsb25nKSZfZmxhc2hlbmQgLSAodW5zaWduZWQgbG9uZykmX3JvbXZlYzsqLwotCiAjaWZkZWYgQ09ORklHX01NVQogCXNldHVwX2xpbnV4X21lbW9yeSgpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvS2NvbmZpZyBiL2FyY2gvaDgzMDAvS2NvbmZpZwppbmRleCA2MThkYmFkLi5lMzVmNzRlIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL0tjb25maWcKKysrIGIvYXJjaC9oODMwMC9LY29uZmlnCkBAIC02OCw2ICs2OCw5IEBACiBjb25maWcgTk9fSU9QT1JUCiAJZGVmX2Jvb2wgeQogCitjb25maWcgTk9fRE1BCisJZGVmX2Jvb2wgeQorCiBjb25maWcgSVNBCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvTWFrZWZpbGUKaW5kZXggYjJkODk2YS4uNTNiNWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9NYWtlZmlsZQorKysgYi9hcmNoL2g4MzAwL01ha2VmaWxlCkBAIC02MSwxMCArNjEsMTEgQEAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKLXZtbGludXguc3JlYyB2bWxpbnV4LmJpbjogdm1saW51eAordm1saW51eC5zcmVjIHZtbGludXguYmluIHpJbWFnZTogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCiBkZWZpbmUgYXJjaGhlbHAKLSAgZWNobyAgJ3ZtbGludXguYmluICAtIENyZWF0ZSByYXcgYmluYXJ5JwotICBlY2hvICAndm1saW51eC5zcmVjIC0gQ3JlYXRlIHNyZWMgYmluYXJ5JworICBAZWNobyAgJ3ZtbGludXguYmluICAtIENyZWF0ZSByYXcgYmluYXJ5JworICBAZWNobyAgJ3ZtbGludXguc3JlYyAtIENyZWF0ZSBzcmVjIGJpbmFyeScKKyAgQGVjaG8gICd6SW1hZ2UgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZScKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDcxYWFjODIuLmQ2MTg5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xNSwxMCArMTUsMTAgQEAKICMgaW4gb3JkZXIgdG8gc3VwcHJlc3MgZXJyb3IgbWVzc2FnZS4KICMKIENPTkZJR19NRU1PUllfU1RBUlQgICAgID89IDB4MDA0MDAwMDAKLUNPTkZJR19CT09UX0xJTktfT0ZGU0VUID89IDB4MDA0MDAwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUID89IDB4MDAxNDAwMDAKIElNQUdFX09GRlNFVCA6PSAkKHNoZWxsIHByaW50ZiAiMHglMDh4IiAkJFskKENPTkZJR19NRU1PUllfU1RBUlQpKyQoQ09ORklHX0JPT1RfTElOS19PRkZTRVQpXSkKIAotTERGTEFHU192bWxpbnV4IDo9IC1UICQob2JqKS92bWxpbnV4LmxkcworTERGTEFHU192bWxpbnV4IDo9IC1UdGV4dCAkKElNQUdFX09GRlNFVCkgLWVzdGFydHVwICQob2JqKS92bWxpbnV4LmxkcwogCiAkKG9iaikvdm1saW51eDogJChPQkpFQ1RTKSAkKG9iaikvcGlnZ3kubyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGI4ZTkwZDEuLjk4NWE4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFlvc2hpbm9yaSBTYXRvCiAgKi8KIAotLmg4MzAwaAorCS5oODMwMGgKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKICNkZWZpbmUgU1JBTV9TVEFSVCAweGZmNDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWUyYTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMKQEAgLTAsMCArMSwzMiBAQAorU0VDVElPTlMKK3sKKyAgICAgICAgLnRleHQgOgorICAgICAgICB7CisgICAgICAgIF9fc3RleHQgPSAuIDsKKwlfX3RleHQgPSAuOworCSAgICAgICAqKC50ZXh0LnN0YXJ0dXApCisJICAgICAgICooLnRleHQpCisgICAgICAgIF9fZXRleHQgPSAuIDsKKyAgICAgICAgfQorCisJLnJvZGF0YSA6CisJeworCQkqKC5yb2RhdGEpCisJfQorICAgICAgICAuZGF0YSA6CisKKyAgICAgICAgeworICAgICAgICBfX3NkYXRhID0gLiA7CisgICAgICAgIF9fX2RhdGFfc3RhcnQgPSAuIDsKKyAgICAgICAgICAgICAgICAqKC5kYXRhLiopCisJfQorICAgICAgICAuYnNzIDoKKyAgICAgICAgeworICAgICAgICAuID0gQUxJR04oMHg0KSA7CisgICAgICAgIF9fc2JzcyA9IC4gOworICAgICAgICAgICAgICAgICooLmJzcyopCisgICAgICAgIC4gPSBBTElHTigweDQpIDsKKyAgICAgICAgX19lYnNzID0gLiA7CisgICAgICAgIF9fZW5kID0gLiA7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmNjk2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCkBAIC0wLDAgKzEsOSBAQAorU0VDVElPTlMKK3sKKyAgLmRhdGEgOiB7CisJX2lucHV0X2xlbiA9IC47CisJTE9ORyhfaW5wdXRfZGF0YV9lbmQgLSBfaW5wdXRfZGF0YSkgX2lucHV0X2RhdGEgPSAuOworCSooLmRhdGEpCisJX2lucHV0X2RhdGFfZW5kID0gLjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCmluZGV4IGNjYzFhN2YuLjg3NGY2YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCkBAIC02LDYgKzYsNyBAQAogCiBvYmoteSA6PSBwcm9jZXNzLm8gdHJhcHMubyBwdHJhY2UubyBpcnEubyBcCiAJIHN5c19oODMwMC5vIHRpbWUubyBzZW1hcGhvcmUubyBzaWduYWwubyBcCi0gICAgICAgICBzZXR1cC5vIGdwaW8ubyBpbml0X3Rhc2subyBzeXNjYWxscy5vCisgICAgICAgICBzZXR1cC5vIGdwaW8ubyBpbml0X3Rhc2subyBzeXNjYWxscy5vIFwKKwkgZW50cnkubwogCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8gaDgzMDBfa3N5bXMubyAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMgYi9hcmNoL2g4MzAwL2tlcm5lbC9lbnRyeS5TCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIGFyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMKcmVuYW1lIHRvIGFyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKaW5kZXggZjNkNmI4ZS4uY2E3NDMxNiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9lbnRyeS5TCkBAIC0xLDExICsxLDEwIEBACiAvKiAtKi0gbW9kZTogYXNtIC0qLQogICoKLSAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lbnRyeS5TCisgKiAgbGludXgvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwogICoKICAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+CisgKiAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KICAqCi0gKglmYWlybHkgaGVhdnkgY2hhbmdlcyB0byBmaXggc3lzY2FsbCBhcmdzIGFuZCBzaWduYWwgcHJvY2Vzc2luZwotICoJYnkgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KICAqLwogCiAvKgpAQCAtMjMsMTMgKzIyLDY2IEBACiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDgzMDBIKQorI2RlZmluZSBVU0VSUkVUIDgKK0lOVEVSUlVQVFMgPSA2NAorCS5oODMwMGgKKwkubWFjcm8JU0hMTDIgcmVnCisJc2hsbC5sCVxyZWcKKwlzaGxsLmwJXHJlZworCS5lbmRtCisJLm1hY3JvCVNITFIyIHJlZworCXNobHIubAlccmVnCisJc2hsci5sCVxyZWcKKwkuZW5kbQorCS5tYWNybwlTQVZFUkVHUworCW1vdi5sCWVyMCxALXNwCisJbW92LmwJZXIxLEAtc3AKKwltb3YubAllcjIsQC1zcAorCW1vdi5sCWVyMyxALXNwCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRVJFR1MKKwltb3YubAlAc3ArLGVyMworCW1vdi5sCUBzcCssZXIyCisJLmVuZG0KKwkubWFjcm8JU0FWRUVYUgorCS5lbmRtCisJLm1hY3JvCVJFU1RPUkVFWFIKKwkuZW5kbQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4UykKKyNkZWZpbmUgVVNFUlJFVCAxMAorI2RlZmluZSBVU0VSRVhSIDgKK0lOVEVSUlVQVFMgPSAxMjgKIAkuaDgzMDBzCisJLm1hY3JvCVNITEwyIHJlZworCXNobGwubAkjMixccmVnCisJLmVuZG0KKwkubWFjcm8JU0hMUjIgcmVnCisJc2hsci5sCSMyLFxyZWcKKwkuZW5kbQorCS5tYWNybwlTQVZFUkVHUworCXN0bS5sCWVyMC1lcjMsQC1zcAorCS5lbmRtCisJLm1hY3JvCVJFU1RPUkVSRUdTCisJbGRtLmwJQHNwKyxlcjItZXIzCisJLmVuZG0KKwkubWFjcm8JU0FWRUVYUgorCW1vdi53CUAoVVNFUkVYUjoxNixlcjApLHIxCisJbW92LncJcjEsQChMRVhSLUxFUjM6MTYsc3ApCQkvKiBjb3B5IEVYUiAqLworCS5lbmRtCisJLm1hY3JvCVJFU1RPUkVFWFIKKwltb3YudwlAKExFWFItTEVSMToxNixzcCkscjEJCS8qIHJlc3RvcmUgRVhSICovCisJbW92LmIJcjFsLHIxaAorCW1vdi53CXIxLEAoVVNFUkVYUjoxNixlcjApCisJLmVuZG0KKyNlbmRpZgorCiAKIC8qIENQVSBjb250ZXh0IHNhdmUvcmVzdG9yZSBtYWNyb3MuICovCi0JCisKIAkubWFjcm8JU0FWRV9BTEwKIAltb3YubAllcjAsQC1zcAotCiAJc3RjCWNjcixyMGwJCQkJLyogY2hlY2sga2VybmVsIG1vZGUgKi8KIAlidHN0CSM0LHIwbAogCWJuZQk1ZgpAQCAtMzksNDIgKzkxLDM4IEBACiAJbW92LmwJQHNwLGVyMAkJCQkvKiByZXN0b3JlIHNhdmVkIGVyMCAqLwogCW9yYwkjMHgxMCxjY3IJCQkvKiBzd2l0Y2gga2VybmVsIHN0YWNrICovCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X2tzcCksc3AKLQlzdWIubAkjKExSRVQtTE9SSUcpLHNwCQkvKiBhbGxvY2F0ZSBMT1JJRyAtIExSRVQgKi8gCi0Jc3RtLmwJZXIwLWVyMyxALXNwCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCgxMDoxNixlcjApLGVyMQkJLyogY29weSB0aGUgUkVUIGFkZHIgKi8KLQltb3YubAllcjEsQChMUkVULUxFUjM6MTYsc3ApCi0JbW92LncJQCg4OjE2LGVyMCkscjEKLQltb3YudwlyMSxAKExFWFItTEVSMzoxNixzcCkJCS8qIGNvcHkgRVhSICovCisJc3ViLmwJIyhMUkVULUxPUklHKSxzcAkJLyogYWxsb2NhdGUgTE9SSUcgLSBMUkVUICovCisJU0FWRVJFR1MKKwltb3YubCAgIEBTWU1CT0xfTkFNRShzd191c3ApLGVyMAorCW1vdi5sICAgQChVU0VSUkVUOjE2LGVyMCksZXIxICAgICAgICAgICAvKiBjb3B5IHRoZSBSRVQgYWRkciAqLworCW1vdi5sICAgZXIxLEAoTFJFVC1MRVIzOjE2LHNwKQorCVNBVkVFWFIKIAotCW1vdi53CWUxLHIxCQkJCS8qIGUxIGhpZ2hieXRlID0gY2NyICovCi0JYW5kCSMweGVmLHIxaAkJCS8qIG1hc2sgbW9kZT8gZmxhZyAqLwotCXN1Yi53CXIwLHIwCi0JbW92LmIJcjFoLHIwbAotCW1vdi53CXIwLEAoTENDUi1MRVIzOjE2LHNwKQkJLyogY29weSBjY3IgKi8KIAltb3YubAlAKExPUklHLUxFUjM6MTYsc3ApLGVyMAogCW1vdi5sCWVyMCxAKExFUjAtTEVSMzoxNixzcCkJCS8qIGNvcHkgRVIwICovCisJbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KKwlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCiAJYnJhCTZmCiA1OgogCS8qIGtlcm5lbCBtb2RlICovCiAJbW92LmwJQHNwLGVyMAkJCQkvKiByZXN0b3JlIHNhdmVkIGVyMCAqLwogCXN1YnMJIzIsc3AJCQkJLyogc2V0IGR1bW15IGNjciAqLwotCXN0bS5sCWVyMC1lcjMsQC1zcAorCVNBVkVSRUdTCiAJbW92LncJQChMUkVULUxFUjM6MTYsc3ApLHIxCQkvKiBjb3B5IG9sZCBjY3IgKi8KKzY6CiAJbW92LmIJcjFoLHIxbAogCW1vdi5iCSMwLHIxaAotCW1vdi53CXIxLEAoTENDUi1MRVIzOjE2LHNwKQotNjoJCisJbW92LncJcjEsQChMQ0NSLUxFUjM6MTYsc3ApCQkvKiBzZXQgY2NyICovCiAJbW92LmwJZXI2LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNiAqLwogCW1vdi5sCWVyNSxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzUgKi8KIAltb3YubAllcjQsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM0ICovCi0JLmVuZG0KKwkuZW5kbQkJCQkJLyogcjEgPSBjY3IgKi8KIAogCS5tYWNybwlSRVNUT1JFX0FMTAogCW1vdi5sCUBzcCssZXI0CiAJbW92LmwJQHNwKyxlcjUKIAltb3YubAlAc3ArLGVyNgotCWxkbS5sCUBzcCssZXIyLWVyMworCVJFU1RPUkVSRUdTCiAJbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIwCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwogCWJ0c3QJIzQscjBsCiAJYm5lCTdmCkBAIC04MywxOCArMTMxLDE2IEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCiAJbW92LmwJQChMRVIwLUxFUjE6MTYsc3ApLGVyMQkJLyogcmVzdG9yZSBFUjAgKi8KIAltb3YubAllcjEsQGVyMAotCW1vdi53CUAoTEVYUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSBFWFIgKi8KLQltb3YuYglyMWwscjFoCi0JbW92LncJcjEsQCg4OjE2LGVyMCkKKwlSRVNUT1JFRVhSCiAJbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIHRoZSBSRVQgYWRkciAqLwogCW1vdi5iCXIxbCxyMWgKIAltb3YuYglAKExSRVQrMS1MRVIxOjE2LHNwKSxyMWwKIAltb3YudwlyMSxlMQogCW1vdi53CUAoTFJFVCsyLUxFUjE6MTYsc3ApLHIxCi0JbW92LmwJZXIxLEAoMTA6MTYsZXIwKQorCW1vdi5sCWVyMSxAKFVTRVJSRVQ6MTYsZXIwKQogCiAJbW92LmwJQHNwKyxlcjEKLQlhZGQubAkjKExSRVQtTEVSMSksc3AJCQkvKiByZW1vdmUgTE9SSUcgLSBMUkVUICovIAorCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8KIAltb3YubAlzcCxAU1lNQk9MX05BTUUoc3dfa3NwKQogCWFuZGMJIzB4ZWYsY2NyCQkJLyogc3dpdGNoIHRvIHVzZXIgbW9kZSAqLwogCW1vdi5sCWVyMCxzcApAQCAtMTA4LDcgKzE1NCw3IEBACiAJYWRkcwkjNCxzcAkJCQkvKiByZW1vdmUgdGhlIHN3IGNyZWF0ZWQgTFZFQyAqLwogCXJ0ZQogCS5lbmRtCi0JCisKIC5nbG9ibCBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkKIC5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCiAuZ2xvYmwgU1lNQk9MX05BTUUocmV0X2Zyb21fZm9yaykKQEAgLTExNiwxNiArMTYyLDI1IEBACiAuZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQogLmdsb2JsIFNZTUJPTF9OQU1FKHN3X2tzcCksU1lNQk9MX05BTUUoc3dfdXNwKQogLmdsb2JsIFNZTUJPTF9OQU1FKHJlc3VtZSkKLS5nbG9ibCBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykKIC5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCi0JCQotSU5URVJSVVBUUyA9IDEyOAorLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQorCiAjaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQogCS5zZWN0aW9uIC5pbnRfcmVkaXJlY3QsImF4IgogU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IODMwMEgpCiAJLnJlcHQJNwogCS5sb25nCTAKIAkuZW5kcgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4UykKKwkucmVwdAk1CisJLmxvbmcJMAorCS5lbmRyCisJam1wCUBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykKKwkubG9uZwkwCisjZW5kaWYKKwogCWpzcglAU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQkvKiBOTUkgKi8KIAlqbXAJQFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQkvKiBUUkFQQSAjMCAoU3lzdGVtIGNhbGwpICovCiAJLmxvbmcJMApAQCAtMTQxLDIwICsxOTYsMjAgQEAKIFNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKIAkuc3BhY2UJNAogI2VuZGlmCi0JCisKIAkuc2VjdGlvbiAudGV4dAogCS5hbGlnbgkyCiBTWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfZW50cnkpCiAJU0FWRV9BTEwKLQltb3YudwlAKExDQ1Isc3ApLHIwCi0JYnRzdAkjNCxyMGwKKwltb3YubAlzcCxlcjAKKwlhZGQubAkjTFZFQyxlcjAKKwlidHN0CSM0LHIxbAogCWJuZQkxZgorCS8qIHVzZXIgTFZFQyAqLwogCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sCUAoNDoxNixlcjApLGVyMAotCWJyYQkyZgorCWFkZHMJIzQsZXIwCiAxOgotCW1vdi5sCUAoTFZFQzoxNixzcCksZXIwCi0yOgorCW1vdi5sCUBlcjAsZXIwCQkJLyogTFZFQyBhZGRyZXNzICovCiAjaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQogCXN1Yi5sCSNTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMAogI2VuZGlmCkBAIC0xNjIsNjkgKzIxNyw2MiBAQAogCW1vdi5sCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMQogCXN1Yi5sCWVyMSxlcjAKICNlbmRpZgotCXNobHIubAkjMixlcjAKKwlTSExSMgllcjAKIAlkZWMubAkjMSxlcjAKIAltb3YubAlzcCxlcjEKIAlzdWJzCSM0LGVyMQkJCQkvKiBhZGp1c3QgcmV0X3BjICovCi0JanNyCUBTWU1CT0xfTkFNRShwcm9jZXNzX2ludCkKLQltb3YubAlAU1lNQk9MX05BTUUoaXJxX3N0YXQpK0NQVVNUQVRfU09GVElSUV9QRU5ESU5HLGVyMAotCWJlcQkxZgotCWpzcglAU1lNQk9MX05BTUUoZG9fc29mdGlycSkKLTE6Ci0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCisJanNyCUBTWU1CT0xfTkFNRShkb19JUlEpCisJam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9pbnRlcnJ1cHQpCiAKIFNZTUJPTF9OQU1FX0xBQkVMKHN5c3RlbV9jYWxsKQogCXN1YnMJIzQsc3AJCQkJLyogZHVtbXkgTFZFQyAqLwogCVNBVkVfQUxMCisJYW5kYwkjMHg3ZixjY3IKIAltb3YubAllcjAsZXI0Ci0JbW92LmwJIy1FTk9TWVMsZXIwCi0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKIAogCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCiAJbW92LmwJc3AsZXIwCiAJanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQljbXAubAkjTlJfc3lzY2FsbHMsZXI0Ci0JYmNjCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKLQlzaGxsLmwJIzIsZXI0Ci0JbW92LmwJI1NZTUJPTF9OQU1FKHN5c19jYWxsX3RhYmxlKSxlcjAKLQlhZGQubAllcjQsZXIwCi0JbW92LmwJQGVyMCxlcjAKLQltb3YubAllcjAsZXI0Ci0JYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYJCiAJbW92LmwJc3AsZXIyCiAJYW5kLncJIzB4ZTAwMCxyMgotCW1vdi5iCUAoKFRBU0tfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCisJbW92LmIJQCgoVElfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCiAJYnRzdAkjKFRJRl9TWVNDQUxMX1RSQUNFICYgNykscjJsCi0JbW92LmwJQChMRVIxOjE2LHNwKSxlcjAKLQltb3YubAlAKExFUjI6MTYsc3ApLGVyMQotCW1vdi5sCUAoTEVSMzoxNixzcCksZXIyCi0JYW5kYwkjMHg3ZixjY3IKLQlqc3IJQGVyNAotCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCi0jZW5kaWYKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CisJYmVxCTFmCisJanNyCUBTWU1CT0xfTkFNRShkb19zeXNjYWxsX3RyYWNlKQogMToKLQlqc3IJU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKKwljbXAubAkjTlJfc3lzY2FsbHMsZXI0CisJYmNjCWJhZHN5cworCVNITEwyCWVyNAorCW1vdi5sCSNTWU1CT0xfTkFNRShzeXNfY2FsbF90YWJsZSksZXIwCisJYWRkLmwJZXI0LGVyMAorCW1vdi5sCUBlcjAsZXI0CisJYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKIAltb3YubAlAKExFUjE6MTYsc3ApLGVyMAogCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCiAJbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKIAlqc3IJQGVyNAogCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfdHJhY2UpCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAorCW1vdi5sCXNwLGVyMgorCWFuZC53CSMweGUwMDAscjIKKwltb3YuYglAKChUSV9GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKKwlidHN0CSMoVElGX1NZU0NBTExfVFJBQ0UgJiA3KSxyMmwKKwliZXEJMmYKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX3N5c2NhbGxfdHJhY2UpCisyOgorI2lmIGRlZmluZWQoQ09ORklHX1NZU0NBTExfUFJJTlQpCisJanNyCUBTWU1CT0xfTkFNRShzeXNjYWxsX3ByaW50KQorI2VuZGlmCisJb3JjCSMweDgwLGNjcgorCWJyYQlyZXN1bWVfdXNlcnNwYWNlCiAKLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCi0JbW92LmwJZXIyLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CitiYWRzeXM6CisJbW92LmwJIy1FTk9TWVMsZXIwCisJbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKKwlicmEJcmVzdW1lX3VzZXJzcGFjZQogCi1TWU1CT0xfTkFNRV9MQUJFTChyZXNjaGVkdWxlKQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQorI2lmICFkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorI2RlZmluZSByZXN1bWVfa2VybmVsIHJlc3RvcmVfYWxsCisjZW5kaWYKIAogU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21fZXhjZXB0aW9uKQogI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCkBAIC0yMzIsNTggKzI4MCw2OCBAQAogI2VuZGlmCiBTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9pbnRlcnJ1cHQpCiAJbW92LmIJQChMQ0NSKzE6MTYsc3ApLHIwbAotCWJ0c3QJIzQscjBsCQkJLyogY2hlY2sgaWYgcmV0dXJuaW5nIHRvIGtlcm5lbCAqLwotCWJuZQlkb25lOjgJCQkvKiBpZiBzbywgc2tpcCByZXNjaGVkLCBzaWduYWxzICovCisJYnRzdAkjNCxyMGwKKwlibmUJcmVzdW1lX2tlcm5lbDo4CQkvKiByZXR1cm4gZnJvbSBrZXJuZWwgKi8KK3Jlc3VtZV91c2Vyc3BhY2U6CiAJYW5kYwkjMHg3ZixjY3IKIAltb3YubAlzcCxlcjQKLQlhbmQudwkjMHhlMDAwLHI0CisJYW5kLncJIzB4ZTAwMCxyNAkJLyogZXI0IDwtIGN1cnJlbnQgdGhyZWFkIGluZm8gKi8KIAltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCiAJYW5kLmwJI19USUZfV09SS19NQVNLLGVyMQotCWJlcQlkb25lOjgKLTE6Ci0JbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMQorCWJlcQlyZXN0b3JlX2FsbDo4Cit3b3JrX3BlbmRpbmc6CiAJYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQlibmUJU1lNQk9MX05BTUUocmVzY2hlZHVsZSk6MTYKKwlibmUJd29ya19yZXNjaGVkOjgKKwkvKiB3b3JrIG5vdGlmeXNpZyAqLwogCW1vdi5sCXNwLGVyMAotCXN1YnMJIzQsZXIwCQkJLyogYWRqdXN0IHJldHBjICovCi0JbW92LmwJZXIyLGVyMQotCWpzcglAU1lNQk9MX05BTUUoZG9fc2lnbmFsKQotI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCi0JYnJhCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotMzoKLQlidHN0CSM0LHIwbAotCWJlcQlkb25lOjgJCQkvKiB1c2Vyc3BhY2UgdGhvcnUgKi8KLTQ6Ci0JbW92LmwJQChUSV9QUkVfQ09VTlQ6MTYsZXI0KSxlcjEKLQlibmUJZG9uZTo4Ci0JbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMQotCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjFsCi0JYmVxCWRvbmU6OAotCW1vdi5iCXIwbCxyMGwKLQlicGwJZG9uZTo4CQkJLyogaW50ZXJydXB0IG9mZiAoZXhjZXB0aW9uIHBhdGg/KSAqLwotCW1vdi5sCSNQUkVFTVBUX0FDVElWRSxlcjEKLQltb3YubAllcjEsQChUSV9QUkVfQ09VTlQ6MTYsZXI0KQotCWFuZGMJIzB4N2YsY2NyCisJc3VicwkjNCxlcjAJCQkvKiBlcjA6IHB0X3JlZ3MgKi8KKwlqc3IJQFNZTUJPTF9OQU1FKGRvX25vdGlmeV9yZXN1bWUpCisJYnJhCXJlc3RvcmVfYWxsOjgKK3dvcmtfcmVzY2hlZDoKKwltb3YubAlzcCxlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQogCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0Jc3ViLmwJZXIxLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0Jb3JjCSMweDgwLGNjcgotCWJyYQk0Yjo4Ci0jZW5kaWYKLWRvbmU6CisJYnJhCXJlc3VtZV91c2Vyc3BhY2U6OAorcmVzdG9yZV9hbGw6CiAJUkVTVE9SRV9BTEwJCQkvKiBEb2VzIFJURSAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKK3Jlc3VtZV9rZXJuZWw6CisJbW92LmwJQChUSV9QUkVfQ09VTlQ6MTYsZXI0KSxlcjAKKwlibmUJcmVzdG9yZV9hbGw6OAorbmVlZF9yZXNjaGVkOgorCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjAKKwlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIwbAorCWJlcQlyZXN0b3JlX2FsbDo4CisJbW92LmIJQChMQ0NSKzE6MTYsc3ApLHIwbAkvKiBJbnRlcnJ1cHQgRW5hYmxlZD8gKi8KKwlibWkJcmVzdG9yZV9hbGw6OAorCW1vdi5sCSNQUkVFTVBUX0FDVElWRSxlcjAKKwltb3YubAllcjAsQChUSV9QUkVfQ09VTlQ6MTYsZXI0KQorCWFuZGMJIzB4N2YsY2NyCisJbW92LmwJc3AsZXIwCisJanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKKwlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQorCW9yYwkjMHg4MCxjY3IKKwlicmEJbmVlZF9yZXNjaGVkOjgKKyNlbmRpZgorCitTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9mb3JrKQorCW1vdi5sCWVyMixlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlX3RhaWwpCisJam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCisKIFNZTUJPTF9OQU1FX0xBQkVMKHJlc3VtZSkKIAkvKgotCSAqCWVyMCA9IHByZXYKLQkgKgllcjEgPSBuZXh0Ci0JICoJcmV0dXJuIGxhc3QgaW4gZXIyCisJICogQmV3YXJlIC0gd2hlbiBlbnRlcmluZyByZXN1bWUsIG9mZnNldCBvZiB0c3MgaXMgaW4gZDEsCisJICogcHJldiAodGhlIGN1cnJlbnQgdGFzaykgaXMgaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykKKwkgKiBpcyBpbiBhMSBhbmQgZDIuYiBpcyBub24temVybyBpZiB0aGUgbW0gc3RydWN0dXJlIGlzCisJICogc2hhcmVkIGJldHdlZW4gdGhlIHRhc2tzLCBzbyBkb24ndCBjaGFuZ2UgdGhlc2UKKwkgKiByZWdpc3RlcnMgdW50aWwgdGhlaXIgY29udGVudHMgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAJICovCiAKIAkvKiBzYXZlIHNyICovCiAJc3ViLncJcjMscjMKIAlzdGMJY2NyLHIzbAotCXN0YwlleHIscjNoCiAJbW92LncJcjMsQChUSFJFQURfQ0NSKzI6MTYsZXIwKQogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCkBAIC0yOTEsNDEgKzM0OSw0NSBAQAogCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMwogCW1vdi5sCWVyMyxAKFRIUkVBRF9VU1A6MTYsZXIwKQogCW1vdi5sCXNwLEAoVEhSRUFEX0tTUDoxNixlcjApCi0JCisKIAkvKiBTa2lwIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoaW5nIGlmIHRoZXkgYXJlIHRoZSBzYW1lLiAqLwogCS8qIEZJWE1FOiB3aGF0IGRpZCB3ZSBoYWNrIG91dCBvZiBoZXJlLCB0aGlzIGRvZXMgbm90aGluZyEgKi8KIAogCW1vdi5sCUAoVEhSRUFEX1VTUDoxNixlcjEpLGVyMAogCW1vdi5sCWVyMCxAU1lNQk9MX05BTUUoc3dfdXNwKQogCW1vdi5sCUAoVEhSRUFEX0tTUDoxNixlcjEpLHNwCi0JCQkKKwogCS8qIHJlc3RvcmUgc3RhdHVzIHJlZ2lzdGVyICovCiAJbW92LncJQChUSFJFQURfQ0NSKzI6MTYsZXIxKSxyMwogCiAJbGRjCXIzbCxjY3IKLQlsZGMJcjNoLGV4cgotCiAJcnRzCiAKIFNZTUJPTF9OQU1FX0xBQkVMKHRyYWNlX2JyZWFrKQotCXN1YnMJIzQsc3AJCQkvKiBkdW1teSBMVkVDICovCisJc3VicwkjNCxzcAogCVNBVkVfQUxMCiAJc3ViLmwJZXIxLGVyMQogCWRlYy5sCSMxLGVyMQotCW1vdi5sCWVyMSxAKExPUklHLHNwKQkKKwltb3YubAllcjEsQChMT1JJRyxzcCkKIAltb3YubAlzcCxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQogCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMAogCW1vdi5sCUBlcjAsZXIxCisJbW92LncJQCgtMjoxNixlcjEpLHIyCisJY21wLncJIzB4NTczMCxyMgorCWJlcQkxZgogCXN1YnMJIzIsZXIxCi0JbW92LmwJZXIxLEBlcjAJCisJbW92LmwJZXIxLEBlcjAKKzE6CiAJYW5kLncJIzB4ZmYsZTEKIAltb3YubAllcjEsZXIwCiAJanNyCUBTWU1CT0xfTkFNRSh0cmFjZV90cmFwKQotCWptcAlAU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKQkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKIAogCS5zZWN0aW9uCS5ic3MKIFNZTUJPTF9OQU1FX0xBQkVMKHN3X2tzcCkKLQkuc3BhY2UJNAkKKwkuc3BhY2UJNAogU1lNQk9MX05BTUVfTEFCRUwoc3dfdXNwKQotCS5zcGFjZQk0CQorCS5zcGFjZQk0CisKKwkuZW5kCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGY0NzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvaW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKLSAqCi0gKiBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+Ci0gKgotICogQmFzZWQgb24gbGludXgvYXJjaC8kKEFSQ0gpL3BsYXRmb3JtLyQoUExBVEZPUk0pL2ludHMuYwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5NiBSb21hbiBaaXBwZWwKLSAqIENvcHlyaWdodCAxOTk5IEQuIEplZmYgRGlvbm5lIDxqZWZmQHJ0LWNvbnRyb2wuY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLQotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGhhcyBvbmx5IDQgZWxlbWVudHMgZm9yIHNwZWVkIHJlYXNvbnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaXJxX2hhbmRsZXIgewotCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCWludCAgICAgICAgIGZsYWdzOwotCWludCAgICAgICAgIGNvdW50OwotCXZvaWQJICAgICpkZXZfaWQ7Ci0JY29uc3QgY2hhciAgKmRldm5hbWU7Ci19IGlycV9oYW5kbGVyX3Q7Ci0KLXN0YXRpYyBpcnFfaGFuZGxlcl90ICppcnFfbGlzdFtOUl9JUlFTXTsKLXN0YXRpYyBpbnQgdXNlX2ttYWxsb2M7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nICppbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGU7Ci1leHRlcm4gY29uc3QgaW50IGg4MzAwX3NhdmVkX3ZlY3RvcnNbXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGg4MzAwX3RyYXBfdGFibGVbXTsKLWludCBoODMwMF9lbmFibGVfaXJxX3Bpbih1bnNpZ25lZCBpbnQgaXJxKTsKLXZvaWQgaDgzMDBfZGlzYWJsZV9pcnFfcGluKHVuc2lnbmVkIGludCBpcnEpOwotCi0jZGVmaW5lIENQVV9WRUNUT1IgKCh1bnNpZ25lZCBsb25nICopMHgwMDAwMDApCi0jZGVmaW5lIEFERFJfTUFTSyAoMHhmZmZmZmYpCi0KLSNpZiBkZWZpbmVkKENPTkZJR19SQU1LRVJORUwpCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgKmdldF92ZWN0b3JfYWRkcmVzcyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgKnJvbV92ZWN0b3IgPSBDUFVfVkVDVE9SOwotCXVuc2lnbmVkIGxvbmcgYmFzZSx0bXA7Ci0JaW50IHZlY19ubzsKLQotCWJhc2UgPSByb21fdmVjdG9yW0VYVF9JUlEwXSAmIEFERFJfTUFTSzsKLQkKLQkvKiBjaGVjayByb212ZWN0b3IgZm9ybWF0ICovCi0JZm9yICh2ZWNfbm8gPSBFWFRfSVJRMTsgdmVjX25vIDw9IEVYVF9JUlEwK0VYVF9JUlFTOyB2ZWNfbm8rKykgewotCQlpZiAoKGJhc2UrKHZlY19ubyAtIEVYVF9JUlEwKSo0KSAhPSAocm9tX3ZlY3Rvclt2ZWNfbm9dICYgQUREUl9NQVNLKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCS8qIHJhbXZlY3RvciBiYXNlIGFkZHJlc3MgKi8KLQliYXNlIC09IEVYVF9JUlEwKjQ7Ci0KLQkvKiB3cml0ZXJibGUgY2hlY2sgKi8KLQl0bXAgPSB+KCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpOwotCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiliYXNlKSA9IHRtcDsKLQlpZiAoKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpICE9IHRtcCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nICopYmFzZTsKLX0KLSNlbmRpZgotCi12b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQotewotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nICpyYW12ZWMsKnJhbXZlY19wOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRyYXBfZW50cnk7Ci0JY29uc3QgaW50ICpzYXZlZF92ZWN0b3I7Ci0KLQlyYW12ZWMgPSBnZXRfdmVjdG9yX2FkZHJlc3MoKTsKLQlpZiAocmFtdmVjID09IE5VTEwpCi0JCXBhbmljKCJpbnRlcnJ1cHQgdmVjdG9yIHNlcnVwIGZhaWxlZC4iKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gInZpcnR1YWwgdmVjdG9yIGF0IDB4JTA4bHhcbiIsKHVuc2lnbmVkIGxvbmcpcmFtdmVjKTsKLQotCS8qIGNyZWF0ZSByZWRpcmVjdCB0YWJsZSAqLwotCXJhbXZlY19wID0gcmFtdmVjOwotCXRyYXBfZW50cnkgPSBoODMwMF90cmFwX3RhYmxlOwotCXNhdmVkX3ZlY3RvciA9IGg4MzAwX3NhdmVkX3ZlY3RvcnM7Ci0JZm9yICggaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaWYgKGkgPT0gKnNhdmVkX3ZlY3RvcikgewotCQkJcmFtdmVjX3ArKzsKLQkJCXNhdmVkX3ZlY3RvcisrOwotCQl9IGVsc2UgewotCQkJaWYgKCBpIDwgTlJfVFJBUFMgKSB7Ci0JCQkJaWYgKCp0cmFwX2VudHJ5KQotCQkJCQkqcmFtdmVjX3AgPSBWRUNUT1IoKnRyYXBfZW50cnkpOwotCQkJCXJhbXZlY19wKys7Ci0JCQkJdHJhcF9lbnRyeSsrOwotCQkJfSBlbHNlCi0JCQkJKnJhbXZlY19wKysgPSBSRURJUkVDVChpbnRlcnJ1cHRfZW50cnkpOwotCQl9Ci0JfQotCWludGVycnVwdF9yZWRpcmVjdF90YWJsZSA9IHJhbXZlYzsKLSNpZmRlZiBEVU1QX1ZFQ1RPUgotCXJhbXZlY19wID0gcmFtdmVjOwotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaWYgKChpICUgOCkgPT0gMCkKLQkJCXByaW50ayhLRVJOX0RFQlVHICJcbiVwOiAiLHJhbXZlY19wKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVwICIsKnJhbXZlY19wKTsKLQkJcmFtdmVjX3ArKzsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi1pbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpcnFfaGFuZGxlcl90ICppcnFfaGFuZGxlOwotCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOUl9JUlFTKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaXJxX2xpc3RbaXJxXSB8fCAoaDgzMDBfZW5hYmxlX2lycV9waW4oaXJxKSA9PSAtRUJVU1kpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKHVzZV9rbWFsbG9jKQotCQlpcnFfaGFuZGxlID0ga21hbGxvYyhzaXplb2YoaXJxX2hhbmRsZXJfdCksIEdGUF9BVE9NSUMpOwotCWVsc2UgewotCQkvKiB1c2UgYm9vdG1lbSBhbGxvY2F0ZXIgKi8KLQkJaXJxX2hhbmRsZSA9IChpcnFfaGFuZGxlcl90ICopYWxsb2NfYm9vdG1lbShzaXplb2YoaXJxX2hhbmRsZXJfdCkpOwotCQlpcnFfaGFuZGxlID0gKGlycV9oYW5kbGVyX3QgKikoKHVuc2lnbmVkIGxvbmcpaXJxX2hhbmRsZSB8IDB4ODAwMDAwMDApOwotCX0KLQotCWlmIChpcnFfaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaXJxX2hhbmRsZS0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JaXJxX2hhbmRsZS0+ZmxhZ3MgICA9IGZsYWdzOwotCWlycV9oYW5kbGUtPmNvdW50ICAgPSAwOwotCWlycV9oYW5kbGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0JaXJxX2hhbmRsZS0+ZGV2bmFtZSA9IGRldm5hbWU7Ci0JaXJxX2xpc3RbaXJxXSA9IGlycV9oYW5kbGU7Ci0KLQlpZiAoaXJxX2hhbmRsZS0+ZmxhZ3MgJiBJUlFGX1NBTVBMRV9SQU5ET00pCi0JCXJhbmRfaW5pdGlhbGl6ZV9pcnEoaXJxKTsKLQotCWVuYWJsZV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2lycSk7Ci0KLXZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChpcnEgPj0gTlJfSVJRUykKLQkJcmV0dXJuOwotCi0JaWYgKCFpcnFfbGlzdFtpcnFdIHx8IGlycV9saXN0W2lycV0tPmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgaXJxLCBpcnFfbGlzdFtpcnFdLT5kZXZuYW1lKTsKLQlkaXNhYmxlX2lycShpcnEpOwotCWg4MzAwX2Rpc2FibGVfaXJxX3BpbihpcnEpOwotCWlmICgoKHVuc2lnbmVkIGxvbmcpaXJxX2xpc3RbaXJxXSAmIDB4ODAwMDAwMDApID09IDApIHsKLQkJa2ZyZWUoaXJxX2xpc3RbaXJxXSk7Ci0JCWlycV9saXN0W2lycV0gPSBOVUxMOwotCX0KLX0KLQotRVhQT1JUX1NZTUJPTChmcmVlX2lycSk7Ci0KLS8qCi0gKiBEbyB3ZSBuZWVkIHRoZXNlIHByb2JlIGZ1bmN0aW9ucyBvbiB0aGUgbTY4az8KLSAqLwotdW5zaWduZWQgbG9uZyBwcm9iZV9pcnFfb24gKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocHJvYmVfaXJxX29uKTsKLQotaW50IHByb2JlX2lycV9vZmYgKHVuc2lnbmVkIGxvbmcgaXJxcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb2ZmKTsKLQotdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGlycSA+PSBFWFRfSVJRMCAmJiBpcnEgPD0gKEVYVF9JUlEwICsgRVhUX0lSUVMpKQotCQlJRVJfUkVHUyB8PSAxIDw8IChpcnEgLSBFWFRfSVJRMCk7Ci19Ci0KLXZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID49IEVYVF9JUlEwICYmIGlycSA8PSAoRVhUX0lSUTAgKyBFWFRfSVJRUykpCi0JCUlFUl9SRUdTICY9IH4oMSA8PCAoaXJxIC0gRVhUX0lSUTApKTsKLX0KLQotYXNtbGlua2FnZSB2b2lkIHByb2Nlc3NfaW50KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlpcnFfZW50ZXIoKTsKLQloODMwMF9jbGVhcl9pc3IoaXJxKTsKLQlpZiAoaXJxID49IE5SX1RSQVBTICYmIGlycSA8IE5SX0lSUVMpIHsKLQkJaWYgKGlycV9saXN0W2lycV0pIHsKLQkJCWlycV9saXN0W2lycV0tPmhhbmRsZXIoaXJxLCBpcnFfbGlzdFtpcnFdLT5kZXZfaWQsIGZwKTsKLQkJCWlycV9saXN0W2lycV0tPmNvdW50Kys7Ci0JCQlpZiAoaXJxX2xpc3RbaXJxXS0+ZmxhZ3MgJiBJUlFGX1NBTVBMRV9SQU5ET00pCi0JCQkJYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGlycSk7Ci0JCX0KLQl9IGVsc2UgewotCQlCVUcoKTsKLQl9Ci0JaXJxX2V4aXQoKTsKLX0KLQotaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGkgPSAqKGxvZmZfdCAqKSB2OwotCi0JaWYgKChpIDwgTlJfSVJRUykgJiYgKGlycV9saXN0W2ldIT1OVUxMKSkgewotCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICUxMHUgIixpLGlycV9saXN0W2ldLT5jb3VudCk7Ci0JCXNlcV9wcmludGYocCwgIiVzXG4iLCBpcnFfbGlzdFtpXS0+ZGV2bmFtZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKQotewotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlbmFibGVfa21hbGxvYyh2b2lkKQotewotCXVzZV9rbWFsbG9jID0gMTsKLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwoZW5hYmxlX2ttYWxsb2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYwppbmRleCA4ZjI0MTFkLi5kMzJiYmYwIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTExLDEwICsxMTEsNyBAQAogICAgICAgLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KQEAgLTIxOSw3ICsyMTYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlKHZvaWQpCithc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZSh2b2lkKQogewogCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMDI5NTU2MC4uNjJlYTEyZCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTU0NywzICs1NDcsOSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworYXNtbGlua2FnZSB2b2lkIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHUzMiB0aHJlYWRfaW5mb19mbGFncykKK3sKKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spKQorCQlkb19zaWduYWwocmVncywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlCmluZGV4IGIyNGVhMDguLmM1MDk2MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogIyBSZXVzZSBhbnkgZmlsZXMgd2UgY2FuIGZyb20gdGhlIEg4LzMwMEgKICMKIAotb2JqLXkgOj0gZW50cnkubyBpcnFfcGluLm8gcHRyYWNlX2g4MzAwaC5vCitvYmoteSA6PSBpcnFfcGluLm8gcHRyYWNlX2g4MzAwaC5vCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2YWMzYi4uMDAwMDAwMAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qIC0qLSBtb2RlOiBhc20gLSotCi0gKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMKLSAqCi0gKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvcmdlLmpwPgotICogIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+Ci0gKgotICovCi0KLS8qCi0gKiAgZW50cnkuUwotICogIGluY2x1ZGUgZXhjZXB0aW9uL2ludGVycnVwdCBnYXRld2F5Ci0gKiAgICAgICAgICBzeXN0ZW0gY2FsbCBlbnRyeQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zeXMuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSNpbmNsdWRlIDxhc20vbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0JLmg4MzAwaAotCi0vKiBDUFUgY29udGV4dCBzYXZlL3Jlc3RvcmUgbWFjcm9zLiAqLwotCQotCS5tYWNybwlTQVZFX0FMTAotCW1vdi5sCWVyMCxALXNwCi0KLQlzdGMJY2NyLHIwbAkJCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwotCWJ0c3QJIzQscjBsCi0JYm5lCTVmCi0KLQltb3YubAlzcCxAU1lNQk9MX05BTUUoc3dfdXNwKQkJLyogdXNlciBtb2RlICovCi0JbW92LmwJQHNwLGVyMAotCW9yYwkjMHgxMCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfa3NwKSxzcAotCXN1Yi5sCSMoTFJFVC1MT1JJRyksc3AJCS8qIGFsbG9jYXRlIExPUklHIC0gTFJFVCAqLyAKLQltb3YubAllcjAsQC1zcAotCW1vdi5sCWVyMSxALXNwCi0JbW92LmwgICBAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubCAgIEAoODoxNixlcjApLGVyMSAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgUkVUIGFkZHIgKi8KLQltb3YubCAgIGVyMSxAKExSRVQtTEVSMToxNixzcCkKLQotCW1vdi53CWUxLHIxCQkJCS8qIGUxIGhpZ2hieXRlID0gY2NyICovCi0JYW5kCSMweGVmLHIxaAkJCS8qIG1hc2sgbW9kZT8gZmxhZyAqLwotCXN1Yi53CXIwLHIwCi0JbW92LmIJcjFoLHIwbAotCW1vdi53CXIwLEAoTENDUi1MRVIxOjE2LHNwKQkJLyogY29weSBjY3IgKi8KLQltb3YubAlAKExPUklHLUxFUjE6MTYsc3ApLGVyMAotCW1vdi5sCWVyMCxAKExFUjAtTEVSMToxNixzcCkJCS8qIGNvcHkgRVIwICovCi0JYnJhCTZmCi01OgotCW1vdi5sCUBzcCxlcjAJCQkJLyoga2VybmVsIG1vZGUgKi8KLQlzdWJzCSMyLHNwCQkJCS8qIGR1bW15IGNjciAqLwotCW1vdi5sCWVyMCxALXNwCi0JbW92LmwJZXIxLEAtc3AKLQltb3YudwlAKExSRVQtTEVSMToxNixzcCkscjEJCS8qIGNvcHkgb2xkIGNjciAqLwotCW1vdi5iCXIxaCxyMWwKLQltb3YuYgkjMCxyMWgKLQltb3YudwlyMSxAKExDQ1ItTEVSMToxNixzcCkJCS8qIHNldCBjY3IgKi8KLTY6Ci0JbW92LmwJZXIyLEAtc3AKLQltb3YubAllcjMsQC1zcAotCW1vdi5sCWVyNixALXNwCQkJLyogc3lzY2FsbCBhcmcgIzYgKi8KLQltb3YubAllcjUsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM1ICovCi0JbW92LmwJZXI0LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNCAqLwotCS5lbmRtCi0KLQkubWFjcm8JUkVTVE9SRV9BTEwKLQltb3YubAlAc3ArLGVyNAotCW1vdi5sCUBzcCssZXI1Ci0JbW92LmwJQHNwKyxlcjYKLQltb3YubAlAc3ArLGVyMwotCW1vdi5sCUBzcCssZXIyCi0JbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIwCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwotCWJ0c3QJIzQscjBsCi0JYm5lCTdmCi0KLQlvcmMJIzB4ODAsY2NyCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQChMRVIwLUxFUjE6MTYsc3ApLGVyMQkJLyogcmVzdG9yZSBFUjAgKi8KLQltb3YubAllcjEsQGVyMAotCW1vdi53CUAoTENDUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSB0aGUgUkVUIGFkZHIgKi8KLQltb3YuYglyMWwscjFoCi0JbW92LmIJQChMUkVUKzEtTEVSMToxNixzcCkscjFsCi0JbW92LncJcjEsZTEKLQltb3YudwlAKExSRVQrMi1MRVIxOjE2LHNwKSxyMQotCW1vdi5sCWVyMSxAKDg6MTYsZXIwKQotCi0JbW92LmwJQHNwKyxlcjEKLQlhZGQubAkjKExSRVQtTEVSMSksc3AJCQkvKiByZW1vdmUgTE9SSUcgLSBMUkVUICovIAotCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd19rc3ApCi0JbW92LmwJZXIwLHNwCi0JYnJhCThmCi03OgotCW1vdi5sCUBzcCssZXIxCi0JYWRkcwkjNCxzcAotCWFkZHMJIzIsc3AKLTg6Ci0JbW92LmwJQHNwKyxlcjAKLQlhZGRzCSM0LHNwCQkJCS8qIHJlbW92ZSB0aGUgc3cgY3JlYXRlZCBMVkVDICovCi0JcnRlCi0JLmVuZG0KLQkKLS5nbG9ibCBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCi0uZ2xvYmwgU1lNQk9MX05BTUUocmV0X2Zyb21fZm9yaykKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9pbnRlcnJ1cHQpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotLmdsb2JsIFNZTUJPTF9OQU1FKHN3X2tzcCksU1lNQk9MX05BTUUoc3dfdXNwKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJlc3VtZSkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQotLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQotLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQotCi0jaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQotSU5URVJSVVBUUyA9IDY0CQkKLQkuc2VjdGlvbiAuaW50X3JlZGlyZWN0LCJheCIKLVNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkucmVwdAk3Ci0JLmxvbmcJMAotCS5lbmRyCi0JanNyCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCS8qIE5NSSAqLwotCWptcAlAU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCS8qIFRSQVBBICMwIChTeXN0ZW0gY2FsbCkgKi8KLQkubG9uZwkwCi0JLmxvbmcJMAotCWptcAlAU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCS8qIFRSQVBBICMzIChicmVha3BvaW50KSAqLwotCS5yZXB0CUlOVEVSUlVQVFMtMTIKLQlqc3IJQFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkKLQkuZW5kcgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkuc2VjdGlvbiAuYnNzCi1TWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0JLnNwYWNlCTQKLSNlbmRpZgotCi0JLnNlY3Rpb24gLnRleHQKLQkuYWxpZ24JMgotU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X2VudHJ5KQotCVNBVkVfQUxMCi0JbW92LncJQChMQ0NSLHNwKSxyMAotCWJ0c3QJIzQscjBsCi0JYm5lCTFmCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCg0OjE2LGVyMCksZXIwCi0JYnJhCTJmCi0xOgotCW1vdi5sCUAoTFZFQyxzcCksZXIwCi0yOgotI2lmIGRlZmluZWQoQ09ORklHX1JPTUtFUk5FTCkKLQlzdWIubAkjU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKSxlcjAKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLQltb3YubAlAU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKSxlcjEKLQlzdWIubAllcjEsZXIwCi0jZW5kaWYKLQlzaGxyLmwJZXIwCi0Jc2hsci5sCWVyMAotCWRlYy5sCSMxLGVyMAotCW1vdi5sCXNwLGVyMQotCXN1YnMJIzQsZXIxCQkJCS8qIGFkanVzdCByZXRfcGMgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKGRvX0lSUSkKLQltb3YubAlAU1lNQk9MX05BTUUoaXJxX3N0YXQpK0NQVVNUQVRfU09GVElSUV9QRU5ESU5HLGVyMAotCWJlcQkxZgotCWpzcglAU1lNQk9MX05BTUUoZG9fc29mdGlycSkKLTE6Ci0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9pbnRlcnJ1cHQpCi0JCi1TWU1CT0xfTkFNRV9MQUJFTChzeXN0ZW1fY2FsbCkKLQlzdWJzCSM0LHNwCQkJCS8qIGR1bW15IExWRUMgKi8KLQlTQVZFX0FMTAotCW1vdi53CUAoTENDUjoxNixzcCkscjEKLQlic2V0CSM0LHIxbAotCWxkYwlyMWwsY2NyCi0JbW92LmwJZXIwLGVyNAotCW1vdi5sCSMtRU5PU1lTLGVyMAotCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCi0KLQkvKiBzYXZlIHRvcCBvZiBmcmFtZSAqLwotCW1vdi5sCXNwLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCi0JY21wLmwJI05SX3N5c2NhbGxzLGVyNAotCWJjYwlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjE2Ci0Jc2hsbC5sCWVyNAotCXNobGwubAllcjQKLQltb3YubAkjU1lNQk9MX05BTUUoc3lzX2NhbGxfdGFibGUpLGVyMAotCWFkZC5sCWVyNCxlcjAKLQltb3YubAlAZXIwLGVyNAotCWJlcQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjE2CQotCW1vdi5sCXNwLGVyMgotCWFuZC53CSMweGUwMDAscjIKLQltb3YuYglAKChUQVNLX0ZMQUdTKzMtKFRJRl9TWVNDQUxMX1RSQUNFID4+IDMpKToxNixlcjIpLHIybAotCWJ0c3QJIyhUSUZfU1lTQ0FMTF9UUkFDRSAmIDcpLHIybAotCWJuZQkxZgotCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCi0JbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKLQltb3YubAlAKExFUjM6MTYsc3ApLGVyMgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NBTExfUFJJTlQpCi0JanNyCUBTWU1CT0xfTkFNRShzeXNjYWxsX3ByaW50KQotI2VuZGlmCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAotMToKLQlqc3IJU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQltb3YubAlAKExFUjE6MTYsc3ApLGVyMAotCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCi0JbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKLQlqc3IJQGVyNAotCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfdHJhY2UpCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9mb3JrKQotCW1vdi5sCWVyMixlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlX3RhaWwpCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXNjaGVkdWxlKQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9leGNlcHRpb24pCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlvcmMJIzB4ODAsY2NyCi0jZW5kaWYKLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ludGVycnVwdCkKLQltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCi0JYnRzdAkjNCxyMGwJCQkvKiBjaGVjayBpZiByZXR1cm5pbmcgdG8ga2VybmVsICovCi0JYm5lCWRvbmU6OAkJCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMgKi8KLQlhbmRjCSMweDdmLGNjcgotCW1vdi5sCXNwLGVyNAotCWFuZC53CSMweGUwMDAscjQKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYW5kLmwJI19USUZfV09SS19NQVNLLGVyMQotCWJlcQlkb25lOjgKLTE6Ci0JbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMQotCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjFsCi0JYm5lCVNZTUJPTF9OQU1FKHJlc2NoZWR1bGUpOjE2Ci0JbW92LmwJc3AsZXIwCi0Jc3VicwkjNCxlcjAJCQkvKiBhZGp1c3QgcmV0cGMgKi8KLQltb3YubAllcjIsZXIxCi0JanNyCUBTWU1CT0xfTkFNRShkb19zaWduYWwpCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlicmEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi0zOgotCWJ0c3QJIzQscjBsCi0JYmVxCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotNDoKLQltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMQotCWJuZQlkb25lOjgKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQliZXEJZG9uZTo4Ci0JbW92LmIJcjBsLHIwbAotCWJwbAlkb25lOjgJCQkvKiBpbnRlcnJ1cHQgb2ZmIChleGNlcHRpb24gcGF0aD8pICovCi0JbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0JYW5kYwkjMHg3ZixjY3IKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQotCXN1Yi5sCWVyMSxlcjEKLQltb3YubAllcjEsQChUSV9QUkVfQ09VTlQ6MTYsZXI0KQotCW9yYwkjMHg4MCxjY3IKLQlicmEJNGI6OAotI2VuZGlmCi1kb25lOgotCVJFU1RPUkVfQUxMCQkJLyogRG9lcyBSVEUgKi8KLQotU1lNQk9MX05BTUVfTEFCRUwocmVzdW1lKQotCS8qCi0JICogQmV3YXJlIC0gd2hlbiBlbnRlcmluZyByZXN1bWUsIG9mZnNldCBvZiB0c3MgaXMgaW4gZDEsCi0JICogcHJldiAodGhlIGN1cnJlbnQgdGFzaykgaXMgaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykKLQkgKiBpcyBpbiBhMSBhbmQgZDIuYiBpcyBub24temVybyBpZiB0aGUgbW0gc3RydWN0dXJlIGlzCi0JICogc2hhcmVkIGJldHdlZW4gdGhlIHRhc2tzLCBzbyBkb24ndCBjaGFuZ2UgdGhlc2UKLQkgKiByZWdpc3RlcnMgdW50aWwgdGhlaXIgY29udGVudHMgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0KLQkvKiBzYXZlIHNyICovCi0Jc3ViLncJcjMscjMKLQlzdGMJY2NyLHIzbAotCW1vdi53CXIzLEAoVEhSRUFEX0NDUisyOjE2LGVyMCkKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCW9yYwkjMHg4MCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjMKLQltb3YubAllcjMsQChUSFJFQURfVVNQOjE2LGVyMCkKLQltb3YubAlzcCxAKFRIUkVBRF9LU1A6MTYsZXIwKQotCi0JLyogU2tpcCBhZGRyZXNzIHNwYWNlIHN3aXRjaGluZyBpZiB0aGV5IGFyZSB0aGUgc2FtZS4gKi8KLQkvKiBGSVhNRTogd2hhdCBkaWQgd2UgaGFjayBvdXQgb2YgaGVyZSwgdGhpcyBkb2VzIG5vdGhpbmchICovCi0KLQltb3YubAlAKFRIUkVBRF9VU1A6MTYsZXIxKSxlcjAKLQltb3YubAllcjAsQFNZTUJPTF9OQU1FKHN3X3VzcCkKLQltb3YubAlAKFRIUkVBRF9LU1A6MTYsZXIxKSxzcAotCQkJCi0JLyogcmVzdG9yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQltb3YudwlAKFRIUkVBRF9DQ1IrMjoxNixlcjEpLHIzCi0KLQlsZGMJcjNsLGNjcgotCXJ0cwotCQotU1lNQk9MX05BTUVfTEFCRUwodHJhY2VfYnJlYWspCi0Jc3VicwkjNCxzcAotCVNBVkVfQUxMCi0Jc3ViLmwJZXIxLGVyMQotCWRlYy5sCSMxLGVyMQotCW1vdi5sCWVyMSxAKExPUklHLHNwKQkKLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sCUBlcjAsZXIxCi0Jc3VicwkjMixlcjEKLQltb3YubAllcjEsQGVyMAkKLQlhbmQudwkjMHhmZixlMQotCW1vdi5sCWVyMSxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHRyYWNlX3RyYXApCi0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCQotCi0JLnNlY3Rpb24JLmJzcwotU1lNQk9MX05BTUVfTEFCRUwoc3dfa3NwKQotCS5zcGFjZQk0CQotU1lNQk9MX05BTUVfTEFCRUwoc3dfdXNwKQotCS5zcGFjZQk0CQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvTWFrZWZpbGUgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZQppbmRleCAwODQ3YjE1Li5iZjEyNDE4IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZQorKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZQpAQCAtNCw0ICs0LDQgQEAKICMgUmV1c2UgYW55IGZpbGVzIHdlIGNhbiBmcm9tIHRoZSBIOFMKICMKIAotb2JqLXkgOj0gZW50cnkubyBpbnRzX2g4cy5vIHB0cmFjZV9oOHMubworb2JqLXkgOj0gaW50c19oOHMubyBwdHJhY2VfaDhzLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggYjFiMmIzMC4uYzdjOWMyYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTEyMTIsMjEgKzEyMTIsMjYgQEAKIAogc291cmNlICJmcy9LY29uZmlnIgogCi1tZW51ICJJbnN0cnVtZW50YXRpb24gU3VwcG9ydCIKK21lbnVjb25maWcgSU5TVFJVTUVOVEFUSU9OCisJYm9vbCAiSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IHkKKworaWYgSU5TVFJVTUVOVEFUSU9OCiAKIHNvdXJjZSAiYXJjaC9pMzg2L29wcm9maWxlL0tjb25maWciCiAKIGNvbmZpZyBLUFJPQkVTCi0JYm9vbCAiS3Byb2JlcyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEtBTExTWU1TICYmIEVYUEVSSU1FTlRBTCAmJiBNT0RVTEVTCisJYm9vbCAiS3Byb2JlcyIKKwlkZXBlbmRzIG9uIEtBTExTWU1TICYmIE1PRFVMRVMKIAloZWxwCiAJICBLcHJvYmVzIGFsbG93cyB5b3UgdG8gdHJhcCBhdCBhbG1vc3QgYW55IGtlcm5lbCBhZGRyZXNzIGFuZAogCSAgZXhlY3V0ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgcmVnaXN0ZXJfa3Byb2JlKCkgZXN0YWJsaXNoZXMKIAkgIGEgcHJvYmVwb2ludCBhbmQgc3BlY2lmaWVzIHRoZSBjYWxsYmFjay4gIEtwcm9iZXMgaXMgdXNlZnVsCiAJICBmb3Iga2VybmVsIGRlYnVnZ2luZywgbm9uLWludHJ1c2l2ZSBpbnN0cnVtZW50YXRpb24gYW5kIHRlc3RpbmcuCiAJICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KLWVuZG1lbnUKKworZW5kaWYgIyBJTlNUUlVNRU5UQVRJT04KIAogc291cmNlICJhcmNoL2kzODYvS2NvbmZpZy5kZWJ1ZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCmluZGV4IGJkMjhmOWYuLjE4MWNjMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTEwOCw2ICsxMDgsNyBAQAogIyBtdXN0IGJlIGxpbmtlZCBhZnRlciBrZXJuZWwvCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkJKz0gYXJjaC9pMzg2L29wcm9maWxlLwogZHJpdmVycy0kKENPTkZJR19QTSkJCQkrPSBhcmNoL2kzODYvcG93ZXIvCitkcml2ZXJzLSQoQ09ORklHX0ZCKSAgICAgICAgICAgICAgICAgICAgKz0gYXJjaC9pMzg2L3ZpZGVvLwogCiBDRkxBR1MgKz0gJChtZmxhZ3MteSkKIEFGTEFHUyArPSAkKG1mbGFncy15KQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggNDExMmFmZS4uNDcwMDFkNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0yMjIsNiArMjIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KQEAgLTIzMTEsNyArMjMxMiw2IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJhcG0iLCBOVUxMKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Ja2FwbWRfdGFzay0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJd2FrZV91cF9wcm9jZXNzKGthcG1kX3Rhc2spOwogCiAJaWYgKG51bV9vbmxpbmVfY3B1cygpID4gMSAmJiAhc21wICkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwppbmRleCBmNzRkZmM0Li44MjcxNDY2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpAQCAtMTY4LDYgKzE2OCwxMiBAQAogLnNlY3Rpb24gLmluaXQudGV4dCwiYXgiLEBwcm9nYml0cwogI2VuZGlmCiAKKwkvKiBEbyBhbiBlYXJseSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZml4bWFwIGFyZWEgKi8KKwltb3ZsICQoc3dhcHBlcl9wZ19kaXIgLSBfX1BBR0VfT0ZGU0VUKSwgJWVkeAorCW1vdmwgJChzd2FwcGVyX3BnX3BtZCAtIF9fUEFHRV9PRkZTRVQpLCAlZWF4CisJYWRkbCAkMHgwMDcsICVlYXgJCQkvKiAweDAwNyA9IFBSRVNFTlQrUlcrVVNFUiAqLworCW1vdmwgJWVheCwgNDA5MiglZWR4KQorCiAjaWZkZWYgQ09ORklHX1NNUAogRU5UUlkoc3RhcnR1cF8zMl9zbXApCiAJY2xkCkBAIC01MDcsNiArNTEzLDggQEAKIC5zZWN0aW9uICIuYnNzLnBhZ2VfYWxpZ25lZCIsInciCiBFTlRSWShzd2FwcGVyX3BnX2RpcikKIAkuZmlsbCAxMDI0LDQsMAorRU5UUlkoc3dhcHBlcl9wZ19wbWQpCisJLmZpbGwgMTAyNCw0LDAKIEVOVFJZKGVtcHR5X3plcm9fcGFnZSkKIAkuZmlsbCA0MDk2LDEsMAogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDdmOGI3YWYuLjIxZGI4ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC02NjcsNiArNjY3LDcgQEAKIAkJc2V0X3BlbmRpbmdfaXJxKGksIGNwdW1hc2tfb2ZfY3B1KDApKTsKIAl9CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICggOyA7ICkgewogCQl0aW1lX3JlbWFpbmluZyA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lX3JlbWFpbmluZyk7CiAJCXRyeV90b19mcmVlemUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL2kzODYva2VybmVsL25taS5jCmluZGV4IGZiYTEyMWYuLjAzYjdmNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJbGFzdF9pcnFfc3VtcyBbTlJfQ1BVU10sCiAJYWxlcnRfY291bnRlciBbTlJfQ1BVU107CiAKLXZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQordm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX3dhdGNoZG9nID4gMCkgewogCQl1bnNpZ25lZCBjcHU7CkBAIC0zMDQsOCArMzA0LDEwIEBACiAJCSAqIEp1c3QgcmVzZXQgdGhlIGFsZXJ0IGNvdW50ZXJzLCAob3RoZXIgQ1BVcyBtaWdodCBiZQogCQkgKiBzcGlubmluZyBvbiBsb2NrcyB3ZSBob2xkKToKIAkJICovCi0JCWZvcl9lYWNoX3ByZXNlbnRfY3B1IChjcHUpCi0JCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJCWlmIChhbGVydF9jb3VudGVyW2NwdV0pCisJCQkJYWxlcnRfY291bnRlcltjcHVdID0gMDsKKwkJfQogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDA2ZGZhNjUuLjZjNDlhY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01MzgsOCArNTM4LDMxIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBub2lubGluZSB2b2lkIF9fc3dpdGNoX3RvX3h0cmEoc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCi0JCQkJICAgIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKK3ZvaWQgaGFyZF9kaXNhYmxlX1RTQyh2b2lkKQoreworCXdyaXRlX2NyNChyZWFkX2NyNCgpIHwgWDg2X0NSNF9UU0QpOworfQordm9pZCBkaXNhYmxlX1RTQyh2b2lkKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmICghdGVzdF9hbmRfc2V0X3RocmVhZF9mbGFnKFRJRl9OT1RTQykpCisJCS8qCisJCSAqIE11c3QgZmxpcCB0aGUgQ1BVIHN0YXRlIHN5bmNocm9ub3VzbHkgd2l0aAorCQkgKiBUSUZfTk9UU0MgaW4gdGhlIGN1cnJlbnQgcnVubmluZyBjb250ZXh0LgorCQkgKi8KKwkJaGFyZF9kaXNhYmxlX1RTQygpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9Cit2b2lkIGhhcmRfZW5hYmxlX1RTQyh2b2lkKQoreworCXdyaXRlX2NyNChyZWFkX2NyNCgpICYgflg4Nl9DUjRfVFNEKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLworCitzdGF0aWMgbm9pbmxpbmUgdm9pZAorX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXZfcCwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCisJCSBzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzKQogewogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0OwogCkBAIC01NTUsNiArNTc4LDE3IEBACiAJCXNldF9kZWJ1Z3JlZyhuZXh0LT5kZWJ1Z3JlZ1s3XSwgNyk7CiAJfQogCisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocHJldl9wLCBUSUZfTk9UU0MpIF4KKwkgICAgdGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfTk9UU0MpKSB7CisJCS8qIHByZXYgYW5kIG5leHQgYXJlIGRpZmZlcmVudCAqLworCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfTk9UU0MpKQorCQkJaGFyZF9kaXNhYmxlX1RTQygpOworCQllbHNlCisJCQloYXJkX2VuYWJsZV9UU0MoKTsKKwl9CisjZW5kaWYKKwogCWlmICghdGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfSU9fQklUTUFQKSkgewogCQkvKgogCQkgKiBEaXNhYmxlIHRoZSBiaXRtYXAgdmlhIGFuIGludmFsaWQgb2Zmc2V0LiBXZSBzdGlsbCBjYWNoZQpAQCAtNTg2LDMzICs2MjAsNiBAQAogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIHRoZSBjb250ZXh0IHN3aXRjaCBmcm9tIHByZXYgdG8gbmV4dAotICogaGFzIHRvIHR3ZWFrIHRoZSBUU0MgZGlzYWJsZSBiaXQgaW4gdGhlIGNyNC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfdHNjKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLAotCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wKQotewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqcHJldiwgKm5leHQ7Ci0KLQkvKgotCSAqIGdjYyBzaG91bGQgZWxpbWluYXRlIHRoZSAtPnRocmVhZF9pbmZvIGRlcmVmZXJlbmNlIGlmCi0JICogaGFzX3NlY3VyZV9jb21wdXRpbmcgcmV0dXJucyAwIGF0IGNvbXBpbGUgdGltZSAoU0VDQ09NUD1uKS4KLQkgKi8KLQlwcmV2ID0gdGFza190aHJlYWRfaW5mbyhwcmV2X3ApOwotCW5leHQgPSB0YXNrX3RocmVhZF9pbmZvKG5leHRfcCk7Ci0KLQlpZiAoaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgfHwgaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpIHsKLQkJLyogc2xvdyBwYXRoIGhlcmUgKi8KLQkJaWYgKGhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpICYmCi0JCSAgICAhaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpIHsKLQkJCXdyaXRlX2NyNChyZWFkX2NyNCgpICYgflg4Nl9DUjRfVFNEKTsKLQkJfSBlbHNlIGlmICghaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgJiYKLQkJCSAgIGhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKQotCQkJd3JpdGVfY3I0KHJlYWRfY3I0KCkgfCBYODZfQ1I0X1RTRCk7Ci0JfQotfQotCi0vKgogICoJc3dpdGNoX3RvKHgseW4pIHNob3VsZCBzd2l0Y2ggdGFza3MgZnJvbSB4IHRvIHkuCiAgKgogICogV2UgZnNhdmUvZndhaXQgc28gdGhhdCBhbiBleGNlcHRpb24gZ29lcyBvZmYgYXQgdGhlIHJpZ2h0IHRpbWUKQEAgLTY4OSwxMSArNjk2LDkgQEAKIAkvKgogCSAqIE5vdyBtYXliZSBoYW5kbGUgZGVidWcgcmVnaXN0ZXJzIGFuZC9vciBJTyBiaXRtYXBzCiAJICovCi0JaWYgKHVubGlrZWx5KCh0YXNrX3RocmVhZF9pbmZvKG5leHRfcCktPmZsYWdzICYgX1RJRl9XT1JLX0NUWFNXKQotCSAgICB8fCB0ZXN0X3Rza190aHJlYWRfZmxhZyhwcmV2X3AsIFRJRl9JT19CSVRNQVApKSkKLQkJX19zd2l0Y2hfdG9feHRyYShuZXh0X3AsIHRzcyk7Ci0KLQlkaXNhYmxlX3RzYyhwcmV2X3AsIG5leHRfcCk7CisJaWYgKHVubGlrZWx5KHRhc2tfdGhyZWFkX2luZm8ocHJldl9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1dfUFJFViB8fAorCQkgICAgIHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1dfTkVYVCkpCisJCV9fc3dpdGNoX3RvX3h0cmEocHJldl9wLCBuZXh0X3AsIHRzcyk7CiAKIAkvKgogCSAqIExlYXZlIGxhenkgbW9kZSwgZmx1c2hpbmcgYW55IGh5cGVyY2FsbHMgbWFkZSBoZXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMGMwY2VlYy4uMWMwNzVmNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCkBAIC0zNTgsMTcgKzM1OCw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8gCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsIGRhdGFwKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0zOTUsMTAgKzM4Nyw3IEBACiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCA5MGRhMDU3Li4xOGMxYzI4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBlc3A7CiAJCXVuc2lnbmVkIHNob3J0IHNzOwogCi0JCXJlcG9ydF9idWcocmVncy0+ZWlwKTsKKwkJcmVwb3J0X2J1ZyhyZWdzLT5laXAsIHJlZ3MpOwogCiAJCXByaW50ayhLRVJOX0VNRVJHICIlczogJTA0bHggWyMlZF1cbiIsIHN0ciwgZXJyICYgMHhmZmZmLCArK2RpZV9jb3VudGVyKTsKICNpZmRlZiBDT05GSUdfUFJFRU1QVApAQCAtNDMzLDYgKzQzMyw3IEBACiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CiAKIAlpZiAoIXJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvdmlkZW8vTWFrZWZpbGUgYi9hcmNoL2kzODYvdmlkZW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0NDdjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfRkIpICAgICAgICAgICAgICAgKz0gZmJkZXYubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMgYi9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGZiMzhkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGFyY2gvaTM4Ni92aWRlby9mYmRldi5jIC0gaTM4NiBGcmFtZWJ1ZmZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbnRvbmlubyBEYXBsYXMgPGFkYXBsYXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gaW5mby0+ZGV2aWNlOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoZGV2aWNlKQorCQlwY2lfZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCisJaWYgKHBjaV9kZXYpCisJCXJlcyA9ICZwY2lfZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKKworCWlmIChyZXMgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX1NIQURPVykKKwkJcmV0dmFsID0gMTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGZiX2lzX3ByaW1hcnlfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggZGI5ZGRmZi4uNjE2Yzk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTU4Miw4ICs1ODIsOCBAQAogc291cmNlICJhcmNoL2lhNjQvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKaW5kZXggYzFkY2EyMi4uY2Q0YWRmNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYworKysgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4gICAgICAgICAvKiBod2VpZ2h0NjQoKSAqLworI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KIAogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgkJLyogaWE2NF9nZXRfaXRjKCkgKi8KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTQzLDYgKzQ0LDggQEAKIAogI2luY2x1ZGUgPGFzbS9hY3BpLWV4dC5oPgogCitleHRlcm4gaW50IHN3aW90bGJfbGF0ZV9pbml0X3dpdGhfZGVmYXVsdF9zaXplIChzaXplX3Qgc2l6ZSk7CisKICNkZWZpbmUgUEZYICJJT0M6ICIKIAogLyoKQEAgLTIwMjYsMTEgKzIwMjksMjQgQEAKIAlpZiAoIWlhNjRfcGxhdGZvcm1faXMoImhwengxIikgJiYgIWlhNjRfcGxhdGZvcm1faXMoImhwengxX3N3aW90bGIiKSkKIAkJcmV0dXJuIDA7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpICYmIGRlZmluZWQoQ09ORklHX0NSQVNIX0RVTVApCisJLyogSWYgd2UgYXJlIGJvb3RpbmcgYSBrZHVtcCBrZXJuZWwsIHRoZSBzYmFfaW9tbXUgd2lsbAorCSAqIGNhdXNlIGRldmljZXMgdGhhdCB3ZXJlIG5vdCBzaHV0ZG93biBwcm9wZXJseSB0byBNQ0EKKwkgKiBhcyBzb29uIGFzIHRoZXkgYXJlIHR1cm5lZCBiYWNrIG9uLiAgT3VyIG9ubHkgb3B0aW9uIGZvcgorCSAqIGEgc3VjY2Vzc2Z1bCBrZHVtcCBrZXJuZWwgYm9vdCBpcyB0byB1c2UgdGhlIHN3aW90bGIuCisJICovCisJaWYgKGVsZmNvcmVoZHJfYWRkciA8IEVMRkNPUkVfQUREUl9NQVgpIHsKKwkJaWYgKHN3aW90bGJfbGF0ZV9pbml0X3dpdGhfZGVmYXVsdF9zaXplKDY0ICogKDE8PDIwKSkgIT0gMCkKKwkJCXBhbmljKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBzb2Z0d2FyZSBJL08gVExCOiIKKwkJCQkgICIgVHJ5IG1hY2h2ZWM9ZGlnIGJvb3Qgb3B0aW9uIik7CisJCW1hY2h2ZWNfaW5pdCgiZGlnIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCiAJYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3NiYV9pb2NfZHJpdmVyKTsKIAlpZiAoIWlvY19saXN0KSB7CiAjaWZkZWYgQ09ORklHX0lBNjRfR0VORVJJQwotCQlleHRlcm4gaW50IHN3aW90bGJfbGF0ZV9pbml0X3dpdGhfZGVmYXVsdF9zaXplIChzaXplX3Qgc2l6ZSk7Ci0KIAkJLyoKIAkJICogSWYgd2UgZGlkbid0IGZpbmQgc29tZXRoaW5nIHNiYV9pb21tdSBjYW4gY2xhaW0sIHdlCiAJCSAqIG5lZWQgdG8gc2V0dXAgdGhlIHN3aW90bGIgYW5kIHN3aXRjaCB0byB0aGUgZGlnIG1hY2h2ZWMuCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMgYi9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMKaW5kZXggMzAwYWNkOS4uMTE4OWQwMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYwpAQCAtMzI5LDExICszMjksNiBAQAogCXN0cmNweShzYWxfc3lzdGFiLT5wcm9kdWN0X2lkLCAiSFAtc2ltdWxhdG9yIik7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19JQTY0X1NEVgotCXN0cmNweShzYWxfc3lzdGFiLT5vZW1faWQsICJJbnRlbCIpOwotCXN0cmNweShzYWxfc3lzdGFiLT5wcm9kdWN0X2lkLCAiU0RWIik7Ci0jZW5kaWYKLQogCS8qIGZpbGwgaW4gYW4gZW50cnkgcG9pbnQ6ICovCiAJc2FsX2VkLT50eXBlID0gU0FMX0RFU0NfRU5UUllfUE9JTlQ7CiAJc2FsX2VkLT5wYWxfcHJvYyA9IF9fcGEocGFsX2Rlc2NbMF0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKaW5kZXggMzI0ZWE3NS4uZWYyNTJkZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCkBAIC0zNiwxMCArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaWZkZWYgQ09ORklHX0tEQgotIyBpbmNsdWRlIDxsaW51eC9rZGIuaD4KLSNlbmRpZgotCiAjdW5kZWYgU0lNU0VSSUFMX0RFQlVHCS8qIGRlZmluZSB0aGlzIHRvIGdldCBzb21lIGRlYnVnIGluZm9ybWF0aW9uICovCiAKICNkZWZpbmUgS0VZQk9BUkRfSU5UUgkzCS8qIG11c3QgbWF0Y2ggd2l0aCBzaW11bGF0b3IhICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYyBiL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jCmluZGV4IGMwNWJkYTYuLjZmNGQzZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVsZjMyX21hcCAoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSkKK2VsZjMyX21hcCAoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBwZ29mZiA9IChlcHBudC0+cF92YWRkcikgJiB+SUEzMl9QQUdFX01BU0s7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwppbmRleCA5OWI2NjVlLi4wNmVmZDFmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCkBAIC0zMDQsNyArMzA0LDcgQEAKIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkvKiBpbml0X21vZHVsZSAqLwogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGRlbGV0ZV9tb2R1bGUgKi8KIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkvKiBnZXRfa2VybmVsX3N5bXMgKi8gIC8qIDEzMCAqLwotCWRhdGE4IHN5c19xdW90YWN0bAorCWRhdGE4IHN5czMyX3F1b3RhY3RsCiAJZGF0YTggc3lzX2dldHBnaWQKIAlkYXRhOCBzeXNfZmNoZGlyCiAJZGF0YTggc3lzX25pX3N5c2NhbGwJLyogc3lzX2JkZmx1c2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCmluZGV4IDc1ZWMzNDcuLjczY2E4NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20va3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKaW5kZXggODU4OWU4NC4uM2Y5MjZjMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMKQEAgLTI0Nyw2ICsyNDcsOSBAQAogLnRpbWVfcmVkbzoKIAkucHJlZC5yZWwubXV0ZXggcDgscDkscDEwCiAJbGQ0LmFjcSByMjggPSBbcjI5XQkvLyB4dGltZV9sb2NrLnNlcXVlbmNlLiBNdXN0IGNvbWUgZmlyc3QgZm9yIGxvY2tpbmcgcHVycG9zZXMKKwk7OworCWFuZCByMjggPSB+MSxyMjgJLy8gTWFrZSBzZXF1ZW5jZSBldmVuIHRvIGZvcmNlIHJldHJ5IGlmIG9kZAorCTs7CiAocDgpCW1vdiByMiA9IGFyLml0YwkJLy8gQ1BVX1RJTUVSLiAzNiBjbG9ja3MgbGF0ZW5jeSEhIQogCWFkZCByMjIgPSBJQTY0X1RJTUVfSU5URVJQT0xBVE9SX0xBU1RfQ09VTlRFUl9PRkZTRVQscjIwCiAocDkpCWxkOCByMiA9IFtyMzBdCQkvLyByZWFkcSh0aS0+YWRkcmVzcykuIENvdWxkIGFsc28gaGF2ZSBsYXRlbmN5IGlzc3Vlcy4uCkBAIC0yODQsNyArMjg3LDYgQEAKIChwMTUpCWxkOCByMTcgPSBbcjE5XSwtSUE2NF9USU1FU1BFQ19UVl9OU0VDX09GRlNFVAogKHA3KQljbXAubmUgcDcscDAgPSByMjUscjMJLy8gaWYgY21weGNoZyBub3Qgc3VjY2Vzc2Z1bCByZWRvCiAJLy8gc2ltdWxhdGUgdGJpdC5uei5vciBwNyxwMCA9IHIyOCwwCi0JYW5kIHIyOCA9IH4xLHIyOAkvLyBNYWtlIHNlcXVlbmNlIGV2ZW4gdG8gZm9yY2UgcmV0cnkgaWYgb2RkCiAJZ2V0Zi5zaWcgcjIgPSBmOAogCW1mCiAJYWRkIHI4ID0gcjgscjE4CQkvLyBBZGQgdGltZSBpbnRlcnBvbGF0b3Igb2Zmc2V0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggMTg4ZmI3My4uNGQ5ODY0YyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtMzkwLDEwICszOTAsNiBAQAogCWlmICghZWZpX3NldHVwX3BjZHBfY29uc29sZShjbWRsaW5lKSkKIAkJZWFybHljb25zKys7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQotCWlmICghZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChjbWRsaW5lKSkKLQkJZWFybHljb25zKys7Ci0jZW5kaWYKIAogCXJldHVybiAoZWFybHljb25zKSA/IDAgOiAtMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwppbmRleCAxNWFkODVkLi4zYWVhZjE1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCkBAIC02OSw2ICs2OSw3IEBACiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllLmxvY2spOwogCiAJaWYgKHBhbmljX29uX29vcHMpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMgYi9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKaW5kZXggNDQxMWQ5Yi4uOWZjOTU1MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYwpAQCAtNjAsNiArNjAsNyBAQAogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwogCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3RjcHVkcF9ub2ZvbGQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBkb19jc3VtIChjb25zdCB1bnNpZ25lZCBjaGFyICosIGxvbmcpOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9od3BlcmYuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCmluZGV4IDZkYTk4NTQuLmRmOGQ1YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCkBAIC03NTAsOSArNzUwLDEwIEBACiAJCQlnb3RvIGVycm9yOwogCQl9IGVsc2UKIAkJaWYgKChyID0gc25faHdwZXJmX2VudW1fb2JqZWN0cygmbm9iaiwgJm9ianMpKSA9PSAwKSB7CisJCQlpbnQgY3B1b2JqX2luZGV4ID0gMDsKKwogCQkJbWVtc2V0KHAsIDAsIGEuc3opOwogCQkJZm9yIChpID0gMDsgaSA8IG5vYmo7IGkrKykgewotCQkJCWludCBjcHVvYmpfaW5kZXggPSAwOwogCQkJCWlmICghU05fSFdQRVJGX0lTX05PREUob2JqcyArIGkpKQogCQkJCQljb250aW51ZTsKIAkJCQlub2RlID0gc25faHdwZXJmX29ial90b19jbm9kZShvYmpzICsgaSk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IGMzYmI4YTc1Li44Y2NmM2U0IDEwMDY0NAotLS0gYS9hcmNoL20zMnIvS2NvbmZpZworKysgYi9hcmNoL20zMnIvS2NvbmZpZwpAQCAtMzEsNiArMzEsOSBAQAogY29uZmlnIE5PX0lPUE9SVAogCWRlZl9ib29sIHkKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sIHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNWYwMmIzMS4uNTdhOTJlZiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCkBAIC01OTUsNyArNTk1LDYgQEAKIHN0YXRpYyBpbnQKIGRvX3B0cmFjZShsb25nIHJlcXVlc3QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKQEAgLTYwNCwxMSArNjAzLDcgQEAKIAkgKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoKIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKHJldCA9PSBzaXplb2YodG1wKSkKLQkJCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAkvKgpAQCAtNjI0LDE1ICs2MTksOSBAQAogCSAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKGRhdGEpKSB7Ci0JCQlyZXQgPSAwOwotCQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1BPS0VURVhUKSB7Ci0JCQkJaW52YWxpZGF0ZV9jYWNoZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0ID0gLUVJTzsKLQkJfQorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CisJCWlmIChyZXQgPT0gMCAmJiByZXF1ZXN0ID09IFBUUkFDRV9QT0tFVEVYVCkKKwkJCWludmFsaWRhdGVfY2FjaGUoKTsKIAkJYnJlYWs7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMKaW5kZXggY2RiYTlmZC4uMmNmMDY5MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZS5jCkBAIC0xMjgsMTAgKzEyOCw3IEBACiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOgkvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJaSA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChpICE9IHNpemVvZih0bXApKQotCQkJZ290byBvdXRfZWlvOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopZGF0YSk7CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KQEAgLTE2MCw4ICsxNTcsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOgkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpICE9IHNpemVvZihkYXRhKSkKLQkJCWdvdG8gb3V0X2VpbzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCmluZGV4IGEyN2E0ZmEuLjRlMjc1MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKQEAgLTExNzAsNiArMTE3MCw3IEBACiAJY29uc29sZV92ZXJib3NlKCk7CiAJcHJpbnRrKCIlczogJTA4eFxuIixzdHIsbnIpOwogCXNob3dfcmVnaXN0ZXJzKGZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKaW5kZXggY2Y2YmI1MS4uNjIxNmYxMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYwpAQCAtNDIyLDMgKzQyMiw0IEBACiAJICAgICk7CiAgICAgcmV0dXJuKHN1bSk7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOTQxOTU1ZC4uODQ2Zjk3NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNzcsNyArMzc3LDcgQEAKIAlmcCA9ICgoc3RydWN0IHN3aXRjaF9zdGFjayAqKXAtPnRocmVhZC5rc3ApLT5hNjsKIAlkbyB7CiAJCWlmIChmcCA8IHN0YWNrX3BhZ2Urc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgfHwKLQkJICAgIGZwID49IDgxODQrc3RhY2tfcGFnZSkKKwkJICAgIGZwID49IFRIUkVBRF9TSVpFLTgrc3RhY2tfcGFnZSkKIAkJCXJldHVybiAwOwogCQlwYyA9ICgodW5zaWduZWQgbG9uZyAqKWZwKVsxXTsKIAkJaWYgKCFpbl9zY2hlZF9mdW5jdGlvbnMocGMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jCmluZGV4IGY1NGI2YTMuLmVmNzBjYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHRyYWNlLmMKQEAgLTEwNiwxNyArMTA2LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCQljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovIAotCQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCQlpbnQgY29waWVkOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJYnJlYWs7Ci0JCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7CisJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7Ci0JCX0KIAogCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTU5LDEwICsxNTEsNyBAQAogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYwppbmRleCA4MTMzYjEwLi44MGY0ZTlkIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYwpAQCAtMSw4ICsxLDggQEAKIC8qCiAgKiAgbGludXgvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk4LDE5OTkgIEQuIEplZmYgRGlvbm5lIDxqZWZmQGxpbmVvLmNhPgorICogIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQorICogIENvcHlyaWdodCAoQykgMTk5OCwxOTk5ICBELiBKZWZmIERpb25uZSA8amVmZkB1Q2xpbnV4Lm9yZz4KICAqICBDb3B5bGVmdCAgKCkpIDIwMDAgICAgICAgSmFtZXMgRC4gU2NoZXR0aW5lIHtqYW1lc0B0ZWxvcy1zeXN0ZW1zLmNvbX0KICAqICBDb3B5cmlnaHQgKEMpIDE5OTggICAgICAgS2VubmV0aCBBbGJhbm93c2tpIDxramFoZHNAa2phaGRzLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDE5OTUgICAgICAgSGFtaXNoIE1hY2RvbmFsZApAQCAtMjAsMTcgKzIwLDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTQ2LDM0ICs0MiwxOSBAQAogCiBjaGFyIF9faW5pdGRhdGEgY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKIAotLyogc2V0dXAgc29tZSBkdW1teSByb3V0aW5lcyAqLwotc3RhdGljIHZvaWQgZHVtbXlfd2FpdGJ1dCh2b2lkKQotewotfQordm9pZCAoKm1hY2hfdHJhcF9pbml0KSh2b2lkKTsKIAotdm9pZCAoKm1hY2hfc2NoZWRfaW5pdCkgKGlycV9oYW5kbGVyX3QgaGFuZGxlcik7Ci12b2lkICgqbWFjaF90aWNrKSggdm9pZCApOwotLyogbWFjaGluZSBkZXBlbmRlbnQga2V5Ym9hcmQgZnVuY3Rpb25zICovCi1pbnQgKCptYWNoX2tleWJfaW5pdCkgKHZvaWQpOwotaW50ICgqbWFjaF9rYmRyYXRlKSAoc3RydWN0IGtiZF9yZXBlYXQgKik7Ci12b2lkICgqbWFjaF9rYmRfbGVkcykgKHVuc2lnbmVkIGludCk7Ci0vKiBtYWNoaW5lIGRlcGVuZGVudCBpcnEgZnVuY3Rpb25zICovCi12b2lkICgqbWFjaF9pbml0X0lSUSkgKHZvaWQpOwotaXJxX2hhbmRsZXJfdCBtYWNoX2RlZmF1bHRfaGFuZGxlcjsKLWludCAoKm1hY2hfZ2V0X2lycV9saXN0KSAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Ci12b2lkICgqbWFjaF9wcm9jZXNzX2ludCkgKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7Ci12b2lkICgqbWFjaF90cmFwX2luaXQpICh2b2lkKTsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IHRpbWVyIGZ1bmN0aW9ucyAqLwotdW5zaWduZWQgbG9uZyAoKm1hY2hfZ2V0dGltZW9mZnNldCkgKHZvaWQpOwotdm9pZCAoKm1hY2hfZ2V0dG9kKSAoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7Ci1pbnQgKCptYWNoX2h3Y2xrKSAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUqKTsKLWludCAoKm1hY2hfc2V0X2Nsb2NrX21tc3MpICh1bnNpZ25lZCBsb25nKTsKLXZvaWQgKCptYWNoX21rc291bmQpKCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCB0aWNrcyApOwotdm9pZCAoKm1hY2hfcmVzZXQpKCB2b2lkICk7Ci12b2lkICgqd2FpdGJ1dCkodm9pZCkgPSBkdW1teV93YWl0YnV0Owotdm9pZCAoKm1hY2hfZGVidWdfaW5pdCkodm9pZCk7Ci12b2lkICgqbWFjaF9oYWx0KSggdm9pZCApOwotdm9pZCAoKm1hY2hfcG93ZXJfb2ZmKSggdm9pZCApOwordm9pZCAoKm1hY2hfc2NoZWRfaW5pdCkoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKK3ZvaWQgKCptYWNoX3RpY2spKHZvaWQpOwordm9pZCAoKm1hY2hfZ2V0dG9kKShpbnQqLCBpbnQqLCBpbnQqLCBpbnQqLCBpbnQqLCBpbnQqKTsKK2ludCAoKm1hY2hfc2V0X2Nsb2NrX21tc3MpKHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgbG9uZyAoKm1hY2hfZ2V0dGltZW9mZnNldCkodm9pZCk7CisKKy8qIG1hY2hpbmUgZGVwZW5kZW50IHJlYm9vdCBmdW5jdGlvbnMgKi8KK3ZvaWQgKCptYWNoX3Jlc2V0KSh2b2lkKTsKK3ZvaWQgKCptYWNoX2hhbHQpKHZvaWQpOwordm9pZCAoKm1hY2hfcG93ZXJfb2ZmKSh2b2lkKTsKIAogCiAjaWZkZWYgQ09ORklHX002ODAwMApAQCAtMTM0LDEzICsxMTUsNiBAQAogCSNkZWZpbmUJQ1BVICJVTktOT1dOIgogI2VuZGlmCiAKLS8qIChlcykgKi8KLS8qIG5vdGU6IHdoeSBpcyB0aGlzIGRlZmluZWQgaGVyZT8gIHRoZSBtdXN0IGJlIGEgYmV0dGVyIHBsYWNlIHRvIHB1dCB0aGlzICovCi0jaWYgZGVmaW5lZCggQ09ORklHX1RFTE9TKSB8fCBkZWZpbmVkKCBDT05GSUdfVUNESU1NICkgfHwgZGVmaW5lZCggQ09ORklHX1VDU0lNTSApIHx8IGRlZmluZWQoQ09ORklHX0RSQUdFTjIpIHx8IChkZWZpbmVkKCBDT05GSUdfUElMT1QgKSAmJiBkZWZpbmVkKCBDT05GSUdfTTY4MzI4ICkpCi0jZGVmaW5lIENBVF9ST01BUlJBWQotI2VuZGlmCi0vKiAoL2VzKSAqLwotCiBleHRlcm4gaW50IF9zdGV4dCwgX2V0ZXh0LCBfc2RhdGEsIF9lZGF0YSwgX3Nic3MsIF9lYnNzLCBfZW5kOwogZXh0ZXJuIGludCBfcmFtc3RhcnQsIF9yYW1lbmQ7CiAKQEAgLTE0OCwxNSArMTIyLDggQEAKIHsKIAlpbnQgYm9vdG1hcF9zaXplOwogCi0jaWYgZGVmaW5lZChDQVRfUk9NQVJSQVkpICYmIGRlZmluZWQoREVCVUcpCi0JZXh0ZXJuIGludCBfX2RhdGFfcm9tX3N0YXJ0OwotCWV4dGVybiBpbnQgX19kYXRhX3N0YXJ0OwotCWludCAqcm9tYXJyYXkgPSAoaW50ICopKChpbnQpICZfX2RhdGFfcm9tX3N0YXJ0ICsKLQkJCSAgICAgIChpbnQpJl9lZGF0YSAtIChpbnQpJl9fZGF0YV9zdGFydCk7Ci0jZW5kaWYKLQogCW1lbW9yeV9zdGFydCA9IFBBR0VfQUxJR04oX3JhbXN0YXJ0KTsKLQltZW1vcnlfZW5kID0gX3JhbWVuZDsgLyogYnkgbm93IHRoZSBzdGFjayBpcyBwYXJ0IG9mIHRoZSBpbml0IHRhc2sgKi8KKwltZW1vcnlfZW5kID0gX3JhbWVuZDsKIAogCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX3N0ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKQEAgLTIyMCwxMSArMTg3LDcgQEAKIAkJKGludCkgJl9zYnNzLCAoaW50KSAmX2Vic3MpOwogCXByaW50ayhLRVJOX0RFQlVHICJLRVJORUwgLT4gUk9NRlM9MHglMDZ4LTB4JTA2eCBNRU09MHglMDZ4LTB4JTA2eCAiCiAJCSJTVEFDSz0weCUwNngtMHglMDZ4XG4iLAotI2lmZGVmIENBVF9ST01BUlJBWQotCQkoaW50KSByb21hcnJheSwgKChpbnQpIHJvbWFycmF5KSArIHJvbWFycmF5WzJdLAotI2Vsc2UKIAkJKGludCkgJl9lYnNzLCAoaW50KSBtZW1vcnlfc3RhcnQsCi0jZW5kaWYKIAkJKGludCkgbWVtb3J5X3N0YXJ0LCAoaW50KSBtZW1vcnlfZW5kLAogCQkoaW50KSBtZW1vcnlfZW5kLCAoaW50KSBfcmFtZW5kKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYwppbmRleCBiZWQ1ZjQ3Li5mZGUwNGUxIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYwpAQCAtODMsNiArODMsNyBAQAogCXByaW50ayhLRVJOX0VNRVJHICJQcm9jZXNzICVzIChwaWQ6ICVkLCBzdGFja3BhZ2U9JTA4bHgpXG4iLAogCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIFBBR0VfU0laRSsodW5zaWduZWQgbG9uZyljdXJyZW50KTsKIAlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nICopZnApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWRvX2V4aXQoU0lHU0VHVik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jIGIvYXJjaC9tNjhrbm9tbXUvbW0vbWVtb3J5LmMKaW5kZXggNDExZTQ1Mi4uMWE2NmI3MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvbW0vbWVtb3J5LmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvbW0vbWVtb3J5LmMKQEAgLTE3LDkwICsxNywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAvKgotICogY2FjaGVfY2xlYXIoKSBzZW1hbnRpY3M6IENsZWFyIGFueSBjYWNoZSBlbnRyaWVzIGZvciB0aGUgYXJlYSBpbiBxdWVzdGlvbiwKLSAqIHdpdGhvdXQgd3JpdGluZyBiYWNrIGRpcnR5IGVudHJpZXMgZmlyc3QuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBkYXRhIHdpbGwKLSAqIGJlIG92ZXJ3cml0dGVuIGFueXdheSwgZS5nLiBieSBETUEgdG8gbWVtb3J5LiBUaGUgcmFuZ2UgaXMgZGVmaW5lZCBieSBhCi0gKiBfcGh5c2ljYWxfIGFkZHJlc3MuCi0gKi8KLQotdm9pZCBjYWNoZV9jbGVhciAodW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGxlbikKLXsKLX0KLQotCi0vKgotICoJRGVmaW5lIGNhY2hlIGludmFsaWRhdGUgZnVuY3Rpb25zLiBUaGUgQ29sZEZpcmUgNTQwNyBpcyByZWFsbHkKLSAqCXRoZSBvbmx5IHByb2Nlc3NvciB0aGF0IG5lZWRzIHRvIGRvIHNvbWUgd29yayBoZXJlLiBBbnl0aGluZwotICoJdGhhdCBoYXMgc2VwYXJhdGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGVzIHdpbGwgYmUgYSBwcm9ibGVtLgotICovCi0jaWZkZWYgQ09ORklHX001NDA3Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY2FjaGVfaW52YWxpZGF0ZV9saW5lcyh1bnNpZ25lZCBsb25nIHBhZGRyLCBpbnQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcJc3NldCwgZXNldDsKLQotCXNzZXQgPSAocGFkZHIgJiAweDAwMDAwZmYwKTsKLQllc2V0ID0gKChwYWRkciArIGxlbikgJiAweDAwMDBmZjApICsgMHgxMDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIm5vcFxuXHQiCi0JCSJjbHJsCSUlZDBcblx0IgotCQkiMTpcblx0IgotCQkibW92ZWwJJTAsJSVhMFxuXHQiCi0JCSJhZGRsCSUlZDAsJSVhMFxuXHQiCi0JCSIyOlxuXHQiCi0JCSIud29yZAkweGY0ZThcblx0IgotCQkiYWRkbAkjMHgxMCwlJWEwXG5cdCIKLQkJImNtcGwJJTEsJSVhMFxuXHQiCi0JCSJibHQJMmJcblx0IgotCQkiYWRkcWwJIzEsJSVkMFxuXHQiCi0JCSJjbXBpbAkjNCwlJWQwXG5cdCIKLQkJImJuZQkxYiIKLQkJOiA6ICJhIiAoc3NldCksICJhIiAoZXNldCkgOiAiZDAiLCAiYTAiICk7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lCWNhY2hlX2ludmFsaWRhdGVfbGluZXMoYSxiKQotI2VuZGlmCi0KLQotLyoKLSAqIGNhY2hlX3B1c2goKSBzZW1hbnRpY3M6IFdyaXRlIGJhY2sgYW55IGRpcnR5IGNhY2hlIGRhdGEgaW4gdGhlIGdpdmVuIGFyZWEsCi0gKiBhbmQgaW52YWxpZGF0ZSB0aGUgcmFuZ2UgaW4gdGhlIGluc3RydWN0aW9uIGNhY2hlLiBJdCBuZWVkcyBub3QgKGJ1dCBtYXkpCi0gKiBpbnZhbGlkYXRlIHRob3NlIGVudHJpZXMgYWxzbyBpbiB0aGUgZGF0YSBjYWNoZS4gVGhlIHJhbmdlIGlzIGRlZmluZWQgYnkgYQotICogX3BoeXNpY2FsXyBhZGRyZXNzLgotICovCi0KLXZvaWQgY2FjaGVfcHVzaCAodW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGxlbikKLXsKLQljYWNoZV9pbnZhbGlkYXRlX2xpbmVzKHBhZGRyLCBsZW4pOwotfQotCi0KLS8qCi0gKiBjYWNoZV9wdXNoX3YoKSBzZW1hbnRpY3M6IFdyaXRlIGJhY2sgYW55IGRpcnR5IGNhY2hlIGRhdGEgaW4gdGhlIGdpdmVuCi0gKiBhcmVhLCBhbmQgaW52YWxpZGF0ZSB0aG9zZSBlbnRyaWVzIGF0IGxlYXN0IGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gVGhpcwotICogaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhZnRlciBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYXMKLSAqIGNvZGUgbGF0ZXIuIFRoZSByYW5nZSBpcyBkZWZpbmVkIGJ5IGEgX3VzZXJfbW9kZV8gX3ZpcnR1YWxfIGFkZHJlc3MgIChvciwKLSAqIG1vcmUgZXhhY3RseSwgdGhlIHNwYWNlIGlzIGRlZmluZWQgYnkgdGhlICVzZmMvJWRmYyByZWdpc3Rlci4pCi0gKi8KLQotdm9pZCBjYWNoZV9wdXNoX3YgKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBsZW4pCi17Ci0JY2FjaGVfaW52YWxpZGF0ZV9saW5lcyh2YWRkciwgbGVuKTsKLX0KLQotLyogTWFwIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyByYW5nZSBpbnRvIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4gVGhlCi0gKiBjb2RlIGlzIGNvcGllZCBhbmQgYWRhcHRlZCBmcm9tIG1hcF9jaHVuaygpLgorICogTWFwIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyByYW5nZSBpbnRvIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KKyAqIFRoZSBjb2RlIGlzIGNvcGllZCBhbmQgYWRhcHRlZCBmcm9tIG1hcF9jaHVuaygpLgogICovCiAKIHVuc2lnbmVkIGxvbmcga2VybmVsX21hcCh1bnNpZ25lZCBsb25nIHBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYwppbmRleCBiNWE3YjQ2Li44OTNlN2JjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKQEAgLTE3NCwxNyArMTc0LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0zMTMsMTEgKzMwNSw3IEBACiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkKLQkJICAgID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IDM3YzU2MmMuLmNlMjc3Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTMyNiw2ICszMjYsNyBAQAogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAlwcmludGsoIiVzWyMlZF06XG4iLCBzdHIsICsrZGllX2NvdW50ZXIpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc2V0dXAuYwppbmRleCBiZGFhYzM0Li44OWYyOTIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc2V0dXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvc2V0dXAuYwpAQCAtMzEsNiArMzEsNyBAQAogdW5zaWduZWQgaW50IHNiMV9wYXNzOwogdW5zaWduZWQgaW50IHNvY19wYXNzOwogdW5zaWduZWQgaW50IHNvY190eXBlOworRVhQT1JUX1NZTUJPTChzb2NfdHlwZSk7CiB1bnNpZ25lZCBpbnQgcGVyaXBoX3JldjsKIHVuc2lnbmVkIGludCB6YmJ1c19taHo7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NldHVwLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jCmluZGV4IGY0YTYxNjkuLjJkNWM2ZDhiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogRVhQT1JUX1NZTUJPTCh6YmJ1c19taHopOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCmluZGV4IDhhMGRiMzcuLjI2ZWM3NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTg3LDEwICs4Nyw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKIAljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQlpbnQgY29waWVkOwotCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJCWlmIChfX2lzX2NvbXBhdF90YXNrKGNoaWxkKSkgeworCQkJaW50IGNvcGllZDsKIAkJCXVuc2lnbmVkIGludCB0bXA7CiAKIAkJCWFkZHIgJj0gMHhmZmZmZmZmZkw7CkBAIC0xMDUsMTUgKzEwNCw3IEBACiAJCX0KIAkJZWxzZQogI2VuZGlmCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJZ290byBvdXRfdHNrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQl9CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0X3RzazsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKaW5kZXggYzNlYzlmMS4uYmJmMDI5YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKQEAgLTI2NCw2ICsyNjQsNyBAQAogCiAJc2hvd19yZWdzKHJlZ3MpOwogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMwMiw3ICszMDMsNyBAQAogCWlmICh1bmxpa2VseShpaXIgPT0gUEFSSVNDX0JVR19CUkVBS19JTlNOICYmICF1c2VyX21vZGUocmVncykpKSB7CiAJCS8qIGNoZWNrIGlmIGEgQlVHKCkgb3IgV0FSTigpIHRyYXBwZWQgaGVyZS4gICovCiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0dDsKLQkJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPmlhb3FbMF0gJiB+Myk7CisJCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5pYW9xWzBdICYgfjMsIHJlZ3MpOwogCQlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5pYW9xWzBdICs9IDQ7CiAJCQlyZWdzLT5pYW9xWzFdICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKaW5kZXggMzIyMTY3Ny4uY2Y3ODBjYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJCS8qIEhhbmRsZSBzb21lIGZyZXF1ZW50IHNwZWNpYWwgY2FzZXMuLi4uICovCiAJCXsKLQkJCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCQkJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCQkJY2hhciAqbW9kbmFtZTsKIAogCQkJa2FsbHN5bXNfbG9va3VwKGluZm8tPmlwLCBOVUxMLCBOVUxMLCAmbW9kbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNmJlZWUzMi4uZDg2MGI2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTQsMTcgKzQsNyBAQAogCiBtYWlubWVudSAiTGludXgvUG93ZXJQQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAotY29uZmlnIFBQQzY0Ci0JYm9vbCAiNjQtYml0IGtlcm5lbCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCi0JICB3aWxsIGJlIGJ1aWx0LgotCi1jb25maWcgUFBDX1BNX05FRURTX1JUQ19MSUIKLQlib29sCi0Jc2VsZWN0IFJUQ19MSUIKLQlkZWZhdWx0IHkgaWYgUE0KK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUiCiAKIGNvbmZpZyBQUEMzMgogCWJvb2wKQEAgLTY2LDYgKzU2LDkgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX05PX1ZJUlRfVE9fQlVTCisJZGVmX2Jvb2wgUFBDNjQKKwogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTEzMiwxMjMgKzEyNSw2IEBACiAJZGVwZW5kcyBvbiBQUEM2NCAmJiAoQlJPS0VOIHx8IChQUENfUE1BQzY0ICYmIEVYUEVSSU1FTlRBTCkpCiAJZGVmYXVsdCB5CiAKLW1lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgotY2hvaWNlCi0JcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKLQlkZXBlbmRzIG9uIFBQQzMyCi0JZGVmYXVsdCA2eHgKLQotY29uZmlnIENMQVNTSUMzMgotCWJvb2wgIjUyeHgvNnh4Lzd4eC83NHh4IgotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IDZ4eAotCWhlbHAKLQkgIFRoZXJlIGFyZSBmb3VyIGZhbWlsaWVzIG9mIFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLiAgVGhlIG1vcmUgY29tbW9uCi0JICB0eXBlcyAoNjAxLCA2MDMsIDYwNCwgNzQwLCA3NTAsIDc0MDApLCB0aGUgTW90b3JvbGEgZW1iZWRkZWQKLQkgIHZlcnNpb25zICg4MjEsIDgyMywgODUwLCA4NTUsIDg2MCwgNTJ4eCwgODJ4eCwgODN4eCksIHRoZSBBTUNDCi0JICBlbWJlZGRlZCB2ZXJzaW9ucyAoNDAzIGFuZCA0MDUpIGFuZCB0aGUgaGlnaCBlbmQgNjQgYml0IFBvd2VyCi0JICBwcm9jZXNzb3JzIChQT1dFUiAzLCBQT1dFUjQsIGFuZCBJQk0gUFBDOTcwIGFsc28ga25vd24gYXMgRzUpLgotCi0JICBUaGlzIG9wdGlvbiBpcyB0aGUgY2F0Y2gtYWxsIGZvciA2eHggdHlwZXMsIGluY2x1ZGluZyBzb21lIG9mIHRoZQotCSAgZW1iZWRkZWQgdmVyc2lvbnMuICBVbmxlc3MgdGhlcmUgaXMgc2VlIGFuIG9wdGlvbiBmb3IgdGhlIHNwZWNpZmljCi0JICBjaGlwIGZhbWlseSB5b3UgYXJlIHVzaW5nLCB5b3Ugd2FudCB0aGlzIG9wdGlvbi4KLQkgIAotCSAgWW91IGRvIG5vdCB3YW50IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSA2NCBiaXQKLQkgIElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgotCSAgCi0JICBJZiB1bnN1cmUsIHNlbGVjdCB0aGlzIG9wdGlvbgotCSAgCi0JICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBydW5zIGluIDMyLWJpdCBtb2RlIGV2ZW4gb24gNjQtYml0IGNoaXBzLgotCi1jb25maWcgUFBDXzgyeHgKLQlib29sICJGcmVlc2NhbGUgODJ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IFBQQ19GUFUKLQotY29uZmlnIFBQQ184M3h4Ci0JYm9vbCAiRnJlZXNjYWxlIDgzeHgiCi0Jc2VsZWN0IDZ4eAotCXNlbGVjdCBGU0xfU09DCi0Jc2VsZWN0IDgzeHgKLQlzZWxlY3QgUFBDX0ZQVQotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODV4eAotCWJvb2wgIkZyZWVzY2FsZSA4NXh4IgotCXNlbGVjdCBFNTAwCi0Jc2VsZWN0IEZTTF9TT0MKLQlzZWxlY3QgODV4eAotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODZ4eAotCWJvb2wgIkZyZWVzY2FsZSA4Nnh4IgotCXNlbGVjdCA2eHgKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCBGU0xfUENJRQotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IEFMVElWRUMKLQloZWxwCi0JICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCi0KLWNvbmZpZyBQUENfOHh4Ci0JYm9vbCAiRnJlZXNjYWxlIDh4eCIKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCA4eHgKLQotY29uZmlnIDQweAotCWJvb2wgIkFNQ0MgNDB4IgotCXNlbGVjdCBQUENfRENSX05BVElWRQotCi1jb25maWcgNDR4Ci0JYm9vbCAiQU1DQyA0NHgiCi0Jc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCi0Jc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKLQotY29uZmlnIEUyMDAKLQlib29sICJGcmVlc2NhbGUgZTIwMCIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBQT1dFUjRfT05MWQotCWJvb2wgIk9wdGltaXplIGZvciBQT1dFUjQiCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIENhdXNlIHRoZSBjb21waWxlciB0byBvcHRpbWl6ZSBmb3IgUE9XRVI0L1BPV0VSNS9QUEM5NzAgcHJvY2Vzc29ycy4KLQkgIFRoZSByZXN1bHRpbmcgYmluYXJ5IHdpbGwgbm90IHdvcmsgb24gUE9XRVIzIG9yIFJTNjQgcHJvY2Vzc29ycwotCSAgd2hlbiBjb21waWxlZCB3aXRoIGJpbnV0aWxzIDIuMTUgb3IgbGF0ZXIuCi0KLWNvbmZpZyBQT1dFUjMKLQlib29sCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgeSBpZiAhUE9XRVI0X09OTFkKLQotY29uZmlnIFBPV0VSNAotCWRlcGVuZHMgb24gUFBDNjQKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyA2eHgKLQlib29sCi0KLSMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYwotY29uZmlnIDh4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODN4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODV4eAotCWJvb2wKLQotY29uZmlnIEU1MDAKLQlib29sCi0KLWNvbmZpZyBQUENfRlBVCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBQUEM2NAotCiBjb25maWcgUFBDX0RDUl9OQVRJVkUKIAlib29sCiAJZGVmYXVsdCBuCkBAIC0yNjcsMTM0ICsxNDMsNiBAQAogCWRlcGVuZHMgb24gUFBDNjQgIyBub3Qgc3VwcG9ydGVkIG9uIDMyIGJpdHMgeWV0CiAJZGVmYXVsdCBuCiAKLWNvbmZpZyA0eHgKLQlib29sCi0JZGVwZW5kcyBvbiA0MHggfHwgNDR4Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBCT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMCB8fCA0NHgKLQlkZWZhdWx0IHkKLQotY29uZmlnIEZTTF9CT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCi1jb25maWcgUFRFXzY0QklUCi0JYm9vbAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlkZWZhdWx0IHkgaWYgNDR4Ci0JZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAotCi1jb25maWcgUEhZU182NEJJVAotCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCi0JZGVmYXVsdCB5IGlmIDQ0eAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIGxhcmdlciB0aGFuIDMyLWJpdCBwaHlzaWNhbAotCSAgYWRkcmVzc2VzLiAgVGhpcyBmZWF0dXJlcyBpcyBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBlNTAwIGNvcmVzLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KLQotY29uZmlnIEFMVElWRUMKLQlib29sICJBbHRpVmVjIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDTEFTU0lDMzIgfHwgUE9XRVI0Ci0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIEFsdGl2ZWMgZXh0ZW5zaW9ucyB0byB0aGUKLQkgIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseSBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZwotCSAgYWx0aXZlYyByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZSAnYWx0aXZlYyBlbmFibGUnIGJpdCBzbyB1c2VyCi0JICBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgYWx0aXZlYyBpbnN0cnVjdGlvbnMuCi0KLQkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgYWx0aXZlYyAoRzQsIG90aGVyd2lzZSBrbm93biBhcyA3NHh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlCi0JICBhbnkgYWZmZWN0IG9uIGEgbm9uLWFsdGl2ZWMgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZQotCSAga2VybmVsKS4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTUEUKLQlib29sICJTUEUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBTaWduYWwgUHJvY2Vzc2luZwotCSAgRXh0ZW5zaW9ucyAoU1BFKSB0byB0aGUgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5Ci0JICBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyBTUEUgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUKLQkgICdzcGUgZW5hYmxlJyBiaXQgc28gdXNlciBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgU1BFIGluc3RydWN0aW9ucy4KLQotCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKLQkgIGVmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KLQotY29uZmlnIFBQQ19TVERfTU1VCi0JYm9vbAotCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMyB8fCBQT1dFUjQgfHwgUFBDNjQKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19TVERfTU1VXzMyCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUgJiYgUFBDMzIKLQotY29uZmlnIFBQQ19NTV9TTElDRVMKLQlib29sCi0JZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRQotCWRlZmF1bHQgbgotCi1jb25maWcgVklSVF9DUFVfQUNDT1VOVElORwotCWJvb2wgIkRldGVybWluaXN0aWMgdGFzayBhbmQgQ1BVIHRpbWUgYWNjb3VudGluZyIKLQlkZXBlbmRzIG9uIFBQQzY0Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGFjY3VyYXRlIHRhc2sgYW5kIENQVSB0aW1lCi0JICBhY2NvdW50aW5nLiAgVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBDUFUgY291bnRlciBvbiBlYWNoCi0JICBrZXJuZWwgZW50cnkgYW5kIGV4aXQgYW5kIG9uIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUga2VybmVsCi0JICBiZXR3ZWVuIHN5c3RlbSwgc29mdGlycSBhbmQgaGFyZGlycSBzdGF0ZSwgc28gdGhlcmUgaXMgYQotCSAgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LiAgVGhpcyBhbHNvIGVuYWJsZXMgYWNjb3VudGluZyBvZgotCSAgc3RvbGVuIHRpbWUgb24gbG9naWNhbGx5LXBhcnRpdGlvbmVkIHN5c3RlbXMgcnVubmluZyBvbgotCSAgSUJNIFBPV0VSNS1iYXNlZCBtYWNoaW5lcy4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTTVAKLQlkZXBlbmRzIG9uIFBQQ19TVERfTU1VCi0JYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQotCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUKLQkgIHRoYW4gb25lIENQVSwgc2F5IFkuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBjdXJyZW50bHkKLQkgIHN1cHBvcnQgU01QIG1hY2hpbmVzIHdpdGggNjAzLzYwM2UvNjAzZXYgb3IgUFBDNzUwICgiRzMiKSBwcm9jZXNzb3JzCi0JICBzaW5jZSB0aGV5IGhhdmUgaW5hZGVxdWF0ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBtdWx0aXByb2Nlc3NvcgotCSAgb3BlcmF0aW9uLgotCi0JICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUgYW5kIG11bHRpcHJvY2Vzc29yCi0JICBtYWNoaW5lcywgYnV0IHdpbGwgdXNlIG9ubHkgb25lIENQVSBvZiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuIElmCi0JICB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmVzLgotCSAgT24gYSBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gZmFzdGVyIGlmIHlvdSBzYXkKLQkgIE4gaGVyZS4KLQotCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KLQotY29uZmlnIE5SX0NQVVMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMTI4KSIKLQlyYW5nZSAyIDEyOAotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCAiMzIiIGlmIFBQQzY0Ci0JZGVmYXVsdCAiNCIKLQotY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQotCWJvb2wKLQlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAotCWRlZmF1bHQgeQotCi1jb25maWcgQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWQotCWJvb2wKLWVuZG1lbnUKLQogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIgpAQCAtNjc0LDEwICs0MjIsNiBAQAogY29uZmlnIEZTTF9TT0MKIAlib29sCiAKLWNvbmZpZyBGU0xfUENJRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ184Nnh4Ci0KICMgWWVzIE1DQSBSUy82MDAwcyBleGlzdCBidXQgTGludXgtUFBDIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFueQogY29uZmlnIE1DQQogCWJvb2wKQEAgLTY4NSwxMCArNDI5LDEwIEBACiBjb25maWcgUENJCiAJYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IFBQQ184NXh4IHx8IFBQQ184Nnh4IFwKIAkJfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIChQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUykpIFwKLQkJfHwgTVBDNzQ0OEhQQzIgfHwgUFBDX1BTMyB8fCBQUENfSE9MTFkKLQlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICFQUENfODN4eCBcCisJCXx8IFBQQ19QUzMKKwlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFQUENfODN4eCBcCiAJCSYmICFQUENfODV4eCAmJiAhUFBDXzg2eHgKLQlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHggJiYgQVBVUworCWRlZmF1bHQgUENJX1BFUk1FRElBIGlmICE0eHggJiYgIUNQTTIgJiYgITh4eAogCWRlZmF1bHQgUENJX1FTUEFOIGlmICE0eHggJiYgIUNQTTIgJiYgOHh4CiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJaGVscApAQCAtODk2LDggKzY0MCw4IEBACiBzb3VyY2UgImFyY2gvcG93ZXJwYy9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggZmJhZmQ5Ni4uMTg3YTM5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIENQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwogCi1CT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB6SW1hZ2UuZHRzIHpJbWFnZS5kdHNfaW5pdHJkIHVJbWFnZQorQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgdUltYWdlCiAKIFBIT05ZICs9ICQoQk9PVF9UQVJHRVRTKQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguYyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCmluZGV4IGQ1MTM3N2QuLjlmNjRlODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCkBAIC0zOCwzICszOCw0OCBAQAogCiAJZHRfZml4dXBfbWVtb3J5KDAsIG1lbXNpemUpOwogfQorCisjZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0CisjZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWFzbSB2b2xhdGlsZSAoCisJCSJtZnNwcgklMCwlMVxuIgorCQkib3JpcwklMCwlMCwlMkBoXG4iCisJCSJtdHNwcgklMSwlMCIKKwkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKKwkJKTsKKworfQorCisvKiBSZWFkIDR4eCBFQkMgYnVzIGJyaWRnZSByZWdpc3RlcnMgdG8gZ2V0IG1hcHBpbmdzIG9mIHRoZSBwZXJpcGhlcmFsCisgKiBiYW5rcyBpbnRvIHRoZSBPUEIgYWRkcmVzcyBzcGFjZSAqLwordm9pZCBpYm00eHhfZml4dXBfZWJjX3Jhbmdlcyhjb25zdCBjaGFyICplYmMpCit7CisJdm9pZCAqZGV2cDsKKwl1MzIgYnhjcjsKKwl1MzIgcmFuZ2VzW0VCQ19OVU1fQkFOS1MqNF07CisJdTMyICpwID0gcmFuZ2VzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVCQ19OVU1fQkFOS1M7IGkrKykgeworCQltdGRjcihEQ1JOX0VCQzBfQ0ZHQUREUiwgRUJDX0JYQ1IoaSkpOworCQlieGNyID0gbWZkY3IoRENSTl9FQkMwX0NGR0RBVEEpOworCisJCWlmICgoYnhjciAmIEVCQ19CWENSX0JVKSAhPSBFQkNfQlhDUl9CVV9PRkYpIHsKKwkJCSpwKysgPSBpOworCQkJKnArKyA9IDA7CisJCQkqcCsrID0gYnhjciAmIEVCQ19CWENSX0JBUzsKKwkJCSpwKysgPSBFQkNfQlhDUl9CQU5LX1NJWkUoYnhjcik7CisJCX0KKwl9CisKKwlkZXZwID0gZmluZGRldmljZShlYmMpOworCWlmICghIGRldnApCisJCWZhdGFsKCJDb3VsZG4ndCBsb2NhdGUgRUJDIG5vZGUgJXNcblxyIiwgZWJjKTsKKworCXNldHByb3AoZGV2cCwgInJhbmdlcyIsIHJhbmdlcywgKHAgLSByYW5nZXMpICogc2l6ZW9mKHUzMikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmggYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAppbmRleCA3YjEyOWFkLi41Nzc5ODJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaApAQCAtMTEsNiArMTEsOSBAQAogI2RlZmluZSBfUFBDX0JPT1RfNDRYX0hfCiAKIHZvaWQgaWJtNDR4X2ZpeHVwX21lbXNpemUodm9pZCk7Cit2b2lkIGlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKGNvbnN0IGNoYXIgKmViYyk7CisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCk7CiB2b2lkIGVib255X2luaXQodm9pZCAqbWFjMCwgdm9pZCAqbWFjMSk7CiAKICNlbmRpZiAvKiBfUFBDX0JPT1RfNDRYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGZmMjcwMTkuLjYxYTZmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC00MywxMCArNDMsMTEgQEAKIAogc3JjLXdsaWIgOj0gc3RyaW5nLlMgY3J0MC5TIHN0ZGlvLmMgbWFpbi5jIGZsYXRkZXZ0cmVlLmMgZmxhdGRldnRyZWVfbWlzYy5jIFwKIAkJbnMxNjU1MC5jIHNlcmlhbC5jIHNpbXBsZV9hbGxvYy5jIGRpdjY0LlMgdXRpbC5TIFwKLQkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIFwKLQkJNDR4LmMgZWJvbnkuYyBtdjY0eDYwLmMgbXBzYy5jIG12NjR4NjBfaTJjLmMKKwkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIG9mbGliLmMgb2Zjb25zb2xlLmMgXAorCQk0NHguYyBlYm9ueS5jIG12NjR4NjAuYyBtcHNjLmMgbXY2NHg2MF9pMmMuYyBjdWJvb3QuYwogc3JjLXBsYXQgOj0gb2YuYyBjdWJvb3QtODN4eC5jIGN1Ym9vdC04NXh4LmMgaG9sbHkuYyBcCi0JCWN1Ym9vdC1lYm9ueS5jIHRyZWVib290LWVib255LmMgcHJwbWMyODAwLmMKKwkJY3Vib290LWVib255LmMgdHJlZWJvb3QtZWJvbnkuYyBwcnBtYzI4MDAuYyBcCisJCXBzMy1oZWFkLlMgcHMzLWh2Y2FsbC5TIHBzMy5jCiBzcmMtYm9vdCA6PSAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCiAKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQpAQCAtNzUsMTEgKzc2LDExIEBACiAkKG9iaikvZW1wdHkuYzoKIAlAdG91Y2ggJEAKIAotJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkczogJChvYmopLyU6ICQoc3JjdHJlZSkvJChzcmMpLyUuUworJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHM6ICQob2JqKS8lOiAkKHNyY3RyZWUpLyQoc3JjKS8lLlMKIAlAY3AgJDwgJEAKIAogY2xlYW4tZmlsZXMgOj0gJCh6bGliKSAkKHpsaWJoZWFkZXIpICQoemxpYmxpbnV4aGVhZGVyKSBcCi0JCWVtcHR5LmMgekltYWdlLmNvZmYubGRzIHpJbWFnZS5sZHMKKwkJZW1wdHkuYyB6SW1hZ2UgekltYWdlLmNvZmYubGRzIHpJbWFnZS5wczMubGRzIHpJbWFnZS5sZHMKIAogcXVpZXRfY21kX2Jvb3RjYyA9IEJPT1RDQyAgJEAKICAgICAgIGNtZF9ib290Y2MgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVENGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiB0YXJnZXRzCQkrPSAkKHBhdHN1YnN0ICQob2JqKS8lLCUsJChvYmotYm9vdCkgd3JhcHBlci5hKQogZXh0cmEteQkJOj0gJChvYmopL3dyYXBwZXIuYSAkKG9iai1wbGF0KSAkKG9iaikvZW1wdHkubyBcCi0JCSAgICQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHMKKwkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHMKIAogd3JhcHBlcgkJOj0kKHNyY3RyZWUpLyQoc3JjKS93cmFwcGVyCiB3cmFwcGVyYml0cwk6PSAkKGV4dHJhLXkpICQoYWRkcHJlZml4ICQob2JqKS8sYWRkbm90ZSBoYWNrLWNvZmYgbWt0cmVlKSBcCkBAIC0xMzIsNyArMTMzLDcgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gekltYWdlLmNocnAKIGltYWdlLSQoQ09ORklHX1BQQ19FRklLQSkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJCSs9IHpJbWFnZS5wbWFjCi1pbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHktZWxmCitpbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHkKIGltYWdlLSQoQ09ORklHX1BQQ19QUlBNQzI4MDApCQkrPSB6SW1hZ2UucHJwbWMyODAwCiBpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykJCSs9IHpJbWFnZS5pc2VyaWVzCiBpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkJCSs9IHVJbWFnZQpAQCAtMTU3LDU1ICsxNTgsNDMgQEAKIAogJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negogCi1kdHMtICA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHMlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0cy15IDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0cyUsICQoaW1hZ2UteSkpCi1kdHMteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHMteSkpCi10YXJnZXRzCSs9ICQoaW1hZ2UteSkgJChkdHMteSkKLQotZHRzX2luaXRyZC0gIDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0c19pbml0cmQlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0c19pbml0cmQteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHNfaW5pdHJkJSwgJChpbWFnZS15KSkKLWR0c19pbml0cmQteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHNfaW5pdHJkLXkpKQotdGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoZHRzX2luaXRyZC15KQotCi0kKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negorIyBJZiBDT05GSUdfV0FOVF9ERVZJQ0VfVFJFRSBpcyBzZXQgYW5kIENPTkZJR19ERVZJQ0VfVFJFRSBpc24ndCBhbgorIyBlbXB0eSBzdHJpbmcsIGRlZmluZSAnZHRzJyB0byBiZSBwYXRoIHRvIHRoZSBkdHMKKyMgQ09ORklHX0RFVklDRV9UUkVFIHdpbGwgaGF2ZSAiIiBhcm91bmQgaXQsIG1ha2Ugc3VyZSB0byBzdHJpcCB0aGVtCitpZmVxICgkKENPTkZJR19XQU5UX0RFVklDRV9UUkVFKSx5KQoraWZuZXEgKCQoQ09ORklHX0RFVklDRV9UUkVFKSwiIikKK2R0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAorCSwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFOiIlIj0lKQorZW5kaWYKK2VuZGlmCiAKICMgRG9uJ3QgcHV0IHRoZSByYW1kaXNrIG9uIHRoZSBwYXR0ZXJuIHJ1bGU7IHdoZW4gaXRzIG1pc3NpbmcgbWFrZSB3aWxsIHRyeQogIyB0aGUgcGF0dGVybiBydWxlIHdpdGggbGVzcyBkZXBlbmRlbmNpZXMgdGhhdCBhbHNvIG1hdGNoZXMgKGV2ZW4gd2l0aCB0aGUKICMgaGFyZCBkZXBlbmRlbmN5IGxpc3RlZCkuCi0kKG9iaikvekltYWdlLmR0c19pbml0cmQuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKKyQob2JqKS96SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChkdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwkKGR0cyksLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCi0kKG9iaikvekltYWdlLmR0cy4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQorJChvYmopL3pJbWFnZS4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpKQogCi0kKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQotCi0kKG9iaikvekltYWdlLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqKQorIyBUaGlzIGNhbm5vdCBiZSBpbiB0aGUgcm9vdCBvZiAkKHNyYykgYXMgdGhlIHpJbWFnZSBydWxlIGFsd2F5cyBhZGRzIGEgJChvYmopCisjIHByZWZpeAorJChvYmopL3ZtbGludXguc3RyaXA6IHZtbGludXgKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCiAkKG9iaikvekltYWdlLmlzZXJpZXM6IHZtbGludXgKIAkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCi0kKG9iaikvekltYWdlLnBzMzogdm1saW51eAotCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACiskKG9iaikvekltYWdlLnBzMzogdm1saW51eCAgJCh3cmFwcGVyKSAkKHdyYXBwZXJiaXRzKSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cworCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vIHZtbGludXguc3RyaXAKKwkkKGNhbGwgY21kLHdyYXAscHMzLCQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzLCwpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkLnBzMzogdm1saW51eAotCUBlY2hvICIgIFdBUk5JTkcgekltYWdlLmluaXRyZC5wczMgbm90IHN1cHBvcnRlZCAoeWV0KSIKLQotJChvYmopL3pJbWFnZS5ob2xseS1lbGY6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLGhvbGx5LCQob2JqKS9kdHMvaG9sbHkuZHRzLCwpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLmhvbGx5LWVsZjogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKG9iaikvcmFtZGlzay5pbWFnZS5negotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsaG9sbHksJChvYmopL2R0cy9ob2xseS5kdHMsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQorJChvYmopL3pJbWFnZS5pbml0cmQucHMzOiB2bWxpbnV4ICAkKHdyYXBwZXIpICQod3JhcHBlcmJpdHMpICQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzICQob2JqKS9yYW1kaXNrLmltYWdlLmd6CisJJChjYWxsIGNtZCx3cmFwLHBzMywkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cywsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCiAKICQob2JqKS91SW1hZ2U6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHVib290KQogCi0jIENPTkZJR19ERVZJQ0VfVFJFRSB3aWxsIGhhdmUgIiIgYXJvdW5kIGl0LCBtYWtlIHN1cmUgdG8gc3RyaXAgdGhlbQotZHRzID0gJChpZiAkKHNoZWxsIGVjaG8gJChDT05GSUdfREVWSUNFX1RSRUUpIHwgZ3JlcCAnXi8nKSxcCi0JLCQoc3JjdHJlZSkvJChzcmMpL2R0cy8pJChDT05GSUdfREVWSUNFX1RSRUU6IiUiPSUpCi0KICQob2JqKS9jdUltYWdlLiU6IHZtbGludXggJChkdHMpICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCxjdWJvb3QtJCosJChkdHMpKQogCkBAIC0yMTUsMjIgKzIwNCwyMiBAQAogJChvYmopL3RyZWVJbWFnZS4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHMpKQogCisjIElmIHRoZXJlIGlzbid0IGEgcGxhdGZvcm0gc2VsZWN0ZWQgdGhlbiBqdXN0IHN0cmlwIHRoZSB2bWxpbnV4LgoraWZlcSAoLCQoaW1hZ2UteSkpCitpbWFnZS15IDo9IHZtbGludXguc3RyaXAKK2VuZGlmCisKICQob2JqKS96SW1hZ2U6CQkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCUBybSAtZiAkQDsgbG4gJDwgJEAKICQob2JqKS96SW1hZ2UuaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGluaXRyZC15KSkKIAlAcm0gLWYgJEA7IGxuICQ8ICRACi0kKG9iaikvekltYWdlLmR0czoJJChhZGRwcmVmaXggJChvYmopLywgJChkdHMteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotCiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCi1jbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSB6SW1hZ2UgekltYWdlLmluaXRyZCBjdUltYWdlLiogXAotCXRyZWVJbWFnZS4qIHpJbWFnZS5kdHMgekltYWdlLmR0c19pbml0cmQKK2NsZWFuLWZpbGVzICs9ICQoaW1hZ2UtKSAkKGluaXRyZC0pIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIGN1SW1hZ2UuKiB0cmVlSW1hZ2UuKiBcCisJb3RoZXJvcy5ibGQKIAogIyBjbGVhbiB1cCBmaWxlcyBjYWNoZWQgYnkgd3JhcHBlcgogY2xlYW4ta2VybmVsIDo9IHZtbGludXguc3RyaXAgdm1saW51eC5iaW4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jCmluZGV4IDlhZjU1NGUuLjI5NjAyNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAKICNpbmNsdWRlICJvcHMuaCIKICNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgImN1Ym9vdC5oIgogCiAjZGVmaW5lIFRBUkdFVF84M3h4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKIGV4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKIAogc3RhdGljIHZvaWQgcGxhdGZvcm1fZml4dXBzKHZvaWQpCkBAIC01MiwxNiArNTIsNyBAQAogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKIHsKLQl1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0gPSBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemU7Ci0JdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKLQotCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOwotCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSAtIDEwMjQqMTAyNCwgMzIsIDY0KTsKKwlDVUJPT1RfSU5JVCgpOwogCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CiAJc2VyaWFsX2NvbnNvbGVfaW5pdCgpOwogCXBsYXRmb3JtX29wcy5maXh1cHMgPSBwbGF0Zm9ybV9maXh1cHM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYwppbmRleCBlMjU2MDMxLi4xMGYwZjY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMKQEAgLTEyLDEyICsxMiwxMiBAQAogCiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfODV4eAogI2luY2x1ZGUgInBwY2Jvb3QuaCIKIAogc3RhdGljIGJkX3QgYmQ7Ci1leHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CiAKIHN0YXRpYyB2b2lkIHBsYXRmb3JtX2ZpeHVwcyh2b2lkKQpAQCAtNTMsMTYgKzUzLDcgQEAKIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCiB7Ci0JdW5zaWduZWQgbG9uZyBlbmRfb2ZfcmFtID0gYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplOwotCXVuc2lnbmVkIGxvbmcgYXZhaWxfcmFtID0gZW5kX29mX3JhbSAtICh1bnNpZ25lZCBsb25nKV9lbmQ7Ci0KLQltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKLQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSAtIHI0IDogMDsKLQlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKLQlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7Ci0KLQlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0gLSAxMDI0KjEwMjQsIDMyLCA2NCk7CisJQ1VCT09UX0lOSVQoKTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwogCXNlcmlhbF9jb25zb2xlX2luaXQoKTsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gcGxhdGZvcm1fZml4dXBzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwppbmRleCA0NDY0YzVmLi5jNWYzN2NlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwpAQCAtMTUsMjggKzE1LDE2IEBACiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKICNpbmNsdWRlICI0NHguaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfNDR4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKLQotQlNTX1NUQUNLKDQwOTYpOwogCiB2b2lkIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQogewotCXVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSA9IGJkLmJpX21lbXN0YXJ0ICsgYmQuYmlfbWVtc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOwotCi0JbWVtY3B5KCZiZCwgKGJkX3QgKilyMywgc2l6ZW9mKGJkKSk7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKLQlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSwgMzIsIDY0KTsKLQorCUNVQk9PVF9JTklUKCk7CiAJZWJvbnlfaW5pdCgmYmQuYmlfZW5ldGFkZHIsICZiZC5iaV9lbmV0MWFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc5NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvbXBhdGliaWxpdHkgZm9yIG9sZCAobm90IGRldmljZSB0cmVlIGF3YXJlKSBVLUJvb3QgdmVyc2lvbnMKKyAqCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICogQ29uc29saWRhdGVkIHVzaW5nIG1hY3JvcyBieSBEYXZpZCBHaWJzb24gPGRhdmlkQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisKKyNpbmNsdWRlICJwcGNib290LmgiCisKK2V4dGVybiBjaGFyIF9lbmRbXTsKK2V4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOworCisJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKKwlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgLSByNCA6IDA7CisJbG9hZGVyX2luZm8uY21kbGluZSA9IChjaGFyICopcjY7CisJbG9hZGVyX2luZm8uY21kbGluZV9sZW4gPSByNyAtIHI2OworCisJc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtIC0gMTAyNCoxMDI0LCAzMiwgNjQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmggYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfUFBDX0JPT1RfQ1VCT09UX0hfCisjZGVmaW5lIF9QUENfQk9PVF9DVUJPT1RfSF8KKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSk7CisKKyNkZWZpbmUgQ1VCT09UX0lOSVQoKSBcCisJZG8geyBcCisJCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOyBcCisJCWN1Ym9vdF9pbml0KHI0LCByNSwgcjYsIHI3LCBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemUpOyBcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9QUENfQk9PVF9DVUJPT1RfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKaW5kZXggODc3YmM5Ny4uMTRiNDRhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKQEAgLTI2LDYgKzI2LDQzIEBACiAjZGVmaW5lCQkJU0RSQU1fQ09ORklHX0JBTktfU0laRShyZWcpCVwKIAkoMHgwMDQwMDAwMCA8PCAoKHJlZyAmIFNEUkFNX0NPTkZJR19TSVpFX01BU0spID4+IDE3KSkKIAorLyogNDQwR1AgRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgKEVCQykgKi8KKyNkZWZpbmUgRENSTl9FQkMwX0NGR0FERFIJCQkJMHgwMTIKKyNkZWZpbmUgRENSTl9FQkMwX0NGR0RBVEEJCQkJMHgwMTMKKyNkZWZpbmUgICBFQkNfTlVNX0JBTktTCQkJCQkgIDgKKyNkZWZpbmUgICBFQkNfQjBDUgkJCQkJICAweDAwCisjZGVmaW5lICAgRUJDX0IxQ1IJCQkJCSAgMHgwMQorI2RlZmluZSAgIEVCQ19CMkNSCQkJCQkgIDB4MDIKKyNkZWZpbmUgICBFQkNfQjNDUgkJCQkJICAweDAzCisjZGVmaW5lICAgRUJDX0I0Q1IJCQkJCSAgMHgwNAorI2RlZmluZSAgIEVCQ19CNUNSCQkJCQkgIDB4MDUKKyNkZWZpbmUgICBFQkNfQjZDUgkJCQkJICAweDA2CisjZGVmaW5lICAgRUJDX0I3Q1IJCQkJCSAgMHgwNworI2RlZmluZSAgIEVCQ19CWENSKG4pCQkJCQkgIChuKQorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFTCQkJCSAgICAweGZmZjAwMDAwCisjZGVmaW5lCSAgICBFQkNfQlhDUl9CUwkJCQkgIAkgICAgMHgwMDBlMDAwMAorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFOS19TSVpFKHJlZykgXAorCSgweDEwMDAwMCA8PCAoKChyZWcpICYgRUJDX0JYQ1JfQlMpID4+IDE3KSkKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JVCQkJCSAgCSAgICAweDAwMDE4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX09GRgkJCSAgCSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICAgICAgRUJDX0JYQ1JfQlVfUk8JCQkgIAkgICAgICAweDAwMDA4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX1dPCQkJICAJICAgICAgMHgwMDAxMDAwMAorI2RlZmluZQkgICAgICBFQkNfQlhDUl9CVV9SVwkJCSAgCSAgICAgIDB4MDAwMTgwMDAKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JXCQkJCSAgCSAgICAweDAwMDA2MDAwCisjZGVmaW5lICAgRUJDX0IwQVAJCQkJCSAgMHgxMAorI2RlZmluZSAgIEVCQ19CMUFQCQkJCQkgIDB4MTEKKyNkZWZpbmUgICBFQkNfQjJBUAkJCQkJICAweDEyCisjZGVmaW5lICAgRUJDX0IzQVAJCQkJCSAgMHgxMworI2RlZmluZSAgIEVCQ19CNEFQCQkJCQkgIDB4MTQKKyNkZWZpbmUgICBFQkNfQjVBUAkJCQkJICAweDE1CisjZGVmaW5lICAgRUJDX0I2QVAJCQkJCSAgMHgxNgorI2RlZmluZSAgIEVCQ19CN0FQCQkJCQkgIDB4MTcKKyNkZWZpbmUgICBFQkNfQlhBUChuKQkJCQkJICAoMHgxMCsobikpCisjZGVmaW5lICAgRUJDX0JFQVIJCQkJCSAgMHgyMAorI2RlZmluZSAgIEVCQ19CRVNSCQkJCQkgIDB4MjEKKyNkZWZpbmUgICBFQkNfQ0ZHCQkJCQkgIDB4MjMKKyNkZWZpbmUgICBFQkNfQ0lECQkJCQkgIDB4MjQKKwogLyogNDQwR1AgQ2xvY2ssIFBNLCBjaGlwIGNvbnRyb2wgKi8KICNkZWZpbmUgRENSTl9DUEMwX1NSCQkJCQkweDBiMAogI2RlZmluZSBEQ1JOX0NQQzBfRVIJCQkJCTB4MGIxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cwppbmRleCAwZWMwMmY0Li5jNWY5OTYxM2ZjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzCkBAIC0zMSw4ICszMSw4IEBACiAJCQlyZWcgPSA8MD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZpbGxlZCBpbiBieSB6SW1hZ2UKIAkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRmlsbGVkIGluIGJ5IHpJbWFnZQotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MjA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MjA+OwogCQkJaS1jYWNoZS1zaXplID0gPDgwMDA+OyAvKiAzMiBrQiAqLwogCQkJZC1jYWNoZS1zaXplID0gPDgwMDA+OyAvKiAzMiBrQiAqLwogCQkJZGNyLWNvbnRyb2xsZXI7CkBAIC0xMzUsMTEgKzEzNSw5IEBACiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGaWxsZWQgaW4gYnkgekltYWdlCi0JCQkJcmFuZ2VzID0gPDAgMDAwMDAwMDAgZmZmMDAwMDAgMTAwMDAwCi0JCQkJCSAgMSAwMDAwMDAwMCA0ODAwMDAwMCAxMDAwMDAKLQkJCQkJICAyIDAwMDAwMDAwIGZmODAwMDAwIDQwMDAwMAotCQkJCQkgIDMgMDAwMDAwMDAgNDgyMDAwMDAgMTAwMDAwCi0JCQkJCSAgNyAwMDAwMDAwMCA0ODMwMDAwMCAxMDAwMDA+OworCQkJCS8vIHJhbmdlcyBwcm9wZXJ0eSBpcyBzdXBwbGllZCBieSB6SW1hZ2UKKwkJCQkvLyBiYXNlZCBvbiBmaXJtd2FyZSdzIGNvbmZpZ3VyYXRpb24gb2YgdGhlCisJCQkJLy8gRUJDIGJyaWRnZQogCQkJCWludGVycnVwdHMgPSA8NSA0PjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMxPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMKaW5kZXggMjU0NDk5Yi4uODBhNGZhYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzCkBAIC00Niw3ICs0Niw3IEBACiAKICAgCXRzaTEwOUBjMDAwMDAwMCB7CiAJCWRldmljZV90eXBlID0gInRzaS1icmlkZ2UiOwotCQljb21wYXRpYmxlID0gInRzaS1icmlkZ2UiOworCQljb21wYXRpYmxlID0gInRzaTEwOS1icmlkZ2UiLCAidHNpMTA4LWJyaWRnZSI7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmFuZ2VzID0gPDAwMDAwMDAwIGMwMDAwMDAwIDAwMDEwMDAwPjsKQEAgLTU0LDUyICs1NCw1NSBAQAogCiAJCWkyY0A3MDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7Ci0JCQljb21wYXRpYmxlICA9ICJ0c2ktaTJjIjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQljb21wYXRpYmxlICA9ICJ0c2kxMDktaTJjIiwgInRzaTEwOC1pMmMiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGUgMj47CiAJCQlyZWcgPSA8NzAwMCA0MDA+OwogCQl9OwogCi0JCW1kaW9ANjAwMCB7CisJCU1ESU86IG1kaW9ANjAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJtZGlvIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LW1kaW8iLCAidHNpMTA4LW1kaW8iOworCQkJcmVnID0gPDYwMDAgNTA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAotCQkJUEhZMTogZXRoZXJuZXQtcGh5QDYwMDAgewotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7Ci0JCQkJY29tcGF0aWJsZSA9ICJiY201NHh4IjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDE+OworCQkJUEhZMTogZXRoZXJuZXQtcGh5QDEgeworCQkJCWNvbXBhdGlibGUgPSAiYmNtNTQ2MWEiOworCQkJCXJlZyA9IDwxPjsKKwkJCQl0eGMtcnhjLWRlbGF5LWRpc2FibGU7CiAJCQl9OwogCi0JCQlQSFkyOiBldGhlcm5ldC1waHlANjQwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQljb21wYXRpYmxlID0gImJjbTU0eHgiOwotCQkJCXJlZyA9IDw2MDAwIDUwPjsKLQkJCQlwaHktaWQgPSA8Mj47CisJCQlQSFkyOiBldGhlcm5ldC1waHlAMiB7CisJCQkJY29tcGF0aWJsZSA9ICJiY201NDYxYSI7CisJCQkJcmVnID0gPDI+OworCQkJCXR4Yy1yeGMtZGVsYXktZGlzYWJsZTsKIAkJCX07CiAJCX07CiAKIAkJZXRoZXJuZXRANjIwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LWV0aGVybmV0IiwgInRzaTEwOC1ldGhlcm5ldCI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcmVnID0gPDYwMDAgMjAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JlBIWTE+OwogCQl9OwogCiAJCWV0aGVybmV0QDY2MDAgewogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQljb21wYXRpYmxlID0gInRzaS1ldGhlcm5ldCI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOS1ldGhlcm5ldCIsICJ0c2kxMDgtZXRoZXJuZXQiOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCXJlZyA9IDw2NDAwIDIwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMj47CisJCQltZGlvLWhhbmRsZSA9IDwmTURJTz47CiAJCQlwaHktaGFuZGxlID0gPCZQSFkyPjsKIAkJfTsKIApAQCAtMTEwLDcgKzExMyw3IEBACiAJCQl2aXJ0dWFsLXJlZyA9IDxjMDAwNzgwOD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8M0Y5QzYwMDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDwxYzIwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGMgMj47CiAJCX07CiAKQEAgLTEyMSw3ICsxMjQsNyBAQAogCQkJdmlydHVhbC1yZWcgPSA8YzAwMDdjMDg+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDNGOUM2MDAwPjsKIAkJCWN1cnJlbnQtc3BlZWQgPSA8MWMyMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDxkIDI+OwogCQl9OwogCkBAIC0xMzYsNyArMTM5LDcgQEAKIAogCQlwY2lAMTAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDkiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktcGNpIiwgInRzaTEwOC1wY2kiOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CkBAIC0xNTAsNyArMTUzLDcgQEAKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDQwMDAwMDAwIDQwMDAwMDAwIDAgMTAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgN2UwMDAwMDAgMCAwMDAxMDAwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8N2YyODE1ND47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPDE3IDI+OwogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OwogCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpAQCAtMTg2LDEzICsxODksMTIgQEAKICAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAgCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgCQkJCWludGVycnVwdHMgPSA8MTcgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCX07CiAJCX07CiAJfTsKIAogCWNob3NlbiB7CiAJCWxpbnV4LHN0ZG91dC1wYXRoID0gIi90c2kxMDlAYzAwMDAwMDAvc2VyaWFsQDc4MDgiOwotCQlib290YXJncyA9ICJjb25zb2xlPXR0eVMwLDExNTIwMCI7CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwppbmRleCA3NjVjMzA2Li4wZTNkMzE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQlkZXZpY2VfdHlwZSA9ICJ0c2ktYnJpZGdlIjsKKwkJZGV2aWNlX3R5cGUgPSAidHNpMTA4LWJyaWRnZSI7CiAJCXJhbmdlcyA9IDwwMDAwMDAwMCBjMDAwMDAwMCAwMDAxMDAwMD47CiAJCXJlZyA9IDxjMDAwMDAwMCAwMDAxMDAwMD47CiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CkBAIC01NSwyNyArNTUsMjYgQEAKIAkJCWludGVycnVwdHMgPSA8RSAwPjsKIAkJCXJlZyA9IDw3MDAwIDQwMD47CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwotCQkJY29tcGF0aWJsZSAgPSAidHNpLWkyYyI7CisJCQljb21wYXRpYmxlICA9ICJ0c2kxMDgtaTJjIjsKIAkJfTsKIAotCQltZGlvQDYwMDAgeworCQlNRElPOiBtZGlvQDYwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7Ci0JCQljb21wYXRpYmxlID0gInRzaS1ldGhlcm5ldCI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOC1tZGlvIjsKKwkJCXJlZyA9IDw2MDAwIDUwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CiAKLQkJCXBoeTg6IGV0aGVybmV0LXBoeUA2MDAwIHsKKwkJCXBoeTg6IGV0aGVybmV0LXBoeUA4IHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDIgMT47Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDw4PjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJCXJlZyA9IDw4PjsKIAkJCX07CiAKLQkJCXBoeTk6IGV0aGVybmV0LXBoeUA2NDAwIHsKKwkJCXBoeTk6IGV0aGVybmV0LXBoeUA5IHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDIgMT47Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDw5PjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJCXJlZyA9IDw5PjsKIAkJCX07CiAKIAkJfTsKQEAgLTgzLDEyICs4MiwxMiBAQAogCQlldGhlcm5ldEA2MjAwIHsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJUU0ktRVRIIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LWV0aGVybmV0IjsKIAkJCXJlZyA9IDw2MDAwIDIwMD47CiAJCQlhZGRyZXNzID0gWyAwMCAwNiBEMiAwMCAwMCAwMSBdOwogCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5OD47CiAJCX07CiAKQEAgLTk2LDEyICs5NSwxMiBAQAogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiVFNJLUVUSCI7Ci0JCQljb21wYXRpYmxlID0gInRzaS1ldGhlcm5ldCI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOC1ldGhlcm5ldCI7CiAJCQlyZWcgPSA8NjQwMCAyMDA+OwogCQkJYWRkcmVzcyA9IFsgMDAgMDYgRDIgMDAgMDAgMDIgXTsKIAkJCWludGVycnVwdHMgPSA8MTEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTk+OwogCQl9OwogCkBAIC0xMzUsNyArMTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgCWJpZy1lbmRpYW47CiAJCX07CiAJCXBjaUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAidHNpMTB4IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LXBjaSI7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzCmluZGV4IDQyM2VlZGMuLjE5MzRiODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MjcyYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMKQEAgLTE0LDEyICsxNCwxMCBAQAogICAgICAgIGNvbXBhdGlibGUgPSAiTVBDODI2MEFEUyI7CiAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAgICAgICAgI3NpemUtY2VsbHMgPSA8MT47Ci0gICAgICAgbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAgICAgICAgY3B1cyB7CiAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gPDA+OwotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyMDA+OwogCiAgICAgICAgICAgICAgICBQb3dlclBDLDgyNzJAMCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gImNwdSI7CkBAIC0zMiwxMiArMzAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgYnVzLWZyZXF1ZW5jeSA9IDwwPjsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICAzMi1iaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjAxPjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgfTsKIAotICAgICAgIGludGVycnVwdC1jb250cm9sbGVyQGY4MjAwMDAwIHsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8ZjgyMDAwMDA+OworCQlwY2lfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckBmODIwMDAwMCB7CiAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwwPjsKICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTQ3LDE1ICs0MywxMyBAQAogICAgICAgIH07CiAgICAgICAgbWVtb3J5IHsKICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0gICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDMwMD47CiAgICAgICAgICAgICAgICByZWcgPSA8MDAwMDAwMDAgNDAwMDAwMCBmNDUwMDAwMCAwMDAwMDAyMD47CiAgICAgICAgfTsKIAogICAgICAgIGNob3NlbiB7CiAgICAgICAgICAgICAgICBuYW1lID0gImNob3NlbiI7CiAgICAgICAgICAgICAgICBsaW51eCxwbGF0Zm9ybSA9IDwwPjsKLSAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8NDAwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXIgPSA8JkNwbV9waWM+OwogICAgICAgIH07CiAKICAgICAgICBzb2M4MjcyQGYwMDAwMDAwIHsKQEAgLTcwLDIwICs2NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfdHlwZSA9ICJtZGlvIjsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDAgMD47Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjQ1MjA+OwogICAgICAgICAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47Ci0gICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0LXBoeUAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDI0NTIwMDA+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJcGh5MDpldGhlcm5ldC1waHlAMCB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNyA0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YmFuZyA9IFsgMTIgMTIgMTMgMDIgMDIgMDEgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldC1waHlAMSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyNDUyMDAxPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCXBoeTE6ZXRoZXJuZXQtcGh5QDEgeworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MTcgND47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YmFuZyA9IFsgMTIgMTIgMTMgMDIgMDIgMDEgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8Mz47CkBAIC0xMDEsOCArOTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MTEzMDAgMjAgODQwMCAxMDAgMTEzODAgMzA+OwogICAgICAgICAgICAgICAgICAgICAgICBtYWMtYWRkcmVzcyA9IFsgMDAgMTEgMkYgOTkgNDMgNTQgXTsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyMCAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgIHBoeS1oYW5kbGUgPSA8MjQ1MjAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTA+OwogICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxMz47CiAgICAgICAgICAgICAgICAgICAgICAgIHR4LWNsb2NrID0gPDEyPjsKICAgICAgICAgICAgICAgIH07CkBAIC0xMTUsMTQgKzEwNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MTEzMjAgMjAgODUwMCAxMDAgMTEzYjAgMzA+OwogICAgICAgICAgICAgICAgICAgICAgICBtYWMtYWRkcmVzcyA9IFsgMDAgMTEgMkYgOTkgNDQgNTQgXTsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyMSAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgIHBoeS1oYW5kbGUgPSA8MjQ1MjAwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTE+OwogICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxNz47CiAgICAgICAgICAgICAgICAgICAgICAgIHR4LWNsb2NrID0gPDE4PjsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgIGNwbUBmMDAwMDAwMCB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8ZjAwMDAwMDA+OwogICAgICAgICAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MT47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xNDIsNyArMTMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MTFhMDAgMjAgODAwMCAxMDA+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtc3BlZWQgPSA8MWMyMDA+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MjggMj47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stc2V0dXAgPSA8MCAwMGZmZmZmZj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcngtY2xvY2sgPSA8MT47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MT47CkBAIC0xNTYsMTUgKzE0NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMWE2MCAyMCA4MzAwIDEwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC1zcGVlZCA9IDwxYzIwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyYiAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1zZXR1cCA9IDwxYiBmZmZmZmYwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcngtY2xvY2sgPSA8ND47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8ND47CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICBpbnRlcnJ1cHQtY29udHJvbGxlckAxMGMwMCB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MTBjMDA+OworCQkJY3BtX3BpYzppbnRlcnJ1cHQtY29udHJvbGxlckAxMGMwMCB7CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICAjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTE3NCw3ICsxNjMsNiBAQAogCQkgICAgICAgY29tcGF0aWJsZSA9ICJDUE0yIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBwY2lAMDUwMCB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MDUwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAgICAgICAgICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gPDI+OwogICAgICAgICAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwzPjsKQEAgLTIwMiw3ICsxOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwMDAgMCAwIDIgZjgyMDAwMDAgNDMgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwMDAgMCAwIDMgZjgyMDAwMDAgNDAgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwMDAgMCAwIDQgZjgyMDAwMDAgNDEgOD47Ci0gICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MTQgOD47CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1cy1yYW5nZSA9IDwwIDA+OwogICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDQwMDAwMDAwCkBAIC0yMTYsNyArMjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJ0YWxpdG9zIjsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDMwMDAwIDEwMDAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDxiIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICBudW0tY2hhbm5lbHMgPSA8ND47CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtZmlmby1sZW4gPSA8MTg+OwogICAgICAgICAgICAgICAgICAgICAgICBleGVjLXVuaXRzLW1hc2sgPSA8MDAwMDAwN2U+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKaW5kZXggMTEyZGQ1MS4uNGZjMGM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCkBAIC0yNzIsNyArMjcyLDEzIEBACiAJCQlyZWcgPSA8MjIwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIDAwIDIzIDIzIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxOT47CiAJCQl0eC1jbG9jayA9IDwxYT47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5MyA+OwpAQCAtMjg3LDcgKzI5MywxMyBAQAogCQkJcmVnID0gPDMwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjM+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJnFlaWMgPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAxMSAyMiAzMyA0NCA1NSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MTc+OwogCQkJdHgtY2xvY2sgPSA8MTg+OwogCQkJcGh5LWhhbmRsZSA9IDwgJnBoeTQgPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCmluZGV4IGJlNGMzNTcuLjQ0N2MwM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cwpAQCAtMjMxLDcgKzIzMSwxMyBAQAogCQkJcmVnID0gPDMwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgZWYgMDMgMDIgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDIwPjsKIAkJCXR4LWNsb2NrID0gPDEzPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTAwPjsKQEAgLTI0Niw3ICsyNTIsMTMgQEAKIAkJCXJlZyA9IDwyMjAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIGVmIDAzIDAxIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxOT47CiAJCQl0eC1jbG9jayA9IDwxYT47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwND47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCmluZGV4IGRiMGQwMDMuLmFlOWJjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCkBAIC0xMzEsNiArMTMxLDExIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLwogCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwyMCA4IDIxIDggMjIgOD47CkBAIC0xNDUsNiArMTUwLDExIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLwogCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwyMyA4IDI0IDggMjUgOD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwppbmRleCBkZjc3M2ZhLi4zMTBlODc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKQEAgLTEzNiw2ICsxMzYsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIwIDggMjEgOCAyMiA4PjsKQEAgLTE1MCw2ICsxNTUsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIzIDggMjQgOCAyNSA4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IDM4Yzg1OTQuLjFlOTE0ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cwpAQCAtMzAxLDcgKzMwMSwxMyBAQAogCQkJcmVnID0gPDIwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJnFlaWMgPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwNCA5ZiAwMCAyMyAyMyBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxOT47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5MCA+OwpAQCAtMzE3LDcgKzMyMywxMyBAQAogCQkJcmVnID0gPDMwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJnFlaWMgPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAxMSAyMiAzMyA0NCA1NSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxND47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5MSA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCmluZGV4IGQ5MWU4MWMuLjM2NGE5NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxOSArODEsMTkgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTM6IGV0aGVybmV0LXBoeUAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM3IDE+OworCQkJCWludGVycnVwdHMgPSA8NyAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDYsOSArMTA2LDE0IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMCBdOwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTIwLDkgKzEyNSwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTM0LDkgKzE0NCwxNCBAQAogCQkJbW9kZWwgPSAiRkVDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjYwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMiBdOwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAyIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDE5IDI+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjkgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OwogCQl9OwpAQCAtMTQ2LDcgKzE2MSw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE1NSw3ICsxNzAsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NjAwIDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAJCXBjaUA4MDAwIHsKQEAgLTE2Myw3OCArMTc4LDc4IEBACiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCiAJCQkJLyogSURTRUwgMHgwMiAqLwotCQkJCTEwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTEwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTEwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCTEwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCTEwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkxMDAwIDAgMCAzICZtcGljIDMgMQorCQkJCTEwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkvKiBJRFNFTCAweDAzICovCi0JCQkJMTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJMTgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMTgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkxODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MDQgKi8KLQkJCQkyMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkyMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkyMDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkyMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkyMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCTIwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJMjAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkyMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJLyogSURTRUwgMHgwNSAqLwotCQkJCTI4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTI4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCTI4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCTI4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTI4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJMjgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkyODAwIDAgMCAzICZtcGljIDQgMQorCQkJCTI4MDAgMCAwIDQgJm1waWMgMSAxCiAKIAkJCQkvKiBJRFNFTCAweDBjICovCi0JCQkJNjAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJNjAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJNjAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJNjAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJNjAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQk2MDAwIDAgMCAyICZtcGljIDIgMQorCQkJCTYwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJNjAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCS8qIElEU0VMIDB4MGQgKi8KLQkJCQk2ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQk2ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQk2ODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQk2ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQk2ODAwIDAgMCAxICZtcGljIDQgMQorCQkJCTY4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJNjgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQk2ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgwZSAqLwotCQkJCTcwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCTcwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCTcwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTcwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCTcwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJNzAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQk3MDAwIDAgMCAzICZtcGljIDEgMQorCQkJCTcwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBJRFNFTCAweDBmICovCi0JCQkJNzgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJNzgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJNzgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJNzgwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJNzgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQk3ODAwIDAgMCAyICZtcGljIDMgMQorCQkJCTc4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJNzgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKi8KLQkJCQk5MDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQk5MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQk5MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQk5MDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQk5MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCTkwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJOTAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQk5MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJLyogSURTRUwgMHgxMyAqLwotCQkJCTk4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCTk4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTk4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTk4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTk4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJOTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQk5ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTk4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDE0ICovCi0JCQkJYTAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJYTAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJYTAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJYTAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJYTAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQlhMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCWEwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJYTAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDMxIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIDQgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgMSAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKaW5kZXggNGYyYzNhZi4uMDcwMjA2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MS1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8NDAwMDA+OwkvLyBMMiwgMjU2SwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDEzICs4MSwxMyBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTAwLDggKzEwMCw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTEzLDggKzExMyw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTQyLDQ5ICsxNDIsNDkgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjE2LDEyICsyMTYsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cwppbmRleCAzMDMzNTk5Li44Mjg1OTI1OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxMyArODEsMTMgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzYSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8M2EgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGYgMiAxMCAyIDExIDI+OworCQkJaW50ZXJydXB0cyA9IDwxZiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NjAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKaW5kZXggYWQ5NjM4MS4uOWQwYjg0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0OC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8ODAwMDA+OwkvLyBMMiwgNTEySwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDI1ICs4MSwyNSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MjogZXRoZXJuZXQtcGh5QDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTM6IGV0aGVybmV0LXBoeUAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMTIsOCArMTEyLDggQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTI1LDggKzEyNSw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTM5LDggKzEzOSw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAyIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGYgMiAxMCAyIDExIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFmIDIgMjAgMiAyMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CiAJCX07CkBAIC0xNTIsOCArMTUyLDggQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjcwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDMgXTsKLQkJCWludGVycnVwdHMgPSA8MTUgMiAxNiAyIDE3IDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDI1IDIgMjYgMiAyNyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTczLDU4ICsxNzMsNjQgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgcmVnCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQkJcmVnID0gPGUwMDAwIDEwMDA+OworCQkJZnNsLGhhcy1yc3RjcjsKKwkJfTsKKwogCQlwY2kxOiBwY2lAODAwMCB7CiAJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MWY4MDAgMCAwIDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yNTYsMTIgKzI2MiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKaW5kZXggOTUxZWQ5Mi4uMTdlNDVkOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8NDAwMDA+OwkvLyBMMiwgMjU2SwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDEzICs4MSwxMyBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTAwLDggKzEwMCw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MGQgMiAwZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTMsOCArMTEzLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNDIsNDkgKzE0Miw0OSBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yMTYsMTIgKzIxNiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKaW5kZXggODA2ODIxNS4uMjFjY2FhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDcgKzYxLDcgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQltZGlvQDI0NTIwIHsKQEAgLTcyLDI1ICs3MiwyNSBAQAogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM3IDE+OworCQkJCWludGVycnVwdHMgPSA8NyAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDcgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTAxLDggKzEwMSwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDAgRkQgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTQsOCArMTIwLDE0IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMSBGRCBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTMyLDc5ICsxNDQsNzkgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkJLyogSURTRUwgMHgyICovCi0JCQkJCSAxMDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQkJIDEwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCQkgMTAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJCSAxMDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQkJIDEwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJCSAxMDAwIDAgMCAyICZtcGljIDIgMQorCQkJCQkgMTAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkJIDEwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkJLyogSURTRUwgMHgzICovCi0JCQkJCSAxODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDE4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgMTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSAxODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDE4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSAxODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgMTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDE4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMHg0ICovCi0JCQkJCSAyMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIDIwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgMjAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSAyMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIDIwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSAyMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgMjAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIDIwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMHg1ICAqLwotCQkJCQkgMjgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJCSAyODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkJIDI4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCQkgMjgwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJCSAyODAwIDAgMCAxICZtcGljIDIgMQorCQkJCQkgMjgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkJIDI4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJCSAyODAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJCS8qIElEU0VMIDEyICovCi0JCQkJCSA2MDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQkJIDYwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCQkgNjAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJCSA2MDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQkJIDYwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJCSA2MDAwIDAgMCAyICZtcGljIDIgMQorCQkJCQkgNjAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkJIDYwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkJLyogSURTRUwgMTMgKi8KLQkJCQkJIDY4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCQkgNjgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJCSA2ODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkJIDY4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCQkgNjgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkJIDY4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJCSA2ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCQkgNjgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCQkvKiBJRFNFTCAxNCovCi0JCQkJCSA3MDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIDcwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgNzAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSA3MDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIDcwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSA3MDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgNzAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIDcwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMTUgKi8KLQkJCQkJIDc4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgNzgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSA3ODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIDc4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCQkgNzgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkJIDc4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJCSA3ODAwIDAgMCAzICZtcGljIDQgMQorCQkJCQkgNzgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCQkvKiBJRFNFTCAxOCAqLwotCQkJCQkgOTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSA5MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDkwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgOTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSA5MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgOTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDkwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSA5MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDE5ICovCi0JCQkJCSA5ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDk4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgOTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSA5ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDk4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSA5ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgOTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDk4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMjAgKi8KLQkJCQkJIGEwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCQkgYTAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJCSBhMDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkJIGEwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCQkgYTAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkJIGEwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJCSBhMDAwIDAgMCAzICZtcGljIDEgMQorCQkJCQkgYTAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCQkvKiBJRFNFTCAyMSAqLwotCQkJCQkgYTgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJCSBhODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkJIGE4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCQkgYTgwMCAwIDAgNCAmbXBpYyAzMSAxPjsKKwkJCQkJIGE4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJCSBhODAwIDAgMCAyICZtcGljIDMgMQorCQkJCQkgYTgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQkJIGE4MDAgMCAwIDQgJm1waWMgMSAxPjsKIAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDggMD47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDEwMDAwMDA+OwpAQCAtMjM0LDcgKzI0Niw3IEBACiAJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDFlIDA+OworCQkJCWludGVycnVwdHMgPSA8MmUgMj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQkJcmVnID0gPDkwYzAwIDgwPjsKIAkJCQlidWlsdC1pbjsKQEAgLTI3NSw3ICsyODcsMTMgQEAKIAkJCQltb2RlbCA9ICJGQ0MiOwogCQkJCWRldmljZS1pZCA9IDwyPjsKIAkJCQlyZWcgPSA8OTEzMjAgMjAgODg1MDAgMTAwIDkxM2EwIDMwPjsKLQkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDIgRkQgXTsKKwkJCQkvKgorCQkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkJICovCisJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQkJY2xvY2stc2V0dXAgPSA8ZmYwMGZmZmYgMjUwMDAwPjsKIAkJCQlyeC1jbG9jayA9IDwxNT47CiAJCQkJdHgtY2xvY2sgPSA8MTY+OwpAQCAtMjkwLDcgKzMwOCwxMyBAQAogCQkJCW1vZGVsID0gIkZDQyI7CiAJCQkJZGV2aWNlLWlkID0gPDM+OwogCQkJCXJlZyA9IDw5MTM0MCAyMCA4ODYwMCAxMDAgOTEzZDAgMzA+OwotCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMyBGRCBdOworCQkJCS8qCisJCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCQkgKi8KKwkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCQljbG9jay1zZXR1cCA9IDxmZmZmMDBmZiAzNzAwPjsKIAkJCQlyeC1jbG9jayA9IDwxNz47CiAJCQkJdHgtY2xvY2sgPSA8MTg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCmluZGV4IGExMjNlYzkuLjZiYjE4ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC03MCwxNCArNzAsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDgwMDAwPjsJLy8gTDIsIDUxMksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04Niw3ICs4Niw3IEBACiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMTAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC05OSwyNSArOTksMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDE+OworCQkJCWludGVycnVwdHMgPSA8MSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMiAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTMwLDggKzEzMCwxNCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLwogCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKyAJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CiAJCX07CkBAIC0xNDMsOCArMTQ5LDE0IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworIAkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkzPjsKIAkJfTsKQEAgLTE1NCw3ICsxNjYsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNjMsNyArMTc1LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTcyLDcgKzE4NCw3IEBACiAJCQltb2RlbCA9ICJTRUMyIjsKIAkJCWNvbXBhdGlibGUgPSAidGFsaXRvcyI7CiAJCQlyZWcgPSA8MzAwMDAgZjAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFkIDI+OworCQkJaW50ZXJydXB0cyA9IDwyZCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJbnVtLWNoYW5uZWxzID0gPDQ+OwogCQkJY2hhbm5lbC1maWZvLWxlbiA9IDwxOD47CkBAIC0zMDAsNyArMzEyLDEzIEBACiAJCQlyZWcgPSA8MjAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwNCA5ZiAwMCAyMyAyMyBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxOT47CiAJCQlwaHktaGFuZGxlID0gPCZxZV9waHkwPjsKQEAgLTMxNiw3ICszMzQsMTMgQEAKIAkJCXJlZyA9IDwzMDAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE0PjsKIAkJCXBoeS1oYW5kbGUgPSA8JnFlX3BoeTE+OwpAQCAtMzM1LDI1ICszNTksMjUgQEAKIAkJCSAqIGdpYW5mYXIncyBNRElPIGJ1cyAqLwogCQkJcWVfcGh5MDogZXRoZXJuZXQtcGh5QDAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDE+OworCQkJCWludGVycnVwdHMgPSA8MSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkxOiBldGhlcm5ldC1waHlAMDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTI6IGV0aGVybmV0LXBoeUAwMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MzogZXRoZXJuZXQtcGh5QDAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0zNjcsNyArMzkxLDcgQEAKIAkJCXJlZyA9IDw4MCA4MD47CiAJCQlidWlsdC1pbjsKIAkJCWJpZy1lbmRpYW47Ci0JCQlpbnRlcnJ1cHRzID0gPDFlIDIgMWUgMj47IC8vaGlnaDozMCBsb3c6MzAKKwkJCWludGVycnVwdHMgPSA8MmUgMiAyZSAyPjsgLy9oaWdoOjMwIGxvdzozMAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKaW5kZXggMjYwYjI2NC4uZGI1NmEwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKQEAgLTU2LDggKzU2LDEyIEBACiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQlyYW5nZXMgPSA8MCBmODAwMDAwMCAwMDEwMDAwMD47Ci0JCXJlZyA9IDxmODAwMDAwMCAwMDEwMDAwMD47CS8vIENDU1JCQVIgMU0KKwkJcmFuZ2VzID0gPDAwMDAxMDAwIGY4MDAxMDAwIDAwMGZmMDAwCisJCQkgIDgwMDAwMDAwIDgwMDAwMDAwIDIwMDAwMDAwCisJCQkgIGUyMDAwMDAwIGUyMDAwMDAwIDAwMTAwMDAwCisJCQkgIGEwMDAwMDAwIGEwMDAwMDAwIDIwMDAwMDAwCisJCQkgIGUzMDAwMDAwIGUzMDAwMDAwIDAwMTAwMDAwPjsKKwkJcmVnID0gPGY4MDAwMDAwIDAwMDAxMDAwPjsJLy8gQ0NTUkJBUgogCQlidXMtZnJlcXVlbmN5ID0gPDA+OwogCiAJCWkyY0AzMDAwIHsKQEAgLTg2LDI1ICs5MCwyNSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MjogZXRoZXJuZXQtcGh5QDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NGEgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTM6IGV0aGVybmV0LXBoeUAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMTcsNyArMTIxLDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKQEAgLTEzMCw3ICsxNDAsMTMgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwpAQCAtMTQzLDcgKzE1OSwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDAyIEZEIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDFGIDIgMjAgMiAyMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CkBAIC0xNTYsNyArMTc4LDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjcwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgMDMgRkQgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjUgMiAyNiAyIDI3IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkzPjsKQEAgLTE4Niw3ICsyMTQsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4MDAwIDEwMDA+OwotCQkJYnVzLXJhbmdlID0gPDAgZmU+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwMTAwMDAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsKQEAgLTI4NSwxNyArMzEzLDg0IEBACiAJCQkJZjgwMCAwIDAgMyAmaTgyNTkgMCAwCiAJCQkJZjgwMCAwIDAgNCAmaTgyNTkgMCAwCiAJCQkJPjsKLQkJCWk4MjU5OiBpODI1OUA0ZDAgewotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQlidWlsdC1pbjsKLQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLSAgICAgICAgICAgICAgICAJICAgICAgICBiaWctZW5kaWFuOwotCQkJCWludGVycnVwdHMgPSA8NDkgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl1bGkxNTc1QDAgeworCQkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwCisJCQkJCSAgMDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkgIDAgMjAwMDAwMDAKKwkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkgIDAgMDAxMDAwMDA+OworCisJCQkJcGNpX2JyaWRnZUAwIHsKKwkJCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJCSAgMDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkJICAwIDIwMDAwMDAwCisJCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkJICAwIDAwMTAwMDAwPjsKKworCQkJCQlpc2FAMWUgeworCQkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKKwkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJCQkJcmVnID0gPGYwMDAgMCAwIDAgMD47CisJCQkJCQlyYW5nZXMgPSA8MSAwIDAxMDAwMDAwIDAgMAorCQkJCQkJCSAgMDAwMDEwMDA+OworCQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaTgyNTk+OworCisJCQkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgeworCQkJCQkJCXJlZyA9IDwxIDIwIDIKKwkJCQkJCQkgICAgICAgMSBhMCAyCisJCQkJCQkJICAgICAgIDEgNGQwIDI+OworCQkJCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCQkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7CisJCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQkJCQlidWlsdC1pbjsKKwkJCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKKwkJCQkJCQlpbnRlcnJ1cHRzID0gPDkgMj47CisJCQkJCQkJaW50ZXJydXB0LXBhcmVudCA9CisJCQkJCQkJCTwmbXBpYz47CisJCQkJCQl9OworCisJCQkJCQlpODA0MkA2MCB7CisJCQkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCQkJcmVnID0gPDEgNjAgMSAxIDY0IDE+OworCQkJCQkJCWludGVycnVwdHMgPSA8MSAzIGMgMz47CisJCQkJCQkJaW50ZXJydXB0LXBhcmVudCA9CisJCQkJCQkJCTwmaTgyNTk+OworCisJCQkJCQkJa2V5Ym9hcmRAMCB7CisJCQkJCQkJCXJlZyA9IDwwPjsKKwkJCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsMzAzIjsKKwkJCQkJCQl9OworCisJCQkJCQkJbW91c2VAMSB7CisJCQkJCQkJCXJlZyA9IDwxPjsKKwkJCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsZjAzIjsKKwkJCQkJCQl9OworCQkJCQkJfTsKKworCQkJCQkJcnRjQDcwIHsKKwkJCQkJCQljb21wYXRpYmxlID0KKwkJCQkJCQkJInBucFBOUCxiMDAiOworCQkJCQkJCXJlZyA9IDwxIDcwIDI+OworCQkJCQkJfTsKKworCQkJCQkJZ3Bpb0A0MDAgeworCQkJCQkJCXJlZyA9IDwxIDQwMCA4MD47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCiAJCX07CkBAIC0zMTYsMTAgKzQxMSwxMCBAQAogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQ0IDEKLQkJCQkwMDAwIDAgMCAyICZtcGljIDQ1IDEKLQkJCQkwMDAwIDAgMCAzICZtcGljIDQ2IDEKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDQ3IDEKKwkJCQkwMDAwIDAgMCAxICZtcGljIDQgMQorCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMQogCQkJCT47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMKaW5kZXggYzBkMDZmZC4uZTVlNzcyNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMKQEAgLTE1LDEyICsxNSwxMCBAQAogCWNvbXBhdGlibGUgPSAibXBjOHh4IjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKLQlsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKIAljcHVzIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwotCQlsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKIAkJUG93ZXJQQyw4NjZAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwpAQCAtMzQsMTQgKzMyLDEyIEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQkzMi1iaXQ7CiAJCQlpbnRlcnJ1cHRzID0gPGYgMj47CS8vIGRlY3JlbWVudGVyIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPDIwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJfTsKIAl9OwogCiAJbWVtb3J5IHsKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJbGludXgscGhhbmRsZSA9IDwzMDA+OwogCQlyZWcgPSA8MDAwMDAwMDAgODAwMDAwPjsKIAl9OwogCkBAIC01NywxMSArNTMsOSBAQAogCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7CiAJCQljb21wYXRpYmxlID0gImZzX2VuZXQiOwogCQkJcmVnID0gPGU4MCA4PjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlldGhlcm5ldC1waHlAZiB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwZj47CisJCQlwaHk6IGV0aGVybmV0LXBoeUBmIHsKIAkJCQlyZWcgPSA8Zj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC03NSwxMiArNjksMTEgQEAKIAkJCXJlZyA9IDxlMDAgMTg4PjsKIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMSBGRCBdOwogCQkJaW50ZXJydXB0cyA9IDwzIDE+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlwaHktaGFuZGxlID0gPGU4MDBmPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5PjsKIAkJfTsKIAotCQlwaWNAZmYwMDAwMDAgewotCQkJbGludXgscGhhbmRsZSA9IDxmZjAwMDAwMD47CisJCW1wYzh4eF9waWM6IHBpY0BmZjAwMDAwMCB7CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTkxLDcgKzg0LDYgQEAKIAkJfTsKIAogCQljcG1AZmYwMDAwMDAgewotCQkJbGludXgscGhhbmRsZSA9IDxmZjAwMDAwMD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTEwMiwxNSArOTQsMTQgQEAKIAkJCWNvbW1hbmQtcHJvYyA9IDw5YzA+OwogCQkJYnJnLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MCAyPjsJLy8gY3BtIGVycm9yIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAKLQkJCXBpY0A5MzAgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8OTMwPjsKKwkJCWNwbV9waWM6IHBpY0A5MzAgewogCQkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQkJaW50ZXJydXB0cyA9IDw1IDIgMCAyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJCQlyZWcgPSA8OTMwIDIwPjsKIAkJCQlidWlsdC1pbjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJjcG0tcGljIjsKQEAgLTEyOCw3ICsxMTksNyBAQAogCQkJCXR4LWNsb2NrID0gPDE+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDw0IDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNtY0BhOTAgewpAQCAtMTQyLDcgKzEzMyw3IEBACiAJCQkJdHgtY2xvY2sgPSA8Mj47CiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDMgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAogCQkJc2NjQGEwMCB7CkBAIC0xNTMsNyArMTQ0LDcgQEAKIAkJCQlyZWcgPSA8YTAwIDE4IDNjMDAgODA+OwogCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMyBGRCBdOwogCQkJCWludGVycnVwdHMgPSA8MWUgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cwppbmRleCAxMTBiZjYxLi5kYzdhYjljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cwpAQCAtMTUsMTIgKzE1LDEwIEBACiAJY29tcGF0aWJsZSA9ICJtcGM4eHgiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwotCWxpbnV4LHBoYW5kbGUgPSA8MTAwPjsKIAogCWNwdXMgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCWxpbnV4LHBoYW5kbGUgPSA8MjAwPjsKIAogCQlQb3dlclBDLDg4NUAwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CkBAIC0zNCwxNCArMzIsMTIgQEAKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCTMyLWJpdDsKIAkJCWludGVycnVwdHMgPSA8ZiAyPjsJLy8gZGVjcmVtZW50ZXIgaW50ZXJydXB0Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8MjAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OwogCQl9OwogCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlsaW51eCxwaGFuZGxlID0gPDMwMD47CiAJCXJlZyA9IDwwMDAwMDAwMCA4MDAwMDA+OwogCX07CiAKQEAgLTU3LDIxICs1MywxNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7CiAJCQljb21wYXRpYmxlID0gImZzX2VuZXQiOwogCQkJcmVnID0gPGU4MCA4PjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlldGhlcm5ldC1waHlAMCB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwMD47CisJCQlQaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwotCQkJZXRoZXJuZXQtcGh5QDEgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMDE+OworCQkJUGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKLQkJCWV0aGVybmV0LXBoeUAyIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPGU4MDAyPjsKKwkJCVBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC04NSw4ICs3Nyw4IEBACiAJCQlyZWcgPSA8ZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTE+OwogCQl9OwogCiAJCWZlY0AxZTAwIHsKQEAgLTk3LDEyICs4OSwxMSBAQAogCQkJcmVnID0gPDFlMDAgMTg4PjsKIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMiBGRCBdOwogCQkJaW50ZXJydXB0cyA9IDw3IDE+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlwaHktaGFuZGxlID0gPGU4MDAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5Mj47CiAJCX07CiAKLQkJcGljQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OworCQlNcGM4eHhfcGljOiBwaWNAZmYwMDAwMDAgewogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMTIsOCArMTAzLDE4IEBACiAJCQljb21wYXRpYmxlID0gIkNQTSI7CiAJCX07CiAKKwkJcGNtY2lhQDAwODAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbCxwcS1wY21jaWEiOworCQkJZGV2aWNlX3R5cGUgPSAicGNtY2lhIjsKKwkJCXJlZyA9IDw4MCA4MD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCWludGVycnVwdHMgPSA8ZCAxPjsKKwkJfTsKKwogCQljcG1AZmYwMDAwMDAgewotCQkJbGludXgscGhhbmRsZSA9IDxmZjAwMDAwMD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTEyNCwxNSArMTI1LDE0IEBACiAJCQljb21tYW5kLXByb2MgPSA8OWMwPjsKIAkJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMj47CS8vIGNwbSBlcnJvciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCi0JCQlwaWNAOTMwIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPDkzMD47CisJCQlDcG1fcGljOiBwaWNAOTMwIHsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCQkJcmVnID0gPDkzMCAyMD47CiAJCQkJYnVpbHQtaW47CiAJCQkJZGV2aWNlX3R5cGUgPSAiY3BtLXBpYyI7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJCQl0eC1jbG9jayA9IDwxPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8NCAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzbWNAYTkwIHsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQkJCXR4LWNsb2NrID0gPDI+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDwzIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNjY0BhNDAgewpAQCAtMTc1LDggKzE3NSw4IEBACiAJCQkJcmVnID0gPGE0MCAxOCAzZTAwIDgwPjsKIAkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKIAkJCQlpbnRlcnJ1cHRzID0gPDFjIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKLQkJCQlwaHktaGFuZGxlID0gPGU4MDAyPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKKwkJCQlwaHktaGFuZGxlID0gPCZQaHkyPjsKIAkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKaW5kZXggNTY4OTY1YS4uNjk5ZDBkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKQEAgLTMwOSw3ICszMDksNyBAQAogCX07CiAKIAljaG9zZW4gewotCQlib290YXJncyA9ICJpcD1vbiBjb25zb2xlPXR0eU1NMCI7CisJCWJvb3RhcmdzID0gImlwPW9uIjsKIAkJbGludXgsc3Rkb3V0LXBhdGggPSAiL212NjR4NjBAZjEwMDAwMDAvbXBzY0A4MDAwIjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BzMy5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5ZGVkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgUFMzIEdhbWUgQ29uc29sZSBkZXZpY2UgdHJlZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8geworCW1vZGVsID0gIlNvbnlQUzMiOworCWNvbXBhdGlibGUgPSAic29ueSxwczMiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCisJY2hvc2VuIHsKKwl9OworCisJLyoKKwkgKiBXZSdsbCBnZXQgdGhlIHNpemUgb2YgdGhlIGJvb3RtZW0gYmxvY2sgZnJvbSBsdjEgYWZ0ZXIgc3RhcnR1cCwKKwkgKiBzbyB3ZSdsbCBwdXQgYSBudWxsIGVudHJ5IGhlcmUuCisJICovCisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MCAwIDAgMD47CisJfTsKKworCS8qCisJICogVGhlIGJvb3QgY3B1IGlzIGFsd2F5cyB6ZXJvIGZvciBQUzMuCisJICoKKwkgKiBkdGMgZXhwZWN0cyBhIGNsb2NrLWZyZXF1ZW5jeSBhbmQgdGltZWJhc2UtZnJlcXVlbmN5IGVudHJpZXMsIHNvCisJICogd2UnbGwgcHV0IGEgbnVsbCBlbnRyaWVzIGhlcmUuICBUaGVzZSB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyCisJICogc3RhcnR1cCB3aXRoIGRhdGEgZnJvbSBsdjEuCisJICoKKwkgKiBTZWVtcyB0aGUgb25seSB3YXkgY3VycmVudGx5IHRvIGluZGljYXRlIGEgcHJvY2Vzc29yIGhhcyBtdWx0aXBsZQorCSAqIHRocmVhZHMgaXMgd2l0aCBhbiBpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyBlbnRyeS4gIFdlJ2xsIHB1dCBvbmUKKwkgKiBoZXJlIHNvIHdlIGNhbiBicmluZyB1cCBib3RoIG9mIG91cnMuICBTZWUgc21wX3NldHVwX2NwdV9tYXBzKCkuCisJICovCisKKwljcHVzIHsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCisJCWNwdUAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyA9IDwwIDE+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OworCQkJaS1jYWNoZS1zaXplID0gPDgwMDA+OworCQkJZC1jYWNoZS1zaXplID0gPDgwMDA+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8ODA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8ODA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYyBiL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMKaW5kZXggYjEyNTFlZS4uNzVkYWVkYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9lYm9ueS5jCkBAIC0xMDAsMjggKzEwMCwxMyBAQAogCWlibTQ0MGdwX2ZpeHVwX2Nsb2NrcyhzeXNjbGssIDYgKiAxODQzMjAwKTsKIAlpYm00NHhfZml4dXBfbWVtc2l6ZSgpOwogCWR0X2ZpeHVwX21hY19hZGRyZXNzZXMoZWJvbnlfbWFjMCwgZWJvbnlfbWFjMSk7Ci19Ci0KLSNkZWZpbmUgU1BSTl9EQkNSMAkJMHgxMzQKLSNkZWZpbmUgICBEQkNSMF9SU1RfU1lTVEVNCTB4MzAwMDAwMDAKLQotc3RhdGljIHZvaWQgZWJvbnlfZXhpdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JYXNtIHZvbGF0aWxlICgKLQkJIm1mc3ByCSUwLCUxXG4iCi0JCSJvcmlzCSUwLCUwLCUyQGhcbiIKLQkJIm10c3ByCSUxLCUwIgotCQk6ICI9JnIiKHRtcCkgOiAiaSIoU1BSTl9EQkNSMCksICJpIihEQkNSMF9SU1RfU1lTVEVNKQotCQkpOwotCisJaWJtNHh4X2ZpeHVwX2ViY19yYW5nZXMoIi9wbGIvb3BiL2ViYyIpOwogfQogCiB2b2lkIGVib255X2luaXQodm9pZCAqbWFjMCwgdm9pZCAqbWFjMSkKIHsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gZWJvbnlfZml4dXBzOwotCXBsYXRmb3JtX29wcy5leGl0ID0gZWJvbnlfZXhpdDsKKwlwbGF0Zm9ybV9vcHMuZXhpdCA9IGlibTQ0eF9kYmNyX3Jlc2V0OwogCWVib255X21hYzAgPSBtYWMwOwogCWVib255X21hYzEgPSBtYWMxOwogCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKaW5kZXggNTZiNTZhOC4uNDE2ZGMzOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwpAQCAtMzYsOCArMzYsNiBAQAogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIH07CiAKLXR5cGVkZWYgdm9pZCAoKmtlcm5lbF9lbnRyeV90KSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwotCiAjdW5kZWYgREVCVUcKIAogc3RhdGljIHN0cnVjdCBhZGRyX3JhbmdlIHByZXBfa2VybmVsKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYwppbmRleCBkMTZlZTNlLi4zODVlMDhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmMKQEAgLTE1LDggKzE1LDcgQEAKICNpbmNsdWRlICJwYWdlLmgiCiAjaW5jbHVkZSAib3BzLmgiCiAKLXR5cGVkZWYgdm9pZCAqaWhhbmRsZTsKLXR5cGVkZWYgdm9pZCAqcGhhbmRsZTsKKyNpbmNsdWRlICJvZi5oIgogCiBleHRlcm4gY2hhciBfZW5kW107CiAKQEAgLTI1LDE1NCArMjQsMTAgQEAKICNkZWZpbmUgUkFNX0VORAkJKDUxMjw8MjApCS8qIEZpeG1lOiB1c2UgT0YgKi8KICNkZWZpbmUJT05FX01CCQkweDEwMDAwMAogCi1pbnQgKCpwcm9tKSAodm9pZCAqKTsKIAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFpbV9iYXNlOwogCi1zdGF0aWMgaW50IGNhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNvbnN0IGNoYXIgKnNlcnZpY2U7Ci0JCWludCBuYXJnczsKLQkJaW50IG5yZXQ7Ci0JCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKLQl9IGFyZ3M7Ci0JdmFfbGlzdCBsaXN0OwotCi0JYXJncy5zZXJ2aWNlID0gc2VydmljZTsKLQlhcmdzLm5hcmdzID0gbmFyZ3M7Ci0JYXJncy5ucmV0ID0gbnJldDsKLQotCXZhX3N0YXJ0KGxpc3QsIG5yZXQpOwotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCQlhcmdzLmFyZ3NbaV0gPSB2YV9hcmcobGlzdCwgdW5zaWduZWQgaW50KTsKLQl2YV9lbmQobGlzdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJldDsgaSsrKQotCQlhcmdzLmFyZ3NbbmFyZ3MraV0gPSAwOwotCi0JaWYgKHByb20oJmFyZ3MpIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAotCQkgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKQotewotCWludCBpOwotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljb25zdCBjaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07Ci0JfSBhcmdzOwotCXZhX2xpc3QgbGlzdDsKLQotCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7Ci0JYXJncy5uYXJncyA9IG5hcmdzOwotCWFyZ3MubnJldCA9IG5yZXQ7Ci0KLQl2YV9zdGFydChsaXN0LCByZXRzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7Ci0JdmFfZW5kKGxpc3QpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKLQkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKLQotCWlmIChwcm9tKCZhcmdzKSA8IDApCi0JCXJldHVybiAtMTsKLQotCWlmIChyZXRzICE9ICh2b2lkICopIDApCi0JCWZvciAoaSA9IDE7IGkgPCBucmV0OyArK2kpCi0JCQlyZXRzW2ktMV0gPSBhcmdzLmFyZ3NbbmFyZ3MraV07Ci0KLQlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKLX0KLQotLyoKLSAqIE9sZGVyIE9GJ3MgcmVxdWlyZSB0aGF0IHdoZW4gY2xhaW1pbmcgYSBzcGVjaWZpYyByYW5nZSBvZiBhZGRyZXNzZXMsCi0gKiB3ZSBjbGFpbSB0aGUgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIC9tZW1vcnkgbm9kZSBhbmQgdGhlIHZpcnR1YWwKLSAqIHNwYWNlIGluIHRoZSBjaG9zZW4gbW11IG5vZGUsIGFuZCB0aGVuIGRvIGEgbWFwIG9wZXJhdGlvbiB0bwotICogbWFwIHZpcnR1YWwgdG8gcGh5c2ljYWwuCi0gKi8KLXN0YXRpYyBpbnQgbmVlZF9tYXAgPSAtMTsKLXN0YXRpYyBpaGFuZGxlIGNob3Nlbl9tbXU7Ci1zdGF0aWMgcGhhbmRsZSBtZW1vcnk7Ci0KLS8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLwotc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQotewotCWZvciAoOyAqczI7ICsrczIpCi0JCWlmICgqczErKyAhPSAqczIpCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBjaGVja19vZl92ZXJzaW9uKHZvaWQpCi17Ci0JcGhhbmRsZSBvcHJvbSwgY2hvc2VuOwotCWNoYXIgdmVyc2lvbls2NF07Ci0KLQlvcHJvbSA9IGZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOwotCWlmIChvcHJvbSA9PSAocGhhbmRsZSkgLTEpCi0JCXJldHVybiAwOwotCWlmIChnZXRwcm9wKG9wcm9tLCAibW9kZWwiLCB2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpIDw9IDApCi0JCXJldHVybiAwOwotCXZlcnNpb25bc2l6ZW9mKHZlcnNpb24pLTFdID0gMDsKLQlwcmludGYoIk9GIHZlcnNpb24gPSAnJXMnXHJcbiIsIHZlcnNpb24pOwotCWlmICghc3RyaW5nX21hdGNoKHZlcnNpb24sICJPcGVuIEZpcm13YXJlLCAxLiIpCi0JICAgICYmICFzdHJpbmdfbWF0Y2godmVyc2lvbiwgIkZpcm1Xb3JrcywzLiIpKQotCQlyZXR1cm4gMDsKLQljaG9zZW4gPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7Ci0JaWYgKGNob3NlbiA9PSAocGhhbmRsZSkgLTEpIHsKLQkJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbkAwIik7Ci0JCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7Ci0JCQlwcmludGYoIm5vIGNob3NlblxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoZ2V0cHJvcChjaG9zZW4sICJtbXUiLCAmY2hvc2VuX21tdSwgc2l6ZW9mKGNob3Nlbl9tbXUpKSA8PSAwKSB7Ci0JCXByaW50Zigibm8gbW11XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeSIpOwotCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7Ci0JCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeUAwIik7Ci0JCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7Ci0JCQlwcmludGYoIm5vIG1lbW9yeSBub2RlXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXByaW50Zigib2xkIE9GIGRldGVjdGVkXHJcbiIpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAqY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0OwotCi0JaWYgKG5lZWRfbWFwIDwgMCkKLQkJbmVlZF9tYXAgPSBjaGVja19vZl92ZXJzaW9uKCk7Ci0JaWYgKGFsaWduIHx8ICFuZWVkX21hcCkKLQkJcmV0dXJuICh2b2lkICopIGNhbGxfcHJvbSgiY2xhaW0iLCAzLCAxLCB2aXJ0LCBzaXplLCBhbGlnbik7Ci0KLQlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIG1lbW9yeSwKLQkJCSAgICBhbGlnbiwgc2l6ZSwgdmlydCk7Ci0JaWYgKHJldCAhPSAwIHx8IHJlc3VsdCA9PSAtMSkKLQkJcmV0dXJuICh2b2lkICopIC0xOwotCXJldCA9IGNhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgY2hvc2VuX21tdSwKLQkJCSAgICBhbGlnbiwgc2l6ZSwgdmlydCk7Ci0JLyogMHgxMiA9PSBjb2hlcmVudCArIHJlYWQvd3JpdGUgKi8KLQlyZXQgPSBjYWxsX3Byb20oImNhbGwtbWV0aG9kIiwgNiwgMSwgIm1hcCIsIGNob3Nlbl9tbXUsCi0JCQkweDEyLCBzaXplLCB2aXJ0LCB2aXJ0KTsKLQlyZXR1cm4gKHZvaWQgKikgdmlydDsKLX0KLQogc3RhdGljIHZvaWQgKm9mX3RyeV9jbGFpbSh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKQEAgLTE4NCw3ICszOSw3IEBACiAjaWZkZWYgREVCVUcKIAkJcHJpbnRmKCIgICAgdHJ5aW5nOiAweCUwOGx4XG5cciIsIGNsYWltX2Jhc2UpOwogI2VuZGlmCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZyljbGFpbShjbGFpbV9iYXNlLCBzaXplLCAwKTsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKW9mX2NsYWltKGNsYWltX2Jhc2UsIHNpemUsIDApOwogCQlpZiAoKHZvaWQgKilhZGRyICE9ICh2b2lkICopLTEpCiAJCQlicmVhazsKIAl9CkBAIC0yMDgsNjQgKzYzLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkICpvZl92bWxpbnV4X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpwID0gbWFsbG9jKHNpemUpOwotCi0JaWYgKCFwKQotCQlmYXRhbCgiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBrZXJuZWwgaW1hZ2UhXG5cciIpOwotCi0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9mX2V4aXQodm9pZCkKLXsKLQljYWxsX3Byb20oImV4aXQiLCAwLCAwKTsKLX0KLQotLyoKLSAqIE9GIGRldmljZSB0cmVlIHJvdXRpbmVzCi0gKi8KLXN0YXRpYyB2b2lkICpvZl9maW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIChwaGFuZGxlKSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBuYW1lKTsKLX0KLQotc3RhdGljIGludCBvZl9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwKLQkJY29uc3QgaW50IGJ1ZmxlbikKLXsKLQlyZXR1cm4gY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOwotfQotCi1zdGF0aWMgaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAotCQljb25zdCBpbnQgYnVmbGVuKQotewotCXJldHVybiBjYWxsX3Byb20oInNldHByb3AiLCA0LCAxLCBwaGFuZGxlLCBuYW1lLCBidWYsIGJ1Zmxlbik7Ci19Ci0KLS8qCi0gKiBPRiBjb25zb2xlIHJvdXRpbmVzCi0gKi8KLXN0YXRpYyB2b2lkICpvZl9zdGRvdXRfaGFuZGxlOwotCi1zdGF0aWMgaW50IG9mX2NvbnNvbGVfb3Blbih2b2lkKQotewotCXZvaWQgKmRldnA7Ci0KLQlpZiAoKChkZXZwID0gZmluZGRldmljZSgiL2Nob3NlbiIpKSAhPSBOVUxMKQotCQkJJiYgKGdldHByb3AoZGV2cCwgInN0ZG91dCIsICZvZl9zdGRvdXRfaGFuZGxlLAotCQkJCXNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkKLQkJCQk9PSBzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgb2ZfY29uc29sZV93cml0ZShjaGFyICpidWYsIGludCBsZW4pCi17Ci0JY2FsbF9wcm9tKCJ3cml0ZSIsIDMsIDEsIG9mX3N0ZG91dF9oYW5kbGUsIGJ1ZiwgbGVuKTsKLX0KLQogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIHZvaWQgKnByb21wdHIpCiB7CiAJcGxhdGZvcm1fb3BzLmltYWdlX2hkciA9IG9mX2ltYWdlX2hkcjsKQEAgLTI3NywxMCArNzQsOSBAQAogCWR0X29wcy5nZXRwcm9wID0gb2ZfZ2V0cHJvcDsKIAlkdF9vcHMuc2V0cHJvcCA9IG9mX3NldHByb3A7CiAKLQljb25zb2xlX29wcy5vcGVuID0gb2ZfY29uc29sZV9vcGVuOwotCWNvbnNvbGVfb3BzLndyaXRlID0gb2ZfY29uc29sZV93cml0ZTsKKwlvZl9jb25zb2xlX2luaXQoKTsKIAotCXByb20gPSAoaW50ICgqKSh2b2lkICopKXByb21wdHI7CisJb2ZfaW5pdChwcm9tcHRyKTsKIAlsb2FkZXJfaW5mby5wcm9tcHRyID0gcHJvbXB0cjsKIAlpZiAoYTEgJiYgYTIgJiYgYTIgIT0gMHhkZWFkYmVlZikgewogCQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IGExOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuaCBiL2FyY2gvcG93ZXJwYy9ib290L29mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjNjhmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfUFBDX0JPT1RfT0ZfSF8KKyNkZWZpbmUgX1BQQ19CT09UX09GX0hfCisKK3R5cGVkZWYgdm9pZCAqcGhhbmRsZTsKK3R5cGVkZWYgdm9pZCAqaWhhbmRsZTsKKwordm9pZCBvZl9pbml0KHZvaWQgKnByb21wdHIpOworaW50IG9mX2NhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pOwordm9pZCAqb2ZfY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pOwordm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwordm9pZCBvZl9leGl0KHZvaWQpOwordm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCBvZl9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwKKwkgICAgICAgY29uc3QgaW50IGJ1Zmxlbik7CitpbnQgb2Zfc2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pOworCisvKiBDb25zb2xlIGZ1bmN0aW9ucyAqLwordm9pZCBvZl9jb25zb2xlX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfUFBDX0JPT1RfT0ZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2Zjb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwZTAyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBPRiBjb25zb2xlIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgIm9wcy5oIgorCisjaW5jbHVkZSAib2YuaCIKKworc3RhdGljIHZvaWQgKm9mX3N0ZG91dF9oYW5kbGU7CisKK3N0YXRpYyBpbnQgb2ZfY29uc29sZV9vcGVuKHZvaWQpCit7CisJdm9pZCAqZGV2cDsKKworCWlmICgoKGRldnAgPSBvZl9maW5kZGV2aWNlKCIvY2hvc2VuIikpICE9IE5VTEwpCisJICAgICYmIChvZl9nZXRwcm9wKGRldnAsICJzdGRvdXQiLCAmb2Zfc3Rkb3V0X2hhbmRsZSwKKwkJCSAgIHNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkKKwkJPT0gc2l6ZW9mKG9mX3N0ZG91dF9oYW5kbGUpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIG9mX2NvbnNvbGVfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCW9mX2NhbGxfcHJvbSgid3JpdGUiLCAzLCAxLCBvZl9zdGRvdXRfaGFuZGxlLCBidWYsIGxlbik7Cit9CisKK3ZvaWQgb2ZfY29uc29sZV9pbml0KHZvaWQpCit7CisJY29uc29sZV9vcHMub3BlbiA9IG9mX2NvbnNvbGVfb3BlbjsKKwljb25zb2xlX29wcy53cml0ZSA9IG9mX2NvbnNvbGVfd3JpdGU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZmxpYi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWI4ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMTk5Ny4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbGYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJvcHMuaCIKKworI2luY2x1ZGUgIm9mLmgiCisKK3N0YXRpYyBpbnQgKCpwcm9tKSAodm9pZCAqKTsKKwordm9pZCBvZl9pbml0KHZvaWQgKnByb21wdHIpCit7CisJcHJvbSA9IChpbnQgKCopKHZvaWQgKikpcHJvbXB0cjsKK30KKworaW50IG9mX2NhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pCit7CisJaW50IGk7CisJc3RydWN0IHByb21fYXJncyB7CisJCWNvbnN0IGNoYXIgKnNlcnZpY2U7CisJCWludCBuYXJnczsKKwkJaW50IG5yZXQ7CisJCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKKwl9IGFyZ3M7CisJdmFfbGlzdCBsaXN0OworCisJYXJncy5zZXJ2aWNlID0gc2VydmljZTsKKwlhcmdzLm5hcmdzID0gbmFyZ3M7CisJYXJncy5ucmV0ID0gbnJldDsKKworCXZhX3N0YXJ0KGxpc3QsIG5yZXQpOworCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorCQlhcmdzLmFyZ3NbaV0gPSB2YV9hcmcobGlzdCwgdW5zaWduZWQgaW50KTsKKwl2YV9lbmQobGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJldDsgaSsrKQorCQlhcmdzLmFyZ3NbbmFyZ3MraV0gPSAwOworCisJaWYgKHByb20oJmFyZ3MpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAorCQkJICAgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKQoreworCWludCBpOworCXN0cnVjdCBwcm9tX2FyZ3MgeworCQljb25zdCBjaGFyICpzZXJ2aWNlOworCQlpbnQgbmFyZ3M7CisJCWludCBucmV0OworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CisJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKKworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCByZXRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChyZXRzICE9ICh2b2lkICopIDApCisJCWZvciAoaSA9IDE7IGkgPCBucmV0OyArK2kpCisJCQlyZXRzW2ktMV0gPSBhcmdzLmFyZ3NbbmFyZ3MraV07CisKKwlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKK30KKworLyogcmV0dXJucyB0cnVlIGlmIHMyIGlzIGEgcHJlZml4IG9mIHMxICovCitzdGF0aWMgaW50IHN0cmluZ19tYXRjaChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJZm9yICg7ICpzMjsgKytzMikKKwkJaWYgKCpzMSsrICE9ICpzMikKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogT2xkZXIgT0YncyByZXF1aXJlIHRoYXQgd2hlbiBjbGFpbWluZyBhIHNwZWNpZmljIHJhbmdlIG9mIGFkZHJlc3NlcywKKyAqIHdlIGNsYWltIHRoZSBwaHlzaWNhbCBzcGFjZSBpbiB0aGUgL21lbW9yeSBub2RlIGFuZCB0aGUgdmlydHVhbAorICogc3BhY2UgaW4gdGhlIGNob3NlbiBtbXUgbm9kZSwgYW5kIHRoZW4gZG8gYSBtYXAgb3BlcmF0aW9uIHRvCisgKiBtYXAgdmlydHVhbCB0byBwaHlzaWNhbC4KKyAqLworc3RhdGljIGludCBuZWVkX21hcCA9IC0xOworc3RhdGljIGloYW5kbGUgY2hvc2VuX21tdTsKK3N0YXRpYyBwaGFuZGxlIG1lbW9yeTsKKworc3RhdGljIGludCBjaGVja19vZl92ZXJzaW9uKHZvaWQpCit7CisJcGhhbmRsZSBvcHJvbSwgY2hvc2VuOworCWNoYXIgdmVyc2lvbls2NF07CisKKwlvcHJvbSA9IG9mX2ZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOworCWlmIChvcHJvbSA9PSAocGhhbmRsZSkgLTEpCisJCXJldHVybiAwOworCWlmIChvZl9nZXRwcm9wKG9wcm9tLCAibW9kZWwiLCB2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpIDw9IDApCisJCXJldHVybiAwOworCXZlcnNpb25bc2l6ZW9mKHZlcnNpb24pLTFdID0gMDsKKwlwcmludGYoIk9GIHZlcnNpb24gPSAnJXMnXHJcbiIsIHZlcnNpb24pOworCWlmICghc3RyaW5nX21hdGNoKHZlcnNpb24sICJPcGVuIEZpcm13YXJlLCAxLiIpCisJICAgICYmICFzdHJpbmdfbWF0Y2godmVyc2lvbiwgIkZpcm1Xb3JrcywzLiIpKQorCQlyZXR1cm4gMDsKKwljaG9zZW4gPSBvZl9maW5kZGV2aWNlKCIvY2hvc2VuIik7CisJaWYgKGNob3NlbiA9PSAocGhhbmRsZSkgLTEpIHsKKwkJY2hvc2VuID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbkAwIik7CisJCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIGNob3NlblxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAob2ZfZ2V0cHJvcChjaG9zZW4sICJtbXUiLCAmY2hvc2VuX21tdSwgc2l6ZW9mKGNob3Nlbl9tbXUpKSA8PSAwKSB7CisJCXByaW50Zigibm8gbW11XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbW9yeSA9IChpaGFuZGxlKSBvZl9jYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeSIpOworCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCW1lbW9yeSA9IChpaGFuZGxlKSBvZl9jYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeUAwIik7CisJCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIG1lbW9yeSBub2RlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXByaW50Zigib2xkIE9GIGRldGVjdGVkXHJcbiIpOworCXJldHVybiAxOworfQorCit2b2lkICpvZl9jbGFpbSh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCByZXN1bHQ7CisKKwlpZiAobmVlZF9tYXAgPCAwKQorCQluZWVkX21hcCA9IGNoZWNrX29mX3ZlcnNpb24oKTsKKwlpZiAoYWxpZ24gfHwgIW5lZWRfbWFwKQorCQlyZXR1cm4gKHZvaWQgKikgb2ZfY2FsbF9wcm9tKCJjbGFpbSIsIDMsIDEsIHZpcnQsIHNpemUsIGFsaWduKTsKKworCXJldCA9IG9mX2NhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgbWVtb3J5LAorCQkJICAgICAgIGFsaWduLCBzaXplLCB2aXJ0KTsKKwlpZiAocmV0ICE9IDAgfHwgcmVzdWx0ID09IC0xKQorCQlyZXR1cm4gKHZvaWQgKikgLTE7CisJcmV0ID0gb2ZfY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBjaG9zZW5fbW11LAorCQkJICAgICAgIGFsaWduLCBzaXplLCB2aXJ0KTsKKwkvKiAweDEyID09IGNvaGVyZW50ICsgcmVhZC93cml0ZSAqLworCXJldCA9IG9mX2NhbGxfcHJvbSgiY2FsbC1tZXRob2QiLCA2LCAxLCAibWFwIiwgY2hvc2VuX21tdSwKKwkJCSAgIDB4MTIsIHNpemUsIHZpcnQsIHZpcnQpOworCXJldHVybiAodm9pZCAqKSB2aXJ0OworfQorCit2b2lkICpvZl92bWxpbnV4X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICpwID0gbWFsbG9jKHNpemUpOworCisJaWYgKCFwKQorCQlmYXRhbCgiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBrZXJuZWwgaW1hZ2UhXG5cciIpOworCisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgb2ZfZXhpdCh2b2lkKQoreworCW9mX2NhbGxfcHJvbSgiZXhpdCIsIDAsIDApOworfQorCisvKgorICogT0YgZGV2aWNlIHRyZWUgcm91dGluZXMKKyAqLwordm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAocGhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgbmFtZSk7Cit9CisKK2ludCBvZl9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwKKwkgICAgICAgY29uc3QgaW50IGJ1ZmxlbikKK3sKKwlyZXR1cm4gb2ZfY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOworfQorCitpbnQgb2Zfc2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pCit7CisJcmV0dXJuIG9mX2NhbGxfcHJvbSgic2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmgKaW5kZXggOTU5MTI0Zi4uODYwNzcwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmgKQEAgLTE5LDYgKzE5LDggQEAKICNkZWZpbmUJTUFYX1BBVEhfTEVOCQkyNTYKICNkZWZpbmUJTUFYX1BST1BfTEVOCQkyNTYgLyogV2hhdCBzaG91bGQgdGhpcyBiZT8gKi8KIAordHlwZWRlZiB2b2lkICgqa2VybmVsX2VudHJ5X3QpKHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHZvaWQgKnI1KTsKKwogLyogUGxhdGZvcm0gc3BlY2lmaWMgb3BlcmF0aW9ucyAqLwogc3RydWN0IHBsYXRmb3JtX29wcyB7CiAJdm9pZAkoKmZpeHVwcykodm9pZCk7CkBAIC01MSw3ICs1Myw3IEBACiAvKiBDb25zb2xlIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBjb25zb2xlX29wcyB7CiAJaW50CSgqb3Blbikodm9pZCk7Ci0Jdm9pZAkoKndyaXRlKShjaGFyICpidWYsIGludCBsZW4pOworCXZvaWQJKCp3cml0ZSkoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKTsKIAl2b2lkCSgqZWRpdF9jbWRsaW5lKShjaGFyICpidWYsIGludCBsZW4pOwogCXZvaWQJKCpjbG9zZSkodm9pZCk7CiAJdm9pZAkqZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3BzMy1oZWFkLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmQ2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiAgUFMzIGJvb3R3cmFwcGVyIGVudHJ5LgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgInBwY19hc20uaCIKKworCS50ZXh0CisKKy8qCisgKiBfX3N5c3RlbV9yZXNldF9vdmVybGF5IC0gVGhlIFBTMyBmaXJzdCBzdGFnZSBlbnRyeS4KKyAqCisgKiBUaGUgYm9vdHdyYXBlciBidWlsZCBzY3JpcHQgY29waWVzIHRoZSAweDEwMCBieXRlcyBhdCBzeW1ib2wKKyAqIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkgdG8gb2Zmc2V0IDB4MTAwIG9mIHRoZSByb20gaW1hZ2UuCisgKgorICogVGhlIFBTMyBoYXMgYSBzaW5nbGUgcHJvY2Vzc29yIHdpdGggdHdvIHRocmVhZHMuCisgKi8KKworCS5nbG9ibCBfX3N5c3RlbV9yZXNldF9vdmVybGF5CitfX3N5c3RlbV9yZXNldF9vdmVybGF5OgorCisJLyogU3dpdGNoIHRvIDMyLWJpdCBtb2RlLiAqLworCisJbWZtc3IJcjkKKwljbHJsZGkJcjkscjksMQorCW10bXNyZAlyOQorCW5vcAorCisJLyogR2V0IHRocmVhZCBudW1iZXIgaW4gcjMgYW5kIGJyYW5jaC4gKi8KKworCW1mc3ByCXIzLCAweDg4CisJY250bHp3LglyMywgcjMKKwlsaQlyNCwgMAorCWxpCXI1LCAwCisJYmVxCTFmCisKKwkvKiBTZWNvbmRhcnkgZ29lcyB0byBfX3NlY29uZGFyeV9ob2xkIGluIGtlcm5lbC4gKi8KKworCWxpCXI0LCAweDYwCisJbXRjdHIJcjQKKwliY3RyCisKKwkvKiBQcmltYXJ5IGRlbGF5cyB0aGVuIGdvZXMgdG8gX3ppbWFnZV9zdGFydCBpbiB3cmFwcGVyLiAqLworMToKKwlvcgkzMSwgMzEsIDMxIC8qIGRiMTZjeWMgKi8KKwlvcgkzMSwgMzEsIDMxIC8qIGRiMTZjeWMgKi8KKworCWxpcwlyNCwgX3ppbWFnZV9zdGFydEBoYQorCWFkZGkJcjQsIHI0LCBfemltYWdlX3N0YXJ0QGwKKwltdGN0cglyNAorCWJjdHIKKworLyoKKyAqIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCAtIFBsYWNlIGhvbGRlciBmb3IgdGhlIGtlcm5lbCByZXNldCB2ZWN0b3IuCisgKgorICogVGhlIGJvb3R3cmFwcGVyIGJ1aWxkIHNjcmlwdCBjb3BpZXMgMHgxMDAgYnl0ZXMgZnJvbSBvZmZzZXQgMHgxMDAKKyAqIG9mIHRoZSByb20gaW1hZ2UgdG8gdGhlIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9rZXJuZWwuICBBdCBydW50aW1lCisgKiB0aGUgYm9vdHdyYXBwZXIgcHJvZ3JhbSBjb3BpZXMgdGhlIDB4MTAwIGJ5dGVzIGF0IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbAorICogdG8gcmFtIGFkZHJlc3MgMHgxMDAuICBUaGlzIHN5bWJvbCBtdXN0IG9jY3VweSAweDEwMCBieXRlcy4KKyAqLworCisJLmdsb2JsIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbAorX19zeXN0ZW1fcmVzZXRfa2VybmVsOgorCisJLiA9IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCArIDB4MTAwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiN2RmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy1odmNhbGwuUwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICBQUzMgYm9vdHdyYXBwZXIgaHZjYWxscy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJwcGNfYXNtLmgiCisKKy8qCisgKiBUaGUgUFMzIGh5cGVydmlzb3IgdXNlcyBhIDY0IGJpdCAiQyIgbGFuZ3VhZ2UgY2FsbGluZyBjb252ZW50aW9uLgorICogVGhlIHJvdXRpbmVzIGhlcmUgbWFyc2hhbCBhcmd1bWVudHMgYmV0d2VlbiB0aGUgMzIgYml0IHdyYXBwZXIKKyAqIHByb2dyYW0gYW5kIHRoZSA2NCBiaXQgaHZjYWxscy4KKyAqCisgKiAgd3JhcHBlciAgICAgICAgICAgbHYxCisgKiAgMzItYml0IChoLGwpICAgICAgNjQtYml0CisgKgorICogIDE6IHIzLHI0ICAgICAgICAgIDwtPiByMworICogIDI6IHI1LHI2ICAgICAgICAgIDwtPiByNAorICogIDM6IHI3LHI4ICAgICAgICAgIDwtPiByNQorICogIDQ6IHI5LHIxMCAgICAgICAgIDwtPiByNgorICogIDU6IDgocjEpLDEyKHIxKSAgIDwtPiByNworICogIDY6IDE2KHIxKSwyMChyMSkgIDwtPiByOAorICogIDc6IDI0KHIxKSwyOChyMSkgIDwtPiByOQorICogIDg6IDMyKHIxKSwzNihyMSkgIDwtPiByMTAKKyAqCisgKi8KKworLm1hY3JvIEdMT0JBTCBuYW1lCisJLnNlY3Rpb24gIi50ZXh0IgorCS5iYWxpZ24gNAorCS5nbG9ibCBcbmFtZQorXG5hbWU6CisuZW5kbQorCisubWFjcm8gTk9fU1VQUE9SVCBuYW1lCisJR0xPQkFMIFxuYW1lCisJYiBwczNfbm9fc3VwcG9ydAorLmVuZG0KKworLm1hY3JvIEhWQ0FMTCBudW0KKwlsaSByMTEsIFxudW0KKwkubG9uZyAweDQ0MDAwMDIyCisJZXh0c3cgcjMsIHIzCisuZW5kbQorCisubWFjcm8gU0FWRV9MUiBvZmZzZXQ9NAorCW1mbHIgcjAKKwlzdHcgcjAsIFxvZmZzZXQocjEpCisuZW5kbQorCisubWFjcm8gTE9BRF9MUiBvZmZzZXQ9NAorCWx3eiByMCwgXG9mZnNldChyMSkKKwltdGxyIHIwCisuZW5kbQorCisubWFjcm8gTE9BRF82NF9SRUcgdGFyZ2V0LGhpZ2gsbG93CisJc2xkaSByMTEsIFxoaWdoLCAzMgorCW9yIFx0YXJnZXQsIHIxMSwgXGxvdworLmVuZG0KKworLm1hY3JvIExPQURfNjRfU1RBQ0sgdGFyZ2V0LG9mZnNldAorCWxkIFx0YXJnZXQsIFxvZmZzZXQocjEpCisuZW5kbQorCisubWFjcm8gTE9BRF9SMworCUxPQURfNjRfUkVHIHIzLHIzLHI0CisuZW5kbQorCisubWFjcm8gTE9BRF9SNAorCUxPQURfNjRfUkVHIHI0LHI1LHI2CisuZW5kbQorCisubWFjcm8gTE9BRF9SNQorCUxPQURfNjRfUkVHIHI1LHI3LHI4CisuZW5kbQorCisubWFjcm8gTE9BRF9SNgorCUxPQURfNjRfUkVHIHI2LHI5LHIxMAorLmVuZG0KKworLm1hY3JvIExPQURfUjcKKwlMT0FEXzY0X1NUQUNLIHI3LDgKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I4CisJTE9BRF82NF9TVEFDSyByOCwxNgorLmVuZG0KKworLm1hY3JvIExPQURfUjkKKwlMT0FEXzY0X1NUQUNLIHI5LDI0CisuZW5kbQorCisubWFjcm8gTE9BRF9SMTAKKwlMT0FEXzY0X1NUQUNLIHIxMCwzMgorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU18wCisJc3R3dSAxLC0xNigxKQorCXN0dyAzLCA4KDEpCisuZW5kbQorCisubWFjcm8gTE9BRF9SRUdTXzUKKwlMT0FEX1IzCisJTE9BRF9SNAorCUxPQURfUjUKKwlMT0FEX1I2CisJTE9BRF9SNworLmVuZG0KKworLm1hY3JvIExPQURfUkVHU182CisJTE9BRF9SRUdTXzUKKwlMT0FEX1I4CisuZW5kbQorCisubWFjcm8gTE9BRF9SRUdTXzgKKwlMT0FEX1JFR1NfNgorCUxPQURfUjkKKwlMT0FEX1IxMAorLmVuZG0KKworLm1hY3JvIFNUT1JFX1JFR1NfMF8xCisJbHd6IHIxMSwgOChyMSkKKwlzdGQgcjQsIDAocjExKQorCW1yIHI0LCByMworCWxpIHIzLCAwCisJYWRkaSByMSxyMSwxNgorLmVuZG0KKworLm1hY3JvIFNUT1JFX1JFR1NfNV8yCisJbHd6IHIxMSwgMTYocjEpCisJc3RkIHI0LCAwKHIxMSkKKwlsd3ogcjExLCAyNChyMSkKKwlzdGQgcjUsIDAocjExKQorLmVuZG0KKworLm1hY3JvIFNUT1JFX1JFR1NfNl8xCisJbHd6IHIxMSwgMjQocjEpCisJc3RkIHI0LCAwKHIxMSkKKy5lbmRtCisKK0dMT0JBTCBsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkCisJU0FWRV9MUgorCUxPQURfUkVHU18wCisJSFZDQUxMIDY5CisJU1RPUkVfUkVHU18wXzEKKwlMT0FEX0xSCisJYmxyCisKK0dMT0JBTCBsdjFfZ2V0X2xvZ2ljYWxfcGFydGl0aW9uX2lkCisJU0FWRV9MUgorCUxPQURfUkVHU18wCisJSFZDQUxMIDc0CisJU1RPUkVfUkVHU18wXzEKKwlMT0FEX0xSCisJYmxyCisKK0dMT0JBTCBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZQorCVNBVkVfTFIKKwlMT0FEX1JFR1NfNQorCUhWQ0FMTCA5MQorCVNUT1JFX1JFR1NfNV8yCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX3BhbmljCisJU0FWRV9MUgorCUxPQURfUkVHU184CisJSFZDQUxMIDI1NQorCUxPQURfTFIKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzZDU5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogIFBTMyBib290d3JhcHBlciBzdXBwb3J0LgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAib3BzLmgiCisKK2V4dGVybiBzNjQgbHYxX3BhbmljKHU2NCBpbl8xKTsKK2V4dGVybiBzNjQgbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZCh1NjQgKm91dF8xKTsKK2V4dGVybiBzNjQgbHYxX2dldF9sb2dpY2FsX3BwZV9pZCh1NjQgKm91dF8xKTsKK2V4dGVybiBzNjQgbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUodTY0IGluXzEsIHU2NCBpbl8yLCB1NjQgaW5fMywKKwl1NjQgaW5fNCwgdTY0IGluXzUsIHU2NCAqb3V0XzEsIHU2NCAqb3V0XzIpOworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZtdC4uLikgcHJpbnRmKGZtdCkKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgREJHKAorCWNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7cmV0dXJuIDA7fQorI2VuZGlmCisKK0JTU19TVEFDSyg0MDk2KTsKKworLyogQSBidWZmZXIgdGhhdCBtYXkgYmUgZWRpdGVkIGJ5IHRvb2xzIG9wZXJhdGluZyBvbiBhIHpJbWFnZSBiaW5hcnkgc28gYXMgdG8KKyAqIGVkaXQgdGhlIGNvbW1hbmQgbGluZSBwYXNzZWQgdG8gdm1saW51eCAoYnkgc2V0dGluZyAvY2hvc2VuL2Jvb3RhcmdzKS4KKyAqIFRoZSBidWZmZXIgaXMgcHV0IGluIGl0J3Mgb3duIHNlY3Rpb24gc28gdGhhdCB0b29scyBtYXkgbG9jYXRlIGl0IGVhc2llci4KKyAqLworc3RhdGljIGNoYXIgY21kbGluZVtDT01NQU5EX0xJTkVfU0laRV0KKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiX19idWlsdGluX2NtZGxpbmUiKSkpOworCitzdGF0aWMgdm9pZCBwcmVwX2NtZGxpbmUodm9pZCAqY2hvc2VuKQoreworCWlmIChjbWRsaW5lWzBdID09ICdcMCcpCisJCWdldHByb3AoY2hvc2VuLCAiYm9vdGFyZ3MiLCBjbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRS0xKTsKKwllbHNlCisJCXNldHByb3Bfc3RyKGNob3NlbiwgImJvb3RhcmdzIiwgY21kbGluZSk7CisKKwlwcmludGYoImNtZGxpbmU6ICclcydcbiIsIGNtZGxpbmUpOworfQorCitzdGF0aWMgdm9pZCBwczNfY29uc29sZV93cml0ZShjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19leGl0KHZvaWQpCit7CisJcHJpbnRmKCJwczNfZXhpdFxuIik7CisKKwkvKiBsdjFfcGFuaWMgd2lsbCBzaHV0ZG93biB0aGUgbHBhci4gKi8KKworCWx2MV9wYW5pYygwKTsgLyogemVybyA9IGRvIG5vdCByZWJvb3QgKi8KKwl3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9zaXplKHU2NCAqcm1fc2l6ZSkKK3sKKwlzNjQgcmVzdWx0OworCXU2NCBscGFyX2lkOworCXU2NCBwcGVfaWQ7CisJdTY0IHYyOworCisJcmVzdWx0ID0gbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZCgmbHBhcl9pZCk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gLTE7CisKKwlyZXN1bHQgPSBsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBuMTogMDAwMDAwMDA2MjY5MDAwMCA6IC4uLi5iaS4uCisJICogbjI6IDcwNzUwMDAwMDAwMDAwMDAgOiBwdS4uLi4uLgorCSAqIG4zOiAwMDAwMDAwMDAwMDAwMDAxIDogLi4uLi4uLi4KKwkgKiBuNDogNzI2ZDVmNzM2OTdhNjUwMCA6IHJtX3NpemUuCisJKi8KKworCXJlc3VsdCA9IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlKGxwYXJfaWQsIDB4MDAwMDAwMDA2MjY5MDAwMFVMTCwKKwkJMHg3MDc1MDAwMDAwMDAwMDAwVUxMLCBwcGVfaWQsIDB4NzI2ZDVmNzM2OTdhNjUwMFVMTCwgcm1fc2l6ZSwKKwkJJnYyKTsKKworCXByaW50ZigiJXM6JWQ6IHBwZV9pZCAgJWx1IFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkodW5zaWduZWQgbG9uZylwcGVfaWQpOworCXByaW50ZigiJXM6JWQ6IGxwYXJfaWQgJWx1IFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkodW5zaWduZWQgbG9uZylscGFyX2lkKTsKKwlwcmludGYoIiVzOiVkOiBybV9zaXplICVsbHhoIFxuIiwgX19mdW5jX18sIF9fTElORV9fLCAqcm1fc2l6ZSk7CisKKwlyZXR1cm4gcmVzdWx0ID8gLTEgOiAwOworfQorCit2b2lkIHBzM19jb3B5X3ZlY3RvcnModm9pZCkKK3sKKwlleHRlcm4gY2hhciBfX3N5c3RlbV9yZXNldF9rZXJuZWxbXTsKKworCW1lbWNweSgodm9pZCAqKTB4MTAwLCBfX3N5c3RlbV9yZXNldF9rZXJuZWwsIDB4MTAwKTsKKwlmbHVzaF9jYWNoZSgodm9pZCAqKTB4MTAwLCAweDEwMCk7Cit9CisKK3ZvaWQgcGxhdGZvcm1faW5pdCh2b2lkKQoreworCWV4dGVybiBjaGFyIF9lbmRbXTsKKwlleHRlcm4gY2hhciBfZHRiX3N0YXJ0W107CisJZXh0ZXJuIGNoYXIgX2luaXRyZF9zdGFydFtdOworCWV4dGVybiBjaGFyIF9pbml0cmRfZW5kW107CisJY29uc3QgdTMyIGhlYXBzaXplID0gMHgxMDAwMDAwIC0gKHUzMilfZW5kOyAvKiAxNk1pQiAqLworCXZvaWQgKmNob3NlbjsKKwl1bnNpZ25lZCBsb25nIGZ0X2FkZHI7CisJdTY0IHJtX3NpemU7CisKKwljb25zb2xlX29wcy53cml0ZSA9IHBzM19jb25zb2xlX3dyaXRlOworCXBsYXRmb3JtX29wcy5leGl0ID0gcHMzX2V4aXQ7CisKKwlwcmludGYoIlxuLS0gUFMzIGJvb3R3cmFwcGVyIC0tXG4iKTsKKworCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGhlYXBzaXplLCAzMiwgNjQpOworCWZ0X2luaXQoX2R0Yl9zdGFydCwgMCwgNCk7CisKKwljaG9zZW4gPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7CisKKwlwczNfcmVwb3NpdG9yeV9yZWFkX3JtX3NpemUoJnJtX3NpemUpOworCWR0X2ZpeHVwX21lbW9yeSgwLCBybV9zaXplKTsKKworCWlmIChfaW5pdHJkX2VuZCA+IF9pbml0cmRfc3RhcnQpIHsKKwkJc2V0cHJvcF92YWwoY2hvc2VuLCAibGludXgsaW5pdHJkLXN0YXJ0IiwgKHUzMikoX2luaXRyZF9zdGFydCkpOworCQlzZXRwcm9wX3ZhbChjaG9zZW4sICJsaW51eCxpbml0cmQtZW5kIiwgKHUzMikoX2luaXRyZF9lbmQpKTsKKwl9CisKKwlwcmVwX2NtZGxpbmUoY2hvc2VuKTsKKworCWZ0X2FkZHIgPSBkdF9vcHMuZmluYWxpemUoKTsKKworCXBzM19jb3B5X3ZlY3RvcnMoKTsKKworCXByaW50ZigiIGZsYXQgdHJlZSBhdCAweCVseFxuXHIiLCBmdF9hZGRyKTsKKworCSgoa2VybmVsX2VudHJ5X3QpMCkoZnRfYWRkciwgMCwgTlVMTCk7CisKKwlwczNfZXhpdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYwppbmRleCA3ZmQzMjMzLi5lYWEwZDNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYwpAQCAtMjcsNyArMjcsNyBAQAogCXJldHVybiBzY2RwLT5vcGVuKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlcmlhbF93cml0ZShjaGFyICpidWYsIGludCBsZW4pCitzdGF0aWMgdm9pZCBzZXJpYWxfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQogewogCXN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhICpzY2RwID0gY29uc29sZV9vcHMuZGF0YTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYyBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKaW5kZXggMGE5ZmVlYjkuLjViNTc4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYwpAQCAtMTkwLDcgKzE5MCwxMSBAQAogCiAJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KIAkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7CisJCWlmICgqZm10ID09ICdsJyAmJiAqKGZtdCArIDEpID09ICdsJykgeworCQkJcXVhbGlmaWVyID0gJ3EnOworCQkJZm10ICs9IDI7CisJCX0gZWxzZSBpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcKKwkJCXx8ICpmbXQgPT0gJ1onKSB7CiAJCQlxdWFsaWZpZXIgPSAqZm10OwogCQkJKytmbXQ7CiAJCX0KQEAgLTI4MSw2ICsyODUsMTAgQEAKIAkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKIAkJCWlmIChmbGFncyAmIFNJR04pCiAJCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07CisJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdxJykgeworCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgbG9uZyBsb25nKSBudW07CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewogCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaCBiL2FyY2gvcG93ZXJwYy9ib290L3R5cGVzLmgKaW5kZXggNzlkMjZlNy4uMzEzOTNkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oCkBAIC03LDYgKzcsMTAgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXUxNjsKIHR5cGVkZWYgdW5zaWduZWQgaW50CQl1MzI7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl1NjQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyCQlzODsKK3R5cGVkZWYgc2hvcnQJCQlzMTY7Cit0eXBlZGVmIGludAkJCXMzMjsKK3R5cGVkZWYgbG9uZyBsb25nCQlzNjQ7CiAKICNkZWZpbmUgbWluKHgseSkgKHsgXAogCXR5cGVvZih4KSBfeCA9ICh4KTsJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlciBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKaW5kZXggZGE3N2FkYy4uNjVmNjg1NCAxMDA3NTUKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCkBAIC0xNDQsNiArMTQ0LDE1IEBACiBjdWJvb3QqKQogICAgIGd6aXA9CiAgICAgOzsKK3BzMykKKyAgICBwbGF0Zm9ybW89IiRvYmplY3QvcHMzLWhlYWQubyAkb2JqZWN0L3BzMy1odmNhbGwubyAkb2JqZWN0L3BzMy5vIgorICAgIGxkcz0kb2JqZWN0L3pJbWFnZS5wczMubGRzCisgICAgZ3ppcD0KKyAgICBleHQ9YmluCisgICAgb2JqZmxhZ3M9Ii1PIGJpbmFyeSAtLXNldC1zZWN0aW9uLWZsYWdzPS5ic3M9Y29udGVudHMsYWxsb2MsbG9hZCxkYXRhIgorICAgIGtzZWN0aW9uPS5rZXJuZWw6dm1saW51eC5iaW4KKyAgICBpc2VjdGlvbj0ua2VybmVsOmluaXRyZAorICAgIDs7CiBlc2FjCiAKIHZtej0iJHRtcGRpci9gYmFzZW5hbWUgXCIka2VybmVsXCJgLiRleHQiCkBAIC0yMzksNCArMjQ4LDUwIEBACiAgICAgZmkKICAgICBleGl0IDAKICAgICA7OworcHMzKQorICAgICMgVGhlIHBzMydzIGxvYWRlciBzdXBwb3J0cyBsb2FkaW5nIGd6aXBwZWQgYmluYXJ5IGltYWdlcyBmcm9tIGZsYXNoCisgICAgIyByb20gdG8gYWRkciB6ZXJvLiBUaGUgbG9hZGVyIGVudGVycyB0aGUgaW1hZ2UgYXQgYWRkciAweDEwMC4gIEEKKyAgICAjIGJvb3R3cmFwcGVyIG92ZXJsYXkgaXMgdXNlIHRvIGFycmFuZ2UgZm9yIHRoZSBrZXJuZWwgdG8gYmUgbG9hZGVkCisgICAgIyB0byBhZGRyIHplcm8gYW5kIHRvIGhhdmUgYSBzdWl0YWJsZSBib290d3JhcHBlciBlbnRyeSBhdCAweDEwMC4KKyAgICAjIFRvIGNvbnN0cnVjdCB0aGUgcm9tIGltYWdlLCAweDEwMCBieXRlcyBmcm9tIG9mZnNldCAweDEwMCBpbiB0aGUKKyAgICAjIGtlcm5lbCBpcyBjb3BpZWQgdG8gdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9rZXJuZWwuCisgICAgIyBUaGUgMHgxMDAgYnl0ZXMgYXQgdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9vdmVybGF5IGlzCisgICAgIyB0aGVuIGNvcGllZCB0byBvZmZzZXQgMHgxMDAuICBBdCBydW50aW1lIHRoZSBib290d3JhcHBlciBwcm9ncmFtCisgICAgIyBjb3BpZXMgdGhlIDB4MTAwIGJ5dGVzIGF0IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCB0byBhZGRyIDB4MTAwLgorCisgICAgc3lzdGVtX3Jlc2V0X292ZXJsYXk9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkkJyAgICAgICBcCisgICAgICAgIHwgY3V0IC1kJyAnIC1mMWAKKyAgICBzeXN0ZW1fcmVzZXRfb3ZlcmxheT1gcHJpbnRmICIlZCIgJHN5c3RlbV9yZXNldF9vdmVybGF5YAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCQnICAgICAgIFwKKyAgICAgICAgfCBjdXQgLWQnICcgLWYxYAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9YHByaW50ZiAiJWQiICRzeXN0ZW1fcmVzZXRfa2VybmVsYAorICAgIG92ZXJsYXlfZGVzdD0iMjU2IgorICAgIG92ZXJsYXlfc2l6ZT0iMjU2IgorCisgICAgcm0gLWYgIiRvYmplY3Qvb3RoZXJvcy5ibGQiCisKKyAgICAke0NST1NTfW9iamNvcHkgLU8gYmluYXJ5ICIkb2ZpbGUiICIkb2ZpbGUuYmluIgorCisgICAgbXNnPSQoZGQgaWY9IiRvZmlsZS5iaW4iIG9mPSIkb2ZpbGUuYmluIiBjb252PW5vdHJ1bmMgXAorICAgICAgICBza2lwPSRvdmVybGF5X2Rlc3Qgc2Vlaz0kc3lzdGVtX3Jlc2V0X2tlcm5lbCAgICAgIFwKKyAgICAgICAgY291bnQ9JG92ZXJsYXlfc2l6ZSBicz0xIDI+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+CiAKIC8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9PRkZTICAgICAgICAgIDB4QTA4CisjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTUFTSyAgICAgIDB4MDBmMDAwMDAKICNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMSAgMHgwMGMwMDAwMAogI2RlZmluZSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzAxICAweDAwNDAwMDAwCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTAgIDB4MDA4MDAwMDAKQEAgLTE1LDIxICsxNyw0MyBAQAogCiAvKiBzeXN0ZW0gaS9vIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgbG93ICovCiAjZGVmaW5lIE1QQzgzWFhfU0lDUkxfT0ZGUyAgICAgICAgIDB4MTE0Ci0jZGVmaW5lIE1QQzgzWFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgTVBDODNYWF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JMX1VTQl9NQVNLICAgICAweDYwMDAwMDAwCisjZGVmaW5lIE1QQzgzNFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODM0WF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzFYX1NJQ1JMX1VTQl9NQVNLICAgICAweDAwMDAwYzAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkxfVVNCX1VMUEkgICAgIDB4MDAwMDA4MDAKIAogLyogc3lzdGVtIGkvbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGhpZ2ggKi8KICNkZWZpbmUgTVBDODNYWF9TSUNSSF9PRkZTICAgICAgICAgMHgxMTgKLSNkZWZpbmUgTVBDODNYWF9TSUNSSF9VU0JfVVRNSSAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkhfVVNCX01BU0sgICAgIDB4MDAwMDAwZTAKKyNkZWZpbmUgTVBDODMxWF9TSUNSSF9VU0JfVUxQSSAgICAgMHgwMDAwMDBhMAorCisvKiBVU0IgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBGU0xfVVNCMl9DT05UUk9MX09GRlMgICAgICAweDUwMAorI2RlZmluZSBDT05UUk9MX1VUTUlfUEhZX0VOICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIENPTlRST0xfUkVGU0VMXzQ4TUhaICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJICAgMHgwMDAwMDQwMAorI2RlZmluZSBDT05UUk9MX09UR19QT1JUICAgICAgICAgICAweDAwMDAwMDIwCisKKy8qIFVTQiBQT1JUU0MgUmVnaXN0ZXJzICovCisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzFfT0ZGUyAgICAgIDB4MTg0CisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzJfT0ZGUyAgICAgIDB4MTg4CisjZGVmaW5lIFBPUlRTQ1hfUFRXXzE2QklUICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgUE9SVFNDWF9QVFNfVVRNSSAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQT1JUU0NYX1BUU19VTFBJICAgICAgICAgICAweDgwMDAwMDAwCiAKIC8qCiAgKiBEZWNsYXJhdGlvbiBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZQogICogbXBjODN4eF8qIGZpbGVzLiBNb3N0bHkgZm9yIHVzZSBieSBtcGM4M3h4X3NldHVwCiAgKi8KIAotZXh0ZXJuIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKLWV4dGVybiBpbnQgbXBjODN4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOworZXh0ZXJuIGludCBtcGM4M3h4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHVfY2hhciBidXMsIHVfY2hhciBkZXZmbik7CiBleHRlcm4gdm9pZCBtcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CitleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKIAogI2VuZGlmCQkJCS8qIF9fTVBDODNYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCA3NzQ0NTdkMC4uYzBlMmI4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwpAQCAtMzMsMTkgKzMzLDE0IEBACiAjZGVmaW5lIERCRyh4Li4uKQogI2VuZGlmCiAKLWludCBtcGM4M3h4X3BjaTJfYnVzbm87Ci0KLWludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK2ludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewotCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwlpZiAoKGJ1cyA9PSBob3NlLT5maXJzdF9idXNubykgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JaWYgKG1wYzgzeHhfcGNpMl9idXNubykKLQkJaWYgKGJ1cyA9PSAobXBjODN4eF9wY2kyX2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKLQkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoraW50IF9faW5pdCBtcGM4M3h4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC02NiwxMSArNjEsMTAgQEAKIAkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAl9CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJcGNpX2Fzc2lnbl9hbGxfYnVzZXMgPSAxOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwotCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwogCiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwpAQCAtODYsOCArODAsNiBAQAogCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODYwMCkgewogCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODM4MCwgaW1tciArIDB4ODM4NCk7CiAJCXByaW1hcnkgPSAwOwotCQlob3NlLT5idXNfb2Zmc2V0ID0gaG9zZS0+Zmlyc3RfYnVzbm87Ci0JCW1wYzgzeHhfcGNpMl9idXNubyA9IGhvc2UtPmZpcnN0X2J1c25vOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1QQzgzeHggUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4gIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3VzYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmRmMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBGcmVlc2NhbGUgODN4eCBVU0IgU09DIHNldHVwIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogTGkgWWFuZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKworI2luY2x1ZGUgIm1wYzgzeHguaCIKKworCisjaWZkZWYgQ09ORklHX01QQzgzNHgKK2ludCBtcGM4MzR4X3VzYl9jZmcodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNjY3IsIHNpY3JsLCBzaWNyaDsKKwl2b2lkIF9faW9tZW0gKmltbWFwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWludCBwb3J0MF9pc19kciA9IDAsIHBvcnQxX2lzX2RyID0gMDsKKwljb25zdCB2b2lkICpwcm9wLCAqZHJfbW9kZTsKKworCWltbWFwID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSwgMHgxMDAwKTsKKwlpZiAoIWltbWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFJlYWQgcmVnaXN0ZXJzICovCisJLyogTm90ZTogRFIgYW5kIE1QSCBtdXN0IHVzZSB0aGUgc2FtZSBjbG9jayBzZXR0aW5nIGluIFNDQ1IgKi8KKwlzY2NyID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTKSAmIH5NUEM4M1hYX1NDQ1JfVVNCX01BU0s7CisJc2ljcmwgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSTF9PRkZTKSAmIH5NUEM4MzRYX1NJQ1JMX1VTQl9NQVNLOworCXNpY3JoID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUykgJiB+TVBDODM0WF9TSUNSSF9VU0JfVVRNSTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpOworCWlmIChucCkgeworCQlzY2NyIHw9IE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMTsgIC8qIDE6MyAqLworCisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHlfdHlwZSIsIE5VTEwpOworCQlpZiAocHJvcCAmJiAoIXN0cmNtcChwcm9wLCAidXRtaSIpIHx8CisJCQkJCSFzdHJjbXAocHJvcCwgInV0bWlfd2lkZSIpKSkgeworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwIHwgTVBDODM0WF9TSUNSTF9VU0IxOworCQkJc2ljcmggfD0gTVBDODM0WF9TSUNSSF9VU0JfVVRNSTsKKwkJCXBvcnQxX2lzX2RyID0gMTsKKwkJfSBlbHNlIGlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgInNlcmlhbCIpKSB7CisJCQlkcl9tb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZHJfbW9kZSIsIE5VTEwpOworCQkJaWYgKGRyX21vZGUgJiYgIXN0cmNtcChkcl9tb2RlLCAib3RnIikpIHsKKwkJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjAgfCBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCQkJcG9ydDFfaXNfZHIgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjA7CisJCQl9CisJCX0gZWxzZSBpZiAocHJvcCAmJiAhc3RyY21wKHByb3AsICJ1bHBpIikpIHsKKwkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjgzNHggVVNCIFBIWSB0eXBlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQl9CisJCXBvcnQwX2lzX2RyID0gMTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJ1c2IiLCAiZnNsLXVzYjItbXBoIik7CisJaWYgKG5wKSB7CisJCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMTsgLyogMTozICovCisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBvcnQwIiwgTlVMTCk7CisJCWlmIChwcm9wKSB7CisJCQlpZiAocG9ydDBfaXNfZHIpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiODM0eCBVU0IgcG9ydDAgY2FuJ3QgYmUgdXNlZCBieSBib3RoIERSIGFuZCBNUEghXG4iKTsKKwkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMDsKKwkJfQorCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicG9ydDEiLCBOVUxMKTsKKwkJaWYgKHByb3ApIHsKKwkJCWlmIChwb3J0MV9pc19kcikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSI4MzR4IFVTQiBwb3J0MSBjYW4ndCBiZSB1c2VkIGJ5IGJvdGggRFIgYW5kIE1QSCFcbiIpOworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IxOworCQl9CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKwkvKiBXcml0ZSBiYWNrICovCisJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NDQ1JfT0ZGUywgc2Njcik7CisJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMsIHNpY3JsKTsKKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUywgc2ljcmgpOworCisJaW91bm1hcChpbW1hcCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX01QQzgzNHggKi8KKworI2lmZGVmIENPTkZJR19QUENfTVBDODMxeAoraW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKQoreworCXUzMiB0ZW1wOworCXZvaWQgX19pb21lbSAqaW1tYXAsICp1c2JfcmVnczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKwljb25zdCB2b2lkICpwcm9wOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IHJldCA9IDA7CisjaWZkZWYgQ09ORklHX1VTQl9PVEcKKwljb25zdCB2b2lkICpkcl9tb2RlOworI2VuZGlmCisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJ1c2IiLCAiZnNsLXVzYjItZHIiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5X3R5cGUiLCBOVUxMKTsKKworCS8qIE1hcCBJTU1SIHNwYWNlIGZvciBwaW4gYW5kIGNsb2NrIHNldHRpbmdzICovCisJaW1tYXAgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpLCAweDEwMDApOworCWlmICghaW1tYXApIHsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDb25maWd1cmUgY2xvY2sgKi8KKwl0ZW1wID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTKTsKKwl0ZW1wICY9IH5NUEM4M1hYX1NDQ1JfVVNCX01BU0s7CisJdGVtcCB8PSBNUEM4M1hYX1NDQ1JfVVNCX0RSQ01fMTE7ICAvKiAxOjMgKi8KKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTLCB0ZW1wKTsKKworCS8qIENvbmZpZ3VyZSBwaW4gbXV4IGZvciBVTFBJLiAgVGhlcmUgaXMgbm8gcGluIG11eCBmb3IgVVRNSSAqLworCWlmICghc3RyY21wKHByb3AsICJ1bHBpIikpIHsKKwkJdGVtcCA9IGluX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMpOworCQl0ZW1wICY9IH5NUEM4MzFYX1NJQ1JMX1VTQl9NQVNLOworCQl0ZW1wIHw9IE1QQzgzMVhfU0lDUkxfVVNCX1VMUEk7CisJCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSTF9PRkZTLCB0ZW1wKTsKKworCQl0ZW1wID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUyk7CisJCXRlbXAgJj0gfk1QQzgzMVhfU0lDUkhfVVNCX01BU0s7CisJCXRlbXAgfD0gTVBDODMxWF9TSUNSSF9VU0JfVUxQSTsKKwkJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JIX09GRlMsIHRlbXApOworCX0KKworCWlvdW5tYXAoaW1tYXApOworCisJLyogTWFwIFVTQiBTT0Mgc3BhY2UgKi8KKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKKwlpZiAocmV0KSB7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdXNiX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOworCisJLyogVXNpbmcgb24tY2hpcCBQSFkgKi8KKwlpZiAoIXN0cmNtcChwcm9wLCAidXRtaV93aWRlIikgfHwKKwkJCSFzdHJjbXAocHJvcCwgInV0bWkiKSkgeworCQkvKiBTZXQgVVRNSV9QSFlfRU4sIFJFRlNFTCB0byA0OE1IWiAqLworCQlvdXRfYmUzMih1c2JfcmVncyArIEZTTF9VU0IyX0NPTlRST0xfT0ZGUywKKwkJCQlDT05UUk9MX1VUTUlfUEhZX0VOIHwgQ09OVFJPTF9SRUZTRUxfNDhNSFopOworCS8qIFVzaW5nIGV4dGVybmFsIFVQTEkgUEhZICovCisJfSBlbHNlIGlmICghc3RyY21wKHByb3AsICJ1bHBpIikpIHsKKwkJLyogU2V0IFBIWV9DTEtfU0VMIHRvIFVMUEkgKi8KKwkJdGVtcCA9IENPTlRST0xfUEhZX0NMS19TRUxfVUxQSTsKKyNpZmRlZiBDT05GSUdfVVNCX09URworCQkvKiBTZXQgT1RHX1BPUlQgKi8KKwkJZHJfbW9kZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRyX21vZGUiLCBOVUxMKTsKKwkJaWYgKGRyX21vZGUgJiYgIXN0cmNtcChkcl9tb2RlLCAib3RnIikpCisJCQl0ZW1wIHw9IENPTlRST0xfT1RHX1BPUlQ7CisjZW5kaWYgLyogQ09ORklHX1VTQl9PVEcgKi8KKwkJb3V0X2JlMzIodXNiX3JlZ3MgKyBGU0xfVVNCMl9DT05UUk9MX09GRlMsIHRlbXApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjgzMXggVVNCIFBIWSB0eXBlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlvdW5tYXAodXNiX3JlZ3MpOworCW9mX25vZGVfcHV0KG5wKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19QUENfTVBDODMxeCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKaW5kZXggM2U2MmZjYi4uNGZlMzc2ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jCkBAIC0xMywxMSArMTMsNDMgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCitzdGF0aWMgX19iZTMyIF9faW9tZW0gKnJzdGNyOwogCiBleHRlcm4gdm9pZCBhYm9ydCh2b2lkKTsKIAorc3RhdGljIGludCBfX2luaXQgbXBjODV4eF9yc3Rjcih2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZ2xvYmFsLXV0aWxpdGllcyIpOworCWlmICgobnAgJiYgb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLGhhcy1yc3RjciIsIE5VTEwpKSkgeworCQljb25zdCB1MzIgKnByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwkJaWYgKHByb3ApIHsKKwkJCS8qIG1hcCByZXNldCBjb250cm9sIHJlZ2lzdGVyCisJCQkgKiAweEUwMEIwIGlzIG9mZnNldCBvZiByZXNldCBjb250cm9sIHJlZ2lzdGVyCisJCQkgKi8KKwkJCXJzdGNyID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSArICpwcm9wICsgMHhCMCwgMHhmZik7CisJCQlpZiAoIXJzdGNyKQorCQkJCXByaW50ayAoS0VSTl9FTUVSRyAiRXJyb3I6IHJlc2V0IGNvbnRyb2wgIgorCQkJCQkJInJlZ2lzdGVyIG5vdCBtYXBwZWQhXG4iKTsKKwkJfQorCX0gZWxzZQorCQlwcmludGsgKEtFUk5fSU5GTyAicnN0Y3IgY29tcGF0aWJsZSByZWdpc3RlciBkb2VzIG5vdCBleGlzdCFcbiIpOworCWlmIChucCkKKwkJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKG1wYzg1eHhfcnN0Y3IpOworCiB2b2lkIG1wYzg1eHhfcmVzdGFydChjaGFyICpjbWQpCiB7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlpZiAocnN0Y3IpCisJCS8qIHNldCByZXNldCBjb250cm9sIHJlZ2lzdGVyICovCisJCW91dF9iZTMyKHJzdGNyLCAweDIpOwkvKiBIUkVTRVRfUkVRICovCiAJYWJvcnQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jCmluZGV4IGJlYzg0ZmYuLjZmYjkwYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYwpAQCAtNjEsMjQgKzYxLDExIEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBBbGxvYyBtcGljIHN0cnVjdHVyZSBhbmQgcGVyIGlzdSBoYXMgMTYgSU5UIGVudHJpZXMuICovCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQkgIE1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCi0JCQkgIDE2LCA2NCwgIiBPUEVOUElDICAgICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAotCS8qCi0JICogNDggSW50ZXJuYWwgSW50ZXJydXB0cwotCSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTA2MDApOwotCi0JLyoKLQkgKiAxNiBFeHRlcm5hbCBpbnRlcnJ1cHRzCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19QUENfSTgyNTkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCmluZGV4IDgzNDE1ZGIuLjcyODZmZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaApAQCAtMTUsNCArMTUsNCBAQAogICovCiAKIGV4dGVybiB2b2lkIG1wYzg1eHhfcmVzdGFydChjaGFyICopOwotZXh0ZXJuIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKK2V4dGVybiBpbnQgbXBjODV4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKaW5kZXggNWQyNzYyMS4uNzIzNWY3MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKQEAgLTM4LDEzICszOCw5IEBACiAjaW5jbHVkZSA8YXNtL2ZzX3BkLmg+CiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3N0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICAgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewogCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTkxLDMwICs4NywxMCBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMCwgci5zdGFydCArIDB4MTAyMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxLCByLnN0YXJ0ICsgMHgxMDI4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDIsIHIuc3RhcnQgKyAweDEwMzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgci5zdGFydCArIDB4MTAzODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA0LCByLnN0YXJ0ICsgMHgxMDQwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDUsIHIuc3RhcnQgKyAweDEwNDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNiwgci5zdGFydCArIDB4MTA1MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA3LCByLnN0YXJ0ICsgMHgxMDU4MCk7Ci0KLQkvKiBVbnVzZWQgb24gdGhpcyBwbGF0Zm9ybSAobGVhdmUgcm9vbSBmb3IgODU0OCkgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgOCwgci5zdGFydCArIDB4MTA2MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA5LCByLnN0YXJ0ICsgMHgxMDY4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEwLCByLnN0YXJ0ICsgMHgxMDcwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDExLCByLnN0YXJ0ICsgMHgxMDc4MCk7Ci0KLQkvKiBFeHRlcm5hbCBJbnRlcnJ1cHRzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEyLCByLnN0YXJ0ICsgMHgxMDAwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEzLCByLnN0YXJ0ICsgMHgxMDA4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDE0LCByLnN0YXJ0ICsgMHgxMDEwMCk7Ci0KIAltcGljX2luaXQobXBpYyk7CiAKICNpZmRlZiBDT05GSUdfQ1BNMgpAQCAtMjQxLDcgKzIxNyw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwppbmRleCAxNDkwZWIzLi41MGM4ZDY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwpAQCAtNDcsMTEgKzQ3LDYgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgIm1wYzg1eHguaCIKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiBzdGF0aWMgaW50IGNkc19wY2lfc2xvdCA9IDI7CiBzdGF0aWMgdm9sYXRpbGUgdTggKmNhZG11czsKIApAQCAtNjAsMTUgKzU1LDExIEBACiAjZGVmaW5lIEFSQ0FESUFfSE9TVF9CUklER0VfSURTRUwJMTcKICNkZWZpbmUgQVJDQURJQV8yTkRfQlJJREdFX0lEU0VMCTMKIAotZXh0ZXJuIGludCBtcGM4NXh4X3BjaTJfYnVzbm87Ci0KLXN0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitzdGF0aWMgaW50IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewotCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwlpZiAoKGJ1cyA9PSBob3NlLT5maXJzdF9idXNubykgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JaWYgKG1wYzg1eHhfcGNpMl9idXNubykKLQkJaWYgKGJ1cyA9PSAobXBjODV4eF9wY2kyX2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKLQkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAJLyogV2UgZXhwbGljaXRseSBkbyBub3QgZ28gcGFzdCB0aGUgVHVuZHJhIDMyMCBCcmlkZ2UgKi8KIAlpZiAoKGJ1cyA9PSAxKSAmJiAoUENJX1NMT1QoZGV2Zm4pID09IEFSQ0FESUFfMk5EX0JSSURHRV9JRFNFTCkpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC03OCw1MiArNjksNDQgQEAKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BjaWJpb3NfZml4dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X2Nkc19wY2lfaXJxX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQl1X2NoYXIJCWM7CisJdV9jaGFyIGM7CisJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfVklBKSB7CisJCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMToKKwkJCS8qCisJCQkgKiBVLUJvb3QgZG9lcyBub3Qgc2V0IHRoZSBlbmFibGUgYml0cworCQkJICogZm9yIHRoZSBJREUgZGV2aWNlLiBGb3JjZSB0aGVtIG9uIGhlcmUuCisJCQkgKi8KKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJmMpOworCQkJYyB8PSAweDAzOyAvKiBJREU6IENoaXAgRW5hYmxlIEJpdHMgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDAsIGMpOwogCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKLQkJCQkJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzEsIE5VTEwpKSkgeworCQkJLyoKKwkJCSAqIFNpbmNlIG9ubHkgcHJpbWFyeSBpbnRlcmZhY2Ugd29ya3MsIGZvcmNlIHRoZQorCQkJICogSURFIGZ1bmN0aW9uIHRvIHN0YW5kYXJkIHByaW1hcnkgSURFIGludGVycnVwdAorCQkJICogdy8gODI1OSBvZmZzZXQKKwkJCSAqLworCQkJZGV2LT5pcnEgPSAxNDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOworCQkJYnJlYWs7CiAJCS8qCi0JCSAqIFUtQm9vdCBkb2VzIG5vdCBzZXQgdGhlIGVuYWJsZSBiaXRzCi0JCSAqIGZvciB0aGUgSURFIGRldmljZS4gRm9yY2UgdGhlbSBvbiBoZXJlLgorCQkgKiBGb3JjZSBsZWdhY3kgVVNCIGludGVycnVwdCByb3V0aW5nCiAJCSAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDAsICZjKTsKLQkJYyB8PSAweDAzOyAvKiBJREU6IENoaXAgRW5hYmxlIEJpdHMgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgYyk7Ci0KLQkJLyoKLQkJICogU2luY2Ugb25seSBwcmltYXJ5IGludGVyZmFjZSB3b3JrcywgZm9yY2UgdGhlCi0JCSAqIElERSBmdW5jdGlvbiB0byBzdGFuZGFyZCBwcmltYXJ5IElERSBpbnRlcnJ1cHQKLQkJICogdy8gODI1OSBvZmZzZXQKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMjoKKwkJLyogVGhlcmUgYXJlIHR3byBVU0IgY29udHJvbGxlcnMuCisJCSAqIElkZW50aWZ5IHRoZW0gYnkgZnVuY3RvbiBudW1iZXIKIAkJICovCi0JCWRldi0+aXJxID0gMTQ7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOwotCQlwY2lfZGV2X3B1dChkZXYpOworCQkJaWYgKFBDSV9GVU5DKGRldi0+ZGV2Zm4pKQorCQkJCWRldi0+aXJxID0gMTE7CisJCQllbHNlCisJCQkJZGV2LT5pcnEgPSAxMDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KIAl9Ci0KLQkvKgotCSAqIEZvcmNlIGxlZ2FjeSBVU0IgaW50ZXJydXB0IHJvdXRpbmcKLQkgKi8KLQlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAotCQkJCQlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMiwgTlVMTCkpKSB7Ci0JCWRldi0+aXJxID0gMTA7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTApOwotCQlwY2lfZGV2X3B1dChkZXYpOwotCX0KLQotCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCi0JCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBkZXYpKSkgewotCQlkZXYtPmlycSA9IDExOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDExKTsKLQkJcGNpX2Rldl9wdXQoZGV2KTsKLQl9Ci0KLQkvKiBOb3cgbWFwIGFsbCB0aGUgUENJIGlycXMgKi8KLQlkZXYgPSBOVUxMOwotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpAQCAtMTY1LDMzICsxNDgsMTIgQEAKIAogCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAogCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCTQsIDAsICIgT3BlblBJQyAgIik7CisJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7CiAKIAkvKiBSZXR1cm4gdGhlIG1waWMgbm9kZSAqLwogCW9mX25vZGVfcHV0KG5wKTsKIAotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTAzMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAzLCByLnN0YXJ0ICsgMHgxMDM4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDQsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgci5zdGFydCArIDB4MTA0ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA2LCByLnN0YXJ0ICsgMHgxMDUwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDcsIHIuc3RhcnQgKyAweDEwNTgwKTsKLQotCS8qIFVzZWQgb25seSBmb3IgODU0OCBzbyBmYXIsIGJ1dCBubyBoYXJtIGluCi0JICogYWxsb2NhdGluZyB0aGVtIGZvciBldmVyeW9uZSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19QUENfSTgyNTkKQEAgLTI1Nyw5ICsyMTksOSBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzg1eHhfYWRkX2JyaWRnZShucCk7CiAKLQlwcGNfbWQucGNpYmlvc19maXh1cCA9IG1wYzg1eHhfY2RzX3BjaWJpb3NfZml4dXA7CisJcHBjX21kLnBjaV9pcnFfZml4dXAgPSBtcGM4NXh4X2Nkc19wY2lfaXJxX2ZpeHVwOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCmluZGV4IGUzZGRkYmYuLjAwNGI4MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCkBAIC01OSwxMSArNTksNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci0jZW5kaWYKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtMTAwLDcgKzk1LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspIHsKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzg1eHhfYWRkX2JyaWRnZShucCk7CiAJfQogCW9mX25vZGVfcHV0KG5wKTsKICNlbmRpZgpAQCAtMTgxLDI5ICsxNzYsMTAgQEAKIAogCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAogCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCTQsIDAsICIgT3BlblBJQyAgIik7CisJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7CiAJb2Zfbm9kZV9wdXQobnApOwogCi0JLyogSW50ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTAzMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAzLCByLnN0YXJ0ICsgMHgxMDM4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDQsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgci5zdGFydCArIDB4MTA0ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA2LCByLnN0YXJ0ICsgMHgxMDUwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDcsIHIuc3RhcnQgKyAweDEwNTgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgOCwgci5zdGFydCArIDB4MTA2MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA5LCByLnN0YXJ0ICsgMHgxMDY4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEwLCByLnN0YXJ0ICsgMHgxMDcwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDExLCByLnN0YXJ0ICsgMHgxMDc4MCk7Ci0KLQkvKiBFeHRlcm5hbCBJbnRlcnJ1cHRzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEyLCByLnN0YXJ0ICsgMHgxMDAwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEzLCByLnN0YXJ0ICsgMHgxMDA4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDE0LCByLnN0YXJ0ICsgMHgxMDEwMCk7Ci0KIAltcGljX2luaXQobXBpYyk7CiAKICNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKaW5kZXggNDhmMTdlMi4uODExODQxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYwpAQCAtMzMsMTAgKzMzLDggQEAKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotaW50IG1wYzg1eHhfcGNpMl9idXNubyA9IDA7Ci0KICNpZmRlZiBDT05GSUdfUENJCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitpbnQgX19pbml0IG1wYzg1eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTU3LDExICs1NSwxMCBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CkBAIC03NCw4ICs3MSw2IEBACiAJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg5MDAwKSB7CiAJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg5MDAwLCBpbW1yICsgMHg5MDA0KTsKIAkJcHJpbWFyeSA9IDA7Ci0JCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKLQkJbXBjODV4eF9wY2kyX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODV4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCmluZGV4IGQxYmNmZjUuLjBmYWViZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogY2hvaWNlCi0JcHJvbXB0ICJNYWNoaW5lIFR5cGUiCisJcHJvbXB0ICI4Nnh4IEJvYXJkIFR5cGUiCiAJZGVwZW5kcyBvbiBQUENfODZ4eAogCWRlZmF1bHQgTVBDODY0MV9IUENOCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCmluZGV4IDI4MzQ0NjIuLjIzZjdlZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaApAQCAtMTUsMTUgKzE1LDEwIEBACiAgKiBtcGM4Nnh4XyogZmlsZXMuIE1vc3RseSBmb3IgdXNlIGJ5IG1wYzg2eHhfc2V0dXAoKS4KICAqLwogCi1leHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4Nnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwogCi1leHRlcm4gaW50IG1wYzg2eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKTsKLQotZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJICAgICAgIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKTsKLWV4dGVybiB2b2lkIHNldHVwX2luZGlyZWN0X3BjaWVfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCQkgICAgIHZvaWQgX19pb21lbSAqY2ZnX2FkZHIsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpjZmdfZGF0YSk7CitleHRlcm4gaW50IG1wYzg2eHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKTsKIAogZXh0ZXJuIHZvaWQgX19pbml0IG1wYzg2eHhfc21wX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwppbmRleCAxMDUxNzAyLi41YjAxZWM3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCkBAIC00NCwxMyArNDQsNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBwY2lfZHJhbV9vZmZzZXQgPSAwOwotI2VuZGlmCi0KLQogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyB2b2lkIG1wYzg2eHhfODI1OV9jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKQEAgLTgxLDIyICs3NCw5IEBACiAJLyogQWxsb2MgbXBpYyBzdHJ1Y3R1cmUgYW5kIHBlciBpc3UgaGFzIDE2IElOVCBlbnRyaWVzLiAqLwogCW1waWMxID0gbXBpY19hbGxvYyhucCwgcmVzLnN0YXJ0LAogCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCTE2LCBOUl9JUlFTIC0gNCwKLQkJCSIgTVBJQyAgICAgIik7CisJCQkwLCAyNTYsICIgTVBJQyAgICAgIik7CiAJQlVHX09OKG1waWMxID09IE5VTEwpOwogCi0JbXBpY19hc3NpZ25faXN1KG1waWMxLCAwLCByZXMuc3RhcnQgKyAweDEwMDAwKTsKLQotCS8qIDQ4IEludGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDEsIHJlcy5zdGFydCArIDB4MTAyMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljMSwgMiwgcmVzLnN0YXJ0ICsgMHgxMDQwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMxLCAzLCByZXMuc3RhcnQgKyAweDEwNjAwKTsKLQotCS8qIDE2IEV4dGVybmFsIGludGVycnVwdHMKLQkgKiBNb3ZpbmcgdGhlbSBmcm9tIFswIC0gMTVdIHRvIFs2NCAtIDc5XQotCSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljMSwgNCwgcmVzLnN0YXJ0ICsgMHgxMDAwMCk7Ci0KIAltcGljX2luaXQobXBpYzEpOwogCiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtMzE5LDYgKzI5OSw3IEBACiB7CiAJdW5zaWduZWQgc2hvcnQgdGVtcDsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDA0LCAweDA0MDUpOworCWRldi0+Y2xhc3MgJj0gfjB4NTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NGEsICZ0ZW1wKTsKIAl0ZW1wIHw9IDB4MTAwMDsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDRhLCB0ZW1wKTsKQEAgLTM2NCw5ICszNDUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7Ci0KLQlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODZ4eF9leGNsdWRlX2RldmljZTsKKwkJbXBjODZ4eF9hZGRfYnJpZGdlKG5wKTsKICNlbmRpZgogCiAJcHJpbnRrKCJNUEM4Nnh4IEhQQ04gYm9hcmQgZnJvbSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvclxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKaW5kZXggODIzNWM1Ni4uNzNjZDViMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiBtcGM4Nnh4X3NldHVwX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgcGNpZV9vZmZzZXQsIHUzMiBwY2llX3NpemUpCiB7CiAJdTE2IGNtZDsKLQl1bnNpZ25lZCBpbnQgdGVtcHM7CiAKIAlEQkcoIlBDSUUgaG9zdCBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldCAweCUwOHgsIHNpemUgMHglMDh4LlxuIiwKIAkJCXBjaWVfb2Zmc2V0LCBwY2llX3NpemUpOwpAQCAtMTMzLDIyICsxMzIsNDkgQEAKIAllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCAwLCAwLCBQQ0lfQ09NTUFORCwgY21kKTsKIAogCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIDAsIDAsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKLQotCS8qIFBDSUUgQnVzLCBGaXggdGhlIE1QQzg2NDFEIGhvc3QgYnJpZGdlJ3MgbG9jYXRpb24gdG8gYnVzIDB4RkYuICovCi0JZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgMCwgMCwgUENJX1BSSU1BUllfQlVTLCAmdGVtcHMpOwotCXRlbXBzID0gKHRlbXBzICYgMHhmZjAwMDAwMCkgfCAoMHhmZikgfCAoMHgwIDw8IDgpIHwgKDB4ZmUgPDwgMTYpOwotCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCAwLCAwLCBQQ0lfUFJJTUFSWV9CVVMsIHRlbXBzKTsKIH0KIAotaW50IG1wYzg2eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpLCByZXNfaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCi0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKwkvKgorCSAqIE1ha2UgdGhlIGJyaWRnZSBiZSB0cmFuc3BhcmVudC4KKwkgKi8KKwlkZXYtPnRyYW5zcGFyZW50ID0gMTsKKworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCWlmICghaG9zZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgaG9zZSBmb3IgYnVzICVkXG4iLAorCQkgICAgICAgZGV2LT5idXMtPm51bWJlcik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3MpIHsKKwkJcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzX2lkeCsrXTsKKwkJcmVzLT5zdGFydCA9IGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0OworCQlyZXMtPmVuZCA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZDsKKwkJcmVzLT5mbGFncyA9IGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzX2lkeCArIGldOworCQlyZXMtPnN0YXJ0ID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydDsKKwkJcmVzLT5lbmQgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZDsKKwkJcmVzLT5mbGFncyA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZmxhZ3M7CisJfQogfQogCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCisKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgMHg3MDEwLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIDB4NzAxMSwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworCisjZGVmaW5lIFBDSUVfTFRTU00JMHg0MDQJLyogUENJZSBMaW5rIFRyYWluaW5nIGFuZCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJRV9MVFNTTV9MMAkweDE2CS8qIEwwIHN0YXRlICovCisKK2ludCBfX2luaXQgbXBjODZ4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtMTU2LDYgKzE4Miw3IEBACiAJY29uc3QgaW50ICpidXNfcmFuZ2U7CiAJaW50IGhhc19hZGRyZXNzID0gMDsKIAlpbnQgcHJpbWFyeSA9IDA7CisJdTE2IHZhbDsKIAogCURCRygiQWRkaW5nIFBDSUUgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIApAQCAtMTY4LDE3ICsxOTUsMjMgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKIAkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKLQkvKiBsYXN0X2J1c25vID0gMHhmZSBjYXVzZSBieSBNUEM4NjQxIFBDSUUgYnVnICovCisJaG9zZS0+aW5kaXJlY3RfdHlwZSA9IFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcgfAorCQkJCVBQQ19JTkRJUkVDVF9UWVBFX1NVUlBSRVNTX1BSSU1BUllfQlVTOworCiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAweDA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmU7CisJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKLQlzZXR1cF9pbmRpcmVjdF9wY2llKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQpOworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgMHg0KTsKKworCS8qIFByb2JlIHRoZSBob3NlIGxpbmsgdHJhaW5pbmcgc3RhdHVzICovCisJZWFybHlfcmVhZF9jb25maWdfd29yZChob3NlLCAwLCAwLCBQQ0lFX0xUU1NNLCAmdmFsKTsKKwlpZiAodmFsIDwgUENJRV9MVFNTTV9MMCkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIFNldHVwIHRoZSBQQ0lFIGhvc3QgY29udHJvbGxlci4gKi8KIAltcGM4Nnh4X3NldHVwX3BjaWUoaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5lbmQgLSByc3JjLnN0YXJ0ICsgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKaW5kZXggMDkwMWRiYS4uZjE2OTM1NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3JlZy5oPgpAQCAtNDksNiArNTAsMTAgQEAKIAogI2luY2x1ZGUgInN5c2Rldi9tcGM4eHhfcGljLmgiCiAKKyNpZmRlZiBDT05GSUdfUENNQ0lBX004WFgKK3N0cnVjdCBtcGM4eHhfcGNtY2lhX29wcyBtOHh4X3BjbWNpYV9vcHM7CisjZW5kaWYKKwogdm9pZCBtOHh4X2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIHZvaWQgbTh4eF93ZHRfaGFuZGxlcl9pbnN0YWxsKGJkX3QgKmJwKTsKIGV4dGVybiBpbnQgY3BtX3BpY19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODg1YWRzX3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYwppbmRleCBjMzZlNDc1Li41YTgwOGQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZnNfZW5ldF9wZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3VhcnRfcGQuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogCiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CkBAIC0zOSw3ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogZXh0ZXJuIHZvaWQgY3BtX3Jlc2V0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbXBjOHh4X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUqKTsKK2V4dGVybiB2b2lkIG1wYzh4eF9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICopOwogZXh0ZXJuIHZvaWQgbXBjOHh4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiB2b2lkIG1wYzh4eF9jYWxpYnJhdGVfZGVjcih2b2lkKTsKIGV4dGVybiBpbnQgbXBjOHh4X3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKQEAgLTQ3LDkgKzQ4LDczIEBACiBleHRlcm4gdm9pZCBtOHh4X3BpY19pbml0KHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBtcGM4eHhfZ2V0X2lycSh2b2lkKTsKIAotc3RhdGljIHZvaWQgaW5pdF9zbWMxX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBmcGkpOwotc3RhdGljIHZvaWQgaW5pdF9zbWMyX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBmcGkpOwotc3RhdGljIHZvaWQgaW5pdF9zY2MzX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8qIHB0cik7CitzdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmZwaSk7CitzdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmZwaSk7CitzdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKTsKKworI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorc3RhdGljIHZvaWQgcGNtY2lhX2h3X3NldHVwKGludCBzbG90LCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkICpiY3NyX2lvOworCisJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKGVuYWJsZSkKKwkJY2xyYml0czMyKGJjc3JfaW8sIEJDU1IxX1BDQ0VOKTsKKwllbHNlCisJCXNldGJpdHMzMihiY3NyX2lvLCBCQ1NSMV9QQ0NFTik7CisKKwlpb3VubWFwKGJjc3JfaW8pOworfQorCitzdGF0aWMgaW50IHBjbWNpYV9zZXRfdm9sdGFnZShpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKK3sKKwl1MzIgcmVnID0gMDsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKKworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MwOworCQlicmVhazsKKwljYXNlIDUwOgorCQlyZWcgfD0gQkNTUjFfUENDVkNDMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLworCWNscmJpdHMzMihiY3NyX2lvLCAweDAwNjEwMDAwKTsKKworCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLworCXNldGJpdHMzMihiY3NyX2lvLCByZWcpOworCisJaW91bm1hcChiY3NyX2lvKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBtcGM4ODVhZHNfYm9hcmRfc2V0dXAodm9pZCkKIHsKQEAgLTYyLDcgKzEyNyw3IEBACiAjZW5kaWYKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWNwID0gKGNwbTh4eF90ICopaW1tcl9tYXAoaW1fY3BtKTsKKwljcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOwogCiAJaWYgKGJjc3JfaW8gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUlxuIik7CkBAIC03NSwxMyArMTQwLDEzIEBACiAJb3V0XzgoJihjcC0+Y3Bfc21jWzBdLnNtY19zbWNtKSwgdG1wdmFsOCk7CiAJY2xyYml0czE2KCZjcC0+Y3Bfc21jWzBdLnNtY19zbWNtciwgU01DTVJfUkVOIHwgU01DTVJfVEVOKTsJLyogYnJnMSAqLwogI2Vsc2UKLQlzZXRiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzEpOworCXNldGJpdHMzMihiY3NyX2lvLCBCQ1NSMV9SUzIzMkVOXzEpOwogCW91dF9iZTE2KCZjcC0+Y3Bfc21jWzBdLnNtY19zbWNtciwgMCk7CiAJb3V0XzgoJmNwLT5jcF9zbWNbMF0uc21jX3NtY2UsIDApOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU0VSSUFMX0NQTV9TTUMyCi0JY2xyYml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9zaW1vZGUsIDB4ZTAwMDAwMDAgPj4gMSk7CiAJc2V0Yml0czMyKCZjcC0+Y3Bfc2ltb2RlLCAweDIwMDAwMDAwID4+IDEpOwkvKiBicmcyICovCiAJdG1wdmFsOCA9IGluXzgoJihjcC0+Y3Bfc21jWzFdLnNtY19zbWNtKSkgfCAoU01DTV9SWCB8IFNNQ01fVFgpOwpAQCAtOTAsNyArMTU1LDcgQEAKIAogCWluaXRfc21jMl91YXJ0X2lvcG9ydHMoMCk7CiAjZWxzZQotCXNldGJpdHMzMihiY3NyX2lvLEJDU1IxX1JTMjMyRU5fMik7CisJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMik7CiAJb3V0X2JlMTYoJmNwLT5jcF9zbWNbMV0uc21jX3NtY21yLCAwKTsKIAlvdXRfOCgmY3AtPmNwX3NtY1sxXS5zbWNfc21jZSwgMCk7CiAjZW5kaWYKQEAgLTk5LDI5ICsxNjQsMzQgQEAKIAogI2lmZGVmIENPTkZJR19GU19FTkVUCiAJLyogdXNlIE1EQyBmb3IgTUlJIChjb21tb24pICovCi0JaW9fcG9ydCA9IChpb3A4eHhfdCopaW1tcl9tYXAoaW1faW9wb3J0KTsKKwlpb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGRwYXIsIDB4MDA4MCk7CiAJY2xyYml0czE2KCZpb19wb3J0LT5pb3BfcGRkaXIsIDB4MDA4MCk7CiAKIAliY3NyX2lvID0gaW9yZW1hcChCQ1NSNSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkxX0VOKTsKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkxX1JTVCk7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTFfRU4pOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSNV9NSUkxX1JTVCk7CiAjaWZuZGVmIENPTkZJR19GQ19FTkVUX0hBU19TQ0MKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkyX0VOKTsKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkyX1JTVCk7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTJfRU4pOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSNV9NSUkyX1JTVCk7CiAKICNlbmRpZgogCWlvdW5tYXAoYmNzcl9pbyk7CiAJaW1tcl91bm1hcChpb19wb3J0KTsKIAogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENNQ0lBX004WFgKKwkvKlNldCB1cCBib2FyZCBzcGVjaWZpYyBob29rLXVwcyAqLworCW04eHhfcGNtY2lhX29wcy5od19jdHJsID0gcGNtY2lhX2h3X3NldHVwOworCW04eHhfcGNtY2lhX29wcy52b2x0YWdlX3NldCA9IHBjbWNpYV9zZXRfdm9sdGFnZTsKKyNlbmRpZgogfQogCi0KLXN0YXRpYyB2b2lkIGluaXRfZmVjMV9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X2ZlYzFfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKQogewotCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7Ci0JaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKilpbW1yX21hcChpbV9pb3BvcnQpOworCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOworCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAKIAkvKiBjb25maWd1cmUgRkVDMSBwaW5zICAqLwogCXNldGJpdHMxNigmaW9fcG9ydC0+aW9wX3BhcGFyLCAweGY4MzApOwpAQCAtMTQzLDExICsyMTMsMTAgQEAKIAlpbW1yX3VubWFwKGNwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBpbml0X2ZlYzJfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogcHRyKQorc3RhdGljIHZvaWQgaW5pdF9mZWMyX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8gKnB0cikKIHsKLQljcG04eHhfdCAqY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOwotCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopaW1tcl9tYXAoaW1faW9wb3J0KTsKKwljcG04eHhfdCAqY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKKwlpb3A4eHhfdCAqaW9fcG9ydCA9IChpb3A4eHhfdCAqKSBpbW1yX21hcChpbV9pb3BvcnQpOwogCiAJLyogY29uZmlndXJlIEZFQzIgcGlucyAqLwogCXNldGJpdHMzMigmY3AtPmNwX3BlcGFyLCAweDAwMDNmZmZjKTsKQEAgLTE3NywxNSArMjQ2LDE1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogZnBpKQorc3RhdGljIHZvaWQgaW5pdF9zY2MzX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8gKmZwaSkKIHsKIAl1bnNpZ25lZCAqYmNzcl9pbzsKIAlpb3A4eHhfdCAqaW9fcG9ydDsKIAljcG04eHhfdCAqY3A7CiAKIAliY3NyX2lvID0gaW9yZW1hcChCQ1NSX0FERFIsIEJDU1JfU0laRSk7Ci0JaW9fcG9ydCA9IChpb3A4eHhfdCAqKWltbXJfbWFwKGltX2lvcG9ydCk7Ci0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKKwljcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOwogCiAJaWYgKGJjc3JfaW8gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUlxuIik7CkBAIC0xOTQsOSArMjYzLDkgQEAKIAogCS8qIEVuYWJsZSB0aGUgUEhZLgogCSAqLwotCWNscmJpdHMzMihiY3NyX2lvKzQsIEJDU1I0X0VUSDEwX1JTVCk7CisJY2xyYml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSNF9FVEgxMF9SU1QpOwogCXVkZWxheSgxMDAwKTsKLQlzZXRiaXRzMzIoYmNzcl9pbys0LCBCQ1NSNF9FVEgxMF9SU1QpOworCXNldGJpdHMzMihiY3NyX2lvICsgNCwgQkNTUjRfRVRIMTBfUlNUKTsKIAkvKiBDb25maWd1cmUgcG9ydCBBIHBpbnMgZm9yIFR4ZCBhbmQgUnhkLgogCSAqLwogCXNldGJpdHMxNigmaW9fcG9ydC0+aW9wX3BhcGFyLCBQQV9FTkVUX1JYRCB8IFBBX0VORVRfVFhEKTsKQEAgLTIxMiw4ICsyODEsNyBAQAogCSAqLwogCXNldGJpdHMzMigmY3AtPmNwX3BlcGFyLCBQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOwogCWNscmJpdHMzMigmY3AtPmNwX3BlcGFyLCBQRV9FTkVUX1RFTkEpOwotCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLAotCQkgIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyB8IFBFX0VORVRfVEVOQSk7CisJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyB8IFBFX0VORVRfVEVOQSk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVzbywgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RFTkEpOwogCkBAIC0yMzcsNyArMzA1LDcgQEAKIAljbHJiaXRzMzIoJmNwLT5jcF9wZWRpciwgUEVfRU5FVF9URU5BKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RFTkEpOwogCi0Jc2V0Yml0czMyKGJjc3JfaW8rNCwgQkNTUjFfRVRIRU4pOworCXNldGJpdHMzMihiY3NyX2lvICsgNCwgQkNTUjFfRVRIRU4pOwogCWlvdW5tYXAoYmNzcl9pbyk7CiAJaW1tcl91bm1hcChpb19wb3J0KTsKIAlpbW1yX3VubWFwKGNwKTsKQEAgLTI1Nyw1MCArMzI1LDQ4IEBACiAJfQogfQogCi0KLQotc3RhdGljIHZvaWQgaW5pdF9zbWMxX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKnB0cikKIHsKLSAgICAgICAgdW5zaWduZWQgKmJjc3JfaW87CisJdW5zaWduZWQgKmJjc3JfaW87CiAJY3BtOHh4X3QgKmNwOwogCi0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwMDAwYzApOwogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCAweDAwMDAwMGMwKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwMDQwKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwMDgwKTsKIAlpbW1yX3VubWFwKGNwKTsKIAotICAgICAgICBiY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotICAgICAgICBpZiAoYmNzcl9pbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2xyYml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8xKTsKLSAgICAgICAgaW91bm1hcChiY3NyX2lvKTsKKwlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSMVxuIik7CisJCXJldHVybjsKKwl9CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMSk7CisJaW91bm1hcChiY3NyX2lvKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9zbWMyX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBmcGkpCitzdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmZwaSkKIHsKLSAgICAgICAgdW5zaWduZWQgKmJjc3JfaW87CisJdW5zaWduZWQgKmJjc3JfaW87CiAJY3BtOHh4X3QgKmNwOwogCi0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwMDBjMDApOwogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCAweDAwMDAwYzAwKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwNDAwKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwODAwKTsKIAlpbW1yX3VubWFwKGNwKTsKIAotICAgICAgICBiY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotICAgICAgICBpZiAoYmNzcl9pbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2xyYml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKLSAgICAgICAgaW91bm1hcChiY3NyX2lvKTsKKwlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSMVxuIik7CisJCXJldHVybjsKKwl9CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMik7CisJaW91bm1hcChiY3NyX2lvKTsKIH0KIAogdm9pZCBpbml0X3NtY19pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmRhdGEpCkBAIC0zNzMsMTUgKzQzOSwxMSBAQAogCXJldHVybiAxOwogfQogCi1kZWZpbmVfbWFjaGluZShtcGM4ODVfYWRzKSB7Ci0JLm5hbWUJCQk9ICJNUEM4ODUgQURTIiwKLQkucHJvYmUJCQk9IG1wYzg4NWFkc19wcm9iZSwKLQkuc2V0dXBfYXJjaAkJPSBtcGM4ODVhZHNfc2V0dXBfYXJjaCwKLQkuaW5pdF9JUlEJCT0gbTh4eF9waWNfaW5pdCwKLQkuc2hvd19jcHVpbmZvCQk9IG1wYzh4eF9zaG93X2NwdWluZm8sCi0JLmdldF9pcnEJCT0gbXBjOHh4X2dldF9pcnEsCi0JLnJlc3RhcnQJCT0gbXBjOHh4X3Jlc3RhcnQsCi0JLmNhbGlicmF0ZV9kZWNyCQk9IG1wYzh4eF9jYWxpYnJhdGVfZGVjciwKLQkuc2V0X3J0Y190aW1lCQk9IG1wYzh4eF9zZXRfcnRjX3RpbWUsCi0JLmdldF9ydGNfdGltZQkJPSBtcGM4eHhfZ2V0X3J0Y190aW1lLAotfTsKK2RlZmluZV9tYWNoaW5lKG1wYzg4NV9hZHMpCit7CisubmFtZSA9ICJNUEM4ODUgQURTIiwucHJvYmUgPSBtcGM4ODVhZHNfcHJvYmUsLnNldHVwX2FyY2ggPQorCSAgICBtcGM4ODVhZHNfc2V0dXBfYXJjaCwuaW5pdF9JUlEgPQorCSAgICBtOHh4X3BpY19pbml0LC5zaG93X2NwdWluZm8gPSBtcGM4eHhfc2hvd19jcHVpbmZvLC5nZXRfaXJxID0KKwkgICAgbXBjOHh4X2dldF9pcnEsLnJlc3RhcnQgPSBtcGM4eHhfcmVzdGFydCwuY2FsaWJyYXRlX2RlY3IgPQorCSAgICBtcGM4eHhfY2FsaWJyYXRlX2RlY3IsLnNldF9ydGNfdGltZSA9CisJICAgIG1wYzh4eF9zZXRfcnRjX3RpbWUsLmdldF9ydGNfdGltZSA9IG1wYzh4eF9nZXRfcnRjX3RpbWUsfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwppbmRleCAzNjFhY2ZhLi4zMzU0NWQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCkBAIC0yLDcgKzIsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIk1hY2hpbmUgdHlwZSIKLQlkZXBlbmRzIG9uIFBQQzY0IHx8IENMQVNTSUMzMgorCWRlcGVuZHMgb24gUFBDNjQgfHwgNnh4CiAJZGVmYXVsdCBQUENfTVVMVElQTEFURk9STQogCiBjb25maWcgUFBDX01VTFRJUExBVEZPUk0KQEAgLTE2LDE1ICsxNiwzMCBAQAogCWJvb2wgIkVtYmVkZGVkIDZ4eC83eHgvN3h4eC1iYXNlZCBib2FyZCIKIAlkZXBlbmRzIG9uIFBQQzMyICYmIChCUk9LRU58fEJST0tFTl9PTl9TTVApCiAKLWNvbmZpZyBBUFVTCi0JYm9vbCAiQW1pZ2EtQVBVUyIKLQlkZXBlbmRzIG9uIFBQQzMyICYmIEJST0tFTgorY29uZmlnIFBQQ184Mnh4CisJYm9vbCAiRnJlZXNjYWxlIDgyeHgiCisJZGVwZW5kcyBvbiA2eHgKKworY29uZmlnIFBQQ184M3h4CisJYm9vbCAiRnJlZXNjYWxlIDgzeHgiCisJZGVwZW5kcyBvbiA2eHgKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCA4M3h4CisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKKworY29uZmlnIFBQQ184Nnh4CisJYm9vbCAiRnJlZXNjYWxlIDg2eHgiCisJZGVwZW5kcyBvbiA2eHgKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCBBTFRJVkVDCiAJaGVscAotCSAgU2VsZWN0IEFQVVMgaWYgY29uZmlndXJpbmcgZm9yIGEgUG93ZXJVUCBBbWlnYS4KLQkgIE1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGF0OgotCSAgPGh0dHA6Ly9saW51eC1hcHVzLnNvdXJjZWZvcmdlLm5ldC8+LgorCSAgVGhlIEZyZWVzY2FsZSBFNjAwIFNvQ3MgaGF2ZSA3NHh4IGNvcmVzLgogZW5kY2hvaWNlCiAKK2NvbmZpZyBDTEFTU0lDMzIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiA2eHggJiYgUFBDX01VTFRJUExBVEZPUk0KKwogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI1ZmRlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMCwwICsxLDIyMSBAQAorY29uZmlnIFBQQzY0CisJYm9vbCAiNjQtYml0IGtlcm5lbCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCisJICB3aWxsIGJlIGJ1aWx0LgorCittZW51ICJQcm9jZXNzb3Igc3VwcG9ydCIKK2Nob2ljZQorCXByb21wdCAiUHJvY2Vzc29yIFR5cGUiCisJZGVwZW5kcyBvbiBQUEMzMgorCWRlZmF1bHQgNnh4CisJaGVscAorCSAgVGhlcmUgYXJlIGZpdmUgZmFtaWxpZXMgb2YgMzIgYml0IFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLgorCSAgVGhlIG1vc3QgY29tbW9uIG9uZXMgYXJlIHRoZSBkZXNrdG9wIGFuZCBzZXJ2ZXIgQ1BVcyAoNjAxLCA2MDMsCisJICA2MDQsIDc0MCwgNzUwLCA3NHh4KSBDUFVzIGZyb20gRnJlZXNjYWxlIGFuZCBJQk0sIHdpdGggdGhlaXIKKwkgIGVtYmVkZGVkIDUyeHgvODJ4eC84M3h4Lzg2eHggY291bnRlcnBhcnRzLgorCSAgVGhlIG90aGVyIGVtYmVlZGVkIHBhcnRzLCBuYW1lbHkgNHh4LCA4eHgsIGUyMDAgKDU1eHgpIGFuZCBlNTAwCisJICAoODV4eCkgZWFjaCBmb3JtIGEgZmFtaWx5IG9mIHRoZWlyIG93biB0aGF0IGlzIG5vdCBjb21wYXRpYmxlCisJICB3aXRoIHRoZSBvdGhlcnMuCisKKwkgIElmIHVuc3VyZSwgc2VsZWN0IDUyeHgvNnh4Lzd4eC83NHh4LzgyeHgvODN4eC84Nnh4LgorCitjb25maWcgNnh4CisJYm9vbCAiNTJ4eC82eHgvN3h4Lzc0eHgvODJ4eC84M3h4Lzg2eHgiCisJc2VsZWN0IFBQQ19GUFUKKworY29uZmlnIFBQQ184NXh4CisJYm9vbCAiRnJlZXNjYWxlIDg1eHgiCisJc2VsZWN0IEU1MDAKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCA4NXh4CisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKKworY29uZmlnIFBQQ184eHgKKwlib29sICJGcmVlc2NhbGUgOHh4IgorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDh4eAorCitjb25maWcgNDB4CisJYm9vbCAiQU1DQyA0MHgiCisJc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCisKK2NvbmZpZyA0NHgKKwlib29sICJBTUNDIDQ0eCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgRTIwMAorCWJvb2wgIkZyZWVzY2FsZSBlMjAwIgorCitlbmRjaG9pY2UKKworY29uZmlnIFBPV0VSNF9PTkxZCisJYm9vbCAiT3B0aW1pemUgZm9yIFBPV0VSNCIKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgQ2F1c2UgdGhlIGNvbXBpbGVyIHRvIG9wdGltaXplIGZvciBQT1dFUjQvUE9XRVI1L1BQQzk3MCBwcm9jZXNzb3JzLgorCSAgVGhlIHJlc3VsdGluZyBiaW5hcnkgd2lsbCBub3Qgd29yayBvbiBQT1dFUjMgb3IgUlM2NCBwcm9jZXNzb3JzCisJICB3aGVuIGNvbXBpbGVkIHdpdGggYmludXRpbHMgMi4xNSBvciBsYXRlci4KKworY29uZmlnIFBPV0VSMworCWJvb2wKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmYXVsdCB5IGlmICFQT1dFUjRfT05MWQorCitjb25maWcgUE9XRVI0CisJZGVwZW5kcyBvbiBQUEM2NAorCWRlZl9ib29sIHkKKworY29uZmlnIDZ4eAorCWJvb2wKKworIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCitjb25maWcgOHh4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4M3h4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4NXh4CisJYm9vbAorCitjb25maWcgRTUwMAorCWJvb2wKKworY29uZmlnIFBQQ19GUFUKKwlib29sCisJZGVmYXVsdCB5IGlmIFBQQzY0CisKK2NvbmZpZyA0eHgKKwlib29sCisJZGVwZW5kcyBvbiA0MHggfHwgNDR4CisJZGVmYXVsdCB5CisKK2NvbmZpZyBCT09LRQorCWJvb2wKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMCB8fCA0NHgKKwlkZWZhdWx0IHkKKworY29uZmlnIEZTTF9CT09LRQorCWJvb2wKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAorCWRlZmF1bHQgeQorCitjb25maWcgUFRFXzY0QklUCisJYm9vbAorCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKKwlkZWZhdWx0IHkgaWYgNDR4CisJZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAorCitjb25maWcgUEhZU182NEJJVAorCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAorCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCisJZGVmYXVsdCB5IGlmIDQ0eAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIGxhcmdlciB0aGFuIDMyLWJpdCBwaHlzaWNhbAorCSAgYWRkcmVzc2VzLiAgVGhpcyBmZWF0dXJlcyBpcyBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBlNTAwIGNvcmVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KKworY29uZmlnIEFMVElWRUMKKwlib29sICJBbHRpVmVjIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBDTEFTU0lDMzIgfHwgUE9XRVI0CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIEFsdGl2ZWMgZXh0ZW5zaW9ucyB0byB0aGUKKwkgIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseSBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZworCSAgYWx0aXZlYyByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZSAnYWx0aXZlYyBlbmFibGUnIGJpdCBzbyB1c2VyCisJICBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgYWx0aXZlYyBpbnN0cnVjdGlvbnMuCisKKwkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cworCSAgYWx0aXZlYyAoRzQsIG90aGVyd2lzZSBrbm93biBhcyA3NHh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlCisJICBhbnkgYWZmZWN0IG9uIGEgbm9uLWFsdGl2ZWMgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZQorCSAga2VybmVsKS4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBTUEUKKwlib29sICJTUEUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBTaWduYWwgUHJvY2Vzc2luZworCSAgRXh0ZW5zaW9ucyAoU1BFKSB0byB0aGUgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5CisJICBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyBTUEUgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUKKwkgICdzcGUgZW5hYmxlJyBiaXQgc28gdXNlciBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgU1BFIGluc3RydWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cworCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKKwkgIGVmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFBQQ19TVERfTU1VCisJYm9vbAorCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMyB8fCBQT1dFUjQgfHwgUFBDNjQKKwlkZWZhdWx0IHkKKworY29uZmlnIFBQQ19TVERfTU1VXzMyCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUFBDX1NURF9NTVUgJiYgUFBDMzIKKworY29uZmlnIFBQQ19NTV9TTElDRVMKKwlib29sCisJZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRQorCWRlZmF1bHQgbgorCitjb25maWcgVklSVF9DUFVfQUNDT1VOVElORworCWJvb2wgIkRldGVybWluaXN0aWMgdGFzayBhbmQgQ1BVIHRpbWUgYWNjb3VudGluZyIKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGFjY3VyYXRlIHRhc2sgYW5kIENQVSB0aW1lCisJICBhY2NvdW50aW5nLiAgVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBDUFUgY291bnRlciBvbiBlYWNoCisJICBrZXJuZWwgZW50cnkgYW5kIGV4aXQgYW5kIG9uIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUga2VybmVsCisJICBiZXR3ZWVuIHN5c3RlbSwgc29mdGlycSBhbmQgaGFyZGlycSBzdGF0ZSwgc28gdGhlcmUgaXMgYQorCSAgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LiAgVGhpcyBhbHNvIGVuYWJsZXMgYWNjb3VudGluZyBvZgorCSAgc3RvbGVuIHRpbWUgb24gbG9naWNhbGx5LXBhcnRpdGlvbmVkIHN5c3RlbXMgcnVubmluZyBvbgorCSAgSUJNIFBPV0VSNS1iYXNlZCBtYWNoaW5lcy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBTTVAKKwlkZXBlbmRzIG9uIFBQQ19TVERfTU1VCisJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQorCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUKKwkgIHRoYW4gb25lIENQVSwgc2F5IFkuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBjdXJyZW50bHkKKwkgIHN1cHBvcnQgU01QIG1hY2hpbmVzIHdpdGggNjAzLzYwM2UvNjAzZXYgb3IgUFBDNzUwICgiRzMiKSBwcm9jZXNzb3JzCisJICBzaW5jZSB0aGV5IGhhdmUgaW5hZGVxdWF0ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBtdWx0aXByb2Nlc3NvcgorCSAgb3BlcmF0aW9uLgorCisJICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUgYW5kIG11bHRpcHJvY2Vzc29yCisJICBtYWNoaW5lcywgYnV0IHdpbGwgdXNlIG9ubHkgb25lIENQVSBvZiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuIElmCisJICB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmVzLgorCSAgT24gYSBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gZmFzdGVyIGlmIHlvdSBzYXkKKwkgIE4gaGVyZS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KKworY29uZmlnIE5SX0NQVVMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMTI4KSIKKwlyYW5nZSAyIDEyOAorCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiMzIiIGlmIFBQQzY0CisJZGVmYXVsdCAiNCIKKworY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQorCWJvb2wKKwlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAorCWRlZmF1bHQgeQorCitjb25maWcgQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWQorCWJvb2wKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9hcHVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkZTNiZi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0KLWNvbmZpZyBBTUlHQQotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBbWlnYSBzZXJpZXMgb2YgY29tcHV0ZXJzLgotCi1jb25maWcgWk9SUk8KLQlib29sCi0JZGVwZW5kcyBvbiBBUFVTCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBab3JybyBidXMgaW4gdGhlIEFtaWdhLiBJZiB5b3UgaGF2ZQotCSAgZXhwYW5zaW9uIGNhcmRzIGluIHlvdXIgQW1pZ2EgdGhhdCBjb25mb3JtIHRvIHRoZSBBbWlnYQotCSAgQXV0b0NvbmZpZyh0bSkgc3BlY2lmaWNhdGlvbiwgc2F5IFksIG90aGVyd2lzZSBOLiBOb3RlIHRoYXQgZXZlbgotCSAgZXhwYW5zaW9uIGNhcmRzIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgWm9ycm8gc2xvdHMgYnV0IGZpdCBpbiBlLmcuCi0JICB0aGUgQ1BVIHNsb3QgbWF5IGZhbGwgaW4gdGhpcyBjYXRlZ29yeSwgc28geW91IGhhdmUgdG8gc2F5IFkgdG8gbGV0Ci0JICBMaW51eCB1c2UgdGhlc2UuCi0KLWNvbmZpZyBBQlNUUkFDVF9DT05TT0xFCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCi1jb25maWcgQVBVU19GQVNUX0VYQ0VQVAotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQotY29uZmlnIEFNSUdBX1BDTUNJQQotCWJvb2wgIkFtaWdhIDEyMDAvNjAwIFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUyAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBmb3IgcGNtY2lhIG9uIEFtaWdhIDEyMDAgYW5kIEFtaWdhCi0JICA2MDAuIElmIHlvdSBpbnRlbmQgdG8gdXNlIHBjbWNpYSBjYXJkcyBzYXkgWTsgb3RoZXJ3aXNlIHNheSBOLgotCi1jb25maWcgQU1JR0FfQlVJTFRJTl9TRVJJQUwKLQl0cmlzdGF0ZSAiQW1pZ2EgYnVpbHRpbiBzZXJpYWwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFQVVMKLQloZWxwCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBBbWlnYSdzIGJ1aWx0LWluIHNlcmlhbCBwb3J0IGluIExpbnV4LAotCSAgYW5zd2VyIFkuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCi0KLWNvbmZpZyBHVlBJT0VYVAotCXRyaXN0YXRlICJHVlAgSU8tRXh0ZW5kZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFQVVMKLQloZWxwCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgYSBHVlAgSU8tRXh0ZW5kZXIgc2VyaWFsIGNhcmQgaW4gTGludXgsIHNheSBZLgotCSAgT3RoZXJ3aXNlLCBzYXkgTi4KLQotY29uZmlnIEdWUElPRVhUX0xQCi0JdHJpc3RhdGUgIkdWUCBJTy1FeHRlbmRlciBwYXJhbGxlbCBwcmludGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBHVlBJT0VYVAotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBkcml2aW5nIGEgcHJpbnRlciBmcm9tIHRoZSBwYXJhbGxlbCBwb3J0IG9uIHlvdXIKLQkgIEdWUCBJTy1FeHRlbmRlciBjYXJkLCBOIG90aGVyd2lzZS4KLQotY29uZmlnIEdWUElPRVhUX1BMSVAKLQl0cmlzdGF0ZSAiR1ZQIElPLUV4dGVuZGVyIFBMSVAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdWUElPRVhUCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIGRvaW5nIElQIG92ZXIgdGhlIHBhcmFsbGVsIHBvcnQgb24geW91ciBHVlAKLQkgIElPLUV4dGVuZGVyIGNhcmQsIE4gb3RoZXJ3aXNlLgotCi1jb25maWcgTVVMVElGQUNFX0lJSV9UVFkKLQl0cmlzdGF0ZSAiTXVsdGlmYWNlIENhcmQgSUlJIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSBhIE11bHRpZmFjZSBJSUkgY2FyZCdzIHNlcmlhbCBwb3J0IGluIExpbnV4LAotCSAgYW5zd2VyIFkuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCi0KLWNvbmZpZyBBMjIzMgotCXRyaXN0YXRlICJDb21tb2RvcmUgQTIyMzIgc2VyaWFsIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQVBVUwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIHN1cHBvcnRzIHRoZSAyMjMyIDctcG9ydCBzZXJpYWwgY2FyZCBzaGlwcGVkIHdpdGggdGhlCi0JICBBbWlnYSAyMDAwIGFuZCBvdGhlciBab3Jyby1idXMgbWFjaGluZXMsIGRhdGluZyBmcm9tIDE5ODkuICBBdAotCSAgYSBtYXggb2YgMTksMjAwIGJwcywgdGhlIHBvcnRzIGFyZSBzZXJ2ZWQgYnkgYSA2NTUxIEFDSUEgVUFSVCBjaGlwCi0JICBlYWNoLCBwbHVzIGEgODUyMCBDSUEsIGFuZCBhIG1hc3RlciA2NTAyIENQVSBhbmQgYnVmZmVyIGFzIHdlbGwuIFRoZQotCSAgcG9ydHMgd2VyZSBjb25uZWN0ZWQgd2l0aCA4IHBpbiBESU4gY29ubmVjdG9ycyBvbiB0aGUgY2FyZCBicmFja2V0LAotCSAgZm9yIHdoaWNoIDggcGluIHRvIERCMjUgYWRhcHRlcnMgd2VyZSBzdXBwbGllZC4gVGhlIGNhcmQgYWxzbyBoYWQKLQkgIGp1bXBlcnMgaW50ZXJuYWxseSB0byB0b2dnbGUgdmFyaW91cyBwaW5uaW5nIGNvbmZpZ3VyYXRpb25zLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbHQgYXMgYSBtb2R1bGU7IGJ1dCB0aGVuICJnZW5lcmljX3NlcmlhbCIKLQkgIHdpbGwgYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gVGhpcyBoYXMgdG8gYmUgbG9hZGVkIGJlZm9yZQotCSAgInNlcl9hMjIzMiIuIElmIHlvdSB3YW50IHRvIGRvIHRoaXMsIGFuc3dlciBNIGhlcmUuCi0KLWNvbmZpZyBXSElQUEVUX1NFUklBTAotCXRyaXN0YXRlICJIaXNvZnQgV2hpcHBldCBQQ01DSUEgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBTUlHQV9QQ01DSUEKLQloZWxwCi0JICBIaVNvZnQgaGFzIGEgd2ViIHBhZ2UgYXQgPGh0dHA6Ly93d3cuaGlzb2Z0LmNvLnVrLz4sIGJ1dCB0aGVyZQotCSAgaXMgbm8gbGlzdGluZyBmb3IgdGhlIFdoaXBwZXQgaW4gdGhlaXIgQW1pZ2Egc2VjdGlvbi4KLQotY29uZmlnIEFQTkUKLQl0cmlzdGF0ZSAiUENNQ0lBIE5FMjAwMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQU1JR0FfUENNQ0lBCi0JaGVscAotCSAgSWYgeW91IGhhdmUgYSBQQ01DSUEgTkUyMDAwIGNvbXBhdGlibGUgYWRhcHRlciwgc2F5IFkuICBPdGhlcndpc2UsCi0JICBzYXkgTi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXBuZS4KLQotY29uZmlnIFNFUklBTF9DT05TT0xFCi0JYm9vbCAiU3VwcG9ydCBmb3Igc2VyaWFsIHBvcnQgY29uc29sZSIKLQlkZXBlbmRzIG9uIEFQVVMgJiYgKEFNSUdBX0JVSUxUSU5fU0VSSUFMPXkgfHwgR1ZQSU9FWFQ9eSB8fCBNVUxUSUZBQ0VfSUlJX1RUWT15KQotCi1jb25maWcgSEVBUlRCRUFUCi0JYm9vbCAiVXNlIHBvd2VyIExFRCBhcyBhIGhlYXJ0YmVhdCIKLQlkZXBlbmRzIG9uIEFQVVMKLQloZWxwCi0JICBVc2UgdGhlIHBvd2VyLW9uIExFRCBvbiB5b3VyIG1hY2hpbmUgYXMgYSBsb2FkIG1ldGVyLiAgVGhlIGV4YWN0Ci0JICBiZWhhdmlvciBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBub3JtYWxseSB0aGUgZmxhc2ggZnJlcXVlbmN5IGlzCi0JICBhIGh5cGVyYm9saWMgZnVuY3Rpb24gb2YgdGhlIDUtbWludXRlIGxvYWQgYXZlcmFnZS4KLQotY29uZmlnIFBST0NfSEFSRFdBUkUKLQlib29sICIvcHJvYy9oYXJkd2FyZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCi1zb3VyY2UgImRyaXZlcnMvem9ycm8vS2NvbmZpZyIKLQotY29uZmlnIFBDSV9QRVJNRURJQQotCWJvb2wgIlBDSSBmb3IgUGVybWVkaWEyIgotCWRlcGVuZHMgb24gITR4eCAmJiAhOHh4ICYmIEFQVVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKaW5kZXggN2ZiOTJmMi4uOWQ3YzJlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQl2YWRkciA9ICh1bnNpZ25lZCBsb25nKVBDSV9GSVhfQUREUihhZGRyKTsKIAogCQkvKiBDaGVjayBpZiBpdCdzIGluIGFsbG93ZWQgcmFuZ2UgZm9yICBQSU8gKi8KLQkJaWYgKHZhZGRyIDwgUEhCU19JT19CQVNFIHx8IHZhZGRyID49IElNQUxMT0NfQkFTRSkKKwkJaWYgKHZhZGRyIDwgUEhCX0lPX0JBU0UgfHwgdmFkZHIgPiBQSEJfSU9fRU5EKQogCQkJcmV0dXJuOwogCiAJCS8qIFRyeSB0byBmaW5kIGEgUFRFLiBJZiBub3QsIGNsZWFyIHRoZSBwYWRkciwgd2UnbGwgZG8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKaW5kZXggYTdmNWE3Ni4uOTZhOGY2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saW51eF9sb2dvLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgpAQCAtMTgzLDcgKzE4NCw3IEBACiAJCXNwdS0+c2xiX3JlcGxhY2UgPSAwOwogCiAJc3B1X3Jlc3RhcnRfZG1hKHNwdSk7Ci0KKwlzcHUtPnN0YXRzLnNsYl9mbHQrKzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMyLDYgKzMzMyw3IEBACiAJaWYgKHN0YXQgJiAweDEwKSAvKiBTUFUgbWFpbGJveCB0aHJlc2hvbGQgKi8KIAkJc3B1LT53Ym94X2NhbGxiYWNrKHNwdSk7CiAKKwlzcHUtPnN0YXRzLmNsYXNzMl9pbnRyKys7CiAJcmV0dXJuIHN0YXQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfQogCkBAIC00NjIsOCArNDY0LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzcHVfZnJlZSk7CiAKK3N0YXRpYyBpbnQgc3B1X3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJc3RydWN0IHNwdSAqc3B1ID0gY29udGFpbmVyX29mKHN5c2Rldiwgc3RydWN0IHNwdSwgc3lzZGV2KTsKKworCXNwdV9mcmVlX2lycXMoc3B1KTsKKwlzcHVfZGVzdHJveV9zcHUoc3B1KTsKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IHN5c2Rldl9jbGFzcyBzcHVfc3lzZGV2X2NsYXNzID0gewotCXNldF9rc2V0X25hbWUoInNwdSIpCisJc2V0X2tzZXRfbmFtZSgic3B1IiksCisJLnNodXRkb3duID0gc3B1X3NodXRkb3duLAogfTsKIAogaW50IHNwdV9hZGRfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpCkBAIC01NzQsNiArNTg2LDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcHVfbGlzdF9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOwogCisJc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9IFNQVV9VVElMX0lETEU7CisJc3B1LT5zdGF0cy50c3RhbXAgPSBqaWZmaWVzOworCiAJZ290byBvdXQ7CiAKIG91dF9mcmVlX2lycXM6CkBAIC01ODYsNiArNjAxLDQ1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKnNwdV9zdGF0ZV9uYW1lc1tdID0geworCSJ1c2VyIiwgInN5c3RlbSIsICJpb3dhaXQiLCAiaWRsZSIKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc3B1X2FjY3RfdGltZShzdHJ1Y3Qgc3B1ICpzcHUsCisJCWVudW0gc3B1X3V0aWxpemF0aW9uX3N0YXRlIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lID0gc3B1LT5zdGF0cy50aW1lc1tzdGF0ZV07CisKKwlpZiAoc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9PSBzdGF0ZSkKKwkJdGltZSArPSBqaWZmaWVzIC0gc3B1LT5zdGF0cy50c3RhbXA7CisKKwlyZXR1cm4gamlmZmllc190b19tc2Vjcyh0aW1lKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBzcHVfc3RhdF9zaG93KHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWxsdSAlbGx1ICVsbHUgJWxsdSAiCisJCSAgICAgICIlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCisJCXNwdV9zdGF0ZV9uYW1lc1tzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlXSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX1VTRVIpLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfU1lTVEVNKSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX0lPV0FJVCksCisJCXNwdV9hY2N0X3RpbWUoc3B1LCBTUFVfVVRJTF9JRExFKSwKKwkJc3B1LT5zdGF0cy52b2xfY3R4X3N3aXRjaCwKKwkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoLAorCQlzcHUtPnN0YXRzLnNsYl9mbHQsCisJCXNwdS0+c3RhdHMuaGFzaF9mbHQsCisJCXNwdS0+c3RhdHMubWluX2ZsdCwKKwkJc3B1LT5zdGF0cy5tYWpfZmx0LAorCQlzcHUtPnN0YXRzLmNsYXNzMl9pbnRyLAorCQlzcHUtPnN0YXRzLmxpYmFzc2lzdCk7Cit9CisKK3N0YXRpYyBTWVNERVZfQVRUUihzdGF0LCAwNjQ0LCBzcHVfc3RhdF9zaG93LCBOVUxMKTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9zcHVfYmFzZSh2b2lkKQogewogCWludCBpLCByZXQgPSAwOwpAQCAtNjAzLDE0ICs2NTcsMjggQEAKIAogCXJldCA9IHNwdV9lbnVtZXJhdGVfc3B1cyhjcmVhdGVfc3B1KTsKIAotCWlmIChyZXQpIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNwdXNcbiIsCiAJCQlfX0ZVTkNUSU9OX18pOwogCQlnb3RvIG91dF91bnJlZ2lzdGVyX3N5c2Rldl9jbGFzczsKIAl9CiAKKwlpZiAocmV0ID4gMCkgeworCQkvKgorCQkgKiBXZSBjYW5ub3QgcHV0IHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uIGluCisJCSAqIDxsaW51eC9saW51eF9sb2dvLmg+IGJlY2F1c2Ugb2YgY29uZmxpY3Rpbmcgc2Vzc2lvbiB0eXBlCisJCSAqIGNvbmZsaWN0cyBmb3IgY29uc3QgYW5kIF9faW5pdGRhdGEgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXIKKwkJICogdmVyc2lvbnMKKwkJICovCisJCWV4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyBsb2dvX3NwZV9jbHV0MjI0OworCisJCWZiX2FwcGVuZF9leHRyYV9sb2dvKCZsb2dvX3NwZV9jbHV0MjI0LCByZXQpOworCX0KKwogCXhtb25fcmVnaXN0ZXJfc3B1cygmc3B1X2Z1bGxfbGlzdCk7CiAKKwlzcHVfYWRkX3N5c2Rldl9hdHRyKCZhdHRyX3N0YXQpOworCiAJcmV0dXJuIDA7CiAKICBvdXRfdW5yZWdpc3Rlcl9zeXNkZXZfY2xhc3M6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwppbmRleCAxZDQ1NjJhLi43NWVkNTBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKQEAgLTI3OSw2ICsyNzksNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXVuc2lnbmVkIGludCBuID0gMDsKIAogCXJldCA9IC1FTk9ERVY7CiAJZm9yIChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNwZSIpOwpAQCAtMjg5LDggKzI5MCw5IEBACiAJCQkJX19GVU5DVElPTl9fLCBub2RlLT5uYW1lKTsKIAkJCWJyZWFrOwogCQl9CisJCW4rKzsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKIH0KIAogc3RhdGljIGludCBfX2luaXQgb2ZfY3JlYXRlX3NwdShzdHJ1Y3Qgc3B1ICpzcHUsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCmluZGV4IGQzMmRiOWYuLjA3YTBlODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCkBAIC0zMjAsNiArMzIwLDEyIEBACiAJLyogRklYTUU6IHdoYXQgYXJlIHRoZSBzaWRlLWVmZmVjdHMgb2YgdGhpcz8gKi8KIAlwcm9iLT5kbWFfcXVlcnltYXNrX1JXID0gbWFzazsKIAlwcm9iLT5kbWFfcXVlcnl0eXBlX1JXID0gbW9kZTsKKwkvKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIFNQVSBjb250ZXh0IGlzIGFsd2F5cworCSAqIGFjcXVpcmVkIGluIHJ1bm5hYmxlIHN0YXRlIHdoZW4gbmV3IGJpdHMgYXJlIGFkZGVkIHRvIHRoZQorCSAqIG1hc2sgKHRhZ3dhaXQpLCBzbyBpdCdzIHN1ZmZpY2llbnQganVzdCB0byBtYXNrCisJICogZG1hX3RhZ3N0YXR1c19SIHdpdGggdGhlICdtYXNrJyBwYXJhbWV0ZXIgaGVyZS4KKwkgKi8KKwljdHgtPmNzYS5wcm9iLmRtYV90YWdzdGF0dXNfUiAmPSBtYXNrOwogb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKaW5kZXggN2M1MWNiNS4uNmQ3YmQ2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCkBAIC0yMywxMCArMjMsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KICNpbmNsdWRlICJzcHVmcy5oIgogCisKK2F0b21pY190IG5yX3NwdV9jb250ZXh0cyA9IEFUT01JQ19JTklUKDApOworCiBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmFsbG9jX3NwdV9jb250ZXh0KHN0cnVjdCBzcHVfZ2FuZyAqZ2FuZykKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKQEAgLTUzLDEwICs1NywxMiBAQAogCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJxKTsKIAlpZiAoZ2FuZykKIAkJc3B1X2dhbmdfYWRkX2N0eChnYW5nLCBjdHgpOwotCWN0eC0+cnRfcHJpb3JpdHkgPSBjdXJyZW50LT5ydF9wcmlvcml0eTsKLQljdHgtPnBvbGljeSA9IGN1cnJlbnQtPnBvbGljeTsKLQljdHgtPnByaW8gPSBjdXJyZW50LT5wcmlvOwotCUlOSVRfREVMQVlFRF9XT1JLKCZjdHgtPnNjaGVkX3dvcmssIHNwdV9zY2hlZF90aWNrKTsKKwljdHgtPmNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzcHVfc2V0X3RpbWVzbGljZShjdHgpOworCWN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID0gU1BVQ1RYX1VUSUxfVVNFUjsKKwljdHgtPnN0YXRzLnRzdGFtcCA9IGppZmZpZXM7CisKKwlhdG9taWNfaW5jKCZucl9zcHVfY29udGV4dHMpOwogCWdvdG8gb3V0Owogb3V0X2ZyZWU6CiAJa2ZyZWUoY3R4KTsKQEAgLTc2LDYgKzgyLDcgQEAKIAlpZiAoY3R4LT5nYW5nKQogCQlzcHVfZ2FuZ19yZW1vdmVfY3R4KGN0eC0+Z2FuZywgY3R4KTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmN0eC0+cnEpKTsKKwlhdG9taWNfZGVjKCZucl9zcHVfY29udGV4dHMpOwogCWtmcmVlKGN0eCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKaW5kZXggMGY3NWMwNy4uZTA2NGQwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKQEAgLTMzLDcgKzMzLDggQEAKICAqIGZ1bmN0aW9uLiBDdXJyZW50bHksIHRoZXJlIGFyZSBhIGZldyBjb3JuZXIgY2FzZXMgdGhhdCB3ZSBoYXZlbid0IGhhZAogICogdG8gaGFuZGxlIGZvcnR1bmF0ZWx5LgogICovCi1zdGF0aWMgaW50IHNwdV9oYW5kbGVfbW1fZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgZHNpc3IpCitzdGF0aWMgaW50IHNwdV9oYW5kbGVfbW1fZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEsCisJCXVuc2lnbmVkIGxvbmcgZHNpc3IsIHVuc2lnbmVkICpmbHQpCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyBpc193cml0ZTsKQEAgLTczLDcgKzc0LDggQEAKIAkJCWdvdG8gYmFkX2FyZWE7CiAJfQogCXJldCA9IDA7Ci0Jc3dpdGNoIChoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgZWEsIGlzX3dyaXRlKSkgeworCSpmbHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgZWEsIGlzX3dyaXRlKTsKKwlzd2l0Y2ggKCpmbHQpIHsKIAljYXNlIFZNX0ZBVUxUX01JTk9SOgogCQljdXJyZW50LT5taW5fZmx0Kys7CiAJCWJyZWFrOwpAQCAtMTUzLDYgKzE1NSw3IEBACiB7CiAJdTY0IGVhLCBkc2lzciwgYWNjZXNzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZmx0ID0gMDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTE3OCw5ICsxODEsMTcgQEAKIAlpZiAoIShkc2lzciAmIChNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKSkpCiAJCXJldHVybiAwOwogCisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX0lPV0FJVCk7CisKIAlwcl9kZWJ1ZygiY3R4ICVwOiBlYSAlMDE2bHgsIGRzaXNyICUwMTZseCBzdGF0ZSAlZFxuIiwgY3R4LCBlYSwKIAkJZHNpc3IsIGN0eC0+c3RhdGUpOwogCisJY3R4LT5zdGF0cy5oYXNoX2ZsdCsrOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQljdHgtPnNwdS0+c3RhdHMuaGFzaF9mbHQrKzsKKwkJc3B1X3N3aXRjaF9zdGF0ZShjdHgtPnNwdSwgU1BVX1VUSUxfSU9XQUlUKTsKKwl9CisKIAkvKiB3ZSBtdXN0IG5vdCBob2xkIHRoZSBsb2NrIHdoZW4gZW50ZXJpbmcgc3B1X2hhbmRsZV9tbV9mYXVsdCAqLwogCXNwdV9yZWxlYXNlKGN0eCk7CiAKQEAgLTE5Miw3ICsyMDMsNyBAQAogCiAJLyogaGFzaGluZyBmYWlsZWQsIHNvIHRyeSB0aGUgYWN0dWFsIGZhdWx0IGhhbmRsZXIgKi8KIAlpZiAocmV0KQotCQlyZXQgPSBzcHVfaGFuZGxlX21tX2ZhdWx0KGN1cnJlbnQtPm1tLCBlYSwgZHNpc3IpOworCQlyZXQgPSBzcHVfaGFuZGxlX21tX2ZhdWx0KGN1cnJlbnQtPm1tLCBlYSwgZHNpc3IsICZmbHQpOwogCiAJc3B1X2FjcXVpcmUoY3R4KTsKIAkvKgpAQCAtMjAxLDExICsyMTIsMjMgQEAKIAkgKiBJbiBjYXNlIG9mIHVuaGFuZGxlZCBlcnJvciByZXBvcnQgdGhlIHByb2JsZW0gdG8gdXNlciBzcGFjZS4KIAkgKi8KIAlpZiAoIXJldCkgeworCQlpZiAoZmx0ID09IFZNX0ZBVUxUX01JTk9SKQorCQkJY3R4LT5zdGF0cy5taW5fZmx0Kys7CisJCWVsc2UKKwkJCWN0eC0+c3RhdHMubWFqX2ZsdCsrOworCQlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJCWlmIChmbHQgPT0gVk1fRkFVTFRfTUlOT1IpCisJCQkJY3R4LT5zcHUtPnN0YXRzLm1pbl9mbHQrKzsKKwkJCWVsc2UKKwkJCQljdHgtPnNwdS0+c3RhdHMubWFqX2ZsdCsrOworCQl9CisKIAkJaWYgKGN0eC0+c3B1KQogCQkJY3R4LT5vcHMtPnJlc3RhcnRfZG1hKGN0eCk7CiAJfSBlbHNlCiAJCXNwdWZzX2hhbmRsZV9kbWFfZXJyb3IoY3R4LCBlYSwgU1BFX0VWRU5UX1NQRV9EQVRBX1NUT1JBR0UpOwogCisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdWZzX2hhbmRsZV9jbGFzczEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKaW5kZXggYjFlN2UyZi4uYzI4MTRlYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpAQCAtMzksNiArNDAsNyBAQAogCiAjZGVmaW5lIFNQVUZTX01NQVBfNEsgKFBBR0VfU0laRSA9PSAweDEwMDApCiAKKwogc3RhdGljIGludAogc3B1ZnNfbWVtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC0yMTYsMTIgKzIxOCwxMiBAQAogI2VuZGlmIC8qIENPTkZJR19TUFVfRlNfNjRLX0xTICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX21lbV9mb3BzID0gewotCS5vcGVuCSAJCT0gc3B1ZnNfbWVtX29wZW4sCi0JLnJlbGVhc2UgCQk9IHNwdWZzX21lbV9yZWxlYXNlLAotCS5yZWFkICAgCQk9IHNwdWZzX21lbV9yZWFkLAotCS53cml0ZSAgIAkJPSBzcHVmc19tZW1fd3JpdGUsCi0JLmxsc2VlayAgCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLm1tYXAgICAgCQk9IHNwdWZzX21lbV9tbWFwLAorCS5vcGVuCQkJPSBzcHVmc19tZW1fb3BlbiwKKwkucmVsZWFzZQkJPSBzcHVmc19tZW1fcmVsZWFzZSwKKwkucmVhZAkJCT0gc3B1ZnNfbWVtX3JlYWQsCisJLndyaXRlCQkJPSBzcHVmc19tZW1fd3JpdGUsCisJLmxsc2VlawkJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkubW1hcAkJCT0gc3B1ZnNfbWVtX21tYXAsCiAjaWZkZWYgQ09ORklHX1NQVV9GU182NEtfTFMKIAkuZ2V0X3VubWFwcGVkX2FyZWEJPSBzcHVmc19nZXRfdW5tYXBwZWRfYXJlYSwKICNlbmRpZgpAQCAtMTQ5NywxNCArMTQ5OSwxNSBAQAogCQlpZiAoc3RhdHVzKQogCQkJcmV0ID0gc3RhdHVzOwogCX0KLQlzcHVfcmVsZWFzZShjdHgpOwogCiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCWN0eC0+dGFnd2FpdCB8PSAxIDw8IGNtZC50YWc7CiAJcmV0ID0gc2l6ZTsKIAorb3V0X3VubG9jazoKKwlzcHVfcmVsZWFzZShjdHgpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNTE1LDE0ICsxNTE4LDE0IEBACiAJdTMyIGZyZWVfZWxlbWVudHMsIHRhZ3N0YXR1czsKIAl1bnNpZ25lZCBpbnQgbWFzazsKIAorCXBvbGxfd2FpdChmaWxlLCAmY3R4LT5tZmNfd3EsIHdhaXQpOworCiAJc3B1X2FjcXVpcmUoY3R4KTsKIAljdHgtPm9wcy0+c2V0X21mY19xdWVyeShjdHgsIGN0eC0+dGFnd2FpdCwgMik7CiAJZnJlZV9lbGVtZW50cyA9IGN0eC0+b3BzLT5nZXRfbWZjX2ZyZWVfZWxlbWVudHMoY3R4KTsKIAl0YWdzdGF0dXMgPSBjdHgtPm9wcy0+cmVhZF9tZmNfdGFnc3RhdHVzKGN0eCk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAotCXBvbGxfd2FpdChmaWxlLCAmY3R4LT5tZmNfd3EsIHdhaXQpOwotCiAJbWFzayA9IDA7CiAJaWYgKGZyZWVfZWxlbWVudHMgJiAweGZmZmYpCiAJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CkBAIC0xNzk3LDYgKzE4MDAsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzcHVmc19jYXBzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gcy0+cHJpdmF0ZTsKKworCWlmICghKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpKQorCQlzZXFfcHV0cyhzLCAic2NoZWRcbiIpOworCWlmICghKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX0lTT0xBVEUpKQorCQlzZXFfcHV0cyhzLCAic3RlcFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfY2Fwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzcHVmc19jYXBzX3Nob3csIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2NhcHNfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVmc19jYXBzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKIHN0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfbWJveF9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCiAJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKIHsKQEAgLTIwMTQsNyArMjA0MCwxMDUgQEAKIAkucmVhZCA9IHNwdWZzX3Byb3h5ZG1hX2luZm9fcmVhZCwKIH07CiAKK3N0YXRpYyBpbnQgc3B1ZnNfc2hvd190aWQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gcy0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYocywgIiVkXG4iLCBjdHgtPnRpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfdGlkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX3Nob3dfdGlkLCBTUFVGU19JKGlub2RlKS0+aV9jdHgpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc190aWRfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVmc190aWRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmN0eF9zdGF0ZV9uYW1lc1tdID0geworCSJ1c2VyIiwgInN5c3RlbSIsICJpb3dhaXQiLCAibG9hZGVkIgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVmc19hY2N0X3RpbWUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWUgPSBjdHgtPnN0YXRzLnRpbWVzW3N0YXRlXTsKKworCWlmIChjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZSA9PSBzdGF0ZSkKKwkJdGltZSArPSBqaWZmaWVzIC0gY3R4LT5zdGF0cy50c3RhbXA7CisKKwlyZXR1cm4gamlmZmllc190b19tc2Vjcyh0aW1lKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVmc19zbGJfZmx0cyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdHMgPSBjdHgtPnN0YXRzLnNsYl9mbHQ7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJc2xiX2ZsdHMgKz0gKGN0eC0+c3B1LT5zdGF0cy5zbGJfZmx0IC0KKwkJCSAgICAgY3R4LT5zdGF0cy5zbGJfZmx0X2Jhc2UpOworCX0KKworCXJldHVybiBzbGJfZmx0czsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVmc19jbGFzczJfaW50cnMoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRycyA9IGN0eC0+c3RhdHMuY2xhc3MyX2ludHI7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJY2xhc3MyX2ludHJzICs9IChjdHgtPnNwdS0+c3RhdHMuY2xhc3MyX2ludHIgLQorCQkJCSBjdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UpOworCX0KKworCXJldHVybiBjbGFzczJfaW50cnM7Cit9CisKKworc3RhdGljIGludCBzcHVmc19zaG93X3N0YXQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gcy0+cHJpdmF0ZTsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJc2VxX3ByaW50ZihzLCAiJXMgJWxsdSAlbGx1ICVsbHUgJWxsdSAiCisJCSAgICAgICIlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCisJCWN0eF9zdGF0ZV9uYW1lc1tjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZV0sCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpLAorCQlzcHVmc19hY2N0X3RpbWUoY3R4LCBTUFVDVFhfVVRJTF9TWVNURU0pLAorCQlzcHVmc19hY2N0X3RpbWUoY3R4LCBTUFVDVFhfVVRJTF9JT1dBSVQpLAorCQlzcHVmc19hY2N0X3RpbWUoY3R4LCBTUFVDVFhfVVRJTF9MT0FERUQpLAorCQljdHgtPnN0YXRzLnZvbF9jdHhfc3dpdGNoLAorCQljdHgtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2gsCisJCXNwdWZzX3NsYl9mbHRzKGN0eCksCisJCWN0eC0+c3RhdHMuaGFzaF9mbHQsCisJCWN0eC0+c3RhdHMubWluX2ZsdCwKKwkJY3R4LT5zdGF0cy5tYWpfZmx0LAorCQlzcHVmc19jbGFzczJfaW50cnMoY3R4KSwKKwkJY3R4LT5zdGF0cy5saWJhc3Npc3QpOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfc3RhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzcHVmc19zaG93X3N0YXQsIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3N0YXRfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVmc19zdGF0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKwogc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX2NvbnRlbnRzW10gPSB7CisJeyAiY2FwYWJpbGl0aWVzIiwgJnNwdWZzX2NhcHNfZm9wcywgMDQ0NCwgfSwKIAl7ICJtZW0iLCAgJnNwdWZzX21lbV9mb3BzLCAgMDY2NiwgfSwKIAl7ICJyZWdzIiwgJnNwdWZzX3JlZ3NfZm9wcywgIDA2NjYsIH0sCiAJeyAibWJveCIsICZzcHVmc19tYm94X2ZvcHMsIDA0NDQsIH0sCkBAIC0yMDQ2LDEwICsyMTcwLDEzIEBACiAJeyAid2JveF9pbmZvIiwgJnNwdWZzX3dib3hfaW5mb19mb3BzLCAwNDQ0LCB9LAogCXsgImRtYV9pbmZvIiwgJnNwdWZzX2RtYV9pbmZvX2ZvcHMsIDA0NDQsIH0sCiAJeyAicHJveHlkbWFfaW5mbyIsICZzcHVmc19wcm94eWRtYV9pbmZvX2ZvcHMsIDA0NDQsIH0sCisJeyAidGlkIiwgJnNwdWZzX3RpZF9mb3BzLCAwNDQ0LCB9LAorCXsgInN0YXQiLCAmc3B1ZnNfc3RhdF9mb3BzLCAwNDQ0LCB9LAogCXt9LAogfTsKIAogc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX25vc2NoZWRfY29udGVudHNbXSA9IHsKKwl7ICJjYXBhYmlsaXRpZXMiLCAmc3B1ZnNfY2Fwc19mb3BzLCAwNDQ0LCB9LAogCXsgIm1lbSIsICAmc3B1ZnNfbWVtX2ZvcHMsICAwNjY2LCB9LAogCXsgIm1ib3giLCAmc3B1ZnNfbWJveF9mb3BzLCAwNDQ0LCB9LAogCXsgImlib3giLCAmc3B1ZnNfaWJveF9mb3BzLCAwNDQ0LCB9LApAQCAtMjA2OCw2ICsyMTk1LDggQEAKIAl7ICJwc21hcCIsICZzcHVmc19wc21hcF9mb3BzLCAwNjY2LCB9LAogCXsgInBoeXMtaWQiLCAmc3B1ZnNfaWRfb3BzLCAwNjY2LCB9LAogCXsgIm9iamVjdC1pZCIsICZzcHVmc19vYmplY3RfaWRfb3BzLCAwNjY2LCB9LAorCXsgInRpZCIsICZzcHVmc190aWRfZm9wcywgMDQ0NCwgfSwKKwl7ICJzdGF0IiwgJnNwdWZzX3N0YXRfZm9wcywgMDQ0NCwgfSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKaW5kZXggOTgwNzIwNi4uZjM3NDYwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTIzMiwxMCArMjMyLDYgQEAKIAlyZXR1cm4gZGNhY2hlX2Rpcl9jbG9zZShpbm9kZSwgZmlsZSk7CiB9CiAKLWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewotCS5sb29rdXAgPSBzaW1wbGVfbG9va3VwLAotfTsKLQogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19jb250ZXh0X2ZvcHMgPSB7CiAJLm9wZW4JCT0gZGNhY2hlX2Rpcl9vcGVuLAogCS5yZWxlYXNlCT0gc3B1ZnNfZGlyX2Nsb3NlLApAQCAtMjY5LDcgKzI2NSw3IEBACiAJCWdvdG8gb3V0X2lwdXQ7CiAKIAljdHgtPmZsYWdzID0gZmxhZ3M7Ci0JaW5vZGUtPmlfb3AgPSAmc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CiAJaWYgKGZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQogCQlyZXQgPSBzcHVmc19maWxsX2RpcihkZW50cnksIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzLApAQCAtMzg2LDcgKzM4Miw3IEBACiAJaWYgKCFnYW5nKQogCQlnb3RvIG91dF9pcHV0OwogCi0JaW5vZGUtPmlfb3AgPSAmc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwpAQCAtNTkzLDcgKzU4OSw3IEBACiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7CiAKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlTUFVGU19JKGlub2RlKS0+aV9jdHggPSBOVUxMOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKaW5kZXggNTc2MjY2MC4uNThhZTEzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwpAQCAtMjksNyArMjksOCBAQAogCXNwdSA9IGN0eC0+c3B1OwogCXB0ZV9mYXVsdCA9IHNwdS0+ZHNpc3IgJgogCSAgICAoTUZDX0RTSVNSX1BURV9OT1RfRk9VTkQgfCBNRkNfRFNJU1JfQUNDRVNTX0RFTklFRCk7Ci0JcmV0dXJuICghKCpzdGF0ICYgMHgxKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8gMSA6IDA7CisJcmV0dXJuICghKCpzdGF0ICYgU1BVX1NUQVRVU19SVU5OSU5HKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8KKwkJMSA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3B1X3NldHVwX2lzb2xhdGVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQpAQCAtMTQyLDggKzE0MywxMSBAQAogCQkJcnVuY250bCA9IFNQVV9SVU5DTlRMX1JVTk5BQkxFOwogCQljdHgtPm9wcy0+cnVuY250bF93cml0ZShjdHgsIHJ1bmNudGwpOwogCX0gZWxzZSB7Ci0JCXNwdV9zdGFydF90aWNrKGN0eCk7CisJCXVuc2lnbmVkIGxvbmcgbW9kZSA9IFNQVV9QUklWQ05UTF9NT0RFX05PUk1BTDsKIAkJY3R4LT5vcHMtPm5wY193cml0ZShjdHgsICpucGMpOworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCisJCQltb2RlID0gU1BVX1BSSVZDTlRMX01PREVfU0lOR0xFX1NURVA7CisJCW91dF9iZTY0KCZjdHgtPnNwdS0+cHJpdjItPnNwdV9wcml2Y250bF9SVywgbW9kZSk7CiAJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfUlVOTkFCTEUpOwogCX0KIApAQCAtMTU1LDcgKzE1OSw2IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlzcHVfc3RvcF90aWNrKGN0eCk7CiAJKnN0YXR1cyA9IGN0eC0+b3BzLT5zdGF0dXNfcmVhZChjdHgpOwogCSpucGMgPSBjdHgtPm9wcy0+bnBjX3JlYWQoY3R4KTsKIAlzcHVfcmVsZWFzZShjdHgpOwpAQCAtMjk4LDkgKzMwMSwyMiBAQAogCWN0eC0+b3BzLT5tYXN0ZXJfc3RhcnQoY3R4KTsKIAljdHgtPmV2ZW50X3JldHVybiA9IDA7CiAKLQlyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgsIDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJc3B1X2FjcXVpcmUoY3R4KTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfU0FWRUQpIHsKKwkJX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKKworCQlyZXQgPSBzcHVfYWN0aXZhdGUoY3R4LCAwKTsKKwkJaWYgKHJldCkgeworCQkJc3B1X3JlbGVhc2UoY3R4KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB1cGRhdGUgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgdW5kZXIgYWN0aXZlX211dGV4CisJCSAqIHRvIHByb3RlY3QgYWdhaW5zdCBmaW5kX3ZpY3RpbSgpLgorCQkgKi8KKwkJc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKGN0eCk7CisJfQogCiAJcmV0ID0gc3B1X3J1bl9pbml0KGN0eCwgbnBjKTsKIAlpZiAocmV0KSB7CkBAIC0zMjUsMTYgKzM0MSwyMCBAQAogCiAJCWlmICh1bmxpa2VseShjdHgtPnN0YXRlICE9IFNQVV9TVEFURV9SVU5OQUJMRSkpIHsKIAkJCXJldCA9IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoY3R4LCBucGMsICZzdGF0dXMpOwotCQkJaWYgKHJldCkgewotCQkJCXNwdV9zdG9wX3RpY2soY3R4KTsKKwkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQyOwotCQkJfQogCQkJY29udGludWU7CiAJCX0KIAkJcmV0ID0gc3B1X3Byb2Nlc3NfZXZlbnRzKGN0eCk7CiAKIAl9IHdoaWxlICghcmV0ICYmICEoc3RhdHVzICYgKFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QIHwKLQkJCQkgICAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCkpKTsKKwkJCQkgICAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCB8CisJCQkJICAgICAgIFNQVV9TVEFUVVNfU0lOR0xFX1NURVApKSk7CisKKwlpZiAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKSAmJgorCSAgICAoKChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSAmIDB4M2YwMCkgPT0gMHgyMTAwKSAmJgorCSAgICAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpKQorCQljdHgtPnN0YXRzLmxpYmFzc2lzdCsrOwogCiAJY3R4LT5vcHMtPm1hc3Rlcl9zdG9wKGN0eCk7CiAJcmV0ID0gc3B1X3J1bl9maW5pKGN0eCwgbnBjLCAmc3RhdHVzKTsKQEAgLTM0NCwxMCArMzY0LDE1IEBACiAJaWYgKChyZXQgPT0gMCkgfHwKIAkgICAgKChyZXQgPT0gLUVSRVNUQVJUU1lTKSAmJgogCSAgICAgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCkgfHwKKwkgICAgICAoc3RhdHVzICYgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCkgfHwKIAkgICAgICAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKSAmJgogCSAgICAgICAoc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCAhPSAweDIxMDQpKSkpKQogCQlyZXQgPSBzdGF0dXM7CiAKKwkvKiBOb3RlOiB3ZSBkb24ndCBuZWVkIHRvIGZvcmNlX3NpZyBTSUdUUkFQIG9uIHNpbmdsZS1zdGVwCisJICogc2luY2Ugd2UgaGF2ZSBUSUZfU0lOR0xFU1RFUCBzZXQsIHRodXMgdGhlIGtlcm5lbCB3aWxsIGRvCisJICogaXQgdXBvbiByZXR1cm4gZnJvbSB0aGUgc3lzY2FsbCBhbnlhd3kKKwkgKi8KIAlpZiAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKQogCSAgICAmJiAoc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCkgPT0gMHgzZmZmKSB7CiAJCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKaW5kZXggM2I4MzFlMC4uZTViNGRkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKQEAgLTM1LDYgKzM1LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbnVtYS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC00Myw1NCArNDcsMTI2IEBACiAjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgogI2luY2x1ZGUgInNwdWZzLmgiCiAKLSNkZWZpbmUgU1BVX1RJTUVTTElDRQkoSFopCi0KIHN0cnVjdCBzcHVfcHJpb19hcnJheSB7CiAJREVDTEFSRV9CSVRNQVAoYml0bWFwLCBNQVhfUFJJTyk7CiAJc3RydWN0IGxpc3RfaGVhZCBydW5xW01BWF9QUklPXTsKIAlzcGlubG9ja190IHJ1bnFfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9saXN0W01BWF9OVU1OT0RFU107CiAJc3RydWN0IG11dGV4IGFjdGl2ZV9tdXRleFtNQVhfTlVNTk9ERVNdOworCWludCBucl9hY3RpdmVbTUFYX05VTU5PREVTXTsKKwlpbnQgbnJfd2FpdGluZzsKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNwdV9hdmVucnVuWzNdOwogc3RhdGljIHN0cnVjdCBzcHVfcHJpb19hcnJheSAqc3B1X3ByaW87Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnNwdV9zY2hlZF93cTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNwdXNjaGVkX3Rhc2s7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc3B1c2NoZWRfdGltZXI7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5vZGVfYWxsb3dlZChpbnQgbm9kZSkKKy8qCisgKiBQcmlvcml0eSBvZiBhIG5vcm1hbCwgbm9uLXJ0LCBub24tbmljZWQnZCBwcm9jZXNzIChha2EgbmljZSBsZXZlbCAwKS4KKyAqLworI2RlZmluZSBOT1JNQUxfUFJJTwkJMTIwCisKKy8qCisgKiBGcmVxdWVuY3kgb2YgdGhlIHNwdSBzY2hlZHVsZXIgdGljay4gIEJ5IGRlZmF1bHQgd2UgZG8gb25lIFNQVSBzY2hlZHVsZXIKKyAqIHRpY2sgZm9yIGV2ZXJ5IDEwIENQVSBzY2hlZHVsZXIgdGlja3MuCisgKi8KKyNkZWZpbmUgU1BVU0NIRURfVElDSwkJKDEwKQorCisvKgorICogVGhlc2UgYXJlIHRoZSAndHVuaW5nIGtub2JzJyBvZiB0aGUgc2NoZWR1bGVyOgorICoKKyAqIE1pbmltdW0gdGltZXNsaWNlIGlzIDUgbXNlY3MgKG9yIDEgc3B1IHNjaGVkdWxlciB0aWNrLCB3aGljaGV2ZXIgaXMKKyAqIGxhcmdlciksIGRlZmF1bHQgdGltZXNsaWNlIGlzIDEwMCBtc2VjcywgbWF4aW11bSB0aW1lc2xpY2UgaXMgODAwIG1zZWNzLgorICovCisjZGVmaW5lIE1JTl9TUFVfVElNRVNMSUNFCW1heCg1ICogSFogLyAoMTAwMCAqIFNQVVNDSEVEX1RJQ0spLCAxKQorI2RlZmluZSBERUZfU1BVX1RJTUVTTElDRQkoMTAwICogSFogLyAoMTAwMCAqIFNQVVNDSEVEX1RJQ0spKQorCisjZGVmaW5lIE1BWF9VU0VSX1BSSU8JCShNQVhfUFJJTyAtIE1BWF9SVF9QUklPKQorI2RlZmluZSBTQ0FMRV9QUklPKHgsIHByaW8pIFwKKwltYXgoeCAqIChNQVhfUFJJTyAtIHByaW8pIC8gKE1BWF9VU0VSX1BSSU8gLyAyKSwgTUlOX1NQVV9USU1FU0xJQ0UpCisKKy8qCisgKiBzY2FsZSB1c2VyLW5pY2UgdmFsdWVzIFsgLTIwIC4uLiAwIC4uLiAxOSBdIHRvIHRpbWUgc2xpY2UgdmFsdWVzOgorICogWzgwMG1zIC4uLiAxMDBtcyAuLi4gNW1zXQorICoKKyAqIFRoZSBoaWdoZXIgYSB0aHJlYWQncyBwcmlvcml0eSwgdGhlIGJpZ2dlciB0aW1lc2xpY2VzCisgKiBpdCBnZXRzIGR1cmluZyBvbmUgcm91bmQgb2YgZXhlY3V0aW9uLiBCdXQgZXZlbiB0aGUgbG93ZXN0CisgKiBwcmlvcml0eSB0aHJlYWQgZ2V0cyBNSU5fVElNRVNMSUNFIHdvcnRoIG9mIGV4ZWN1dGlvbiB0aW1lLgorICovCit2b2lkIHNwdV9zZXRfdGltZXNsaWNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWNwdW1hc2tfdCBtYXNrOwotCi0JaWYgKCFucl9jcHVzX25vZGUobm9kZSkpCi0JCXJldHVybiAwOwotCW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobm9kZSk7Ci0JaWYgKCFjcHVzX2ludGVyc2VjdHMobWFzaywgY3VycmVudC0+Y3B1c19hbGxvd2VkKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisJaWYgKGN0eC0+cHJpbyA8IE5PUk1BTF9QUklPKQorCQljdHgtPnRpbWVfc2xpY2UgPSBTQ0FMRV9QUklPKERFRl9TUFVfVElNRVNMSUNFICogNCwgY3R4LT5wcmlvKTsKKwllbHNlCisJCWN0eC0+dGltZV9zbGljZSA9IFNDQUxFX1BSSU8oREVGX1NQVV9USU1FU0xJQ0UsIGN0eC0+cHJpbyk7CiB9CiAKLXZvaWQgc3B1X3N0YXJ0X3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCisvKgorICogVXBkYXRlIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KKyAqLwordm9pZCBfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoZSBleGl0aW5nIGJpdCBpcyBjbGVhcmVkLgotCQkgKi8KLQkJY2xlYXJfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7Ci0JCW1iKCk7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhzcHVfc2NoZWRfd3EsICZjdHgtPnNjaGVkX3dvcmssIFNQVV9USU1FU0xJQ0UpOwotCX0KKwkvKgorCSAqIDMyLUJpdCBhc3NpZ25tZW50IGFyZSBhdG9taWMgb24gcG93ZXJwYywgYW5kIHdlIGRvbid0IGNhcmUgYWJvdXQKKwkgKiBtZW1vcnkgb3JkZXJpbmcgaGVyZSBiZWNhdXNlIHJldHJpdmluZyB0aGUgY29udHJvbGxpbmcgdGhyZWFkIGlzCisJICogcGVyIGRlZmludGlvbiByYWN5LgorCSAqLworCWN0eC0+dGlkID0gY3VycmVudC0+cGlkOworCisJLyoKKwkgKiBXZSBkbyBvdXIgb3duIHByaW9yaXR5IGNhbGN1bGF0aW9ucywgc28gd2Ugbm9ybWFsbHkgd2FudAorCSAqIC0+c3RhdGljX3ByaW8gdG8gc3RhcnQgd2l0aC4gVW5mb3J0dW5hdGVseSB0aGllcyBmaWVsZAorCSAqIGNvbnRhaW5zIGp1bmsgZm9yIHRocmVhZHMgd2l0aCBhIHJlYWx0aW1lIHNjaGVkdWxpbmcKKwkgKiBwb2xpY3kgc28gd2UgaGF2ZSB0byBsb29rIGF0IC0+cHJpbyBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKHJ0X3ByaW8oY3VycmVudC0+cHJpbykpCisJCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnByaW87CisJZWxzZQorCQljdHgtPnByaW8gPSBjdXJyZW50LT5zdGF0aWNfcHJpbzsKKwljdHgtPnBvbGljeSA9IGN1cnJlbnQtPnBvbGljeTsKKworCS8qCisJICogQSBsb3Qgb2YgcGxhY2VzIHRoYXQgZG9uJ3QgaG9sZCBhY3RpdmVfbXV0ZXggcG9rZSBpbnRvCisJICogY3B1c19hbGxvd2VkLCBpbmNsdWRpbmcgZ3JhYl9ydW5uYWJsZV9jb250ZXh0IHdoaWNoCisJICogYWxyZWFkeSBob2xkcyB0aGUgcnVucV9sb2NrLiAgU28gYWJ1c2UgcnVucV9sb2NrCisJICogdG8gcHJvdGVjdCB0aGlzIGZpZWxkIGFzd2VsbC4KKwkgKi8KKwlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOworCWN0eC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKIH0KIAotdm9pZCBzcHVfc3RvcF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQordm9pZCBzcHVfdXBkYXRlX3NjaGVkX2luZm8oc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0JaWYgKGN0eC0+cG9saWN5ID09IFNDSEVEX1JSKSB7Ci0JCS8qCi0JCSAqIFdoaWxlIHRoZSB3b3JrIGNhbiBiZSByZWFybWluZyBub3JtYWxseSBzZXR0aW5nIHRoaXMgZmxhZwotCQkgKiBtYWtlcyBzdXJlIGl0IGRvZXMgbm90IHJlYXJtIGl0c2VsZiBhbnltb3JlLgotCQkgKi8KLQkJc2V0X2JpdChTUFVfU0NIRURfRVhJVElORywgJmN0eC0+c2NoZWRfZmxhZ3MpOwotCQltYigpOwotCQljYW5jZWxfZGVsYXllZF93b3JrKCZjdHgtPnNjaGVkX3dvcmspOworCWludCBub2RlID0gY3R4LT5zcHUtPm5vZGU7CisKKwltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwlfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhjdHgpOworCW11dGV4X3VubG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7Cit9CisKK3N0YXRpYyBpbnQgX19ub2RlX2FsbG93ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGludCBub2RlKQoreworCWlmIChucl9jcHVzX25vZGUobm9kZSkpIHsKKwkJY3B1bWFza190IG1hc2sgPSBub2RlX3RvX2NwdW1hc2sobm9kZSk7CisKKwkJaWYgKGNwdXNfaW50ZXJzZWN0cyhtYXNrLCBjdHgtPmNwdXNfYWxsb3dlZCkpCisJCQlyZXR1cm4gMTsKIAl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBub2RlX2FsbG93ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGludCBub2RlKQoreworCWludCBydmFsOworCisJc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKwlydmFsID0gX19ub2RlX2FsbG93ZWQoY3R4LCBub2RlKTsKKwlzcGluX3VubG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisKKwlyZXR1cm4gcnZhbDsKIH0KIAogLyoqCkBAIC05OSw5ICsxNzUsMTggQEAKICAqLwogc3RhdGljIHZvaWQgc3B1X2FkZF90b19hY3RpdmVfbGlzdChzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0JbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtzcHUtPm5vZGVdKTsKLQlsaXN0X2FkZF90YWlsKCZzcHUtPmxpc3QsICZzcHVfcHJpby0+YWN0aXZlX2xpc3Rbc3B1LT5ub2RlXSk7Ci0JbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W3NwdS0+bm9kZV0pOworCWludCBub2RlID0gc3B1LT5ub2RlOworCisJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CisJc3B1X3ByaW8tPm5yX2FjdGl2ZVtub2RlXSsrOworCWxpc3RfYWRkX3RhaWwoJnNwdS0+bGlzdCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSk7CisJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKK30KKworc3RhdGljIHZvaWQgX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3RydWN0IHNwdSAqc3B1KQoreworCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CisJc3B1X3ByaW8tPm5yX2FjdGl2ZVtzcHUtPm5vZGVdLS07CiB9CiAKIC8qKgpAQCAtMTEzLDcgKzE5OCw3IEBACiAJaW50IG5vZGUgPSBzcHUtPm5vZGU7CiAKIAltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKLQlsaXN0X2RlbF9pbml0KCZzcHUtPmxpc3QpOworCV9fc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKIH0KIApAQCAtMTQ0LDYgKzIyOSwxMCBAQAogewogCXByX2RlYnVnKCIlczogcGlkPSVkIFNQVT0lZCBOT0RFPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCwKIAkJIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOworCisJY3R4LT5zdGF0cy5zbGJfZmx0X2Jhc2UgPSBzcHUtPnN0YXRzLnNsYl9mbHQ7CisJY3R4LT5zdGF0cy5jbGFzczJfaW50cl9iYXNlID0gc3B1LT5zdGF0cy5jbGFzczJfaW50cjsKKwogCXNwdS0+Y3R4ID0gY3R4OwogCXNwdS0+ZmxhZ3MgPSAwOwogCWN0eC0+c3B1ID0gc3B1OwpAQCAtMTYxLDggKzI1MCw4IEBACiAJc3B1LT50aW1lc3RhbXAgPSBqaWZmaWVzOwogCXNwdV9jcHVfYWZmaW5pdHlfc2V0KHNwdSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJc3B1X3N3aXRjaF9ub3RpZnkoc3B1LCBjdHgpOwotCXNwdV9hZGRfdG9fYWN0aXZlX2xpc3Qoc3B1KTsKIAljdHgtPnN0YXRlID0gU1BVX1NUQVRFX1JVTk5BQkxFOworCXNwdV9zd2l0Y2hfc3RhdGUoc3B1LCBTUFVfVVRJTF9TWVNURU0pOwogfQogCiAvKioKQEAgLTE3NSw3ICsyNjQsOCBAQAogCXByX2RlYnVnKCIlczogdW5iaW5kIHBpZD0lZCBTUFU9JWQgTk9ERT0lZFxuIiwgX19GVU5DVElPTl9fLAogCQkgc3B1LT5waWQsIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOwogCi0Jc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CisJc3B1X3N3aXRjaF9zdGF0ZShzcHUsIFNQVV9VVElMX0lETEUpOworCiAJc3B1X3N3aXRjaF9ub3RpZnkoc3B1LCBOVUxMKTsKIAlzcHVfdW5tYXBfbWFwcGluZ3MoY3R4KTsKIAlzcHVfc2F2ZSgmY3R4LT5jc2EsIHNwdSk7CkBAIC0xOTIsNiArMjgyLDExIEBACiAJY3R4LT5zcHUgPSBOVUxMOwogCXNwdS0+ZmxhZ3MgPSAwOwogCXNwdS0+Y3R4ID0gTlVMTDsKKworCWN0eC0+c3RhdHMuc2xiX2ZsdCArPQorCQkoc3B1LT5zdGF0cy5zbGJfZmx0IC0gY3R4LT5zdGF0cy5zbGJfZmx0X2Jhc2UpOworCWN0eC0+c3RhdHMuY2xhc3MyX2ludHIgKz0KKwkJKHNwdS0+c3RhdHMuY2xhc3MyX2ludHIgLSBjdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UpOwogfQogCiAvKioKQEAgLTIwMCwyMCArMjk1LDM5IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fc3B1X2FkZF90b19ycShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpbnQgcHJpbyA9IGN0eC0+cHJpbzsKLQotCWxpc3RfYWRkX3RhaWwoJmN0eC0+cnEsICZzcHVfcHJpby0+cnVucVtwcmlvXSk7Ci0Jc2V0X2JpdChwcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwkvKgorCSAqIFVuZm9ydHVuYXRlbHkgdGhpcyBjb2RlIHBhdGggY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMKKwkgKiBvbiBiZWhhbGYgb2YgYSBzaW5nbGUgY29udGV4dCBkdWUgdG8gdGhlIHdheSB0aGUgcHJvYmxlbSBzdGF0ZQorCSAqIG1tYXAgc3VwcG9ydCB3b3Jrcy4KKwkgKgorCSAqIEZvcnR1bmF0ZWx5IHdlIG5lZWQgdG8gd2FrZSB1cCBhbGwgdGhlc2UgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lCisJICogYW5kIGNhbiBzaW1wbHkgc2tpcCB0aGUgcnVucXVldWUgYWRkaXRpb24gZm9yIGV2ZXJ5IGJ1dCB0aGUgZmlyc3QKKwkgKiB0aHJlYWQgZ2V0dGluZyBpbnRvIHRoaXMgY29kZXBhdGguCisJICoKKwkgKiBJdCdzIHN0aWxsIHF1aXRlIGhhY2t5LCBhbmQgbG9uZy10ZXJtIHdlIHNob3VsZCBwcm94eSBhbGwgb3RoZXIKKwkgKiB0aHJlYWRzIHRocm91Z2ggdGhlIG93bmVyIHRocmVhZCBzbyB0aGF0IHNwdV9ydW4gaXMgaW4gY29udHJvbAorCSAqIG9mIGFsbCB0aGUgc2NoZWR1bGluZyBhY3Rpdml0eSBmb3IgYSBnaXZlbiBjb250ZXh0LgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZjdHgtPnJxKSkgeworCQlsaXN0X2FkZF90YWlsKCZjdHgtPnJxLCAmc3B1X3ByaW8tPnJ1bnFbY3R4LT5wcmlvXSk7CisJCXNldF9iaXQoY3R4LT5wcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwkJaWYgKCFzcHVfcHJpby0+bnJfd2FpdGluZysrKQorCQkJX19tb2RfdGltZXIoJnNwdXNjaGVkX3RpbWVyLCBqaWZmaWVzICsgU1BVU0NIRURfVElDSyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX3NwdV9kZWxfZnJvbV9ycShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKIAlpbnQgcHJpbyA9IGN0eC0+cHJpbzsKIAotCWlmICghbGlzdF9lbXB0eSgmY3R4LT5ycSkpCisJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJxKSkgeworCQlpZiAoIS0tc3B1X3ByaW8tPm5yX3dhaXRpbmcpCisJCQlkZWxfdGltZXIoJnNwdXNjaGVkX3RpbWVyKTsKIAkJbGlzdF9kZWxfaW5pdCgmY3R4LT5ycSk7Ci0JaWYgKGxpc3RfZW1wdHkoJnNwdV9wcmlvLT5ydW5xW3ByaW9dKSkKLQkJY2xlYXJfYml0KHByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCisJCWlmIChsaXN0X2VtcHR5KCZzcHVfcHJpby0+cnVucVtwcmlvXSkpCisJCQljbGVhcl9iaXQocHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBzcHVfcHJpb193YWl0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQpAQCAtMjQ0LDcgKzM1OCw3IEBACiAKIAlmb3IgKG4gPSAwOyBuIDwgTUFYX05VTU5PREVTOyBuKyssIG5vZGUrKykgewogCQlub2RlID0gKG5vZGUgPCBNQVhfTlVNTk9ERVMpID8gbm9kZSA6IDA7Ci0JCWlmICghbm9kZV9hbGxvd2VkKG5vZGUpKQorCQlpZiAoIW5vZGVfYWxsb3dlZChjdHgsIG5vZGUpKQogCQkJY29udGludWU7CiAJCXNwdSA9IHNwdV9hbGxvY19ub2RlKG5vZGUpOwogCQlpZiAoc3B1KQpAQCAtMjc2LDE1ICszOTAsMTUgQEAKIAlub2RlID0gY3B1X3RvX25vZGUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJZm9yIChuID0gMDsgbiA8IE1BWF9OVU1OT0RFUzsgbisrLCBub2RlKyspIHsKIAkJbm9kZSA9IChub2RlIDwgTUFYX05VTU5PREVTKSA/IG5vZGUgOiAwOwotCQlpZiAoIW5vZGVfYWxsb3dlZChub2RlKSkKKwkJaWYgKCFub2RlX2FsbG93ZWQoY3R4LCBub2RlKSkKIAkJCWNvbnRpbnVlOwogCiAJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwdSwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwgbGlzdCkgewogCQkJc3RydWN0IHNwdV9jb250ZXh0ICp0bXAgPSBzcHUtPmN0eDsKIAotCQkJaWYgKHRtcC0+cnRfcHJpb3JpdHkgPCBjdHgtPnJ0X3ByaW9yaXR5ICYmCi0JCQkgICAgKCF2aWN0aW0gfHwgdG1wLT5ydF9wcmlvcml0eSA8IHZpY3RpbS0+cnRfcHJpb3JpdHkpKQorCQkJaWYgKHRtcC0+cHJpbyA+IGN0eC0+cHJpbyAmJgorCQkJICAgICghdmljdGltIHx8IHRtcC0+cHJpbyA+IHZpY3RpbS0+cHJpbykpCiAJCQkJdmljdGltID0gc3B1LT5jdHg7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKQEAgLTMxMiw3ICs0MjYsMTAgQEAKIAkJCQl2aWN0aW0gPSBOVUxMOwogCQkJCWdvdG8gcmVzdGFydDsKIAkJCX0KKwkJCXNwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOwogCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgdmljdGltKTsKKwkJCXZpY3RpbS0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CiAJCQltdXRleF91bmxvY2soJnZpY3RpbS0+c3RhdGVfbXV0ZXgpOwogCQkJLyoKIAkJCSAqIFdlIG5lZWQgdG8gYnJlYWsgb3V0IG9mIHRoZSB3YWl0IGxvb3AgaW4gc3B1X3J1bgpAQCAtMzM4LDIyICs0NTUsMzAgQEAKICAqLwogaW50IHNwdV9hY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQotCWlmIChjdHgtPnNwdSkKLQkJcmV0dXJuIDA7CisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSk7CiAKIAlkbyB7CiAJCXN0cnVjdCBzcHUgKnNwdTsKIAorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdGhyZWFkcyB3YWl0aW5nIGZvciBhIHNpbmdsZSBjb250ZXh0CisJCSAqIG9ubHkgb25lIGFjdHVhbGx5IGJpbmRzIHRoZSBjb250ZXh0IHdoaWxlIHRoZSBvdGhlcnMgd2lsbAorCQkgKiBvbmx5IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgc3RhdGVfbXV0ZXggb25jZSB0aGUgY29udGV4dAorCQkgKiBhbHJlYWR5IGlzIGluIHJ1bm5hYmxlIHN0YXRlLgorCQkgKi8KKwkJaWYgKGN0eC0+c3B1KQorCQkJcmV0dXJuIDA7CisKIAkJc3B1ID0gc3B1X2dldF9pZGxlKGN0eCk7CiAJCS8qCiAJCSAqIElmIHRoaXMgaXMgYSByZWFsdGltZSB0aHJlYWQgd2UgdHJ5IHRvIGdldCBpdCBydW5uaW5nIGJ5CiAJCSAqIHByZWVtcHRpbmcgYSBsb3dlciBwcmlvcml0eSB0aHJlYWQuCiAJCSAqLwotCQlpZiAoIXNwdSAmJiBjdHgtPnJ0X3ByaW9yaXR5KQorCQlpZiAoIXNwdSAmJiBydF9wcmlvKGN0eC0+cHJpbykpCiAJCQlzcHUgPSBmaW5kX3ZpY3RpbShjdHgpOwogCQlpZiAoc3B1KSB7CiAJCQlzcHVfYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCXNwdV9hZGRfdG9fYWN0aXZlX2xpc3Qoc3B1KTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTM2OSwyMyArNDk0LDI4IEBACiAgKiBSZW1vdmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgY29udGV4dCBvbiB0aGUgcnVucXVldWUgYW5kIHJldHVybiBpdAogICogdG8gdGhlIGNhbGxlci4gIFJldHVybnMgJU5VTEwgaWYgbm8gcnVubmFibGUgY29udGV4dCB3YXMgZm91bmQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmdyYWJfcnVubmFibGVfY29udGV4dChpbnQgcHJpbykKK3N0YXRpYyBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmdyYWJfcnVubmFibGVfY29udGV4dChpbnQgcHJpbywgaW50IG5vZGUpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBOVUxMOworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OwogCWludCBiZXN0OwogCiAJc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKIAliZXN0ID0gc2NoZWRfZmluZF9maXJzdF9iaXQoc3B1X3ByaW8tPmJpdG1hcCk7Ci0JaWYgKGJlc3QgPCBwcmlvKSB7CisJd2hpbGUgKGJlc3QgPCBwcmlvKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnJxID0gJnNwdV9wcmlvLT5ydW5xW2Jlc3RdOwogCi0JCUJVR19PTihsaXN0X2VtcHR5KHJxKSk7Ci0KLQkJY3R4ID0gbGlzdF9lbnRyeShycS0+bmV4dCwgc3RydWN0IHNwdV9jb250ZXh0LCBycSk7Ci0JCV9fc3B1X2RlbF9mcm9tX3JxKGN0eCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCBycSwgcnEpIHsKKwkJCS8qIFhYWChoY2gpOiBjaGVjayBmb3IgYWZmaW5pdHkgaGVyZSBhc3dlbGwgKi8KKwkJCWlmIChfX25vZGVfYWxsb3dlZChjdHgsIG5vZGUpKSB7CisJCQkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJCWJlc3QrKzsKIAl9CisJY3R4ID0gTlVMTDsKKyBmb3VuZDoKIAlzcGluX3VubG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7Ci0KIAlyZXR1cm4gY3R4OwogfQogCkBAIC0zOTUsOSArNTI1LDEyIEBACiAJc3RydWN0IHNwdV9jb250ZXh0ICpuZXcgPSBOVUxMOwogCiAJaWYgKHNwdSkgewotCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQobWF4X3ByaW8pOworCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQobWF4X3ByaW8sIHNwdS0+bm9kZSk7CiAJCWlmIChuZXcgfHwgZm9yY2UpIHsKKwkJCXNwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOwogCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCWN0eC0+c3RhdHMudm9sX2N0eF9zd2l0Y2grKzsKKwkJCXNwdS0+c3RhdHMudm9sX2N0eF9zd2l0Y2grKzsKIAkJCXNwdV9mcmVlKHNwdSk7CiAJCQlpZiAobmV3KQogCQkJCXdha2VfdXAoJm5ldy0+c3RvcF93cSk7CkBAIC00MTcsNyArNTUwLDE3IEBACiAgKi8KIHZvaWQgc3B1X2RlYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CisJLyoKKwkgKiBXZSBtdXN0IG5ldmVyIHJlYWNoIHRoaXMgZm9yIGEgbm9zY2hlZCBjb250ZXh0LAorCSAqIGJ1dCBoYW5kbGUgdGhlIGNhc2UgZ3JhY2VmdWxsIGluc3RlYWQgb2YgcGFuaWNpbmcuCisJICovCisJaWYgKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKwogCV9fc3B1X2RlYWN0aXZhdGUoY3R4LCAxLCBNQVhfUFJJTyk7CisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpOwogfQogCiAvKioKQEAgLTQzMiw1NiArNTc1LDE3OCBAQAogewogCWlmICghKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpKSB7CiAJCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwotCQlfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgTUFYX1BSSU8pOworCQlpZiAoX19zcHVfZGVhY3RpdmF0ZShjdHgsIDAsIE1BWF9QUklPKSkKKwkJCXNwdWN0eF9zd2l0Y2hfc3RhdGUoY3R4LCBTUFVDVFhfVVRJTF9VU0VSKTsKKwkJZWxzZSB7CisJCQlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfTE9BREVEKTsKKwkJCXNwdV9zd2l0Y2hfc3RhdGUoY3R4LT5zcHUsIFNQVV9VVElMX1VTRVIpOworCQl9CiAJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJfQogfQogCi12b2lkIHNwdV9zY2hlZF90aWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIHNwdXNjaGVkX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwdV9jb250ZXh0LCBzY2hlZF93b3JrLndvcmspOwotCWludCBwcmVlbXB0ZWQ7Ci0KLQkvKgotCSAqIElmIHRoaXMgY29udGV4dCBpcyBiZWluZyBzdG9wcGVkIGF2b2lkIHJlc2NoZWR1bGluZyBmcm9tIHRoZQotCSAqIHNjaGVkdWxlciB0aWNrIGJlY2F1c2Ugd2Ugd291bGQgYmxvY2sgb24gdGhlIHN0YXRlX211dGV4LgotCSAqIFRoZSBjYWxsZXIgd2lsbCB5aWVsZCB0aGUgc3B1IGxhdGVyIG9uIGFueXdheS4KLQkgKi8KLQlpZiAodGVzdF9iaXQoU1BVX1NDSEVEX0VYSVRJTkcsICZjdHgtPnNjaGVkX2ZsYWdzKSkKKwlpZiAoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkKKwkJcmV0dXJuOworCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9GSUZPKQogCQlyZXR1cm47CiAKLQltdXRleF9sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKLQlwcmVlbXB0ZWQgPSBfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgY3R4LT5wcmlvICsgMSk7Ci0JbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKKwlpZiAoLS1jdHgtPnRpbWVfc2xpY2UpCisJCXJldHVybjsKIAotCWlmIChwcmVlbXB0ZWQpIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbiBzcHVfcnVuIG1hbnVhbGx5Ci0JCSAqIHRvIGVuc3VyZSB0aGlzIGNvbnRleHQgZ2V0cyBwdXQgb24gdGhlIHJ1bnF1ZXVlIGFnYWluCi0JCSAqIEFTQVAuCi0JCSAqLwotCQl3YWtlX3VwKCZjdHgtPnN0b3Bfd3EpOworCS8qCisJICogVW5mb3J0dW5hdGVseSBhY3RpdmVfbXV0ZXggcmFua3Mgb3V0c2lkZSBvZiBzdGF0ZV9tdXRleCwgc28KKwkgKiB3ZSBoYXZlIHRvIHRyeWxvY2sgaGVyZS4gIElmIHdlIGZhaWwgZ2l2ZSB0aGUgY29udGV4dCBhbm90aGVyCisJICogdGljayBhbmQgdHJ5IGFnYWluLgorCSAqLworCWlmIChtdXRleF90cnlsb2NrKCZjdHgtPnN0YXRlX211dGV4KSkgeworCQlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwkJc3RydWN0IHNwdV9jb250ZXh0ICpuZXc7CisKKwkJbmV3ID0gZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGN0eC0+cHJpbyArIDEsIHNwdS0+bm9kZSk7CisJCWlmIChuZXcpIHsKKworCQkJX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKKwkJCXNwdV91bmJpbmRfY29udGV4dChzcHUsIGN0eCk7CisJCQljdHgtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKKwkJCXNwdS0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1X2ZyZWUoc3B1KTsKKwkJCXdha2VfdXAoJm5ldy0+c3RvcF93cSk7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbgorCQkJICogc3B1X3J1biBtYW51YWxseSB0byBlbnN1cmUgdGhpcyBjb250ZXh0CisJCQkgKiBnZXRzIHB1dCBvbiB0aGUgcnVucXVldWUgYWdhaW4gQVNBUC4KKwkJCSAqLworCQkJd2FrZV91cCgmY3R4LT5zdG9wX3dxKTsKKwkJfQorCQlzcHVfc2V0X3RpbWVzbGljZShjdHgpOworCQltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwogCX0gZWxzZSB7Ci0JCXNwdV9zdGFydF90aWNrKGN0eCk7CisJCWN0eC0+dGltZV9zbGljZSsrOwogCX0KIH0KIAorLyoqCisgKiBjb3VudF9hY3RpdmVfY29udGV4dHMgLSBjb3VudCBuciBvZiBhY3RpdmUgdGFza3MKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0YXNrcyBjdXJyZW50bHkgcnVubmluZyBvciB3YWl0aW5nIHRvIHJ1bi4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgdGFrZSBydW5xX2xvY2sgLyBhY3RpdmVfbXV0ZXggaGVyZS4gIFJlYWRpbmcKKyAqIGEgc2luZ2xlIDMyYml0IHZhbHVlIGlzIGF0b21pYyBvbiBwb3dlcnBjLCBhbmQgd2UgZG9uJ3QgY2FyZQorICogYWJvdXQgbWVtb3J5IG9yZGVyaW5nIGlzc3VlcyBoZXJlLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3VudF9hY3RpdmVfY29udGV4dHModm9pZCkKK3sKKwlpbnQgbnJfYWN0aXZlID0gMCwgbm9kZTsKKworCWZvciAobm9kZSA9IDA7IG5vZGUgPCBNQVhfTlVNTk9ERVM7IG5vZGUrKykKKwkJbnJfYWN0aXZlICs9IHNwdV9wcmlvLT5ucl9hY3RpdmVbbm9kZV07CisJbnJfYWN0aXZlICs9IHNwdV9wcmlvLT5ucl93YWl0aW5nOworCisJcmV0dXJuIG5yX2FjdGl2ZTsKK30KKworLyoqCisgKiBzcHVfY2FsY19sb2FkIC0gZ2l2ZW4gdGljayBjb3VudCwgdXBkYXRlIHRoZSBhdmVucnVuIGxvYWQgZXN0aW1hdGVzLgorICogQHRpY2s6CXRpY2sgY291bnQKKyAqCisgKiBObyBsb2NraW5nIGFnYWluc3QgcmVhZGluZyB0aGVzZSB2YWx1ZXMgZnJvbSB1c2Vyc3BhY2UsIGFzIGZvcgorICogdGhlIENQVSBsb2FkYXZnIGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIHNwdV9jYWxjX2xvYWQodW5zaWduZWQgbG9uZyB0aWNrcykKK3sKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV90YXNrczsgLyogZml4ZWQtcG9pbnQgKi8KKwlzdGF0aWMgaW50IGNvdW50ID0gTE9BRF9GUkVROworCisJY291bnQgLT0gdGlja3M7CisKKwlpZiAodW5saWtlbHkoY291bnQgPCAwKSkgeworCQlhY3RpdmVfdGFza3MgPSBjb3VudF9hY3RpdmVfY29udGV4dHMoKSAqIEZJWEVEXzE7CisJCWRvIHsKKwkJCUNBTENfTE9BRChzcHVfYXZlbnJ1blswXSwgRVhQXzEsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoc3B1X2F2ZW5ydW5bMV0sIEVYUF81LCBhY3RpdmVfdGFza3MpOworCQkJQ0FMQ19MT0FEKHNwdV9hdmVucnVuWzJdLCBFWFBfMTUsIGFjdGl2ZV90YXNrcyk7CisJCQljb3VudCArPSBMT0FEX0ZSRVE7CisJCX0gd2hpbGUgKGNvdW50IDwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcHVzY2hlZF93YWtlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwltb2RfdGltZXIoJnNwdXNjaGVkX3RpbWVyLCBqaWZmaWVzICsgU1BVU0NIRURfVElDSyk7CisJd2FrZV91cF9wcm9jZXNzKHNwdXNjaGVkX3Rhc2spOworCXNwdV9jYWxjX2xvYWQoU1BVU0NIRURfVElDSyk7Cit9CisKK3N0YXRpYyBpbnQgc3B1c2NoZWRfdGhyZWFkKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUsICpuZXh0OworCWludCBub2RlOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKKwkJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKSB7CisJCQltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcHUsIG5leHQsCisJCQkJCQkgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwKKwkJCQkJCSBsaXN0KQorCQkJCXNwdXNjaGVkX3RpY2soc3B1LT5jdHgpOworCQkJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIExPQURfSU5UKHgpICgoeCkgPj4gRlNISUZUKQorI2RlZmluZSBMT0FEX0ZSQUMoeCkgTE9BRF9JTlQoKCh4KSAmIChGSVhFRF8xLTEpKSAqIDEwMCkKKworc3RhdGljIGludCBzaG93X3NwdV9sb2FkYXZnKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcHJpdmF0ZSkKK3sKKwlpbnQgYSwgYiwgYzsKKworCWEgPSBzcHVfYXZlbnJ1blswXSArIChGSVhFRF8xLzIwMCk7CisJYiA9IHNwdV9hdmVucnVuWzFdICsgKEZJWEVEXzEvMjAwKTsKKwljID0gc3B1X2F2ZW5ydW5bMl0gKyAoRklYRURfMS8yMDApOworCisJLyoKKwkgKiBOb3RlIHRoYXQgbGFzdF9waWQgZG9lc24ndCByZWFsbHkgbWFrZSBtdWNoIHNlbnNlIGZvciB0aGUKKwkgKiBTUFUgbG9hZGF2ZyAoaXQgZXZlbiBzZWVtcyB2ZXJ5IG9kZCBvbiB0aGUgQ1BVIHNpZGUuLiksCisJICogYnV0IHdlIGluY2x1ZGUgaXQgaGVyZSB0byBoYXZlIGEgMTAwJSBjb21wYXRpYmxlIGludGVyZmFjZS4KKwkgKi8KKwlzZXFfcHJpbnRmKHMsICIlZC4lMDJkICVkLiUwMmQgJWQuJTAyZCAlbGQvJWQgJWRcbiIsCisJCUxPQURfSU5UKGEpLCBMT0FEX0ZSQUMoYSksCisJCUxPQURfSU5UKGIpLCBMT0FEX0ZSQUMoYiksCisJCUxPQURfSU5UKGMpLCBMT0FEX0ZSQUMoYyksCisJCWNvdW50X2FjdGl2ZV9jb250ZXh0cygpLAorCQlhdG9taWNfcmVhZCgmbnJfc3B1X2NvbnRleHRzKSwKKwkJY3VycmVudC0+bnNwcm94eS0+cGlkX25zLT5sYXN0X3BpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1X2xvYWRhdmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19zcHVfbG9hZGF2ZywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdV9sb2FkYXZnX2ZvcHMgPSB7CisJLm9wZW4JCT0gc3B1X2xvYWRhdmdfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwogaW50IF9faW5pdCBzcHVfc2NoZWRfaW5pdCh2b2lkKQogewotCWludCBpOwotCi0Jc3B1X3NjaGVkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInNwdXNjaGVkIik7Ci0JaWYgKCFzcHVfc2NoZWRfd3EpCi0JCXJldHVybiAxOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CisJaW50IGVyciA9IC1FTk9NRU0sIGk7CiAKIAlzcHVfcHJpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcHVfcHJpb19hcnJheSksIEdGUF9LRVJORUwpOwotCWlmICghc3B1X3ByaW8pIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBwcmlvcml0eSBxdWV1ZS5cbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQkgICAgICAgZGVzdHJveV93b3JrcXVldWUoc3B1X3NjaGVkX3dxKTsKLQkJcmV0dXJuIDE7Ci0JfQorCWlmICghc3B1X3ByaW8pCisJCWdvdG8gb3V0OworCiAJZm9yIChpID0gMDsgaSA8IE1BWF9QUklPOyBpKyspIHsKIAkJSU5JVF9MSVNUX0hFQUQoJnNwdV9wcmlvLT5ydW5xW2ldKTsKIAkJX19jbGVhcl9iaXQoaSwgc3B1X3ByaW8tPmJpdG1hcCk7CkBAIC00OTIsNyArNzU3LDMwIEBACiAJCUlOSVRfTElTVF9IRUFEKCZzcHVfcHJpby0+YWN0aXZlX2xpc3RbaV0pOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisKKwlzZXR1cF90aW1lcigmc3B1c2NoZWRfdGltZXIsIHNwdXNjaGVkX3dha2UsIDApOworCisJc3B1c2NoZWRfdGFzayA9IGt0aHJlYWRfcnVuKHNwdXNjaGVkX3RocmVhZCwgTlVMTCwgInNwdXNjaGVkIik7CisJaWYgKElTX0VSUihzcHVzY2hlZF90YXNrKSkgeworCQllcnIgPSBQVFJfRVJSKHNwdXNjaGVkX3Rhc2spOworCQlnb3RvIG91dF9mcmVlX3NwdV9wcmlvOworCX0KKworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInNwdV9sb2FkYXZnIiwgMCwgTlVMTCk7CisJaWYgKCFlbnRyeSkKKwkJZ290byBvdXRfc3RvcF9rdGhyZWFkOworCWVudHJ5LT5wcm9jX2ZvcHMgPSAmc3B1X2xvYWRhdmdfZm9wczsKKworCXByX2RlYnVnKCJzcHVzY2hlZDogdGljazogJWQsIG1pbiB0aWNrczogJWQsIGRlZmF1bHQgdGlja3M6ICVkXG4iLAorCQkJU1BVU0NIRURfVElDSywgTUlOX1NQVV9USU1FU0xJQ0UsIERFRl9TUFVfVElNRVNMSUNFKTsKIAlyZXR1cm4gMDsKKworIG91dF9zdG9wX2t0aHJlYWQ6CisJa3RocmVhZF9zdG9wKHNwdXNjaGVkX3Rhc2spOworIG91dF9mcmVlX3NwdV9wcmlvOgorCWtmcmVlKHNwdV9wcmlvKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogdm9pZCBfX2V4aXQgc3B1X3NjaGVkX2V4aXQodm9pZCkKQEAgLTUwMCw2ICs3ODgsMTEgQEAKIAlzdHJ1Y3Qgc3B1ICpzcHUsICp0bXA7CiAJaW50IG5vZGU7CiAKKwlyZW1vdmVfcHJvY19lbnRyeSgic3B1X2xvYWRhdmciLCBOVUxMKTsKKworCWRlbF90aW1lcl9zeW5jKCZzcHVzY2hlZF90aW1lcik7CisJa3RocmVhZF9zdG9wKHNwdXNjaGVkX3Rhc2spOworCiAJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKSB7CiAJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3B1LCB0bXAsICZzcHVfcHJpby0+YWN0aXZlX2xpc3Rbbm9kZV0sCkBAIC01MTAsNSArODAzLDQgQEAKIAkJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKIAl9CiAJa2ZyZWUoc3B1X3ByaW8pOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHNwdV9zY2hlZF93cSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3Jlc3RvcmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jCmluZGV4IDBiZjcyM2QuLjRlMTllZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKICAqIFRoaXMgY29kZSBkZXZpYXRlcyBmcm9tIHRoZSBkb2N1bWVudGVkIHNlcXVlbmNlIGluIHRoZQogICogZm9sbG93aW5nIGFzcGVjdHM6CiAgKgotICogCTEuIFRoZSBFQSBmb3IgTFNDU0EgaXMgcGFzc2VkIGZyb20gUFBFIGluIHRoZQorICoJMS4gVGhlIEVBIGZvciBMU0NTQSBpcyBwYXNzZWQgZnJvbSBQUEUgaW4gdGhlCiAgKgkgICBzaWduYWwgbm90aWZpY2F0aW9uIGNoYW5uZWxzLgogICoJMi4gVGhlIHJlZ2lzdGVyIHNwaWxsIGFyZWEgaXMgcHVsbGVkIGJ5IFNQVQogICoJICAgaW50byBMUywgcmF0aGVyIHRoYW4gcHVzaGVkIGJ5IFBQRS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfc2F2ZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKaW5kZXggMTk2MDMzYi4uYWU5NWNjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkgKiAgICBSZWFkIHRoZSBTUFVfUmRFdmVudE1zayBjaGFubmVsIGFuZCBzYXZlIHRvIHRoZSBMU0NTQS4KIAkgKi8KIAlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoZXZlbnRfbWFzayk7Ci0JcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF0gPSBzcHVfcmVhZGNoKFNQVV9SZEV2ZW50U3RhdE1hc2spOworCXJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdID0gc3B1X3JlYWRjaChTUFVfUmRFdmVudE1hc2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV90YWdfbWFzayh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaAppbmRleCA0NzYxN2U4Li4wOGIzNTMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgpAQCAtMzksOSArNDAsMTcgQEAKIHN0cnVjdCBzcHVfY29udGV4dF9vcHM7CiBzdHJ1Y3Qgc3B1X2dhbmc7CiAKLS8qIGN0eC0+c2NoZWRfZmxhZ3MgKi8KLWVudW0gewotCVNQVV9TQ0hFRF9FWElUSU5HID0gMCwKKy8qCisgKiBUaGlzIGlzIHRoZSBzdGF0ZSBmb3Igc3B1IHV0aWxpemF0aW9uIHJlcG9ydGluZyB0byB1c2Vyc3BhY2UuCisgKiBCZWNhdXNlIHRoaXMgc3RhdGUgaXMgdmlzaWJsZSB0byB1c2Vyc3BhY2UgaXQgbXVzdCBuZXZlciBjaGFuZ2UgYW5kIG5lZWRzCisgKiB0byBiZSBrZXB0IHN0cmljdGx5IHNlcGFyYXRlIGZyb20gYW55IGludGVybmFsIHN0YXRlIGtlcHQgYnkgdGhlIGtlcm5lbC4KKyAqLworZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIHsKKwlTUFVDVFhfVVRJTF9VU0VSID0gMCwKKwlTUFVDVFhfVVRJTF9TWVNURU0sCisJU1BVQ1RYX1VUSUxfSU9XQUlULAorCVNQVUNUWF9VVElMX0xPQURFRCwKKwlTUFVDVFhfVVRJTF9NQVgKIH07CiAKIHN0cnVjdCBzcHVfY29udGV4dCB7CkBAIC04MSwxMyArOTAsMzQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdhbmdfbGlzdDsKIAlzdHJ1Y3Qgc3B1X2dhbmcgKmdhbmc7CiAKKwkvKiBvd25lciB0aHJlYWQgKi8KKwlwaWRfdCB0aWQ7CisKIAkvKiBzY2hlZHVsZXIgZmllbGRzICovCi0gCXN0cnVjdCBsaXN0X2hlYWQgcnE7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBzY2hlZF93b3JrOworCXN0cnVjdCBsaXN0X2hlYWQgcnE7CisJdW5zaWduZWQgaW50IHRpbWVfc2xpY2U7CiAJdW5zaWduZWQgbG9uZyBzY2hlZF9mbGFnczsKLQl1bnNpZ25lZCBsb25nIHJ0X3ByaW9yaXR5OworCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CiAJaW50IHBvbGljeTsKIAlpbnQgcHJpbzsKKworCS8qIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgeworCQkvKiB1cGRhdGVzIHByb3RlY3RlZCBieSBjdHgtPnN0YXRlX211dGV4ICovCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBleGVjdXRpb25fc3RhdGU7CisJCXVuc2lnbmVkIGxvbmcgdHN0YW1wOwkJLyogdGltZSBvZiBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyB0aW1lc1tTUFVDVFhfVVRJTF9NQVhdOworCQl1bnNpZ25lZCBsb25nIGxvbmcgdm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnZvbF9jdHhfc3dpdGNoOworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWluX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG1hal9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBoYXNoX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNsYl9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGJfZmx0X2Jhc2U7IC8qICMgYXQgbGFzdCBjdHggc3dpdGNoICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBjbGFzczJfaW50cjsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyX2Jhc2U7IC8qICMgYXQgbGFzdCBjdHggc3dpdGNoICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsaWJhc3Npc3Q7CisJfSBzdGF0czsKIH07CiAKIHN0cnVjdCBzcHVfZ2FuZyB7CkBAIC0xNzcsNiArMjA3LDcgQEAKIGludCBzcHVmc19oYW5kbGVfY2xhc3MxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIAogLyogY29udGV4dCBtYW5hZ2VtZW50ICovCitleHRlcm4gYXRvbWljX3QgbnJfc3B1X2NvbnRleHRzOwogc3RhdGljIGlubGluZSB2b2lkIHNwdV9hY3F1aXJlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewogCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwpAQCAtMjAwLDkgKzIzMSw5IEBACiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgc3B1X2RlYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogdm9pZCBzcHVfeWllbGQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwotdm9pZCBzcHVfc3RhcnRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zdG9wX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwotdm9pZCBzcHVfc2NoZWRfdGljayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBzcHVfc2V0X3RpbWVzbGljZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIHNwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIF9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIGludCBfX2luaXQgc3B1X3NjaGVkX2luaXQodm9pZCk7CiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKTsKIApAQCAtMjEwLDcgKzI0MSw3IEBACiAKIC8qCiAgKiBzcHVmc193YWl0Ci0gKiAJU2FtZSBhcyB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwgZXhjZXB0IHRoYXQgaGVyZQorICoJU2FtZSBhcyB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwgZXhjZXB0IHRoYXQgaGVyZQogICoJd2UgbmVlZCB0byBjYWxsIHNwdV9yZWxlYXNlKGN0eCkgYmVmb3JlIHNsZWVwaW5nLCBhbmQKICAqCXRoZW4gc3B1X2FjcXVpcmUoY3R4KSB3aGVuIGF3b2tlbi4KICAqLwpAQCAtMjU2LDQgKzI4NywzNyBAQAogZXh0ZXJuIHN0cnVjdCBzcHVmc19jb3JlZHVtcF9yZWFkZXIgc3B1ZnNfY29yZWR1bXBfcmVhZFtdOwogZXh0ZXJuIGludCBzcHVmc19jb3JlZHVtcF9udW1fbm90ZXM7CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbGl0dGxlIGJpdCB0b28gbGFyZ2UgZm9yIGFuIGlubGluZSwgYnV0CisgKiBhcyBmYXVsdC5jIGlzIGJ1aWx0IGludG8gdGhlIGtlcm5lbCB3ZSBjYW4ndCBtb3ZlIGl0IG91dCBvZgorICogbGluZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwdWN0eF9zd2l0Y2hfc3RhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZjdHgtPnN0YXRlX211dGV4KSk7CisKKwlpZiAoY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgIT0gbmV3X3N0YXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7CisKKwkJY3R4LT5zdGF0cy50aW1lc1tjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZV0gKz0KKwkJCQkgY3VydGltZSAtIGN0eC0+c3RhdHMudHN0YW1wOworCQljdHgtPnN0YXRzLnRzdGFtcCA9IGN1cnRpbWU7CisJCWN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID0gbmV3X3N0YXRlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwdV9zd2l0Y2hfc3RhdGUoc3RydWN0IHNwdSAqc3B1LAorCQllbnVtIHNwdWN0eF9leGVjdXRpb25fc3RhdGUgbmV3X3N0YXRlKQoreworCWlmIChzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlICE9IG5ld19zdGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIGN1cnRpbWUgPSBqaWZmaWVzOworCisJCXNwdS0+c3RhdHMudGltZXNbc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZV0gKz0KKwkJCQkgY3VydGltZSAtIHNwdS0+c3RhdHMudHN0YW1wOworCQlzcHUtPnN0YXRzLnRzdGFtcCA9IGN1cnRpbWU7CisJCXNwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJfQorfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYwppbmRleCA3MWEwYjQxLi45YzUwNmJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCkBAIC03MCw3ICs3MCw3IEBACiAgIH0KICNlbmRpZgkJCQkvKiBkZWJ1ZyAqLwogCi0jZGVmaW5lIFBPTExfV0hJTEVfRkFMU0UoX2MpIAlQT0xMX1dISUxFX1RSVUUoIShfYykpCisjZGVmaW5lIFBPTExfV0hJTEVfRkFMU0UoX2MpCVBPTExfV0hJTEVfVFJVRSghKF9jKSkKIAogc3RhdGljIGlubGluZSB2b2lkIGFjcXVpcmVfc3B1X2xvY2soc3RydWN0IHNwdSAqc3B1KQogewpAQCAtMzg3LDYgKzM4NywxOSBAQAogCWNzYS0+cHJvYi5kbWFfcXVlcnl0eXBlX1JXID0gaW5fYmUzMigmcHJvYi0+ZG1hX3F1ZXJ5dHlwZV9SVyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3BwdV90YWdzdGF0dXMoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisKKwkvKiBTYXZlIHRoZSBQcnh5X1RhZ1N0YXR1cyByZWdpc3RlciBpbiB0aGUgQ1NBLgorCSAqCisJICogSXQgaXMgdW5uZWNlc3NhcnkgdG8gcmVzdG9yZSBkbWFfdGFnc3RhdHVzX1IsIGhvd2V2ZXIsCisJICogZG1hX3RhZ3N0YXR1c19SIGluIHRoZSBDU0EgaXMgYWNjZXNzZWQgdmlhIGJhY2tpbmdfb3BzLCBzbworCSAqIHdlIG11c3Qgc2F2ZSBpdC4KKwkgKi8KKwljc2EtPnByb2IuZG1hX3RhZ3N0YXR1c19SID0gaW5fYmUzMigmcHJvYi0+ZG1hX3RhZ3N0YXR1c19SKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX2Nzcl90c3Eoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CkBAIC0xODEyLDYgKzE4MjUsNyBAQAogCXNhdmVfbWZjX3F1ZXVlcyhwcmV2LCBzcHUpOwkvKiBTdGVwIDE5LiAqLwogCXNhdmVfcHB1X3F1ZXJ5bWFzayhwcmV2LCBzcHUpOwkvKiBTdGVwIDIwLiAqLwogCXNhdmVfcHB1X3F1ZXJ5dHlwZShwcmV2LCBzcHUpOwkvKiBTdGVwIDIxLiAqLworCXNhdmVfcHB1X3RhZ3N0YXR1cyhwcmV2LCBzcHUpOyAgLyogTkVXLiAgICAgKi8KIAlzYXZlX21mY19jc3JfdHNxKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjIuICovCiAJc2F2ZV9tZmNfY3NyX2NtZChwcmV2LCBzcHUpOwkvKiBTdGVwIDIzLiAqLwogCXNhdmVfbWZjX2Nzcl9hdG8ocHJldiwgc3B1KTsJLyogU3RlcCAyNC4gKi8KQEAgLTE5MzAsNyArMTk0NCw3IEBACiAJcmVzZXRfc3B1X3ByaXZjbnRsKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxNi4gKi8KIAlyZXNldF9zcHVfbHNscihwcmV2LCBzcHUpOyAgICAgICAgICAgICAgLyogU3RlcCAxNy4gKi8KIAlzZXR1cF9tZmNfc3IxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxOC4gKi8KLQlzcHVfaW52YWxpZGF0ZV9zbGJzKHNwdSk7ICAgICAgICAJLyogU3RlcCAxOS4gKi8KKwlzcHVfaW52YWxpZGF0ZV9zbGJzKHNwdSk7CQkvKiBTdGVwIDE5LiAqLwogCXJlc2V0X2NoX3BhcnQxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMC4gKi8KIAlyZXNldF9jaF9wYXJ0MihwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjEuICovCiAJZW5hYmxlX2ludGVycnVwdHMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDIyLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZwppbmRleCBkMmM2OTA1Li4yMmI0YjRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZwpAQCAtOCw0ICs4LDUgQEAKIAlzZWxlY3QgUFBDX01QQzEwNgogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfTkFUSVZFCisJc2VsZWN0IFBDSQogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlCmluZGV4IDkwMmZlYjEuLjRiM2JmYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUKQEAgLTEsNCArMSwzIEBACi1vYmoteQkJCQkrPSBzZXR1cC5vIHRpbWUubyBwZWdhc29zX2V0aC5vCi1vYmotJChDT05GSUdfUENJKQkJKz0gcGNpLm8KK29iai15CQkJCSs9IHNldHVwLm8gdGltZS5vIHBlZ2Fzb3NfZXRoLm8gcGNpLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX05WUkFNKQkJKz0gbnZyYW0ubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCmluZGV4IGQzMmZlZGMuLjM2OTA2MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCiAJCXwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKLQkJfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCQl8IChob3NlLT5nbG9iYWxfbnVtYmVyIDw8IDI0KTsKICAgICAgICAgaW50IHJldCA9IC0xOwogCWludCBydmFsOwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCiAJCXwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKLQkJfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCQl8IChob3NlLT5nbG9iYWxfbnVtYmVyIDw8IDI0KTsKIAlpbnQgcnZhbDsKIAogCXJ2YWwgPSBydGFzX2NhbGwocnRhc190b2tlbigid3JpdGUtcGNpLWNvbmZpZyIpLCAzLCAxLCBOVUxMLApAQCAtMjU0LDEzICsyNTQsMTIgQEAKIAkJCXByaW50aygiIGF0ICVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKXIuc3RhcnQpOwogCQlwcmludGsoIlxuIik7CiAKLQkJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJCWlmICghaG9zZSkgewogCQkJcHJpbnRrKCJDYW4ndCBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yICVzXG4iLAogCQkJCWRldi0+ZnVsbF9uYW1lKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAkJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2VbMF07CiAJCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2VbMV07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwppbmRleCBmMmQyNjI2Li5iZWM3NzI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCkBAIC0yOCw2ICsyOCw3IEBACiAJYm9vbCAiUFBDNzUwR1gvQ0wgd2l0aCBUU0kxMHggYnJpZGdlIChIaWNrb3J5L0hvbGx5KSIKIAlzZWxlY3QgVFNJMTA4X0JSSURHRQogCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCiAJaGVscAogCSAgU2VsZWN0IFBQQ19IT0xMWSBpZiBjb25maWd1cmluZyBmb3IgYW4gSUJNIDc1MEdYL0NMIEV2YWwKIAkgIEJvYXJkIHdpdGggVFNJMTA4LzkgYnJpZGdlIChIaWNrb3J5L0hvbGx5KQpAQCAtNDQsNiArNDUsNyBAQAogY29uZmlnIFRTSTEwOF9CUklER0UKIAlib29sCiAJZGVwZW5kcyBvbiBNUEM3NDQ4SFBDMiB8fCBQUENfSE9MTFkKKwlzZWxlY3QgUENJCiAJc2VsZWN0IE1QSUMKIAlzZWxlY3QgTVBJQ19XRUlSRAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCmluZGV4IDNhMGI0YTAuLjYyOTJlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBIT0xMWV9QQ0lfQ0ZHX1BIWVMgMHg3YzAwMDAwMAogCi1pbnQgaG9sbHlfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IGhvbGx5X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewogCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwppbmRleCBiNDEyZjAwLi5mNGQwYTdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCkBAIC01NCw4ICs1NCw5IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBsaW5rc3RhdGlvbl9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogeworI2lmZGVmIENPTkZJR19QQ0kKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKQEAgLTY3LDE4ICs2OCwxNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkJCSIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKGhvc2UgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwotCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgMHhmZWMwMDAwMCwgMHhmZWUwMDAwMCk7CiAKIAkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCiAJLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIDEpOwotCisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIsNyArOTIsNyBAQAogCiAJLyogTG9va3VwIFBDSSBob3N0IGJyaWRnZXMgKi8KIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQlsaW5rc3RhdGlvbl9hZGRfYnJpZGdlKG5wKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkJVRkZBTE8gTmV0d29yayBBdHRhY2hlZCBTdG9yYWdlIFNlcmllc1xuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiKEMpIDIwMDItMjAwNSBCVUZGQUxPIElOQy5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKaW5kZXggNDU0MmUwYzguLjFlM2NjNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtNTQsMTUgKzU0LDEwIEBACiAKICNkZWZpbmUgTVBDNzQ0OEhQQzJfUENJX0NGR19QSFlTIDB4ZmIwMDAwMDAKIAotI2lmbmRlZiBDT05GSUdfUENJCi1pc2FfaW9fYmFzZSA9IE1QQzc0NDhfSFBDMl9JU0FfSU9fQkFTRTsKLWlzYV9tZW1fYmFzZSA9IE1QQzc0NDhfSFBDMl9JU0FfTUVNX0JBU0U7Ci1wY2lfZHJhbV9vZmZzZXQgPSBNUEM3NDQ4X0hQQzJfUENJX01FTV9PRkZTRVQ7Ci0jZW5kaWYKLQogZXh0ZXJuIHZvaWQgX25tYXNrX2FuZF9vcl9tc3IodW5zaWduZWQgbG9uZyBubWFzaywgdW5zaWduZWQgbG9uZyBvcl92YWwpOwogCi1pbnQgbXBjNzQ0OF9ocGMyX2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK2ludCBtcGM3NDQ4X2hwYzJfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCXVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKIHsKIAlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuaAppbmRleCBhNTQzYTUyLi5mN2UwZTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmgKQEAgLTE4LDkgKzE4LDQgQEAKIAogI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CiAKLS8qIEJhc2UgQWRkcmVzc2VzIGZvciB0aGUgUENJIGJ1cwotICovCi0jZGVmaW5lIE1QQzc0NDhfSFBDMl9QQ0lfTUVNX09GRlNFVAkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgTVBDNzQ0OF9IUEMyX0lTQV9JT19CQVNFCSgweDAwMDAwMDAwKQotI2RlZmluZSBNUEM3NDQ4X0hQQzJfSVNBX01FTV9CQVNFCSgweDAwMDAwMDAwKQogI2VuZGlmCQkJCS8qIF9fUFBDX1BMQVRGT1JNU19NUEM3NDQ4X0hQQzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2NhbGxfaHB0LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaAppbmRleCBhODQzYjBmLi44ZDk1ZmU0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2NhbGxfaHB0LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2NhbGxfaHB0LmgKQEAgLTc2LDI0ICs3NiwyNSBAQAogCXJldHVybiBjb21wcmVzc2VkU3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTY0IHZwbikKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kVmFsaWQoc3RydWN0IGhhc2hfcHRlICpocHRlLCB1NjQgdnBuKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZFZhbGlkLCBocHRlLCB2cG4sIDAsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZE5leHRWYWxpZChocHRlX3QgKmhwdGUsIHUzMiBocHRlSW5kZXgsCitzdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZE5leHRWYWxpZChzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHUzMiBocHRlSW5kZXgsCiAJCXU4IGJpdHNvbiwgdTggYml0c29mZikKIHsKIAlyZXR1cm4gSHZDYWxsM1JldDE2KEh2Q2FsbEhwdEZpbmROZXh0VmFsaWQsIGhwdGUsIGhwdGVJbmRleCwKIAkJCWJpdHNvbiwgYml0c29mZik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfZ2V0KGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfZ2V0KHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKIHsKIAlIdkNhbGwyUmV0MTYoSHZDYWxsSHB0R2V0LCBocHRlLCBocHRlSW5kZXgsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHUzMiBocHRlSW5kZXgsIHUzMiBoQml0LCBocHRlX3QgKmhwdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHUzMiBocHRlSW5kZXgsIHUzMiBoQml0LAorCQkJCQkgc3RydWN0IGhhc2hfcHRlICpocHRlKQogewogCUh2Q2FsbDQoSHZDYWxsSHB0QWRkVmFsaWRhdGUsIGhwdGVJbmRleCwgaEJpdCwgaHB0ZS0+diwgaHB0ZS0+cik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h0YWIuYwppbmRleCBlZDQ0ZGZjLi5iNGUyYzdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkJCSB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewogCWxvbmcgc2xvdDsKLQlocHRlX3QgbGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGxocHRlOwogCWludCBzZWNvbmRhcnkgPSAwOwogCiAJQlVHX09OKHBzaXplICE9IE1NVV9QQUdFXzRLKTsKQEAgLTk5LDcgKzk5LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaVNlcmllc19ocHRlX2dldHdvcmQwKHVuc2lnbmVkIGxvbmcgc2xvdCkKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAogCUh2Q2FsbEhwdF9nZXQoJmhwdGUsIHNsb3QpOwogCXJldHVybiBocHRlLnY7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIHN0YXRpYyBsb25nIGlTZXJpZXNfaHB0ZV91cGRhdGVwcCh1bnNpZ25lZCBsb25nIHNsb3QsIHVuc2lnbmVkIGxvbmcgbmV3cHAsCiAJCQkJICB1bnNpZ25lZCBsb25nIHZhLCBpbnQgcHNpemUsIGludCBsb2NhbCkKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAogCWlTZXJpZXNfaGxvY2soc2xvdCk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAqLwogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX2ZpbmQodW5zaWduZWQgbG9uZyB2cG4pCiB7Ci0JaHB0ZV90IGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGhwdGU7CiAJbG9uZyBzbG90OwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwppbmRleCA5Yzk3NDIyLi5kYTg3MTYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCkBAIC03NDIsNiArNzQyLDExIEBACiAJLyogSW5zdGFsbCBJTyBob29rcyAqLwogCXBwY19wY2lfaW8gPSBpc2VyaWVzX3BjaV9pbzsKIAorCS8qIGlTZXJpZXMgaGFzIG5vIElPIHNwYWNlIGluIHRoZSBjb21tb24gc2Vuc2UsIGl0IG5lZWRzIHRvIHNldAorCSAqIHRoZSBJTyBiYXNlIHRvIDAKKwkgKi8KKwlwY2lfaW9fYmFzZSA9IDA7CisKIAlpZiAocm9vdCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgImlTZXJpZXNfcGNpYmlvc19pbml0OiBjYW4ndCBmaW5kIHJvb3QgIgogCQkJCSJvZiBkZXZpY2UgdHJlZVxuIik7CkBAIC03NjMsNyArNzY4LDcgQEAKIAkJaWYgKHBoYiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJcGhiLT5wY2lfbWVtX29mZnNldCA9IHBoYi0+bG9jYWxfbnVtYmVyID0gYnVzOworCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gYnVzOwogCQlwaGItPmZpcnN0X2J1c25vID0gYnVzOwogCQlwaGItPmxhc3RfYnVzbm8gPSBidXM7CiAJCXBoYi0+b3BzID0gJmlTZXJpZXNfcGNpX29wczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKaW5kZXggN2Y1ZGNlZS4uMTNhOGIxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKQEAgLTc5LDggKzc5LDYgQEAKIHN0YXRpYyB2b2lkIGlTZXJpZXNfcGNpX2ZpbmFsX2ZpeHVwKHZvaWQpIHsgfQogI2VuZGlmCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpU2VyaWVzX3JlY2FsX3RpdGFuOwogCiBzdHJ1Y3QgTWVtb3J5QmxvY2sgewogCXVuc2lnbmVkIGxvbmcgYWJzU3RhcnQ7CkBAIC0yOTIsOCArMjkwLDggQEAKIHsKIAlEQkcoIiAtPiBpU2VyaWVzX2luaXRfZWFybHkoKVxuIik7CiAKLQlpU2VyaWVzX3JlY2FsX3RiID0gZ2V0X3RiKCk7Ci0JaVNlcmllc19yZWNhbF90aXRhbiA9IEh2Q2FsbFhtX2xvYWRUb2QoKTsKKwkvKiBTbmFwc2hvdCB0aGUgdGltZWJhc2UsIGZvciB1c2UgaW4gbGF0ZXIgcmVjYWxpYnJhdGlvbiAqLworCWlTZXJpZXNfdGltZV9pbml0X2Vhcmx5KCk7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIERNQS9UQ0UgbWFuYWdlbWVudApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKaW5kZXggN2FhYTViYi4uZmNlYWFlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCkBAIC00NDQsNyArNDQ0LDcgQEAKIAl1M19odCA9IGhvc2U7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBtYXBsZV9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTE5LDIzICs1MTksNiBAQAogCURCRygiIDwtIG1hcGxlX3BjaV9pcnFfZml4dXBcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWFwbGVfZml4dXBfcGhiX3Jlc291cmNlcyh2b2lkKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKLQkKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQotCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArPSBvZmZzZXQ7Ci0JCWhvc2UtPmlvX3Jlc291cmNlLmVuZCArPSBvZmZzZXQ7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbGx4OyBpbyBlbmQ6ICVsbHhcbiIsCi0JCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylob3NlLT5pb19yZXNvdXJjZS5zdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaG9zZS0+aW9fcmVzb3VyY2UuZW5kKTsKLQl9Ci19Ci0KIHZvaWQgX19pbml0IG1hcGxlX3BjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJvb3Q7CkBAIC01NTgsNyArNTQxLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidTQtcGNpZSIpIHx8CiAJCSAgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ1My1hZ3AiKSkgJiYKLQkJICAgIGFkZF9icmlkZ2UobnApID09IDApCisJCSAgICBtYXBsZV9hZGRfYnJpZGdlKG5wKSA9PSAwKQogCQkJb2Zfbm9kZV9nZXQobnApOwogCiAJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInUzLWh0IikpIHsKQEAgLTU3MCwyNyArNTUzLDkgQEAKIAogCS8qIE5vdyBzZXR1cCB0aGUgSHlwZXJUcmFuc3BvcnQgaG9zdCBpZiB3ZSBmb3VuZCBhbnkKIAkgKi8KLQlpZiAoaHQgJiYgYWRkX2JyaWRnZShodCkgIT0gMCkKKwlpZiAoaHQgJiYgbWFwbGVfYWRkX2JyaWRnZShodCkgIT0gMCkKIAkJb2Zfbm9kZV9wdXQoaHQpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG5lZWQgdG8gY2FsbCBwY2lfc2V0dXBfcGhiX2lvIGZvciB0aGUgSFQgYnJpZGdlIGZpcnN0Ci0gICAgICAgICAqIHNvIGl0IGdldHMgdGhlIEkvTyBwb3J0IG51bWJlcnMgc3RhcnRpbmcgYXQgMCwgYW5kIHdlCi0gICAgICAgICAqIG5lZWQgdG8gY2FsbCBpdCBmb3IgdGhlIEFHUCBicmlkZ2UgYWZ0ZXIgdGhhdCBzbyBpdCBnZXRzCi0gICAgICAgICAqIHNtYWxsIHBvc2l0aXZlIEkvTyBwb3J0IG51bWJlcnMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodTNfaHQpCi0gICAgICAgICAgICAgICAgcGNpX3NldHVwX3BoYl9pbyh1M19odCwgMSk7Ci0gICAgICAgIGlmICh1M19hZ3ApCi0gICAgICAgICAgICAgICAgcGNpX3NldHVwX3BoYl9pbyh1M19hZ3AsIDApOwotICAgICAgICBpZiAodTRfcGNpZSkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHU0X3BjaWUsIDApOwotCi0JLyogRml4dXAgdGhlIElPIHJlc291cmNlcyBvbiBvdXIgaG9zdCBicmlkZ2VzIGFzIHRoZSBjb21tb24gY29kZQotCSAqIGRvZXMgaXQgb25seSBmb3IgY2hpbGRzIG9mIHRoZSBob3N0IGJyaWRnZXMKLQkgKi8KLQltYXBsZV9maXh1cF9waGJfcmVzb3VyY2VzKCk7Ci0KIAkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovIAogCXBjaV9kZXZzX3BoYl9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCmluZGV4IDdjNTA3NmUuLjk1Y2Q5MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZwpAQCAtMjUsNCArMjUsMTMgQEAKIAloZWxwCiAJICBEcml2ZXIgZm9yIE1ESU8gdmlhIEdQSU8gb24gUFdSZmljaWVudCBwbGF0Zm9ybXMKIAorY29uZmlnIEVMRUNUUkFfSURFCisgICAgICB0cmlzdGF0ZSAiRWxlY3RyYSBJREUgZHJpdmVyIgorICAgICAgZGVmYXVsdCB5CisgICAgICBkZXBlbmRzIG9uIFBQQ19QQVNFTUkgJiYgQVRBCisgICAgICBzZWxlY3QgUEFUQV9QTEFURk9STQorICAgICAgaGVscAorCVRoaXMgaW5jbHVkZXMgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSBFbGVjdHJhIG9uLWJvYXJkIElERQorCWludGVyZmFjZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZQppbmRleCAyY2QyYTRmLi5mNDdmY2FjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZQpAQCAtMSwzICsxLDQgQEAKIG9iai15CSs9IHNldHVwLm8gcGNpLm8gdGltZS5vIGlkbGUubyBwb3dlcnNhdmUubyBpb21tdS5vCiBvYmotJChDT05GSUdfUFBDX1BBU0VNSV9NRElPKQkrPSBncGlvX21kaW8ubworb2JqLSQoQ09ORklHX0VMRUNUUkFfSURFKSArPSBlbGVjdHJhX2lkZS5vCiBvYmotJChDT05GSUdfUFBDX1BBU0VNSV9DUFVGUkVRKSArPSBjcHVmcmVxLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9lbGVjdHJhX2lkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmIwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9lbGVjdHJhX2lkZS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUEEgU2VtaSwgSW5jCisgKgorICogTWFpbnRhaW5lZCBieTogT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBUaGUgZWxlY3RyYSBJREUgaW50ZXJmYWNlIGlzIGluY3JlZGlibHkgc2ltcGxlOiBKdXN0IGEgZGV2aWNlIG9uIHRoZSBsb2NhbGJ1cworICogd2l0aCBpbnRlcnJ1cHRzIGhvb2tlZCB1cCB0byBvbmUgb2YgdGhlIEdQSU9zLiBUaGUgZGV2aWNlIHRyZWUgY29udGFpbnMgdGhlCisgKiBhZGRyZXNzIHdpbmRvdyBhbmQgaW50ZXJydXB0IG1hcHBpbmdzIGFscmVhZHksIGFuZCB0aGUgcGF0YV9wbGF0Zm9ybSBkcml2ZXIgaGFuZGxlcworICogdGhlIHJlc3QuIFdlIGp1c3QgbmVlZCB0byBob29rIHRoZSB0d28gdXAuCisgKi8KKworI2RlZmluZSBNQVhfSUZTCTQJLyogcmVhbGx5LCB3ZSBoYXZlIG9ubHkgb25lICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2c1tNQVhfSUZTXTsKKworc3RhdGljIGludCBfX2RldmluaXQgZWxlY3RyYV9pZGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHJlc291cmNlIHJbM107CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJpZGUiLCAiZWxlY3RyYS1pZGUiKTsKKwlpID0gMDsKKworCXdoaWxlIChucCAmJiBpIDwgTUFYX0lGUykgeworCQltZW1zZXQociwgMCwgc2l6ZW9mKHIpKTsKKworCQkvKiBwYXRhX3BsYXRmb3JtIHdhbnRzIHR3byBhZGRyZXNzIHJhbmdlczogb25lIGZvciB0aGUgYmFzZSByZWdpc3RlcnMsCisJCSAqIGFub3RoZXIgZm9yIHRoZSBjb250cm9sIChhbHRzdGF0dXMpLiBJdCdzIGxvY2F0ZWQgYXQgb2Zmc2V0IDB4M2Y2IGluCisJCSAqIHRoZSB3aW5kb3csIGJ1dCB0aGUgZGV2aWNlIHRyZWUgb25seSBoYXMgb25lIGxhcmdlIHJlZ2lzdGVyIHdpbmRvdworCQkgKiB0aGF0IGNvdmVycyBib3RoIHJhbmdlcy4gU28gd2UgbmVlZCB0byBzcGxpdCBpdCB1cCBieSBoYW5kIGhlcmU6CisJCSAqLworCisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyWzBdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclsxXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlyWzFdLnN0YXJ0ICs9IDB4M2Y2OworCQlyWzBdLmVuZCA9IHJbMV0uc3RhcnQtMTsKKworCQlyWzJdLnN0YXJ0ID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCQlyWzJdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwkJclsyXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCXByX2RlYnVnKCJyZWdpc3RlcmluZyBwbGF0Zm9ybSBkZXZpY2UgYXQgMHglbHgvMHglbHgsIGlycSBpcyAlbGRcbiIsCisJCQkgclswXS5zdGFydCwgclsxXS5zdGFydCwgclsyXS5zdGFydCk7CisJCXBkZXZzW2ldID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgicGF0YV9wbGF0Zm9ybSIsIGksIHIsIDMpOworCQlpZiAoSVNfRVJSKHBkZXZzW2ldKSkgeworCQkJcmV0ID0gUFRSX0VSUihwZGV2c1tpXSk7CisJCQlwZGV2c1tpXSA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAiaWRlIiwgImVsZWN0cmEtaWRlIik7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChlbGVjdHJhX2lkZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVsZWN0cmFfaWRlX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSUZTOyBpKyspCisJCWlmIChwZGV2c1tpXSkKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXZzW2ldKTsKK30KK21vZHVsZV9leGl0KGVsZWN0cmFfaWRlX2V4aXQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IgKCJPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBBIFNlbWkgRWxlY3RyYSBJREUgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCmluZGV4IGJiYzZkZmMuLmFiMWY1ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoMHhlMDAwMDAwMCwgMHgxMDAwMDAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBwYXNfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAKQEAgLTE1MCwyOSArMTUwLDExIEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgUEEtUFhQIFBDSSBob3N0IGJyaWRnZS5cbiIpOwogCiAJLyogSW50ZXJwcmV0IHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSAqLwotCS8qIFRoaXMgYWxzbyBtYXBzIHRoZSBJL08gcmVnaW9uIGFuZCBzZXRzIGlzYV9pby9tZW1fYmFzZSAqLwogCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgZGV2LCAxKTsKLQlwY2lfc2V0dXBfcGhiX2lvKGhvc2UsIDEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgX19pbml0IHBhc19maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0JCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICs9IG9mZnNldDsKLQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IG9mZnNldDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbHg7IGlvIGVuZDogJWx4XG4iLAotCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlciwKLQkJICAgICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLQotCiB2b2lkIF9faW5pdCBwYXNfcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcm9vdDsKQEAgLTE4NSwxMyArMTY3LDExIEBACiAJfQogCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIG5wKSkgIT0gTlVMTDspCi0JCWlmIChucC0+bmFtZSAmJiAhc3RyY21wKG5wLT5uYW1lLCAicHhwIikgJiYgIWFkZF9icmlkZ2UobnApKQorCQlpZiAobnAtPm5hbWUgJiYgIXN0cmNtcChucC0+bmFtZSwgInB4cCIpICYmICFwYXNfYWRkX2JyaWRnZShucCkpCiAJCQlvZl9ub2RlX2dldChucCk7CiAKIAlvZl9ub2RlX3B1dChyb290KTsKIAotCXBhc19maXh1cF9waGJfcmVzb3VyY2VzKCk7Ci0KIAkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovCiAJcGNpX2RldnNfcGhiX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKaW5kZXggYzVhM2Y2MS4uZmZlNjUyOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotZGVmaW5lX21hY2hpbmUocGFzKSB7CitkZWZpbmVfbWFjaGluZShwYXNlbWkpIHsKIAkubmFtZQkJCT0gIlBBIFNlbWkgUEE2VC0xNjgyTSIsCiAJLnByb2JlCQkJPSBwYXNfcHJvYmUsCiAJLnNldHVwX2FyY2gJCT0gcGFzX3NldHVwX2FyY2gsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcKaW5kZXggNWI3YWZlNS4uMDU1OTkwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAlib29sICJBcHBsZSBQb3dlck1hYyBiYXNlZCBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCiAJc2VsZWN0IE1QSUMKKwlzZWxlY3QgUENJCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kgaWYgUFBDMzIKIAlzZWxlY3QgUFBDX01QQzEwNiBpZiBQUEMzMgogCXNlbGVjdCBQUENfTkFUSVZFCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCmluZGV4IDNmNTA3YWIuLmVmZGY1ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20va2V5bGFyZ28uaD4KICNpbmNsdWRlIDxhc20vdW5pbm9ydGguaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTg0LDcgKzg1LDcgQEAKIAl2b2lkCQkJKmhvc3RkYXRhOwogCWludAkJCWNoYW5uZWw7CS8qIHNvbWUgaG9zdHMgaGF2ZSBtdWx0aXBsZSAqLwogCWludAkJCW1vZGU7CQkvKiBjdXJyZW50IG1vZGUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCWludAkJCW9wZW5lZDsKIAlpbnQJCQlwb2xsZWQ7CQkvKiBvcGVuIG1vZGUgKi8KIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwbGF0Zm9ybV9kZXY7CkBAIC0xMDQsNyArMTA1LDcgQEAKIAogc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cKIHsKLQlzdHJ1Y3Qgc2VtYXBob3JlCW11dGV4OwkJLyogQWNjZXNzIG11dGV4IGZvciB1c2UgYnkKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogQWNjZXNzIG11dGV4IGZvciB1c2UgYnkKIAkJCQkJCSAqIGkyYy1rZXl3ZXN0ICovCiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsJCS8qIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLwogCWludAkJCWJzdGVwczsJCS8qIHJlZ2lzdGVyIHN0ZXBwaW5nICovCkBAIC0zNzUsMTQgKzM3NiwxNCBAQAogc3RhdGljIGludCBrd19pMmNfb3BlbihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCiB7CiAJc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QgPSBidXMtPmhvc3RkYXRhOwotCWRvd24oJmhvc3QtPm11dGV4KTsKKwltdXRleF9sb2NrKCZob3N0LT5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGt3X2kyY19jbG9zZShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCiB7CiAJc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QgPSBidXMtPmhvc3RkYXRhOwotCXVwKCZob3N0LT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQga3dfaTJjX3hmZXIoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzLCB1OCBhZGRyZGlyLCBpbnQgc3Vic2l6ZSwKQEAgLTQ5OCw3ICs0OTksNyBAQAogCQlrZnJlZShob3N0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWluaXRfTVVURVgoJmhvc3QtPm11dGV4KTsKKwltdXRleF9pbml0KCZob3N0LT5tdXRleCk7CiAJaW5pdF9jb21wbGV0aW9uKCZob3N0LT5jb21wbGV0ZSk7CiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwogCWluaXRfdGltZXIoJmhvc3QtPnRpbWVvdXRfdGltZXIpOwpAQCAtNTcxLDcgKzU3Miw3IEBACiAJYnVzLT5vcGVuID0ga3dfaTJjX29wZW47CiAJYnVzLT5jbG9zZSA9IGt3X2kyY19jbG9zZTsKIAlidXMtPnhmZXIgPSBrd19pMmNfeGZlcjsKLQlpbml0X01VVEVYKCZidXMtPnNlbSk7CisJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJaWYgKGNvbnRyb2xsZXIgPT0gYnVzbm9kZSkKIAkJYnVzLT5mbGFncyA9IHBtYWNfaTJjX211bHRpYnVzOwogCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwpAQCAtNzk4LDcgKzc5OSw3IEBACiAJCWJ1cy0+bW9kZSA9IHBtYWNfaTJjX21vZGVfc3RkOwogCQlidXMtPmhvc3RkYXRhID0gYnVzICsgMTsKIAkJYnVzLT54ZmVyID0gcG11X2kyY194ZmVyOwotCQlpbml0X01VVEVYKCZidXMtPnNlbSk7CisJCW11dGV4X2luaXQoJmJ1cy0+bXV0ZXgpOwogCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CiAJCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwogCkBAIC05MjEsNyArOTIyLDcgQEAKIAkJYnVzLT5tb2RlID0gcG1hY19pMmNfbW9kZV9zdGQ7CiAJCWJ1cy0+aG9zdGRhdGEgPSBidXMgKyAxOwogCQlidXMtPnhmZXIgPSBzbXVfaTJjX3hmZXI7Ci0JCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJCWJ1cy0+ZmxhZ3MgPSAwOwogCQlsaXN0X2FkZCgmYnVzLT5saW5rLCAmcG1hY19pMmNfYnVzc2VzKTsKIApAQCAtMTA5MywxMyArMTA5NCwxMyBAQAogewogCWludCByYzsKIAotCWRvd24oJmJ1cy0+c2VtKTsKKwltdXRleF9sb2NrKCZidXMtPm11dGV4KTsKIAlidXMtPnBvbGxlZCA9IHBvbGxlZCB8fCBwbWFjX2kyY19mb3JjZV9wb2xsOwogCWJ1cy0+b3BlbmVkID0gMTsKIAlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKIAlpZiAoYnVzLT5vcGVuICYmIChyYyA9IGJ1cy0+b3BlbihidXMpKSAhPSAwKSB7CiAJCWJ1cy0+b3BlbmVkID0gMDsKLQkJdXAoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZidXMtPm11dGV4KTsKIAkJcmV0dXJuIHJjOwogCX0KIAlyZXR1cm4gMDsKQEAgLTExMTIsNyArMTExMyw3IEBACiAJaWYgKGJ1cy0+Y2xvc2UpCiAJCWJ1cy0+Y2xvc2UoYnVzKTsKIAlidXMtPm9wZW5lZCA9IDA7Ci0JdXAoJmJ1cy0+c2VtKTsKKwltdXRleF91bmxvY2soJmJ1cy0+bXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1hY19pMmNfY2xvc2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwppbmRleCBjNGFmOWUyLi45MjU4NmRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKQEAgLTM1LDggKzM1LDYgQEAKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotc3RhdGljIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKLQogLyogWFhYIENvdWxkIGJlIHBlci1jb250cm9sbGVyLCBidXQgSSBkb24ndCB0aGluayB3ZSByaXNrIGFueXRoaW5nIGJ5CiAgKiBhc3N1bWluZyB3ZSB3b24ndCBoYXZlIGJvdGggVW5pTm9ydGggYW5kIEJhbmRpdCAqLwogc3RhdGljIGludCBoYXNfdW5pbm9ydGg7CkBAIC04OTcsNyArODk1LDcgQEAKICAqICJwY2kiIChhIE1QQzEwNikgYW5kIG5vIGJhbmRpdCBvciBjaGFvcyBicmlkZ2VzLCBhbmQgY29udHJhcml3aXNlLAogICogaWYgd2UgaGF2ZSBvbmUgb3IgbW9yZSBiYW5kaXQgb3IgY2hhb3MgYnJpZGdlcywgd2UgZG9uJ3QgaGF2ZSBhIE1QQzEwNi4KICAqLwotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IHBtYWNfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTkxOCwxNSArOTE2LDkgQEAKIAkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAl9CiAKLQkvKiBYWFggRGlmZmVyZW50IHByb3RvdHlwZXMsIHRvIGJlIG1lcmdlZCAqLwotI2lmZGVmIENPTkZJR19QUEM2NAogCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKLSNlbHNlCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOwotI2VuZGlmCiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7CiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwogCkBAIC0xMDA2LDE5ICs5OTgsNiBAQAogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogfQogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci1zdGF0aWMgdm9pZCBfX2luaXQgcG1hY19maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSSBIb3N0ICVkLCBpbyBzdGFydDogJWx4OyBpbyBlbmQ6ICVseFxuIiwKLQkJICAgICAgIGhvc2UtPmdsb2JhbF9udW1iZXIsCi0JCSAgICAgICBob3NlLT5pb19yZXNvdXJjZS5zdGFydCwgaG9zZS0+aW9fcmVzb3VyY2UuZW5kKTsKLQl9Ci19Ci0jZW5kaWYKLQogdm9pZCBfX2luaXQgcG1hY19wY2lfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpyb290OwpAQCAtMTAzNiw3ICsxMDE1LDcgQEAKIAkJaWYgKHN0cmNtcChucC0+bmFtZSwgImJhbmRpdCIpID09IDAKIAkJICAgIHx8IHN0cmNtcChucC0+bmFtZSwgImNoYW9zIikgPT0gMAogCQkgICAgfHwgc3RyY21wKG5wLT5uYW1lLCAicGNpIikgPT0gMCkgewotCQkJaWYgKGFkZF9icmlkZ2UobnApID09IDApCisJCQlpZiAocG1hY19hZGRfYnJpZGdlKG5wKSA9PSAwKQogCQkJCW9mX25vZGVfZ2V0KG5wKTsKIAkJfQogCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiaHQiKSA9PSAwKSB7CkBAIC0xMDUwLDI4ICsxMDI5LDkgQEAKIAkvKiBQcm9iZSBIVCBsYXN0IGFzIGl0IHJlbGllcyBvbiB0aGUgYWdwIHJlc291cmNlcyB0byBiZSBhbHJlYWR5CiAJICogc2V0dXAKIAkgKi8KLQlpZiAoaHQgJiYgYWRkX2JyaWRnZShodCkgIT0gMCkKKwlpZiAoaHQgJiYgcG1hY19hZGRfYnJpZGdlKGh0KSAhPSAwKQogCQlvZl9ub2RlX3B1dChodCk7CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gY2FsbCBwY2lfc2V0dXBfcGhiX2lvIGZvciB0aGUgSFQgYnJpZGdlIGZpcnN0Ci0JICogc28gaXQgZ2V0cyB0aGUgSS9PIHBvcnQgbnVtYmVycyBzdGFydGluZyBhdCAwLCBhbmQgd2UKLQkgKiBuZWVkIHRvIGNhbGwgaXQgZm9yIHRoZSBBR1AgYnJpZGdlIGFmdGVyIHRoYXQgc28gaXQgZ2V0cwotCSAqIHNtYWxsIHBvc2l0aXZlIEkvTyBwb3J0IG51bWJlcnMuCi0JICovCi0JaWYgKHUzX2h0KQotCQlwY2lfc2V0dXBfcGhiX2lvKHUzX2h0LCAxKTsKLQlpZiAodTNfYWdwKQotCQlwY2lfc2V0dXBfcGhiX2lvKHUzX2FncCwgMCk7Ci0JaWYgKHU0X3BjaWUpCi0JCXBjaV9zZXR1cF9waGJfaW8odTRfcGNpZSwgMCk7Ci0KLQkvKgotCSAqIE9uIHBwYzY0LCBmaXh1cCB0aGUgSU8gcmVzb3VyY2VzIG9uIG91ciBob3N0IGJyaWRnZXMgYXMKLQkgKiB0aGUgY29tbW9uIGNvZGUgZG9lcyBpdCBvbmx5IGZvciBjaGlsZHJlbiBvZiB0aGUgaG9zdCBicmlkZ2VzCi0JICovCi0JcG1hY19maXh1cF9waGJfcmVzb3VyY2VzKCk7Ci0KIAkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovCiAJcGNpX2RldnNfcGhiX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKaW5kZXggNDBmMDAwOC4uYTA1MDc5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCXNlbGVjdCBVU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCisJc2VsZWN0IE1FTU9SWV9IT1RQTFVHCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU29ueSBQUzMgZ2FtZSBjb25zb2xlCiAJICBhbmQgb3RoZXIgcGxhdGZvcm1zIHVzaW5nIHRoZSBQUzMgaHlwZXJ2aXNvci4KQEAgLTczLDE4ICs3NCwxMiBAQAogCiBjb25maWcgUFMzX1ZVQVJUCiAJZGVwZW5kcyBvbiBQUENfUFMzCi0JYm9vbCAiUFMzIFZpcnR1YWwgVUFSVCBzdXBwb3J0IiBpZiBQUzNfQURWQU5DRUQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQUzMgVmlydHVhbCBVQVJULgotCi0JICBUaGlzIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHNldmVyYWwgc3lzdGVtIHNlcnZpY2VzCi0JICBpbmNsdWRpbmcgdGhlIFN5c3RlbSBNYW5hZ2VyIGFuZCBBViBTZXR0aW5ncy4gIEluCi0JICBnZW5lcmFsLCBhbGwgdXNlcnMgd2lsbCBzYXkgWS4KKwl0cmlzdGF0ZQogCiBjb25maWcgUFMzX1BTM0FWCisJZGVwZW5kcyBvbiBQUENfUFMzCiAJdHJpc3RhdGUgIlBTMyBBViBzZXR0aW5ncyBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAotCWRlcGVuZHMgb24gUFMzX1ZVQVJUCisJc2VsZWN0IFBTM19WVUFSVAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBTMyBBViBTZXR0aW5ncyBkcml2ZXIuCkBAIC05MywxMyArODgsMTggQEAKIAkgIGdlbmVyYWwsIGFsbCB1c2VycyB3aWxsIHNheSBZIG9yIE0uCiAKIGNvbmZpZyBQUzNfU1lTX01BTkFHRVIKLQlib29sICJQUzMgU3lzdGVtIE1hbmFnZXIgZHJpdmVyIiBpZiBQUzNfQURWQU5DRUQKLQlkZXBlbmRzIG9uIFBTM19WVUFSVAotCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFBDX1BTMworCXRyaXN0YXRlICJQUzMgU3lzdGVtIE1hbmFnZXIgZHJpdmVyIiBpZiBQUzNfQURWQU5DRUQKKwlzZWxlY3QgUFMzX1ZVQVJUCisJZGVmYXVsdCBtCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFMzIFN5c3RlbSBNYW5hZ2VyLgogCiAJICBUaGlzIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHN5c3RlbSBjb250cm9sLiAgSW4KLQkgIGdlbmVyYWwsIGFsbCB1c2VycyB3aWxsIHNheSBZLgorCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkgb3IgTS4KKworY29uZmlnIFBTM19TVE9SQUdFCisJZGVwZW5kcyBvbiBQUENfUFMzCisJdHJpc3RhdGUKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQppbmRleCBhMDA0OGZjLi5hYzFiZGY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQpAQCAtNCwzICs0LDQgQEAKIAogb2JqLSQoQ09ORklHX1NNUCkgKz0gc21wLm8KIG9iai0kKENPTkZJR19TUFVfQkFTRSkgKz0gc3B1Lm8KK29iai15ICs9IGRldmljZS1pbml0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCkBAIC0wLDAgKzEsNzg1IEBACisvKgorICogIFBTMyBkZXZpY2UgcmVnaXN0cmF0aW9uIHJvdXRpbmVzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9wczNzdG9yLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKioKKyAqIHBzM19zZXR1cF9nZWxpY19kZXZpY2UgLSBTZXR1cCBhbmQgcmVnaXN0ZXIgYSBnZWxpYyBkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLCBpbml0aWFsaXNlcyB0aGUKKyAqIHN0cnVjdHVyZSBtZW1iZXJzLCBhbmQgcmVnaXN0ZXJzIHRoZSBkZXZpY2UgaW5zdGFuY2Ugd2l0aCB0aGUgc3lzdGVtIGJ1cy4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwczNfc2V0dXBfZ2VsaWNfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkX3JlZ2lvbjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTihyZXBvLT5idXNfdHlwZSAhPSBQUzNfQlVTX1RZUEVfU0IpOworCUJVR19PTihyZXBvLT5kZXZfdHlwZSAhPSBQUzNfREVWX1RZUEVfU0JfR0VMSUMpOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFsbG9jOworCX0KKworCXAtPmRldi5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9HRUxJQzsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfU0I7CisJcC0+ZGV2LmJ1c19pZCA9IHJlcG8tPmJ1c19pZDsKKwlwLT5kZXYuZGV2X2lkID0gcmVwby0+ZGV2X2lkOworCXAtPmRldi5kX3JlZ2lvbiA9ICZwLT5kX3JlZ2lvbjsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KHJlcG8sCisJCVBTM19JTlRFUlJVUFRfVFlQRV9FVkVOVF9QT1JULCAmcC0+ZGV2LmludGVycnVwdF9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZmluZF9pbnRlcnJ1cHQ7CisJfQorCisJQlVHX09OKHAtPmRldi5pbnRlcnJ1cHRfaWQgIT0gMCk7CisKKwlyZXN1bHQgPSBwczNfZG1hX3JlZ2lvbl9pbml0KCZwLT5kZXYsIHAtPmRldi5kX3JlZ2lvbiwgUFMzX0RNQV82NEssCisJCVBTM19ETUFfT1RIRVIsIE5VTEwsIDApOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX2RtYV9yZWdpb25faW5pdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZG1hX2luaXQ7CisJfQorCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX2RldmljZV9yZWdpc3RlcjoKK2ZhaWxfZG1hX2luaXQ6CitmYWlsX2ZpbmRfaW50ZXJydXB0OgorCWtmcmVlKHApOworZmFpbF9tYWxsb2M6CisJcHJfZGVidWcoIiA8LSAlczolZDogZmFpbC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXRfcmVmb2sgcHMzX3NldHVwX3VoY19kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywgZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCisJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50ZXJydXB0X3R5cGUsIGVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCQlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gZF9yZWdpb247CisJCXN0cnVjdCBwczNfbW1pb19yZWdpb24gbV9yZWdpb247CisJfSAqcDsKKwl1NjQgYnVzX2FkZHI7CisJdTY0IGxlbjsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlCVUdfT04ocmVwby0+YnVzX3R5cGUgIT0gUFMzX0JVU19UWVBFX1NCKTsKKwlCVUdfT04ocmVwby0+ZGV2X3R5cGUgIT0gUFMzX0RFVl9UWVBFX1NCX1VTQik7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxheW91dCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYWxsb2M7CisJfQorCisJcC0+ZGV2Lm1hdGNoX2lkID0gbWF0Y2hfaWQ7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX1NCOworCXAtPmRldi5idXNfaWQgPSByZXBvLT5idXNfaWQ7CisJcC0+ZGV2LmRldl9pZCA9IHJlcG8tPmRldl9pZDsKKwlwLT5kZXYuZF9yZWdpb24gPSAmcC0+ZF9yZWdpb247CisJcC0+ZGV2Lm1fcmVnaW9uID0gJnAtPm1fcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJaW50ZXJydXB0X3R5cGUsICZwLT5kZXYuaW50ZXJydXB0X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9maW5kX2ludGVycnVwdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhyZXBvLCByZWdfdHlwZSwKKwkJJmJ1c19hZGRyLCAmbGVuKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9maW5kX3JlZzsKKwl9CisKKwlyZXN1bHQgPSBwczNfZG1hX3JlZ2lvbl9pbml0KCZwLT5kZXYsIHAtPmRldi5kX3JlZ2lvbiwgUFMzX0RNQV82NEssCisJCVBTM19ETUFfSU5URVJOQUwsIE5VTEwsIDApOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX2RtYV9yZWdpb25faW5pdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZG1hX2luaXQ7CisJfQorCisJcmVzdWx0ID0gcHMzX21taW9fcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2Lm1fcmVnaW9uLCBidXNfYWRkciwgbGVuLAorCQlQUzNfTU1JT180Syk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfbW1pb19yZWdpb25faW5pdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfbW1pb19pbml0OworCX0KKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKKworZmFpbF9kZXZpY2VfcmVnaXN0ZXI6CitmYWlsX21taW9faW5pdDoKK2ZhaWxfZG1hX2luaXQ6CitmYWlsX2ZpbmRfcmVnOgorZmFpbF9maW5kX2ludGVycnVwdDoKKwlrZnJlZShwKTsKK2ZhaWxfbWFsbG9jOgorCXByX2RlYnVnKCIgPC0gJXM6JWQ6IGZhaWwuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF9laGNpX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCXJldHVybiBwczNfc2V0dXBfdWhjX2RldmljZShyZXBvLCBQUzNfTUFUQ0hfSURfRUhDSSwKKwkJUFMzX0lOVEVSUlVQVF9UWVBFX1NCX0VIQ0ksIFBTM19SRUdfVFlQRV9TQl9FSENJKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3NldHVwX29oY2lfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJcmV0dXJuIHBzM19zZXR1cF91aGNfZGV2aWNlKHJlcG8sIFBTM19NQVRDSF9JRF9PSENJLAorCQlQUzNfSU5URVJSVVBUX1RZUEVfU0JfT0hDSSwgUFMzX1JFR19UWVBFX1NCX09IQ0kpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkLAorCXVuc2lnbmVkIGludCBwb3J0X251bWJlcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZDogbWF0Y2hfaWQgJXUsIHBvcnQgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJbWF0Y2hfaWQsIHBvcnRfbnVtYmVyKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+ZGV2Lm1hdGNoX2lkID0gbWF0Y2hfaWQ7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX1ZVQVJUOworCXAtPmRldi5wb3J0X251bWJlciA9IHBvcnRfbnVtYmVyOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM3N0b3Jfd2FpdF9mb3JfY29tcGxldGlvbih1NjQgZGV2X2lkLCB1NjQgdGFnLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmVzdWx0ID0gLTE7CisJdW5zaWduZWQgaW50IHJldHJpZXMgPSAwOworCXU2NCBzdGF0dXM7CisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgdGltZW91dDsgcmV0cmllcysrKSB7CisJCXJlc3VsdCA9IGx2MV9zdG9yYWdlX2NoZWNrX2FzeW5jX3N0YXR1cyhkZXZfaWQsIHRhZywgJnN0YXR1cyk7CisJCWlmICghcmVzdWx0KQorCQkJYnJlYWs7CisKKwkJbXNsZWVwKDEpOworCX0KKworCWlmIChyZXN1bHQpCisJCXByX2RlYnVnKCIlczoldTogY2hlY2tfYXN5bmNfc3RhdHVzOiAlcywgc3RhdHVzICVseFxuIiwKKwkJCSBfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSwgc3RhdHVzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3N0b3JhZ2Vfd2FpdF9mb3JfZGV2aWNlIC0gV2FpdCBmb3IgYSBzdG9yYWdlIGRldmljZSB0byBiZWNvbWUgcmVhZHkuCisgKiBAcmVwbzogVGhlIHJlcG9zaXRvcnkgZGV2aWNlIHRvIHdhaXQgZm9yLgorICoKKyAqIFVzZXMgdGhlIGh5cGVydmlzb3IncyBzdG9yYWdlIGRldmljZSBub3RpZmljYXRpb24gbWVjaGFuaXNtIHRvIHdhaXQgdW50aWwKKyAqIGEgc3RvcmFnZSBkZXZpY2UgaXMgcmVhZHkuICBUaGUgZGV2aWNlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20gdXNlcyBhCisgKiBwc3VlZG8gZGV2aWNlIChpZCA9IC0xKSB0byBhc3luY2hyb25vdXNseSBub3RpZnkgdGhlIGd1ZXN0IHdoZW4gc3RvcmFnZQorICogZGV2aWNlcyBiZWNvbWUgcmVhZHkuICBUaGUgbm90aWZpY2F0aW9uIGRldmljZSBoYXMgYSBibG9jayBzaXplIG9mIDUxMgorICogYnl0ZXMuCisgKi8KKworc3RhdGljIGludCBwczNfc3RvcmFnZV93YWl0X2Zvcl9kZXZpY2UoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCWNvbnN0IHU2NCBub3RpZmljYXRpb25fZGV2X2lkID0gKHU2NCktMUxMOworCWNvbnN0IHVuc2lnbmVkIGludCB0aW1lb3V0ID0gSFo7CisJdTY0IGxwYXI7CisJdTY0IHRhZzsKKwlzdHJ1Y3QgeworCQl1NjQgb3BlcmF0aW9uX2NvZGU7CS8qIG11c3QgYmUgemVybyAqLworCQl1NjQgZXZlbnRfbWFzazsJCS8qIDEgPSBkZXZpY2UgcmVhZHkgKi8KKwl9ICpub3RpZnlfY21kOworCXN0cnVjdCB7CisJCXU2NCBldmVudF90eXBlOwkJLyogbm90aWZ5X2RldmljZV9yZWFkeSAqLworCQl1NjQgYnVzX2lkOworCQl1NjQgZGV2X2lkOworCQl1NjQgZGV2X3R5cGU7CisJCXU2NCBkZXZfcG9ydDsKKwl9ICpub3RpZnlfZXZlbnQ7CisJZW51bSB7CisJCW5vdGlmeV9kZXZpY2VfcmVhZHkgPSAxCisJfTsKKworCXByX2RlYnVnKCIgLT4gJXM6JXU6IGJ1c19pZCAldSwgZGV2X2lkICV1LCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sCisJCSBfX0xJTkVfXywgcmVwby0+YnVzX2lkLCByZXBvLT5kZXZfaWQsIHJlcG8tPmRldl90eXBlKTsKKworCW5vdGlmeV9jbWQgPSBremFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CisJbm90aWZ5X2V2ZW50ID0gKHZvaWQgKilub3RpZnlfY21kOworCWlmICghbm90aWZ5X2NtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlscGFyID0gcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKG5vdGlmeV9jbWQpKTsKKworCXJlc3VsdCA9IGx2MV9vcGVuX2RldmljZShyZXBvLT5idXNfaWQsIG5vdGlmaWNhdGlvbl9kZXZfaWQsIDApOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogbHYxX29wZW5fZGV2aWNlICVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZnJlZTsKKwl9CisKKwkvKiBTZXR1cCBhbmQgd3JpdGUgdGhlIHJlcXVlc3QgZm9yIGRldmljZSBub3RpZmljYXRpb24uICovCisKKwlub3RpZnlfY21kLT5vcGVyYXRpb25fY29kZSA9IDA7CS8qIG11c3QgYmUgemVybyAqLworCW5vdGlmeV9jbWQtPmV2ZW50X21hc2sgPSAweDAxOwkvKiBkZXZpY2UgcmVhZHkgKi8KKworCXJlc3VsdCA9IGx2MV9zdG9yYWdlX3dyaXRlKG5vdGlmaWNhdGlvbl9kZXZfaWQsIDAsIDAsIDEsIDAsIGxwYXIsCisJCQkJICAgJnRhZyk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiB3cml0ZSBmYWlsZWQgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJICAgICAgIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9jbG9zZTsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgd3JpdGUgY29tcGxldGlvbiAqLworCisJcmVzdWx0ID0gcHMzc3Rvcl93YWl0X2Zvcl9jb21wbGV0aW9uKG5vdGlmaWNhdGlvbl9kZXZfaWQsIHRhZywKKwkJCQkJICAgICB0aW1lb3V0KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIG5vdCBjb21wbGV0ZWQgJXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9jbG9zZTsKKwl9CisKKwkvKiBMb29wIGhlcmUgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdGVkIG5vdGlmaWNhdGlvbiBldmVudHMuICovCisKKwlyZXN1bHQgPSAtRU5PREVWOworCXdoaWxlICgxKSB7CisJCW1lbXNldChub3RpZnlfZXZlbnQsIDAsIHNpemVvZigqbm90aWZ5X2V2ZW50KSk7CisKKwkJcmVzdWx0ID0gbHYxX3N0b3JhZ2VfcmVhZChub3RpZmljYXRpb25fZGV2X2lkLCAwLCAwLCAxLCAwLAorCQkJCQkgIGxwYXIsICZ0YWcpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiB3cml0ZSBmYWlsZWQgJXNcbiIsIF9fZnVuY19fLAorCQkJICAgICAgIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXN1bHQgPSBwczNzdG9yX3dhaXRfZm9yX2NvbXBsZXRpb24obm90aWZpY2F0aW9uX2Rldl9pZCwgdGFnLAorCQkJCQkJICAgICB0aW1lb3V0KTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogcmVhZCBub3QgY29tcGxldGVkICVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZXZlbnRfdHlwZSAhPSBub3RpZnlfZGV2aWNlX3JlYWR5IHx8CisJCSAgICBub3RpZnlfZXZlbnQtPmJ1c19pZCAhPSByZXBvLT5idXNfaWQpIHsKKwkJCXByX2RlYnVnKCIlczoldTogYmFkIG5vdGlmeV9ldmVudDogZXZlbnQgJWx1LCAiCisJCQkJICJkZXZfaWQgJWx1LCBkZXZfdHlwZSAlbHVcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgbm90aWZ5X2V2ZW50LT5ldmVudF90eXBlLAorCQkJCSBub3RpZnlfZXZlbnQtPmRldl9pZCwgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChub3RpZnlfZXZlbnQtPmRldl9pZCA9PSByZXBvLT5kZXZfaWQgJiYKKwkJICAgIG5vdGlmeV9ldmVudC0+ZGV2X3R5cGUgPT0gcmVwby0+ZGV2X3R5cGUpIHsKKwkJCXByX2RlYnVnKCIlczoldTogZGV2aWNlIHJlYWR5OiBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAorCQkJCSBfX0xJTkVfXywgcmVwby0+ZGV2X2lkKTsKKwkJCXJlc3VsdCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChub3RpZnlfZXZlbnQtPmRldl9pZCA9PSByZXBvLT5kZXZfaWQgJiYKKwkJICAgIG5vdGlmeV9ldmVudC0+ZGV2X3R5cGUgPT0gUFMzX0RFVl9UWVBFX05PQUNDRVNTKSB7CisJCQlwcl9kZWJ1ZygiJXM6JXU6IG5vIGFjY2VzczogZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywKKwkJCQkgX19MSU5FX18sIHJlcG8tPmRldl9pZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworZmFpbF9jbG9zZToKKwlsdjFfY2xvc2VfZGV2aWNlKHJlcG8tPmJ1c19pZCwgbm90aWZpY2F0aW9uX2Rldl9pZCk7CitmYWlsX2ZyZWU6CisJa2ZyZWUobm90aWZ5X2NtZCk7CisJcHJfZGVidWcoIiA8LSAlczoldVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19zZXR1cF9zdG9yYWdlX2Rldihjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAorCQkJCSBlbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKnA7CisJdTY0IHBvcnQsIGJsa19zaXplLCBudW1fYmxvY2tzOworCXVuc2lnbmVkIGludCBudW1fcmVnaW9ucywgaTsKKworCXByX2RlYnVnKCIgLT4gJXM6JXU6IG1hdGNoX2lkICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1hdGNoX2lkKTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhyZXBvLT5idXNfaW5kZXgsCisJCQkJCQkgICByZXBvLT5kZXZfaW5kZXgsICZwb3J0LAorCQkJCQkJICAgJmJsa19zaXplLCAmbnVtX2Jsb2NrcywKKwkJCQkJCSAgICZudW1fcmVnaW9ucyk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiBfcmVhZF9zdG9yX2Rldl9pbmZvIGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJfZGVidWcoIiVzOiV1OiBpbmRleCAldToldTogcG9ydCAlbHUgYmxrX3NpemUgJWx1IG51bV9ibG9ja3MgJWx1ICIKKwkJICJudW1fcmVnaW9ucyAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsCisJCSByZXBvLT5kZXZfaW5kZXgsIHBvcnQsIGJsa19zaXplLCBudW1fYmxvY2tzLCBudW1fcmVnaW9ucyk7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSkgKworCQkgICAgbnVtX3JlZ2lvbnMgKiBzaXplb2Yoc3RydWN0IHBzM19zdG9yYWdlX3JlZ2lvbiksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21hbGxvYzsKKwl9CisKKwlwLT5zYmQubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5zYmQuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfU0I7CisJcC0+c2JkLmJ1c19pZCA9IHJlcG8tPmJ1c19pZDsKKwlwLT5zYmQuZGV2X2lkID0gcmVwby0+ZGV2X2lkOworCXAtPnNiZC5kX3JlZ2lvbiA9ICZwLT5kbWFfcmVnaW9uOworCXAtPmJsa19zaXplID0gYmxrX3NpemU7CisJcC0+bnVtX3JlZ2lvbnMgPSBudW1fcmVnaW9uczsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KHJlcG8sCisJCQkJCSAgICAgICBQUzNfSU5URVJSVVBUX1RZUEVfRVZFTlRfUE9SVCwKKwkJCQkJICAgICAgICZwLT5zYmQuaW50ZXJydXB0X2lkKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IGZpbmRfaW50ZXJydXB0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2ZpbmRfaW50ZXJydXB0OworCX0KKworCS8qIEZJWE1FOiBBcnJhbmdlIHRvIG9ubHkgZG8gdGhpcyBvbiBhICdjb2xkJyBib290ICovCisKKwlyZXN1bHQgPSBwczNfc3RvcmFnZV93YWl0X2Zvcl9kZXZpY2UocmVwbyk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiBzdG9yYWdlX25vdGlmaWNhdGlvbiBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9wcm9iZV9ub3RpZmljYXRpb247CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9yZWdpb25zOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGlkOworCQl1NjQgc3RhcnQsIHNpemU7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24ocmVwby0+YnVzX2luZGV4LAorCQkJCQkJCSAgICAgcmVwby0+ZGV2X2luZGV4LAorCQkJCQkJCSAgICAgaSwgJmlkLCAmc3RhcnQsCisJCQkJCQkJICAgICAmc2l6ZSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczoldTogcmVhZF9zdG9yX2Rldl9yZWdpb24gZmFpbGVkICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJCXJlc3VsdCA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWxfcmVhZF9yZWdpb247CisJCX0KKwkJcHJfZGVidWcoIiVzOiV1OiByZWdpb24gJXU6IGlkICV1IHN0YXJ0ICVsdSBzaXplICVsdVxuIiwKKwkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGksIGlkLCBzdGFydCwgc2l6ZSk7CisKKwkJcC0+cmVnaW9uc1tpXS5pZCA9IGlkOworCQlwLT5yZWdpb25zW2ldLnN0YXJ0ID0gc3RhcnQ7CisJCXAtPnJlZ2lvbnNbaV0uc2l6ZSA9IHNpemU7CisJfQorCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5zYmQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiV1IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RldmljZV9yZWdpc3RlcjsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworCitmYWlsX2RldmljZV9yZWdpc3RlcjoKK2ZhaWxfcmVhZF9yZWdpb246CitmYWlsX3Byb2JlX25vdGlmaWNhdGlvbjoKK2ZhaWxfZmluZF9pbnRlcnJ1cHQ6CisJa2ZyZWUocCk7CitmYWlsX21hbGxvYzoKKwlwcl9kZWJ1ZygiIDwtICVzOiV1OiBmYWlsLlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfdnVhcnRfZGV2aWNlcyh2b2lkKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfYXZfcG9ydCgmcG9ydF9udW1iZXIpOworCWlmIChyZXN1bHQpCisJCXBvcnRfbnVtYmVyID0gMDsgLyogYXYgZGVmYXVsdCAqLworCisJcmVzdWx0ID0gcHMzX3NldHVwX3Z1YXJ0X2RldmljZShQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsIHBvcnRfbnVtYmVyKTsKKwlXQVJOX09OKHJlc3VsdCk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KCZwb3J0X251bWJlcik7CisJaWYgKHJlc3VsdCkKKwkJcG9ydF9udW1iZXIgPSAyOyAvKiBzeXNtZ3IgZGVmYXVsdCAqLworCisJcmVzdWx0ID0gcHMzX3NldHVwX3Z1YXJ0X2RldmljZShQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVIsCisJCXBvcnRfbnVtYmVyKTsKKwlXQVJOX09OKHJlc3VsdCk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19yZWdpc3Rlcl9zb3VuZF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkX3JlZ2lvbjsKKwkJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiBtX3JlZ2lvbjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfU09VTkQ7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX0lPQzA7CisJcC0+ZGV2LmRfcmVnaW9uID0gJnAtPmRfcmVnaW9uOworCXAtPmRldi5tX3JlZ2lvbiA9ICZwLT5tX3JlZ2lvbjsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpCisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX2dyYXBoaWNzX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dSQVBISUNTOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9JT0MwOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19yZWdpc3Rlcl9yZXBvc2l0b3J5X2RldmljZSAtIFJlZ2lzdGVyIGEgZGV2aWNlIGZyb20gdGhlIHJlcG9zaXRpb3J5IGluZm8uCisgKgorICovCisKK3N0YXRpYyBpbnQgcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAocmVwby0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZfVFlQRV9TQl9HRUxJQzoKKwkJcmVzdWx0ID0gcHMzX3NldHVwX2dlbGljX2RldmljZShyZXBvKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19zZXR1cF9nZWxpY19kZXZpY2UgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWX1RZUEVfU0JfVVNCOgorCisJCS8qIEVhY2ggVVNCIGRldmljZSBoYXMgYm90aCBhbiBFSENJIGFuZCBhbiBPSENJIEhDICovCisKKwkJcmVzdWx0ID0gcHMzX3NldHVwX2VoY2lfZGV2aWNlKHJlcG8pOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfc2V0dXBfZWhjaV9kZXZpY2UgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCX0KKworCQlyZXN1bHQgPSBwczNfc2V0dXBfb2hjaV9kZXZpY2UocmVwbyk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19zZXR1cF9vaGNpX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX0RJU0s6CisJCXJlc3VsdCA9IHBzM19zZXR1cF9zdG9yYWdlX2RldihyZXBvLCBQUzNfTUFUQ0hfSURfU1RPUl9ESVNLKTsKKworCQkvKiBTb21lIGRldmljZXMgYXJlIG5vdCBhY2Nlc3NhYmxlIGZyb20gdGhlIE90aGVyIE9TIGxwYXIuICovCisJCWlmIChyZXN1bHQgPT0gLUVOT0RFVikgeworCQkJcmVzdWx0ID0gMDsKKwkJCXByX2RlYnVnKCIlczoldTogbm90IGFjY2Vzc2FibGVcbiIsIF9fZnVuY19fLAorCQkJCSBfX0xJTkVfXyk7CisJCX0KKworCQlpZiAocmVzdWx0KQorCQkJcHJfZGVidWcoIiVzOiV1IHBzM19zZXR1cF9zdG9yYWdlX2RldiBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWJyZWFrOworCisJY2FzZSBQUzNfREVWX1RZUEVfU1RPUl9ST006CisJCXJlc3VsdCA9IHBzM19zZXR1cF9zdG9yYWdlX2RldihyZXBvLCBQUzNfTUFUQ0hfSURfU1RPUl9ST00pOworCQlpZiAocmVzdWx0KQorCQkJcHJfZGVidWcoIiVzOiV1IHBzM19zZXR1cF9zdG9yYWdlX2RldiBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWJyZWFrOworCisJY2FzZSBQUzNfREVWX1RZUEVfU1RPUl9GTEFTSDoKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX0ZMQVNIKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXByX2RlYnVnKCIlczoldSBwczNfc2V0dXBfc3RvcmFnZV9kZXYgZmFpbGVkXG4iLAorCQkJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IDA7CisJCXByX2RlYnVnKCIlczoldTogdW5zdXBwb3J0ZWQgZGV2X3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXJlcG8tPmRldl90eXBlKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19wcm9iZV90aHJlYWQgLSBCYWNrZ3JvdW5kIHJlcG9zaXRvcnkgcHJvYmluZyBhdCBzeXN0ZW0gc3RhcnR1cC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgYmFja2dyb3VuZCBwcm9iaW5nIG9uIGEgc2luZ2xlIGJ1cy4KKyAqLworCitzdGF0aWMgaW50IHBzM19wcm9iZV90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvID0gZGF0YTsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBtcyA9IDI1MDsKKworCXByX2RlYnVnKCIgLT4gJXM6JXU6IGt0aHJlYWQgc3RhcnRlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWRvIHsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCisJCXByX2RlYnVnKCIlczoldTogcHJvYmluZy4uLlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCQlkbyB7CisJCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShyZXBvKTsKKworCQkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQkJCXByX2RlYnVnKCIlczoldTogbm90aGluZyBuZXdcbiIsIF9fZnVuY19fLAorCQkJCQlfX0xJTkVfXyk7CisJCQllbHNlIGlmIChyZXN1bHQpCisJCQkJcHJfZGVidWcoIiVzOiV1OiBmaW5kIGRldmljZSBlcnJvci5cbiIsCisJCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQllbHNlIHsKKwkJCQlwcl9kZWJ1ZygiJXM6JXU6IGZvdW5kIGRldmljZVxuIiwgX19mdW5jX18sCisJCQkJCV9fTElORV9fKTsKKwkJCQlwczNfcmVnaXN0ZXJfcmVwb3NpdG9yeV9kZXZpY2UocmVwbyk7CisJCQkJcHMzX3JlcG9zaXRvcnlfYnVtcF9kZXZpY2UocmVwbyk7CisJCQkJbXMgPSAyNTA7CisJCQl9CisJCX0gd2hpbGUgKCFyZXN1bHQpOworCisJCXByX2RlYnVnKCIlczoldTogbXMgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbXMpOworCisJCWlmICggbXMgPiA2MDAwMCkKKwkJCWJyZWFrOworCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKG1zKTsKKworCQkvKiBBbiBleHBvbmVudGlhbCBiYWNrb2ZmLiAqLworCQltcyA8PD0gMTsKKworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJcHJfZGVidWcoIiA8LSAlczoldToga3RocmVhZCBmaW5pc2hlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM19zdGFydF9wcm9iZV90aHJlYWQgLSBTdGFydHMgdGhlIGJhY2tncm91bmQgcHJvYmUgdGhyZWFkLgorICoKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwczNfc3RhcnRfcHJvYmVfdGhyZWFkKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0YXRpYyBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHJlcG87IC8qIG11c3QgYmUgc3RhdGljICovCisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJbWVtc2V0KCZyZXBvLCAwLCBzaXplb2YocmVwbykpOworCisJcmVwby5idXNfdHlwZSA9IGJ1c190eXBlOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9idXMocmVwby5idXNfdHlwZSwgMCwgJnJlcG8uYnVzX2luZGV4KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGZpbmQgYnVzICglZClcbiIsIF9fZnVuY19fLCByZXN1bHQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChyZXBvLmJ1c19pbmRleCwgJnJlcG8uYnVzX2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVhZF9idXNfaWQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCXJlc3VsdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXRhc2sgPSBrdGhyZWFkX3J1bihwczNfcHJvYmVfdGhyZWFkLCAmcmVwbywgInBzMy1wcm9iZS0ldSIsIGJ1c190eXBlKTsKKworCWlmIChJU19FUlIodGFzaykpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUih0YXNrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoga3RocmVhZF9ydW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwczNfcmVnaXN0ZXJfZGV2aWNlcyAtIFByb2JlIHRoZSBzeXN0ZW0gYW5kIHJlZ2lzdGVyIGRldmljZXMgZm91bmQuCisgKgorICogQSBkZXZpY2VfaW5pdGNhbGwoKSByb3V0aW5lLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19yZWdpc3Rlcl9kZXZpY2VzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJLyogcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbygpOyAqLworCisJcmVzdWx0ID0gcHMzX3N0YXJ0X3Byb2JlX3RocmVhZChQUzNfQlVTX1RZUEVfU1RPUkFHRSk7CisKKwlwczNfcmVnaXN0ZXJfdnVhcnRfZGV2aWNlcygpOworCisJcHMzX3JlZ2lzdGVyX2dyYXBoaWNzX2RldmljZXMoKTsKKworCXBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlcyhQUzNfQlVTX1RZUEVfU0IsCisJCXBzM19yZWdpc3Rlcl9yZXBvc2l0b3J5X2RldmljZSk7CisKKwlwczNfcmVnaXN0ZXJfc291bmRfZGV2aWNlcygpOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKK30KKworZGV2aWNlX2luaXRjYWxsKHBzM19yZWdpc3Rlcl9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYwppbmRleCBhMTQwOWU0Li41ZDJlMTc2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCkBAIC0yOSwxMiArMjksMTIgQEAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCiAjaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2RlZmluZSBEQkcgdWRiZ19wcmludGYKICNlbHNlCi0jZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZGVmaW5lIERCRyBwcl9kZWJ1ZwogI2VuZGlmCiAKLXN0YXRpYyBocHRlX3QgKmh0YWI7CitzdGF0aWMgc3RydWN0IGhhc2hfcHRlICpodGFiOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHRhYl9hZGRyOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKmJvbHR0YWI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqaW51c2V0YWI7CkBAIC00NCw4ICs0NCw4IEBACiAjZGVmaW5lIGRlYnVnX2R1bXBfaHB0ZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZykgXAogCV9kZWJ1Z19kdW1wX2hwdGUoX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9fZnVuY19fLCBfX0xJTkVfXykKIHN0YXRpYyB2b2lkIF9kZWJ1Z19kdW1wX2hwdGUodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyB2YSwKLQl1bnNpZ25lZCBsb25nIGdyb3VwLCB1bnNpZ25lZCBsb25nIGJpdG1hcCwgaHB0ZV90IGxocHRlLCBpbnQgcHNpemUsCi0JdW5zaWduZWQgbG9uZyBzbG90LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKKwl1bnNpZ25lZCBsb25nIGdyb3VwLCB1bnNpZ25lZCBsb25nIGJpdG1hcCwgc3RydWN0IGhhc2hfcHRlIGxocHRlLAorCWludCBwc2l6ZSwgdW5zaWduZWQgbG9uZyBzbG90LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAlEQkcoIiVzOiVkOiBwYSAgICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBwYSk7CiAJREJHKCIlczolZDogbHBhciAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwKQEAgLTYzLDcgKzYzLDcgQEAKIAl1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHJmbGFncywgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHNsb3Q7Ci0JaHB0ZV90IGxocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBsaHB0ZTsKIAlpbnQgc2Vjb25kYXJ5ID0gMDsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGJpdG1hcDsKQEAgLTIzNCwxMCArMjM0LDE3IEBACiAKIHN0YXRpYyB2b2lkIHBzM19ocHRlX2NsZWFyKHZvaWQpCiB7Ci0JLyogTWFrZSBzdXJlIHRvIGNsZWFuIHVwIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGZpcnN0ICovCi0JcHMzZmJfY2xlYW51cCgpOworCWludCByZXN1bHQ7CiAKLQlsdjFfdW5tYXBfaHRhYihodGFiX2FkZHIpOworCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gbHYxX3VubWFwX2h0YWIoaHRhYl9hZGRyKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXBzM19tbV9zaHV0ZG93bigpOworCXBzM19tbV92YXNfZGVzdHJveSgpOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CiAKIHZvaWQgX19pbml0IHBzM19ocHRlX2luaXQodW5zaWduZWQgbG9uZyBodGFiX3NpemUpCkBAIC0yNTUsNyArMjYyLDcgQEAKIAogCXBwYzY0X3BmdF9zaXplID0gX19pbG9nMihodGFiX3NpemUpOwogCi0JYml0bWFwX3NpemUgPSBodGFiX3NpemUgLyBzaXplb2YoaHB0ZV90KSAvIDg7CisJYml0bWFwX3NpemUgPSBodGFiX3NpemUgLyBzaXplb2Yoc3RydWN0IGhhc2hfcHRlKSAvIDg7CiAKIAlib2x0dGFiID0gX192YShsbWJfYWxsb2MoYml0bWFwX3NpemUsIDEpKTsKIAlpbnVzZXRhYiA9IF9fdmEobG1iX2FsbG9jKGJpdG1hcF9zaXplLCAxKSk7CkBAIC0yNzMsOCArMjgwLDggQEAKIAogCXJlc3VsdCA9IGx2MV9tYXBfaHRhYigwLCAmaHRhYl9hZGRyKTsKIAotCWh0YWIgPSAoaHB0ZV90ICopX19pb3JlbWFwKGh0YWJfYWRkciwgaHRhYl9zaXplLAotCQkJCSAgIHBncHJvdF92YWwoUEFHRV9SRUFET05MWV9YKSk7CisJaHRhYiA9IChfX2ZvcmNlIHN0cnVjdCBoYXNoX3B0ZSAqKWlvcmVtYXBfZmxhZ3MoaHRhYl9hZGRyLCBodGFiX3NpemUsCisJCQkJCSAgICBwZ3Byb3RfdmFsKFBBR0VfUkVBRE9OTFlfWCkpOwogCiAJREJHKCIlczolZDogbHBhciAlMDE2bHhoLCB2aXJ0ICUwMTZseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJaHRhYl9hZGRyLCAodW5zaWduZWQgbG9uZylodGFiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKaW5kZXggZWM5MDMwZC4uNjdlMzJlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKQEAgLTMwLDkgKzMwLDkgQEAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCiAjaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2RlZmluZSBEQkcgdWRiZ19wcmludGYKICNlbHNlCi0jZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZGVmaW5lIERCRyBwcl9kZWJ1ZwogI2VuZGlmCiAKIC8qKgpAQCAtNzgsMTkgKzc4LDg1IEBACiAvKioKICAqIHN0cnVjdCBwczNfcHJpdmF0ZSAtIGEgcGVyIGNwdSBkYXRhIHN0cnVjdHVyZQogICogQGJtcDogcHMzX2JtcCBzdHJ1Y3R1cmUKLSAqIEBub2RlOiBIViBsb2dpY2FsX3BwZV9pZAotICogQGNwdTogSFYgdGhyZWFkX2lkCisgKiBAcHBlX2lkOiBIViBsb2dpY2FsX3BwZV9pZAorICogQHRocmVhZF9pZDogSFYgdGhyZWFkX2lkCiAgKi8KIAogc3RydWN0IHBzM19wcml2YXRlIHsKIAlzdHJ1Y3QgcHMzX2JtcCBibXAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFBTM19CTVBfTUlOQUxJR04pKSk7Ci0JdTY0IG5vZGU7Ci0JdW5zaWduZWQgaW50IGNwdTsKKwl1NjQgcHBlX2lkOworCXU2NCB0aHJlYWRfaWQ7CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBzM19wcml2YXRlLCBwczNfcHJpdmF0ZSk7CiAKIC8qKgorICogcHMzX2NoaXBfbWFzayAtIFNldCBhbiBpbnRlcnJ1cHQgbWFzayBiaXQgaW4gcHMzX2JtcC4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBTZXRzIHBzM19ibXAubWFzayBhbmQgY2FsbHMgbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2soKS4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfY2hpcF9tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOiVkOiB0aHJlYWRfaWQgJWx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXBkLT50aHJlYWRfaWQsIHZpcnEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWNsZWFyX2JpdCg2MyAtIHZpcnEsICZwZC0+Ym1wLm1hc2spOworCWx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiBwczNfY2hpcF91bm1hc2sgLSBDbGVhciBhbiBpbnRlcnJ1cHQgbWFzayBiaXQgaW4gcHMzX2JtcC4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBDbGVhcnMgcHMzX2JtcC5tYXNrIGFuZCBjYWxscyBsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzaygpLgorICovCisKK3N0YXRpYyB2b2lkIHBzM19jaGlwX3VubWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlczolZDogdGhyZWFkX2lkICVsdSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwZC0+dGhyZWFkX2lkLCB2aXJxKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzZXRfYml0KDYzIC0gdmlycSwgJnBkLT5ibXAubWFzayk7CisJbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHBzM19jaGlwX2VvaSAtIEhWIGVuZC1vZi1pbnRlcnJ1cHQuCisgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCisgKgorICogQ2FsbHMgbHYxX2VuZF9vZl9pbnRlcnJ1cHRfZXh0KCkuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX2NoaXBfZW9pKHVuc2lnbmVkIGludCB2aXJxKQoreworCWNvbnN0IHN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKwlsdjFfZW5kX29mX2ludGVycnVwdF9leHQocGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgdmlycSk7Cit9CisKKy8qKgorICogcHMzX2lycV9jaGlwIC0gUmVwcmVzZW50cyB0aGUgcHMzX2JtcCBhcyBhIExpbnV4IHN0cnVjdCBpcnFfY2hpcC4KKyAqLworCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBzM19pcnFfY2hpcCA9IHsKKwkudHlwZW5hbWUgPSAicHMzIiwKKwkubWFzayA9IHBzM19jaGlwX21hc2ssCisJLnVubWFzayA9IHBzM19jaGlwX3VubWFzaywKKwkuZW9pID0gcHMzX2NoaXBfZW9pLAorfTsKKworLyoqCiAgKiBwczNfdmlycV9zZXR1cCAtIHZpcnEgcmVsYXRlZCBzZXR1cC4KICAqIEBjcHU6IGVudW0gcHMzX2NwdV9iaW5kaW5nIGluZGljYXRpbmcgdGhlIGNwdSB0aGUgaW50ZXJydXB0IHNob3VsZCBiZQogICogc2VydmljZWQgb24uCkBAIC0xMzQsNiArMjAwLDggQEAKIAkJZ290byBmYWlsX3NldDsKIAl9CiAKKwlwczNfY2hpcF9tYXNrKCp2aXJxKTsKKwogCXJldHVybiByZXN1bHQ7CiAKIGZhaWxfc2V0OgpAQCAtMTUzLDggKzIyMSw4IEBACiB7CiAJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwogCi0JcHJfZGVidWcoIiVzOiVkOiBub2RlICVsdSwgY3B1ICVkLCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCXBkLT5ub2RlLCBwZC0+Y3B1LCB2aXJxKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgcGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgdmlycSk7CiAKIAlzZXRfaXJxX2NoaXBfZGF0YSh2aXJxLCBOVUxMKTsKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKHZpcnEpOwpAQCAtMTkwLDcgKzI1OCw4IEBACiAKIAkvKiBCaW5kcyBvdXRsZXQgdG8gY3B1ICsgdmlycS4gKi8KIAotCXJlc3VsdCA9IGx2MV9jb25uZWN0X2lycV9wbHVnX2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgKnZpcnEsIG91dGxldCwgMCk7CisJcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsICp2aXJxLAorCQlvdXRsZXQsIDApOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9pbmZvKCIlczolZDogbHYxX2Nvbm5lY3RfaXJxX3BsdWdfZXh0IGZhaWxlZDogJXNcbiIsCkBAIC0yMjIsMTAgKzI5MSwxMiBAQAogCWludCByZXN1bHQ7CiAJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwogCi0JcHJfZGVidWcoIiVzOiVkOiBub2RlICVsdSwgY3B1ICVkLCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCXBkLT5ub2RlLCBwZC0+Y3B1LCB2aXJxKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgcGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgdmlycSk7CiAKLQlyZXN1bHQgPSBsdjFfZGlzY29ubmVjdF9pcnFfcGx1Z19leHQocGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwlyZXN1bHQgPSBsdjFfZGlzY29ubmVjdF9pcnFfcGx1Z19leHQocGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgdmlycSk7CiAKIAlpZiAocmVzdWx0KQogCQlwcl9pbmZvKCIlczolZDogbHYxX2Rpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0IGZhaWxlZDogJXNcbiIsCkBAIC0yODIsNyArMzUzLDkgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JcHJfZGVidWcoIiAtPiAlczolZCB2aXJxOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB2aXJxKTsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgdmlycSk7CisKKwlwczNfY2hpcF9tYXNrKHZpcnEpOwogCiAJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCh2aXJxX3RvX2h3KHZpcnEpKTsKIApAQCAtMjkwLDE3ICszNjMsMTQgQEAKIAkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQkvKiBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0KCkgZGVzdHJveXMgdGhlIElSUSBwbHVnLAotCSAqIHNvIGRvbid0IGNhbGwgcHMzX2lycV9wbHVnX2Rlc3Ryb3koKSBoZXJlLgorCS8qCisJICogRG9uJ3QgY2FsbCBwczNfdmlycV9kZXN0cm95KCkgaGVyZSBzaW5jZSBwczNfc21wX2NsZWFudXBfY3B1KCkKKwkgKiBjYWxscyBmcm9tIGludGVycnVwdCBjb250ZXh0IChzbXBfY2FsbF9mdW5jdGlvbikgd2hlbiBrZXhlY2luZy4KIAkgKi8KIAotCXJlc3VsdCA9IHBzM192aXJxX2Rlc3Ryb3kodmlycSk7Ci0JQlVHX09OKHJlc3VsdCk7Ci0KIAlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwczNfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3kpOwogCiBpbnQgcHMzX3NlbmRfZXZlbnRfbG9jYWxseSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKQEAgLTMxMSwxNyArMzgxLDE1IEBACiAgKiBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwIC0gU2V0dXAgYSBzeXN0ZW0gYnVzIGV2ZW50IHJlY2VpdmUgcG9ydC4KICAqIEBjcHU6IGVudW0gcHMzX2NwdV9iaW5kaW5nIGluZGljYXRpbmcgdGhlIGNwdSB0aGUgaW50ZXJydXB0IHNob3VsZCBiZQogICogc2VydmljZWQgb24uCi0gKiBAZGlkOiBUaGUgSFYgZGV2aWNlIGlkZW50aWZpZXIgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeS4KLSAqIEBpbnRlcnJ1cHRfaWQ6IFRoZSBkZXZpY2UgaW50ZXJydXB0IGlkIHJlYWQgZnJvbSB0aGUgc3lzdGVtIHJlcG9zaXRvcnkuCisgKiBAZGV2OiBUaGUgc3lzdGVtIGJ1cyBkZXZpY2UgaW5zdGFuY2UuCiAgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCiAgKgogICogQW4gZXZlbnQgaXJxIHJlcHJlc2VudHMgYSB2aXJ0dWFsIGRldmljZSBpbnRlcnJ1cHQuICBUaGUgaW50ZXJydXB0X2lkCiAgKiBjb3Jlc3BvbmRzIHRvIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgbnVtYmVyLgogICovCiAKLWludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKGVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwKLQljb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLCB1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLAotCXVuc2lnbmVkIGludCAqdmlycSkKK2ludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwllbnVtIHBzM19jcHVfYmluZGluZyBjcHUsIHVuc2lnbmVkIGludCAqdmlycSkKIHsKIAkvKiB0aGlzIHNob3VsZCBnbyBpbiBzeXN0ZW0tYnVzLmMgKi8KIApAQCAtMzMyLDggKzQwMCw4IEBACiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGlkLT5idXNfaWQsCi0JCWRpZC0+ZGV2X2lkLCB2aXJxX3RvX2h3KCp2aXJxKSwgaW50ZXJydXB0X2lkKTsKKwlyZXN1bHQgPSBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KGRldi0+YnVzX2lkLAorCQlkZXYtPmRldl9pZCwgdmlycV90b19odygqdmlycSksIGRldi0+aW50ZXJydXB0X2lkKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0IgpAQCAtMzQ1LDI0ICs0MTMsMjQgQEAKIAl9CiAKIAlwcl9kZWJ1ZygiJXM6JWQ6IGludGVycnVwdF9pZCAldSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlpbnRlcnJ1cHRfaWQsICp2aXJxKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaWQsICp2aXJxKTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKTsKIAotaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShjb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLAotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsIHVuc2lnbmVkIGludCB2aXJxKQoraW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJdW5zaWduZWQgaW50IHZpcnEpCiB7CiAJLyogdGhpcyBzaG91bGQgZ28gaW4gc3lzdGVtLWJ1cy5jICovCiAKIAlpbnQgcmVzdWx0OwogCiAJcHJfZGVidWcoIiAtPiAlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWludGVycnVwdF9pZCwgdmlycSk7CisJCWRldi0+aW50ZXJydXB0X2lkLCB2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGlkLT5idXNfaWQsCi0JCWRpZC0+ZGV2X2lkLCB2aXJxX3RvX2h3KHZpcnEpLCBpbnRlcnJ1cHRfaWQpOworCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGV2LT5idXNfaWQsCisJCWRldi0+ZGV2X2lkLCB2aXJxX3RvX2h3KHZpcnEpLCBkZXYtPmludGVycnVwdF9pZCk7CiAKIAlpZiAocmVzdWx0KQogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kaXNjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQiCkBAIC0zNzIsNiArNDQwLDE0IEBACiAJcmVzdWx0ID0gcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHZpcnEpOwogCUJVR19PTihyZXN1bHQpOwogCisJLyoKKwkgKiBwczNfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koKSBkZXN0cm95cyB0aGUgSVJRIHBsdWcsCisJICogc28gZG9uJ3QgY2FsbCBwczNfaXJxX3BsdWdfZGVzdHJveSgpIGhlcmUuCisJICovCisKKwlyZXN1bHQgPSBwczNfdmlycV9kZXN0cm95KHZpcnEpOworCUJVR19PTihyZXN1bHQpOworCiAJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNDEyLDE2ICs0ODgsMjQgQEAKIGludCBwczNfaW9faXJxX2Rlc3Ryb3kodW5zaWduZWQgaW50IHZpcnEpCiB7CiAJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG91dGxldCA9IHZpcnFfdG9faHcodmlycSk7CiAKLQlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfaW9faXJxX291dGxldCh2aXJxX3RvX2h3KHZpcnEpKTsKKwlwczNfY2hpcF9tYXNrKHZpcnEpOworCisJLyoKKwkgKiBsdjFfZGVzdHJ1Y3RfaW9faXJxX291dGxldCgpIHdpbGwgZGVzdHJveSB0aGUgSVJRIHBsdWcsCisJICogc28gY2FsbCBwczNfaXJxX3BsdWdfZGVzdHJveSgpIGZpcnN0LgorCSAqLworCisJcmVzdWx0ID0gcHMzX2lycV9wbHVnX2Rlc3Ryb3kodmlycSk7CisJQlVHX09OKHJlc3VsdCk7CisKKwlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfaW9faXJxX291dGxldChvdXRsZXQpOwogCiAJaWYgKHJlc3VsdCkKIAkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGVzdHJ1Y3RfaW9faXJxX291dGxldCBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwogCi0JcmVzdWx0ID0gcHMzX2lycV9wbHVnX2Rlc3Ryb3kodmlycSk7Ci0JQlVHX09OKHJlc3VsdCk7Ci0KIAlyZXR1cm4gcmVzdWx0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHMzX2lvX2lycV9kZXN0cm95KTsKQEAgLTQ2MSwxMSArNTQ1LDEzIEBACiAKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X2lycV9zZXR1cCk7CiAKIGludCBwczNfdnVhcnRfaXJxX2Rlc3Ryb3kodW5zaWduZWQgaW50IHZpcnEpCiB7CiAJaW50IHJlc3VsdDsKIAorCXBzM19jaGlwX21hc2sodmlycSk7CiAJcmVzdWx0ID0gbHYxX2RlY29uZmlndXJlX3ZpcnR1YWxfdWFydF9pcnEoKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTQ3OSw2ICs1NjUsNyBAQAogCiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9pcnFfZGVzdHJveSk7CiAKIC8qKgogICogcHMzX3NwZV9pcnFfc2V0dXAgLSBTZXR1cCBhbiBzcGUgdmlycS4KQEAgLTUxNCw5ICs2MDEsMTQgQEAKIAogaW50IHBzM19zcGVfaXJxX2Rlc3Ryb3kodW5zaWduZWQgaW50IHZpcnEpCiB7Ci0JaW50IHJlc3VsdCA9IHBzM19pcnFfcGx1Z19kZXN0cm95KHZpcnEpOworCWludCByZXN1bHQ7CisKKwlwczNfY2hpcF9tYXNrKHZpcnEpOworCisJcmVzdWx0ID0gcHMzX2lycV9wbHVnX2Rlc3Ryb3kodmlycSk7CiAJQlVHX09OKHJlc3VsdCk7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTUzMyw3ICs2MjUsNyBAQAogCQkqcCAmIDB4ZmZmZik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF8yNTZfYm1wKGNvbnN0IGNoYXIgKmhlYWRlciwKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wXzI1Nl9ibXAoY29uc3QgY2hhciAqaGVhZGVyLAogCWNvbnN0IHU2NCAqcCwgdW5zaWduZWQgY3B1LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6ICVzICV1IHslMDE2bHg6JTAxNmx4OiUwMTZseDolMDE2bHh9XG4iLApAQCAtNTQ2LDg2ICs2MzgsMjUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwotCV9kdW1wXzY0X2JtcCgic3RhdCIsICZwZC0+Ym1wLnN0YXR1cywgcGQtPmNwdSwgZnVuYywgbGluZSk7Ci0JX2R1bXBfNjRfYm1wKCJtYXNrIiwgJnBkLT5ibXAubWFzaywgcGQtPmNwdSwgZnVuYywgbGluZSk7CisJX2R1bXBfNjRfYm1wKCJzdGF0IiwgJnBkLT5ibXAuc3RhdHVzLCBwZC0+dGhyZWFkX2lkLCBmdW5jLCBsaW5lKTsKKwlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+dGhyZWFkX2lkLCBmdW5jLCBsaW5lKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKIH0KIAogI2RlZmluZSBkdW1wX21hc2soX3gpIF9kdW1wX21hc2soX3gsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF9tYXNrKHN0cnVjdCBwczNfcHJpdmF0ZSogcGQsCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF9tYXNrKHN0cnVjdCBwczNfcHJpdmF0ZSAqcGQsCiAJY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKLQlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKKwlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+dGhyZWFkX2lkLCBmdW5jLCBsaW5lKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBkdW1wX2JtcChzdHJ1Y3QgcHMzX3ByaXZhdGUqIHBkKSB7fTsKICNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKSAqLwogCi1zdGF0aWMgdm9pZCBwczNfY2hpcF9tYXNrKHVuc2lnbmVkIGludCB2aXJxKQotewotCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKLQl1NjQgYml0ID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKLQl1NjQgKnAgPSAmcGQtPmJtcC5tYXNrOwotCXU2NCBvbGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5jcHUsIHZpcnEpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWFzbSB2b2xhdGlsZSgKLQkJICAgICAiMToJbGRhcnggJTAsMCwlM1xuIgotCQkgICAgICJhbmRjCSUwLCUwLCUyXG4iCi0JCSAgICAgInN0ZGN4LgklMCwwLCUzXG4iCi0JCSAgICAgImJuZS0JMWIiCi0JCSAgICAgOiAiPSZyIiAob2xkKSwgIittIiAoKnApCi0JCSAgICAgOiAiciIgKGJpdCksICJyIiAocCkKLQkJICAgICA6ICJjYyIgKTsKLQotCWx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKHBkLT5ub2RlLCBwZC0+Y3B1KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBzM19jaGlwX3VubWFzayh1bnNpZ25lZCBpbnQgdmlycSkKLXsKLQlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7Ci0JdTY0IGJpdCA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMID4+IHZpcnE7Ci0JdTY0ICpwID0gJnBkLT5ibXAubWFzazsKLQl1NjQgb2xkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGNwdSAldSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwZC0+Y3B1LCB2aXJxKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlhc20gdm9sYXRpbGUoCi0JCSAgICAgIjE6CWxkYXJ4ICUwLDAsJTNcbiIKLQkJICAgICAib3IJJTAsJTAsJTJcbiIKLQkJICAgICAic3RkY3guCSUwLDAsJTNcbiIKLQkJICAgICAiYm5lLQkxYiIKLQkJICAgICA6ICI9JnIiIChvbGQpLCAiK20iICgqcCkKLQkJICAgICA6ICJyIiAoYml0KSwgInIiIChwKQotCQkgICAgIDogImNjIiApOwotCi0JbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPm5vZGUsIHBkLT5jcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHMzX2NoaXBfZW9pKHVuc2lnbmVkIGludCB2aXJxKQotewotCWNvbnN0IHN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKLQlsdjFfZW5kX29mX2ludGVycnVwdF9leHQocGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGlycV9jaGlwID0gewotCS50eXBlbmFtZSA9ICJwczMiLAotCS5tYXNrID0gcHMzX2NoaXBfbWFzaywKLQkudW5tYXNrID0gcHMzX2NoaXBfdW5tYXNrLAotCS5lb2kgPSBwczNfY2hpcF9lb2ksCi19OwotCiBzdGF0aWMgdm9pZCBwczNfaG9zdF91bm1hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxKQogewogCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwpAQCAtNjM3LDcgKzY2OCw3IEBACiAJcHJfZGVidWcoIiVzOiVkOiBod2lycSAlbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaHdpcnEsCiAJCXZpcnEpOwogCi0Jc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZpcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJnBzM19pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjU3LDcgKzY4OCw3IEBACiAJCWNwdSwgdmlycSwgcGQtPmJtcC5pcGlfZGVidWdfYnJrX21hc2spOwogfQogCi11bnNpZ25lZCBpbnQgcHMzX2dldF9pcnEodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHMzX2dldF9pcnEodm9pZCkKIHsKIAlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gJl9fZ2V0X2NwdV92YXIocHMzX3ByaXZhdGUpOwogCXU2NCB4ID0gKHBkLT5ibXAuc3RhdHVzICYgcGQtPmJtcC5tYXNrKTsKQEAgLTY3Miw4ICs3MDMsOCBAQAogCXBsdWcgJj0gMHgzZjsKIAogCWlmICh1bmxpa2VseShwbHVnKSA9PSBOT19JUlEpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBubyBwbHVnIGZvdW5kOiBjcHUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCXBkLT5jcHUpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IHRocmVhZF9pZCAlbHVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIHBkLT50aHJlYWRfaWQpOwogCQlkdW1wX2JtcCgmcGVyX2NwdShwczNfcHJpdmF0ZSwgMCkpOwogCQlkdW1wX2JtcCgmcGVyX2NwdShwczNfcHJpdmF0ZSwgMSkpOwogCQlyZXR1cm4gTk9fSVJROwpAQCAtNzAzLDE2ICs3MzQsMTYgQEAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSAmcGVyX2NwdShwczNfcHJpdmF0ZSwgY3B1KTsKIAotCQlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwZC0+bm9kZSk7Ci0JCXBkLT5jcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CisJCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBkLT5wcGVfaWQpOworCQlwZC0+dGhyZWFkX2lkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOwogCQlzcGluX2xvY2tfaW5pdCgmcGQtPmJtcC5sb2NrKTsKIAotCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIGJtcCAlbHhoXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCBwZC0+bm9kZSwgcGQtPmNwdSwKKwkJcHJfZGVidWcoIiVzOiVkOiBwcGVfaWQgJWx1LCB0aHJlYWRfaWQgJWx1LCBibXAgJWx4aFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwKIAkJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcCkpKTsKIAotCQlyZXN1bHQgPSBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAocGQtPm5vZGUsIHBkLT5jcHUsCi0JCQlwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXApKSk7CisJCXJlc3VsdCA9IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwZC0+cHBlX2lkLAorCQkJcGQtPnRocmVhZF9pZCwgcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKCZwZC0+Ym1wKSkpOwogCiAJCWlmIChyZXN1bHQpCiAJCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCBmYWlsZWQ6IgpAQCAtNzIyLDMgKzc1MywxNiBAQAogCiAJcHBjX21kLmdldF9pcnEgPSBwczNfZ2V0X2lycTsKIH0KKwordm9pZCBwczNfc2h1dGRvd25fSVJRKGludCBjcHUpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgcHBlX2lkOworCXU2NCB0aHJlYWRfaWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CisKKwlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOworCXJlc3VsdCA9IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwcGVfaWQsIHRocmVhZF9pZCwgMCk7CisKKwlEQkcoIiVzOiVkOiBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAgKCVsdTolbHUvJWQpICVzXG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18sIHBwZV9pZCwgdGhyZWFkX2lkLCBjcHUsIHBzM19yZXN1bHQocmVzdWx0KSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwppbmRleCBmOGEzZTIwLi43YmIzZTE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKQEAgLTMwLDkgKzMwLDkgQEAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCiAjaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2RlZmluZSBEQkcgdWRiZ19wcmludGYKICNlbHNlCi0jZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZGVmaW5lIERCRyBwcl9kZWJ1ZwogI2VuZGlmCiAKIGVudW0gewpAQCAtMTE1LDcgKzExNSw4IEBACiB9OwogCiAjZGVmaW5lIGRlYnVnX2R1bXBfbWFwKHgpIF9kZWJ1Z19kdW1wX21hcCh4LCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfZGVidWdfZHVtcF9tYXAoY29uc3Qgc3RydWN0IG1hcCogbSwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZGVidWdfZHVtcF9tYXAoY29uc3Qgc3RydWN0IG1hcCAqbSwKKwljb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKIAlEQkcoIiVzOiVkOiBtYXAudG90YWwgICAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgbS0+dG90YWwpOwogCURCRygiJXM6JWQ6IG1hcC5ybS5zaXplICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5ybS5zaXplKTsKQEAgLTIxMiw5ICsyMTMsMTUgQEAKIAogdm9pZCBwczNfbW1fdmFzX2Rlc3Ryb3kodm9pZCkKIHsKKwlpbnQgcmVzdWx0OworCisJREJHKCIlczolZDogbWFwLnZhc19pZCAgICA9ICVsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtYXAudmFzX2lkKTsKKwogCWlmIChtYXAudmFzX2lkKSB7Ci0JCWx2MV9zZWxlY3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKDApOwotCQlsdjFfZGVzdHJ1Y3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKG1hcC52YXNfaWQpOworCQlyZXN1bHQgPSBsdjFfc2VsZWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSgwKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UobWFwLnZhc19pZCk7CisJCUJVR19PTihyZXN1bHQpOwogCQltYXAudmFzX2lkID0gMDsKIAl9CiB9CkBAIC0yMzIsNyArMjM5LDcgQEAKICAqIEBzaXplIGlzIHJvdW5kZWQgZG93biB0byBhIG11bHRpcGxlIG9mIHRoZSB2YXMgbGFyZ2UgcGFnZSBzaXplLgogICovCiAKLWludCBwczNfbW1fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgbWVtX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBwczNfbW1fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgbWVtX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBtdWlkOwpAQCAtMjczLDEwICsyODAsMTQgQEAKICAqIEByOiBwb2ludGVyIHRvIHN0cnVjdCBtZW1fcmVnaW9uCiAgKi8KIAotdm9pZCBwczNfbW1fcmVnaW9uX2Rlc3Ryb3koc3RydWN0IG1lbV9yZWdpb24gKnIpCitzdGF0aWMgdm9pZCBwczNfbW1fcmVnaW9uX2Rlc3Ryb3koc3RydWN0IG1lbV9yZWdpb24gKnIpCiB7CisJaW50IHJlc3VsdDsKKworCURCRygiJXM6JWQ6IHItPmJhc2UgPSAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHItPmJhc2UpOwogCWlmIChyLT5iYXNlKSB7Ci0JCWx2MV9yZWxlYXNlX21lbW9yeShyLT5iYXNlKTsKKwkJcmVzdWx0ID0gbHYxX3JlbGVhc2VfbWVtb3J5KHItPmJhc2UpOworCQlCVUdfT04ocmVzdWx0KTsKIAkJci0+c2l6ZSA9IHItPmJhc2UgPSByLT5vZmZzZXQgPSAwOwogCQltYXAudG90YWwgPSBtYXAucm0uc2l6ZTsKIAl9CkBAIC0zMjksMzEgKzM0MCwzNCBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoqCi0gKiBkbWFfbHBhcl90b19idXMgLSBUcmFuc2xhdGUgYW4gbHBhciBhZGRyZXNzIHRvIGlvYyBtYXBwZWQgYnVzIGFkZHJlc3MuCisgKiBkbWFfc2JfbHBhcl90b19idXMgLSBUcmFuc2xhdGUgYW4gbHBhciBhZGRyZXNzIHRvIGlvYyBtYXBwZWQgYnVzIGFkZHJlc3MuCiAgKiBAcjogcG9pbnRlciB0byBkbWEgcmVnaW9uIHN0cnVjdHVyZQogICogQGxwYXJfYWRkcjogSFYgbHBhciBhZGRyZXNzCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX2xwYXJfdG9fYnVzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9zYl9scGFyX3RvX2J1cyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCiAJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIpCiB7Ci0JQlVHX09OKGxwYXJfYWRkciA+PSBtYXAucjEuYmFzZSArIG1hcC5yMS5zaXplKTsKLQlyZXR1cm4gci0+YnVzX2FkZHIgKyAobHBhcl9hZGRyIDw9IG1hcC5ybS5zaXplID8gbHBhcl9hZGRyCi0JCTogbHBhcl9hZGRyIC0gbWFwLnIxLm9mZnNldCk7CisJaWYgKGxwYXJfYWRkciA+PSBtYXAucm0uc2l6ZSkKKwkJbHBhcl9hZGRyIC09IG1hcC5yMS5vZmZzZXQ7CisJQlVHX09OKGxwYXJfYWRkciA8IHItPm9mZnNldCk7CisJQlVHX09OKGxwYXJfYWRkciA+PSByLT5vZmZzZXQgKyByLT5sZW4pOworCXJldHVybiByLT5idXNfYWRkciArIGxwYXJfYWRkciAtIHItPm9mZnNldDsKIH0KIAogI2RlZmluZSBkbWFfZHVtcF9yZWdpb24oX2EpIF9kbWFfZHVtcF9yZWdpb24oX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kbWFfZHVtcF9yZWdpb24oY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCBjb25zdCBjaGFyKiBmdW5jLAotCWludCBsaW5lKQorc3RhdGljIHZvaWQgIF9fbWF5YmVfdW51c2VkIF9kbWFfZHVtcF9yZWdpb24oY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorCWNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewotCURCRygiJXM6JWQ6IGRldiAgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsIHItPmRpZC5idXNfaWQsCi0JCXItPmRpZC5kZXZfaWQpOworCURCRygiJXM6JWQ6IGRldiAgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsIHItPmRldi0+YnVzX2lkLAorCQlyLT5kZXYtPmRldl9pZCk7CiAJREJHKCIlczolZDogcGFnZV9zaXplICAldVxuIiwgZnVuYywgbGluZSwgci0+cGFnZV9zaXplKTsKIAlEQkcoIiVzOiVkOiBidXNfYWRkciAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmJ1c19hZGRyKTsKIAlEQkcoIiVzOiVkOiBsZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmxlbik7CisJREJHKCIlczolZDogb2Zmc2V0ICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5vZmZzZXQpOwogfQogCi0vKioKKyAgLyoqCiAgKiBkbWFfY2h1bmsgLSBBIGNodW5rIG9mIGRtYSBwYWdlcyBtYXBwZWQgYnkgdGhlIGlvIGNvbnRyb2xsZXIuCiAgKiBAcmVnaW9uIC0gVGhlIGRtYSByZWdpb24gdGhhdCBvd25zIHRoaXMgY2h1bmsuCiAgKiBAbHBhcl9hZGRyOiBTdGFydGluZyBscGFyIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtMzgxLDEwICszOTUsMTEgQEAKIAlpbnQgbGluZSkKIHsKIAlEQkcoIiVzOiVkOiByLmRldiAgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsCi0JCWMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwgYy0+cmVnaW9uLT5kaWQuZGV2X2lkKTsKKwkJYy0+cmVnaW9uLT5kZXYtPmJ1c19pZCwgYy0+cmVnaW9uLT5kZXYtPmRldl9pZCk7CiAJREJHKCIlczolZDogci5idXNfYWRkciAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+YnVzX2FkZHIpOwogCURCRygiJXM6JWQ6IHIucGFnZV9zaXplICAldVxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5wYWdlX3NpemUpOwogCURCRygiJXM6JWQ6IHIubGVuICAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPmxlbik7CisJREJHKCIlczolZDogci5vZmZzZXQgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+b2Zmc2V0KTsKIAlEQkcoIiVzOiVkOiBjLmxwYXJfYWRkciAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+bHBhcl9hZGRyKTsKIAlEQkcoIiVzOiVkOiBjLmJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+YnVzX2FkZHIpOwogCURCRygiJXM6JWQ6IGMubGVuICAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5sZW4pOwpAQCAtMzk1LDM5ICs0MTAsNjggQEAKIHsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwogCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9idXMgPSBfQUxJR05fRE9XTihidXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4rYnVzX2FkZHItYWxpZ25lZF9idXMsCisJCQkJCSAgICAgIDEgPDwgci0+cGFnZV9zaXplKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJnItPmNodW5rX2xpc3QuaGVhZCwgbGluaykgewogCQkvKiBpbnRlcnNlY3Rpb24gKi8KLQkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyCi0JCQkmJiBhbGlnbmVkX2J1cyA8IGMtPmJ1c19hZGRyICsgYy0+bGVuCi0JCQkmJiBhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyICsgYy0+bGVuKSB7CisJCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkciAmJgorCQkgICAgYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkciArIGMtPmxlbikKIAkJCXJldHVybiBjOwotCQl9CisKIAkJLyogYmVsb3cgKi8KLQkJaWYgKGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIpIHsKKwkJaWYgKGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIpCiAJCQljb250aW51ZTsKLQkJfQorCiAJCS8qIGFib3ZlICovCi0JCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkciArIGMtPmxlbikgeworCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pCiAJCQljb250aW51ZTsKLQkJfQogCiAJCS8qIHdlIGRvbid0IGhhbmRsZSB0aGUgbXVsdGktY2h1bmsgY2FzZSBmb3Igbm93ICovCi0KIAkJZG1hX2R1bXBfY2h1bmsoYyk7CiAJCUJVRygpOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBkbWFfZnJlZV9jaHVuayhzdHJ1Y3QgZG1hX2NodW5rICpjKQorc3RhdGljIHN0cnVjdCBkbWFfY2h1bmsgKmRtYV9maW5kX2NodW5rX2xwYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9scGFyID0gX0FMSUdOX0RPV04obHBhcl9hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4gKyBscGFyX2FkZHIgLSBhbGlnbmVkX2xwYXIsCisJCQkJCSAgICAgIDEgPDwgci0+cGFnZV9zaXplKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJnItPmNodW5rX2xpc3QuaGVhZCwgbGluaykgeworCQkvKiBpbnRlcnNlY3Rpb24gKi8KKwkJaWYgKGMtPmxwYXJfYWRkciA8PSBhbGlnbmVkX2xwYXIgJiYKKwkJICAgIGFsaWduZWRfbHBhciA8IGMtPmxwYXJfYWRkciArIGMtPmxlbikgeworCQkJaWYgKGFsaWduZWRfbHBhciArIGFsaWduZWRfbGVuIDw9IGMtPmxwYXJfYWRkciArIGMtPmxlbikKKwkJCQlyZXR1cm4gYzsKKwkJCWVsc2UgeworCQkJCWRtYV9kdW1wX2NodW5rKGMpOworCQkJCUJVRygpOworCQkJfQorCQl9CisJCS8qIGJlbG93ICovCisJCWlmIChhbGlnbmVkX2xwYXIgKyBhbGlnbmVkX2xlbiA8PSBjLT5scGFyX2FkZHIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGFib3ZlICovCisJCWlmIChjLT5scGFyX2FkZHIgKyBjLT5sZW4gPD0gYWxpZ25lZF9scGFyKSB7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBkbWFfc2JfZnJlZV9jaHVuayhzdHJ1Y3QgZG1hX2NodW5rICpjKQogewogCWludCByZXN1bHQgPSAwOwogCiAJaWYgKGMtPmJ1c19hZGRyKSB7Ci0JCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRpZC5idXNfaWQsCi0JCQljLT5yZWdpb24tPmRpZC5kZXZfaWQsIGMtPmJ1c19hZGRyLCBjLT5sZW4pOworCQlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX2RtYV9yZWdpb24oYy0+cmVnaW9uLT5kZXYtPmJ1c19pZCwKKwkJCWMtPnJlZ2lvbi0+ZGV2LT5kZXZfaWQsIGMtPmJ1c19hZGRyLCBjLT5sZW4pOwogCQlCVUdfT04ocmVzdWx0KTsKIAl9CiAKQEAgLTQzNSw4ICs0NzksMzkgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX2ZyZWVfY2h1bmsoc3RydWN0IGRtYV9jaHVuayAqYykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgaW9wYWdlOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciA9IGMtPnJlZ2lvbjsKKworCURCRygiJXM6c3RhcnRcbiIsIF9fZnVuY19fKTsKKwlmb3IgKGlvcGFnZSA9IDA7IGlvcGFnZSA8IChjLT5sZW4gPj4gci0+cGFnZV9zaXplKTsgaW9wYWdlKyspIHsKKwkJb2Zmc2V0ID0gKDEgPDwgci0+cGFnZV9zaXplKSAqIGlvcGFnZTsKKwkJLyogcHV0IElOVkFMSUQgZW50cnkgKi8KKwkJcmVzdWx0ID0gbHYxX3B1dF9pb3B0ZSgwLAorCQkJCSAgICAgICBjLT5idXNfYWRkciArIG9mZnNldCwKKwkJCQkgICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICByLT5pb2lkLAorCQkJCSAgICAgICAwKTsKKwkJREJHKCIlczogYnVzPSUjbHgsIGxwYXI9JSNseCwgaW9pZD0lZFxuIiwgX19mdW5jX18sCisJCSAgICBjLT5idXNfYWRkciArIG9mZnNldCwKKwkJICAgIGMtPmxwYXJfYWRkciArIG9mZnNldCwKKwkJICAgIHItPmlvaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCURCRygiJXM6JWQ6IGx2MV9wdXRfaW9wdGUgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQkgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCX0KKwl9CisJa2ZyZWUoYyk7CisJREJHKCIlczplbmRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKLSAqIGRtYV9tYXBfcGFnZXMgLSBNYXBzIGRtYSBwYWdlcyBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGJ1cyBhZGRyZXNzIHNwYWNlLgorICogZG1hX3NiX21hcF9wYWdlcyAtIE1hcHMgZG1hIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqIEBwaHlzX2FkZHI6IFN0YXJ0aW5nIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KQEAgLTQ0Niw4ICs1MjEsOCBAQAogICogbWFrZSB0aGUgSFYgY2FsbCB0byBhZGQgdGhlIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYWRkcmVzcyBzcGFjZS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9tYXBfcGFnZXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IGRtYV9jaHVuayAqKmNfb3V0KQorc3RhdGljIGludCBkbWFfc2JfbWFwX3BhZ2VzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgZG1hX2NodW5rICoqY19vdXQsIHU2NCBpb3B0ZV9mbGFnKQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IGRtYV9jaHVuayAqYzsKQEAgLTQ2MSwxMyArNTM2LDEzIEBACiAKIAljLT5yZWdpb24gPSByOwogCWMtPmxwYXJfYWRkciA9IHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKTsKLQljLT5idXNfYWRkciA9IGRtYV9scGFyX3RvX2J1cyhyLCBjLT5scGFyX2FkZHIpOworCWMtPmJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIGMtPmxwYXJfYWRkcik7CiAJYy0+bGVuID0gbGVuOwogCi0JcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRpZC5idXNfaWQsCi0JCWMtPnJlZ2lvbi0+ZGlkLmRldl9pZCwgYy0+bHBhcl9hZGRyLCBjLT5idXNfYWRkciwgYy0+bGVuLAotCQkweGY4MDAwMDAwMDAwMDAwMDBVTCk7Ci0KKwlCVUdfT04oaW9wdGVfZmxhZyAhPSAweGY4MDAwMDAwMDAwMDAwMDBVTCk7CisJcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRldi0+YnVzX2lkLAorCQkJCQkgICBjLT5yZWdpb24tPmRldi0+ZGV2X2lkLCBjLT5scGFyX2FkZHIsCisJCQkJCSAgIGMtPmJ1c19hZGRyLCBjLT5sZW4sIGlvcHRlX2ZsYWcpOwogCWlmIChyZXN1bHQpIHsKIAkJREJHKCIlczolZDogbHYxX21hcF9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwpAQCAtNDg3LDI2ICs1NjIsMTIwIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBkbWFfaW9jMF9tYXBfcGFnZXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgZG1hX2NodW5rICoqY19vdXQsCisJCQkgICAgICB1NjQgaW9wdGVfZmxhZykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkbWFfY2h1bmsgKmMsICpsYXN0OworCWludCBpb3BhZ2UsIHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJREJHKEtFUk5fRVJSICIlczogcGh5PSUjbHgsIGxwYXIlI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJICAgIHBoeXNfYWRkciwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpLCBsZW4pOworCWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX2NodW5rKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWMpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCWMtPnJlZ2lvbiA9IHI7CisJYy0+bGVuID0gbGVuOworCWMtPmxwYXJfYWRkciA9IHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKTsKKwkvKiBhbGxvY2F0ZSBJTyBhZGRyZXNzICovCisJaWYgKGxpc3RfZW1wdHkoJnItPmNodW5rX2xpc3QuaGVhZCkpIHsKKwkJLyogZmlyc3Qgb25lICovCisJCWMtPmJ1c19hZGRyID0gci0+YnVzX2FkZHI7CisJfSBlbHNlIHsKKwkJLyogZGVyaXZlIGZyb20gbGFzdCBidXMgYWRkciovCisJCWxhc3QgID0gbGlzdF9lbnRyeShyLT5jaHVua19saXN0LmhlYWQubmV4dCwKKwkJCQkgICBzdHJ1Y3QgZG1hX2NodW5rLCBsaW5rKTsKKwkJYy0+YnVzX2FkZHIgPSBsYXN0LT5idXNfYWRkciArIGxhc3QtPmxlbjsKKwkJREJHKCIlczogbGFzdCBidXM9JSNseCwgbGVuPSUjbHhcbiIsIF9fZnVuY19fLAorCQkgICAgbGFzdC0+YnVzX2FkZHIsIGxhc3QtPmxlbik7CisJfQorCisJLyogRklYTUU6IGNoZWNrIHdoZXRoZXIgbGVuZ3RoIGV4Y2VlZHMgcmVnaW9uIHNpemUgKi8KKworCS8qIGJ1aWxkIGlvcHRlcyBmb3IgdGhlIGFyZWEgKi8KKwlwYWdlcyA9IGxlbiA+PiByLT5wYWdlX3NpemU7CisJREJHKCIlczogcGdzaXplPSUjeCBsZW49JSNseCBwYWdlcz0lI3ggaW9wdGVmbGFnPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICByLT5wYWdlX3NpemUsIHItPmxlbiwgcGFnZXMsIGlvcHRlX2ZsYWcpOworCWZvciAoaW9wYWdlID0gMDsgaW9wYWdlIDwgcGFnZXM7IGlvcGFnZSsrKSB7CisJCW9mZnNldCA9ICgxIDw8IHItPnBhZ2Vfc2l6ZSkgKiBpb3BhZ2U7CisJCXJlc3VsdCA9IGx2MV9wdXRfaW9wdGUoMCwKKwkJCQkgICAgICAgYy0+YnVzX2FkZHIgKyBvZmZzZXQsCisJCQkJICAgICAgIGMtPmxwYXJfYWRkciArIG9mZnNldCwKKwkJCQkgICAgICAgci0+aW9pZCwKKwkJCQkgICAgICAgaW9wdGVfZmxhZyk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkOiBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uICIKKwkJCQkiZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlnb3RvIGZhaWxfbWFwOworCQl9CisJCURCRygiJXM6IHBnPSVkIGJ1cz0lI2x4LCBscGFyPSUjbHgsIGlvaWQ9JSN4XG4iLCBfX2Z1bmNfXywKKwkJICAgIGlvcGFnZSwgYy0+YnVzX2FkZHIgKyBvZmZzZXQsIGMtPmxwYXJfYWRkciArIG9mZnNldCwKKwkJICAgIHItPmlvaWQpOworCX0KKworCS8qIGJlIHN1cmUgdGhhdCBsYXN0IGFsbG9jYXRlZCBvbmUgaXMgaW5zZXJ0ZWQgYXQgaGVhZCAqLworCWxpc3RfYWRkKCZjLT5saW5rLCAmci0+Y2h1bmtfbGlzdC5oZWFkKTsKKworCSpjX291dCA9IGM7CisJREJHKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfbWFwOgorCWZvciAoaW9wYWdlLS07IDAgPD0gaW9wYWdlOyBpb3BhZ2UtLSkgeworCQlsdjFfcHV0X2lvcHRlKDAsCisJCQkgICAgICBjLT5idXNfYWRkciArIG9mZnNldCwKKwkJCSAgICAgIGMtPmxwYXJfYWRkciArIG9mZnNldCwKKwkJCSAgICAgIHItPmlvaWQsCisJCQkgICAgICAwKTsKKwl9CisJa2ZyZWUoYyk7CitmYWlsX2FsbG9jOgorCSpjX291dCA9IE5VTEw7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCi0gKiBkbWFfcmVnaW9uX2NyZWF0ZSAtIENyZWF0ZSBhIGRldmljZSBkbWEgcmVnaW9uLgorICogZG1hX3NiX3JlZ2lvbl9jcmVhdGUgLSBDcmVhdGUgYSBkZXZpY2UgZG1hIHJlZ2lvbi4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICoKICAqIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCBkbWEgcmVnaW9uIGNyZWF0ZSByb3V0aW5lLCBhbmQgaXMgdGhlIG9uZSB0aGF0CiAgKiB3aWxsIG1ha2UgdGhlIEhWIGNhbGwgdG8gY3JlYXRlIHRoZSByZWdpb24uCiAgKi8KIAotc3RhdGljIGludCBkbWFfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24qIHIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwogCi0Jci0+bGVuID0gX0FMSUdOX1VQKG1hcC50b3RhbCwgMSA8PCByLT5wYWdlX3NpemUpOworCXByX2luZm8oIiAtPiAlczolZDpcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlCVUdfT04oIXIpOworCisJaWYgKCFyLT5kZXYtPmJ1c19pZCkgeworCQlwcl9pbmZvKCIlczolZDogJXU6JXUgbm8gZG1hXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEQkcoIiVzOiV1OiBsZW4gPSAweCVseCwgcGFnZV9zaXplID0gJXUsIG9mZnNldCA9IDB4JWx4XG4iLCBfX2Z1bmNfXywKKwkgICAgX19MSU5FX18sIHItPmxlbiwgci0+cGFnZV9zaXplLCByLT5vZmZzZXQpOworCisJQlVHX09OKCFyLT5sZW4pOworCUJVR19PTighci0+cGFnZV9zaXplKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMpOworCiAJSU5JVF9MSVNUX0hFQUQoJnItPmNodW5rX2xpc3QuaGVhZCk7CiAJc3Bpbl9sb2NrX2luaXQoJnItPmNodW5rX2xpc3QubG9jayk7CiAKLQlyZXN1bHQgPSBsdjFfYWxsb2NhdGVfZGV2aWNlX2RtYV9yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKLQkJci0+bGVuLCByLT5wYWdlX3NpemUsIHItPnJlZ2lvbl90eXBlLCAmci0+YnVzX2FkZHIpOwotCi0JZG1hX2R1bXBfcmVnaW9uKHIpOworCXJlc3VsdCA9IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCisJCXJvdW5kdXBfcG93X29mX3R3byhyLT5sZW4pLCByLT5wYWdlX3NpemUsIHItPnJlZ2lvbl90eXBlLAorCQkmci0+YnVzX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkgewogCQlEQkcoIiVzOiVkOiBsdjFfYWxsb2NhdGVfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKQEAgLTUxNyw2ICs2ODYsMjcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQoreworCWludCByZXN1bHQ7CisKKwlJTklUX0xJU1RfSEVBRCgmci0+Y2h1bmtfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmci0+Y2h1bmtfbGlzdC5sb2NrKTsKKworCXJlc3VsdCA9IGx2MV9hbGxvY2F0ZV9pb19zZWdtZW50KDAsCisJCQkJCSByLT5sZW4sCisJCQkJCSByLT5wYWdlX3NpemUsCisJCQkJCSAmci0+YnVzX2FkZHIpOworCWlmIChyZXN1bHQpIHsKKwkJREJHKCIlczolZDogbHYxX2FsbG9jYXRlX2lvX3NlZ21lbnQgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJci0+bGVuID0gci0+YnVzX2FkZHIgPSAwOworCX0KKwlEQkcoIiVzOiBsZW49JSNseCwgcGc9JWQsIGJ1cz0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgci0+bGVuLCByLT5wYWdlX3NpemUsIHItPmJ1c19hZGRyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKICAqIGRtYV9yZWdpb25fZnJlZSAtIEZyZWUgYSBkZXZpY2UgZG1hIHJlZ2lvbi4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgpAQCAtNTI1LDMxICs3MTUsNjIgQEAKICAqIHdpbGwgbWFrZSB0aGUgSFYgY2FsbCB0byBmcmVlIHRoZSByZWdpb24uCiAgKi8KIAotc3RhdGljIGludCBkbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uKiByKQorc3RhdGljIGludCBkbWFfc2JfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IGRtYV9jaHVuayAqYzsKIAlzdHJ1Y3QgZG1hX2NodW5rICp0bXA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7Ci0JCWxpc3RfZGVsKCZjLT5saW5rKTsKLQkJZG1hX2ZyZWVfY2h1bmsoYyk7CisJQlVHX09OKCFyKTsKKworCWlmICghci0+ZGV2LT5idXNfaWQpIHsKKwkJcHJfaW5mbygiJXM6JWQ6ICV1OiV1IG5vIGRtYVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkKTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JcmVzdWx0ID0gbHYxX2ZyZWVfZGV2aWNlX2RtYV9yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CisJCWxpc3RfZGVsKCZjLT5saW5rKTsKKwkJZG1hX3NiX2ZyZWVfY2h1bmsoYyk7CisJfQorCisJcmVzdWx0ID0gbHYxX2ZyZWVfZGV2aWNlX2RtYV9yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5idXNfYWRkcik7CiAKIAlpZiAocmVzdWx0KQogCQlEQkcoIiVzOiVkOiBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwogCi0Jci0+bGVuID0gci0+YnVzX2FkZHIgPSAwOworCXItPmJ1c19hZGRyID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lvYzBfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRtYV9jaHVuayAqYywgKm47CisKKwlEQkcoIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCBuLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CisJCWxpc3RfZGVsKCZjLT5saW5rKTsKKwkJZG1hX2lvYzBfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfcmVsZWFzZV9pb19zZWdtZW50KDAsIHItPmJ1c19hZGRyKTsKKworCWlmIChyZXN1bHQpCisJCURCRygiJXM6JWQ6IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisKKwlyLT5idXNfYWRkciA9IDA7CisJREJHKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKioKLSAqIGRtYV9tYXBfYXJlYSAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBkbWFfc2JfbWFwX2FyZWEgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAdmlydF9hZGRyOiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KQEAgLTU1OSwxNiArNzgwLDE5IEBACiAgKiBUaGlzIGlzIHRoZSBjb21tb24gZG1hIG1hcHBpbmcgcm91dGluZS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3N0YXRpYyBpbnQgZG1hX3NiX21hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCisJICAgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCSAgIHU2NCBpb3B0ZV9mbGFnKQogewogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwogCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gaXNfa2VybmVsX2FkZHIodmlydF9hZGRyKSA/IF9fcGEodmlydF9hZGRyKQogCQk6IHZpcnRfYWRkcjsKLQotCSpidXNfYWRkciA9IGRtYV9scGFyX3RvX2J1cyhyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcikpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9waHlzID0gX0FMSUdOX0RPV04ocGh5c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4gKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXMsCisJCQkJCSAgICAgIDEgPDwgci0+cGFnZV9zaXplKTsKKwkqYnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpKTsKIAogCWlmICghVVNFX0RZTkFNSUNfRE1BKSB7CiAJCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOwpAQCAtNTg4LDE3ICs4MTIsMTggQEAKIAljID0gZG1hX2ZpbmRfY2h1bmsociwgKmJ1c19hZGRyLCBsZW4pOwogCiAJaWYgKGMpIHsKKwkJREJHKCIlczolZDogcmV1c2luZyBtYXBwZWQgY2h1bmsiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlkbWFfZHVtcF9jaHVuayhjKTsKIAkJYy0+dXNhZ2VfY291bnQrKzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCXJlc3VsdCA9IGRtYV9tYXBfcGFnZXMociwgX0FMSUdOX0RPV04ocGh5c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSksCi0JCV9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKSwgJmMpOworCXJlc3VsdCA9IGRtYV9zYl9tYXBfcGFnZXMociwgYWxpZ25lZF9waHlzLCBhbGlnbmVkX2xlbiwgJmMsIGlvcHRlX2ZsYWcpOwogCiAJaWYgKHJlc3VsdCkgewogCQkqYnVzX2FkZHIgPSAwOwotCQlEQkcoIiVzOiVkOiBkbWFfbWFwX3BhZ2VzIGZhaWxlZCAoJWQpXG4iLAorCQlEQkcoIiVzOiVkOiBkbWFfc2JfbWFwX3BhZ2VzIGZhaWxlZCAoJWQpXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTYxMCw4ICs4MzUsNTcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX21hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCisJICAgICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJICAgICB1NjQgaW9wdGVfZmxhZykKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYV9jaHVuayAqYzsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKKwkJOiB2aXJ0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX3BoeXMgPSBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIHBoeXNfYWRkciAtIGFsaWduZWRfcGh5cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCisJREJHKEtFUk5fRVJSICIlczogdmFkZHI9JSNseCwgbGVuPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICB2aXJ0X2FkZHIsIGxlbik7CisJREJHKEtFUk5fRVJSICIlczogcGg9JSNseCBhX3BoPSUjbHggYV9sPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICBwaHlzX2FkZHIsIGFsaWduZWRfcGh5cywgYWxpZ25lZF9sZW4pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCWMgPSBkbWFfZmluZF9jaHVua19scGFyKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSwgbGVuKTsKKworCWlmIChjKSB7CisJCS8qIEZJWE1FICovCisJCUJVRygpOworCQkqYnVzX2FkZHIgPSBjLT5idXNfYWRkciArIHBoeXNfYWRkciAtIGFsaWduZWRfcGh5czsKKwkJYy0+dXNhZ2VfY291bnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXJlc3VsdCA9IGRtYV9pb2MwX21hcF9wYWdlcyhyLCBhbGlnbmVkX3BoeXMsIGFsaWduZWRfbGVuLCAmYywKKwkJCQkgICAgaW9wdGVfZmxhZyk7CisKKwlpZiAocmVzdWx0KSB7CisJCSpidXNfYWRkciA9IDA7CisJCURCRygiJXM6JWQ6IGRtYV9pb2MwX21hcF9wYWdlcyBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCSpidXNfYWRkciA9IGMtPmJ1c19hZGRyICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzOworCURCRygiJXM6IHZhPSUjbHggcGE9JSNseCBhX3BhPSUjbHggYnVzPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICB2aXJ0X2FkZHIsIHBoeXNfYWRkciwgYWxpZ25lZF9waHlzLCAqYnVzX2FkZHIpOworCWMtPnVzYWdlX2NvdW50ID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgotICogZG1hX3VubWFwX2FyZWEgLSBVbm1hcCBhbiBhcmVhIG9mIG1lbW9yeSBmcm9tIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBkbWFfc2JfdW5tYXBfYXJlYSAtIFVubWFwIGFuIGFyZWEgb2YgbWVtb3J5IGZyb20gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICogQGJ1c19hZGRyOiBUaGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgpAQCAtNjE5LDcgKzg5Myw3IEBACiAgKiBUaGlzIGlzIHRoZSBjb21tb24gZG1hIHVubWFwIHJvdXRpbmUuCiAgKi8KIAotaW50IGRtYV91bm1hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKK3N0YXRpYyBpbnQgZG1hX3NiX3VubWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02MzEsNyArOTA1LDggQEAKIAlpZiAoIWMpIHsKIAkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2J1cyA9IF9BTElHTl9ET1dOKGJ1c19hZGRyLAogCQkJMSA8PCByLT5wYWdlX3NpemUpOwotCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpOworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGJ1c19hZGRyCisJCQktIGFsaWduZWRfYnVzLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CiAJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYnVzX2FkZHIgJWx4aFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2FkZHIpOwogCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGxlbiAlbHhoXG4iLApAQCAtNjQ3LDk0ICs5MjIsMTY2IEBACiAKIAlpZiAoIWMtPnVzYWdlX2NvdW50KSB7CiAJCWxpc3RfZGVsKCZjLT5saW5rKTsKLQkJZG1hX2ZyZWVfY2h1bmsoYyk7CisJCWRtYV9zYl9mcmVlX2NodW5rKGMpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX3VubWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorCQkJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCisJREJHKCIlczogc3RhcnQgYT0lI2x4IGw9JSNseFxuIiwgX19mdW5jX18sIGJ1c19hZGRyLCBsZW4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwljID0gZG1hX2ZpbmRfY2h1bmsociwgYnVzX2FkZHIsIGxlbik7CisKKwlpZiAoIWMpIHsKKwkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2J1cyA9IF9BTElHTl9ET1dOKGJ1c19hZGRyLAorCQkJCQkJCTEgPDwgci0+cGFnZV9zaXplKTsKKwkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4gKyBidXNfYWRkcgorCQkJCQkJICAgICAgLSBhbGlnbmVkX2J1cywKKwkJCQkJCSAgICAgIDEgPDwgci0+cGFnZV9zaXplKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAorCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGxlbik7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYWxpZ25lZF9idXMgJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgYWxpZ25lZF9idXMpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGFsaWduZWRfbGVuICVseGhcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGFsaWduZWRfbGVuKTsKKwkJQlVHKCk7CisJfQorCisJYy0+dXNhZ2VfY291bnQtLTsKKworCWlmICghYy0+dXNhZ2VfY291bnQpIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfaW9jMF9mcmVlX2NodW5rKGMpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCURCRygiJXM6IGVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCiAvKioKLSAqIGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhciAtIFNldHVwIGEgbGluZWFyIGRtYSBtYXBpbmcgZm9yIGEgZGV2aWNlLgorICogZG1hX3NiX3JlZ2lvbl9jcmVhdGVfbGluZWFyIC0gU2V0dXAgYSBsaW5lYXIgZG1hIG1hcHBpbmcgZm9yIGEgZGV2aWNlLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKgogICogVGhpcyByb3V0aW5lIGNyZWF0ZXMgYW4gSFYgZG1hIHJlZ2lvbiBmb3IgdGhlIGRldmljZSBhbmQgbWFwcyBhbGwgYXZhaWxhYmxlCiAgKiByYW0gaW50byB0aGUgaW8gY29udHJvbGxlciBidXMgYWRkcmVzcyBzcGFjZS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fY3JlYXRlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgbGVuLCB0bXA7CiAKLQkvKiBmb3JjZSAxNk0gZG1hIHBhZ2VzIGZvciBsaW5lYXIgbWFwcGluZyAqLwotCi0JaWYgKHItPnBhZ2Vfc2l6ZSAhPSBQUzNfRE1BXzE2TSkgewotCQlwcl9pbmZvKCIlczolZDogZm9yY2luZyAxNk0gcGFnZXMgZm9yIGxpbmVhciBtYXBcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyLT5wYWdlX3NpemUgPSBQUzNfRE1BXzE2TTsKKwlpZiAoci0+bGVuID4gMTYqMTAyNCoxMDI0KSB7CS8qIEZJWE1FOiBuZWVkIHByb3BlciBmaXggKi8KKwkJLyogZm9yY2UgMTZNIGRtYSBwYWdlcyBmb3IgbGluZWFyIG1hcHBpbmcgKi8KKwkJaWYgKHItPnBhZ2Vfc2l6ZSAhPSBQUzNfRE1BXzE2TSkgeworCQkJcHJfaW5mbygiJXM6JWQ6IGZvcmNpbmcgMTZNIHBhZ2VzIGZvciBsaW5lYXIgbWFwXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyLT5wYWdlX3NpemUgPSBQUzNfRE1BXzE2TTsKKwkJCXItPmxlbiA9IF9BTElHTl9VUChyLT5sZW4sIDEgPDwgci0+cGFnZV9zaXplKTsKKwkJfQogCX0KIAotCXJlc3VsdCA9IGRtYV9yZWdpb25fY3JlYXRlKHIpOworCXJlc3VsdCA9IGRtYV9zYl9yZWdpb25fY3JlYXRlKHIpOwogCUJVR19PTihyZXN1bHQpOwogCi0JcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5ybS5iYXNlLCBtYXAucm0uc2l6ZSwgJnRtcCk7Ci0JQlVHX09OKHJlc3VsdCk7CisJaWYgKHItPm9mZnNldCA8IG1hcC5ybS5zaXplKSB7CisJCS8qIE1hcCAocGFydCBvZikgMXN0IFJBTSBjaHVuayAqLworCQl2aXJ0X2FkZHIgPSBtYXAucm0uYmFzZSArIHItPm9mZnNldDsKKwkJbGVuID0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCWlmIChsZW4gPiByLT5sZW4pCisJCQlsZW4gPSByLT5sZW47CisJCXJlc3VsdCA9IGRtYV9zYl9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgJnRtcCwKKwkJCUlPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCi0JaWYgKFVTRV9MUEFSX0FERFIpCi0JCXJlc3VsdCA9IGRtYV9tYXBfYXJlYShyLCBtYXAucjEuYmFzZSwgbWFwLnIxLnNpemUsCi0JCQkmdG1wKTsKLQllbHNlCi0JCXJlc3VsdCA9IGRtYV9tYXBfYXJlYShyLCBtYXAucm0uc2l6ZSwgbWFwLnIxLnNpemUsCi0JCQkmdG1wKTsKLQotCUJVR19PTihyZXN1bHQpOworCWlmIChyLT5vZmZzZXQgKyByLT5sZW4gPiBtYXAucm0uc2l6ZSkgeworCQkvKiBNYXAgKHBhcnQgb2YpIDJuZCBSQU0gY2h1bmsgKi8KKwkJdmlydF9hZGRyID0gVVNFX0xQQVJfQUREUiA/IG1hcC5yMS5iYXNlIDogbWFwLnJtLnNpemU7CisJCWxlbiA9IHItPmxlbjsKKwkJaWYgKHItPm9mZnNldCA+PSBtYXAucm0uc2l6ZSkKKwkJCXZpcnRfYWRkciArPSByLT5vZmZzZXQgLSBtYXAucm0uc2l6ZTsKKwkJZWxzZQorCQkJbGVuIC09IG1hcC5ybS5zaXplIC0gci0+b2Zmc2V0OworCQlyZXN1bHQgPSBkbWFfc2JfbWFwX2FyZWEociwgdmlydF9hZGRyLCBsZW4sICZ0bXAsCisJCQlJT1BURV9QUF9XIHwgSU9QVEVfUFBfUiB8IElPUFRFX1NPX1JXIHwgSU9QVEVfTSk7CisJCUJVR19PTihyZXN1bHQpOworCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgotICogZG1hX3JlZ2lvbl9mcmVlX2xpbmVhciAtIEZyZWUgYSBsaW5lYXIgZG1hIG1hcHBpbmcgZm9yIGEgZGV2aWNlLgorICogZG1hX3NiX3JlZ2lvbl9mcmVlX2xpbmVhciAtIEZyZWUgYSBsaW5lYXIgZG1hIG1hcHBpbmcgZm9yIGEgZGV2aWNlLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKgogICogVGhpcyByb3V0aW5lIHdpbGwgdW5tYXAgYWxsIG1hcHBlZCBhcmVhcyBhbmQgZnJlZSB0aGUgSFYgZG1hIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fZnJlZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQorc3RhdGljIGludCBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIGxlbiwgbHBhcl9hZGRyOwogCi0JcmVzdWx0ID0gZG1hX3VubWFwX2FyZWEociwgZG1hX2xwYXJfdG9fYnVzKHIsIDApLCBtYXAucm0uc2l6ZSk7Ci0JQlVHX09OKHJlc3VsdCk7CisJaWYgKHItPm9mZnNldCA8IG1hcC5ybS5zaXplKSB7CisJCS8qIFVubWFwIChwYXJ0IG9mKSAxc3QgUkFNIGNodW5rICovCisJCWxwYXJfYWRkciA9IG1hcC5ybS5iYXNlICsgci0+b2Zmc2V0OworCQlsZW4gPSBtYXAucm0uc2l6ZSAtIHItPm9mZnNldDsKKwkJaWYgKGxlbiA+IHItPmxlbikKKwkJCWxlbiA9IHItPmxlbjsKKwkJYnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgbHBhcl9hZGRyKTsKKwkJcmVzdWx0ID0gZG1hX3NiX3VubWFwX2FyZWEociwgYnVzX2FkZHIsIGxlbik7CisJCUJVR19PTihyZXN1bHQpOworCX0KIAotCXJlc3VsdCA9IGRtYV91bm1hcF9hcmVhKHIsIGRtYV9scGFyX3RvX2J1cyhyLCBtYXAucjEuYmFzZSksCi0JCW1hcC5yMS5zaXplKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0ICsgci0+bGVuID4gbWFwLnJtLnNpemUpIHsKKwkJLyogVW5tYXAgKHBhcnQgb2YpIDJuZCBSQU0gY2h1bmsgKi8KKwkJbHBhcl9hZGRyID0gbWFwLnIxLmJhc2U7CisJCWxlbiA9IHItPmxlbjsKKwkJaWYgKHItPm9mZnNldCA+PSBtYXAucm0uc2l6ZSkKKwkJCWxwYXJfYWRkciArPSByLT5vZmZzZXQgLSBtYXAucm0uc2l6ZTsKKwkJZWxzZQorCQkJbGVuIC09IG1hcC5ybS5zaXplIC0gci0+b2Zmc2V0OworCQlidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBscGFyX2FkZHIpOworCQlyZXN1bHQgPSBkbWFfc2JfdW5tYXBfYXJlYShyLCBidXNfYWRkciwgbGVuKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCi0JcmVzdWx0ID0gZG1hX3JlZ2lvbl9mcmVlKHIpOworCXJlc3VsdCA9IGRtYV9zYl9yZWdpb25fZnJlZShyKTsKIAlCVUdfT04ocmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgotICogZG1hX21hcF9hcmVhX2xpbmVhciAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBkbWFfc2JfbWFwX2FyZWFfbGluZWFyIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICogQHZpcnRfYWRkcjogU3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIG1hcC4KICAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAYnVzX2FkZHI6IEEgcG9pbnRlciB0byByZXR1cm4gdGhlIHN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0bwogICogbWFwLgogICoKLSAqIFRoaXMgcm91dGluZSBqdXN0IHJldHVybnMgdGhlIGNvcmVzcG9uZGluZyBidXMgYWRkcmVzcy4gIEFjdHVhbCBtYXBwaW5nCisgKiBUaGlzIHJvdXRpbmUganVzdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGJ1cyBhZGRyZXNzLiAgQWN0dWFsIG1hcHBpbmcKICAqIG9jY3VycyBpbiBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIoKS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAotCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCitzdGF0aWMgaW50IGRtYV9zYl9tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJdTY0IGlvcHRlX2ZsYWcpCiB7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBpc19rZXJuZWxfYWRkcih2aXJ0X2FkZHIpID8gX19wYSh2aXJ0X2FkZHIpCiAJCTogdmlydF9hZGRyOwotCSpidXNfYWRkciA9IGRtYV9scGFyX3RvX2J1cyhyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcikpOworCSpidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcikpOwogCXJldHVybiAwOwogfQogCkBAIC03NDQsNDIgKzEwOTEsOTggQEAKICAqIEBidXNfYWRkcjogVGhlIHN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KICAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KICAqCi0gKiBUaGlzIHJvdXRpbmUgZG9lcyBub3RoaW5nLiAgVW5tYXBwaW5nIG9jY3VycyBpbiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyKCkuCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBub3RoaW5nLiAgVW5tYXBwaW5nIG9jY3VycyBpbiBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyKCkuCiAgKi8KIAotc3RhdGljIGludCBkbWFfdW5tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorc3RhdGljIGludCBkbWFfc2JfdW5tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAogCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXJldHVybiAwOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgcHMzX2RtYV9zYl9yZWdpb25fb3BzID0gIHsKKwkuY3JlYXRlID0gZG1hX3NiX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBkbWFfc2JfcmVnaW9uX2ZyZWUsCisJLm1hcCA9IGRtYV9zYl9tYXBfYXJlYSwKKwkudW5tYXAgPSBkbWFfc2JfdW5tYXBfYXJlYQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgcHMzX2RtYV9zYl9yZWdpb25fbGluZWFyX29wcyA9IHsKKwkuY3JlYXRlID0gZG1hX3NiX3JlZ2lvbl9jcmVhdGVfbGluZWFyLAorCS5mcmVlID0gZG1hX3NiX3JlZ2lvbl9mcmVlX2xpbmVhciwKKwkubWFwID0gZG1hX3NiX21hcF9hcmVhX2xpbmVhciwKKwkudW5tYXAgPSBkbWFfc2JfdW5tYXBfYXJlYV9saW5lYXIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzIHBzM19kbWFfaW9jMF9yZWdpb25fb3BzID0geworCS5jcmVhdGUgPSBkbWFfaW9jMF9yZWdpb25fY3JlYXRlLAorCS5mcmVlID0gZG1hX2lvYzBfcmVnaW9uX2ZyZWUsCisJLm1hcCA9IGRtYV9pb2MwX21hcF9hcmVhLAorCS51bm1hcCA9IGRtYV9pb2MwX3VubWFwX2FyZWEKK307CisKK2ludCBwczNfZG1hX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplLAorCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZSwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHI7CisKKwlscGFyX2FkZHIgPSBhZGRyID8gcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGFkZHIpKSA6IDA7CisKKwlyLT5kZXYgPSBkZXY7CisJci0+cGFnZV9zaXplID0gcGFnZV9zaXplOworCXItPnJlZ2lvbl90eXBlID0gcmVnaW9uX3R5cGU7CisJci0+b2Zmc2V0ID0gbHBhcl9hZGRyOworCWlmIChyLT5vZmZzZXQgPj0gbWFwLnJtLnNpemUpCisJCXItPm9mZnNldCAtPSBtYXAucjEub2Zmc2V0OworCXItPmxlbiA9IGxlbiA/IGxlbiA6IF9BTElHTl9VUChtYXAudG90YWwsIDEgPDwgci0+cGFnZV9zaXplKTsKKworCXN3aXRjaCAoZGV2LT5kZXZfdHlwZSkgeworCWNhc2UgUFMzX0RFVklDRV9UWVBFX1NCOgorCQlyLT5yZWdpb25fb3BzID0gIChVU0VfRFlOQU1JQ19ETUEpCisJCQk/ICZwczNfZG1hX3NiX3JlZ2lvbl9vcHMKKwkJCTogJnBzM19kbWFfc2JfcmVnaW9uX2xpbmVhcl9vcHM7CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVklDRV9UWVBFX0lPQzA6CisJCXItPnJlZ2lvbl9vcHMgPSAmcHMzX2RtYV9pb2MwX3JlZ2lvbl9vcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBzM19kbWFfcmVnaW9uX2luaXQpOwogCiBpbnQgcHMzX2RtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKLQlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkKLQkJPyBkbWFfcmVnaW9uX2NyZWF0ZShyKQotCQk6IGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcihyKTsKKwlCVUdfT04oIXIpOworCUJVR19PTighci0+cmVnaW9uX29wcyk7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzLT5jcmVhdGUpOworCXJldHVybiByLT5yZWdpb25fb3BzLT5jcmVhdGUocik7CiB9CitFWFBPUlRfU1lNQk9MKHBzM19kbWFfcmVnaW9uX2NyZWF0ZSk7CiAKIGludCBwczNfZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKLQlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkKLQkJPyBkbWFfcmVnaW9uX2ZyZWUocikKLQkJOiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyKHIpOworCUJVR19PTighcik7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMtPmZyZWUpOworCXJldHVybiByLT5yZWdpb25fb3BzLT5mcmVlKHIpOwogfQorRVhQT1JUX1NZTUJPTChwczNfZG1hX3JlZ2lvbl9mcmVlKTsKIAogaW50IHBzM19kbWFfbWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKQorCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwl1NjQgaW9wdGVfZmxhZykKIHsKLQlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkKLQkJPyBkbWFfbWFwX2FyZWEociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyKQotCQk6IGRtYV9tYXBfYXJlYV9saW5lYXIociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyKTsKKwlyZXR1cm4gci0+cmVnaW9uX29wcy0+bWFwKHIsIHZpcnRfYWRkciwgbGVuLCBidXNfYWRkciwgaW9wdGVfZmxhZyk7CiB9CiAKIGludCBwczNfZG1hX3VubWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbikKIHsKLQlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkgPyBkbWFfdW5tYXBfYXJlYShyLCBidXNfYWRkciwgbGVuKQotCQk6IGRtYV91bm1hcF9hcmVhX2xpbmVhcihyLCBidXNfYWRkciwgbGVuKTsKKwlyZXR1cm4gci0+cmVnaW9uX29wcy0+dW5tYXAociwgYnVzX2FkZHIsIGxlbik7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC04MTAsMTIgKzEyMTMsMTMgQEAKIAlCVUdfT04obWFwLnJtLmJhc2UpOwogCUJVR19PTighbWFwLnJtLnNpemUpOwogCi0JbG1iX2FkZChtYXAucm0uYmFzZSwgbWFwLnJtLnNpemUpOwotCWxtYl9hbmFseXplKCk7CiAKIAkvKiBhcnJhbmdlIHRvIGRvIHRoaXMgaW4gcHMzX21tX2FkZF9tZW1vcnkgKi8KIAlwczNfbW1fcmVnaW9uX2NyZWF0ZSgmbWFwLnIxLCBtYXAudG90YWwgLSBtYXAucm0uc2l6ZSk7CiAKKwkvKiBjb3JyZWN0IG1hcC50b3RhbCBmb3IgdGhlIHJlYWwgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB3ZSB1c2UgKi8KKwltYXAudG90YWwgPSBtYXAucm0uc2l6ZSArIG1hcC5yMS5zaXplOworCiAJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYwppbmRleCA1YzNkYTA4Li5iNzBlNDc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIH0gc3RhdGljIHNhdmVkX3BhcmFtczsKIAogI2RlZmluZSBkdW1wX2hlYWRlcihfYSkgX2R1bXBfaGVhZGVyKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfZHVtcF9oZWFkZXIoY29uc3Qgc3RydWN0IG9zX2FyZWFfaGVhZGVyIF9faW9tZW0gKmgsIGNvbnN0IGNoYXIqIGZ1bmMsCitzdGF0aWMgdm9pZCBfZHVtcF9oZWFkZXIoY29uc3Qgc3RydWN0IG9zX2FyZWFfaGVhZGVyICpoLCBjb25zdCBjaGFyICpmdW5jLAogCWludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogaC5tYWdpY19udW06ICAgICAgICAgJyVzJ1xuIiwgZnVuYywgbGluZSwKQEAgLTE1MSw3ICsxNTEsNyBAQAogfQogCiAjZGVmaW5lIGR1bXBfcGFyYW1zKF9hKSBfZHVtcF9wYXJhbXMoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kdW1wX3BhcmFtcyhjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9wYXJhbXMgX19pb21lbSAqcCwgY29uc3QgY2hhciogZnVuYywKK3N0YXRpYyB2b2lkIF9kdW1wX3BhcmFtcyhjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9wYXJhbXMgKnAsIGNvbnN0IGNoYXIgKmZ1bmMsCiAJaW50IGxpbmUpCiB7CiAJcHJfZGVidWcoIiVzOiVkOiBwLmJvb3RfZmxhZzogICAgICAgJXVcbiIsIGZ1bmMsIGxpbmUsIHAtPmJvb3RfZmxhZyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaAppbmRleCBjYTA0ZjAzLi44N2Q1MjA2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKQEAgLTQxLDYgKzQxLDcgQEAKIC8qIGlycSAqLwogCiB2b2lkIHBzM19pbml0X0lSUSh2b2lkKTsKK3ZvaWQgcHMzX3NodXRkb3duX0lSUShpbnQgY3B1KTsKIHZvaWQgX19pbml0IHBzM19yZWdpc3Rlcl9pcGlfZGVidWdfYnJrKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCB2aXJxKTsKIAogLyogc21wICovCkBAIC04Miw2ICs4Myw3IEBACiAJUFMzX0RFVl9UWVBFX1NUT1JfUk9NID0gVFlQRV9ST00sCS8qIDUgKi8KIAlQUzNfREVWX1RZUEVfU0JfR1BJTyA9IDYsCiAJUFMzX0RFVl9UWVBFX1NUT1JfRkxBU0ggPSBUWVBFX1JCQywJLyogMTQgKi8KKwlQUzNfREVWX1RZUEVfTk9BQ0NFU1MgPSAyNTUsCiB9OwogCiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGNvbnN0IGNoYXIgKmJ1c19zdHIsCkBAIC0xMjksMjQgKzEzMSwyOCBAQAogLyogcmVwb3NpdG9yeSBidXMgZW51bWVyYXRvcnMgKi8KIAogc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSB7CisJZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGU7CiAJdW5zaWduZWQgaW50IGJ1c19pbmRleDsKKwl1bnNpZ25lZCBpbnQgYnVzX2lkOworCWVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlOwogCXVuc2lnbmVkIGludCBkZXZfaW5kZXg7Ci0Jc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCXVuc2lnbmVkIGludCBkZXZfaWQ7CiB9OwogCi1pbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2UoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCi0JZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCi0JY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqc3RhcnRfZGV2LAotCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW5saW5lIGludCBwczNfcmVwb3NpdG9yeV9maW5kX2ZpcnN0X2RldmljZSgKLQllbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwgZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpwczNfcmVwb3NpdG9yeV9idW1wX2RldmljZSgKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQogewotCXJldHVybiBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShidXNfdHlwZSwgZGV2X3R5cGUsIE5VTEwsIGRldik7CisJcmVwby0+ZGV2X2luZGV4Kys7CisJcmV0dXJuIHJlcG87CiB9Ci1pbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pOworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlcyhlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKKwlpbnQgKCpjYWxsYmFjaykoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykpOworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfYnVzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCB1bnNpZ25lZCBpbnQgZnJvbSwKKwl1bnNpZ25lZCBpbnQgKmJ1c19pbmRleCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGUsIHVuc2lnbmVkIGludCAqaW50ZXJydXB0X2lkKTsKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZSwgdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pOwogCiAvKiByZXBvc2l0b3J5IGJsb2NrIGRldmljZSBpbmZvICovCkBAIC0yMTYsNCArMjIyLDE5IEBACiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zcHVfcmVzb3VyY2VfaWQodW5zaWduZWQgaW50IHJlc19pbmRleCwKIAllbnVtIHBzM19zcHVfcmVzb3VyY2VfdHlwZSogcmVzb3VyY2VfdHlwZSwgdW5zaWduZWQgaW50ICpyZXNvdXJjZV9pZCk7CiAKKy8qIHJlcG9zaXRvcnkgdnVhcnQgaW5mbyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9hdl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9zeXNtZ3JfcG9ydCh1bnNpZ25lZCBpbnQgKnBvcnQpOworCisvKiBQYWdlIHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgSU9QVEVfUFBfVwkJMHg4MDAwMDAwMDAwMDAwMDAwdWwgLyogcHJvdGVjdGlvbjogd3JpdGUgKi8KKyNkZWZpbmUgSU9QVEVfUFBfUgkJMHg0MDAwMDAwMDAwMDAwMDAwdWwgLyogcHJvdGVjdGlvbjogcmVhZCAqLworI2RlZmluZSBJT1BURV9NCQkJMHgyMDAwMDAwMDAwMDAwMDAwdWwgLyogY29oZXJlbmN5IHJlcXVpcmVkICovCisjZGVmaW5lIElPUFRFX1NPX1IJCTB4MTAwMDAwMDAwMDAwMDAwMHVsIC8qIG9yZGVyaW5nOiB3cml0ZXMgKi8KKyNkZWZpbmUgSU9QVEVfU09fUlcgICAgICAgICAgICAgMHgxODAwMDAwMDAwMDAwMDAwdWwgLyogb3JkZXJpbmc6IHIgJiB3ICovCisjZGVmaW5lIElPUFRFX1JQTl9NYXNrCQkweDA3ZmZmZmZmZmZmZmYwMDB1bCAvKiBSUE4gKi8KKyNkZWZpbmUgSU9QVEVfSAkJCTB4MDAwMDAwMDAwMDAwMDgwMHVsIC8qIGNhY2hlIGhpbnQgKi8KKyNkZWZpbmUgSU9QVEVfSU9JRF9NYXNrCQkweDAwMDAwMDAwMDAwMDA3ZmZ1bCAvKiBpb2lkICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCmluZGV4IGFlNTg2YTAuLjhjYzM3Y2ZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZSBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwogCQlkdW1wX25vZGVfbmFtZShscGFyX2lkLCBuMSwgbjIsIG4zLCBuNCk7Ci0JCXJldHVybiByZXN1bHQ7CisJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCWR1bXBfbm9kZShscGFyX2lkLCBuMSwgbjIsIG4zLCBuNCwgdjEsIHYyKTsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IHdhcm5pbmc6IGRpc2NhcmRpbmcgbm9uLXplcm8gdjI6ICUwMTZseFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgdjIpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKIH0KIAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3N0cih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCBjb25zdCBjaGFyICpidXNfc3RyLApAQCAtMzE0LDMyNCArMzE0LDE0MCBAQAogCQlyZWdfaW5kZXgsIGJ1c19hZGRyLCBsZW4pOwogfQogCi0jaWYgZGVmaW5lZChERUJVRykKLWludCBwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwKLQl1bnNpZ25lZCBpbnQgZGV2X2luZGV4KQorCisKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQogewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCByZXNfaW5kZXg7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHRtcCA9ICpyZXBvOworCXVuc2lnbmVkIGludCBudW1fZGV2OwogCi0JcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlidXNfaW5kZXgsIGRldl9pbmRleCk7CisJQlVHX09OKHJlcG8tPmJ1c19pbmRleCA+IDEwKTsKKwlCVUdfT04ocmVwby0+ZGV2X2luZGV4ID4gMTApOwogCi0JZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKLQkJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50cl90eXBlOwotCQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkOworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYodG1wLmJ1c19pbmRleCwgJm51bV9kZXYpOwogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIoYnVzX2luZGV4LCBkZXZfaW5kZXgsCi0JCQlyZXNfaW5kZXgsICZpbnRyX3R5cGUsICZpbnRlcnJ1cHRfaWQpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCWlmIChyZXN1bHQgIT0gIExWMV9OT19FTlRSWSkKLQkJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50ciIKLQkJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIGludHJfdHlwZSAldSwgaW50ZXJydXB0X2lkICV1XG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgaW50cl90eXBlLAotCQkJaW50ZXJydXB0X2lkKTsKLQl9Ci0KLQlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgewotCQllbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZTsKLQkJdTY0IGJ1c19hZGRyOwotCQl1NjQgbGVuOwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCXJlc19pbmRleCwgJnJlZ190eXBlLCAmYnVzX2FkZHIsICZsZW4pOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCWlmIChyZXN1bHQgIT0gIExWMV9OT19FTlRSWSkKLQkJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnIgotCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnX3R5cGUgJXUsIGJ1c19hZGRyICVseGgsIGxlbiAlbHhoXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgcmVnX3R5cGUsCi0JCQlidXNfYWRkciwgbGVuKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgZHVtcF9zdG9yX2Rldl9pbmZvKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIHVuc2lnbmVkIGludCBkZXZfaW5kZXgpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IG51bV9yZWdpb25zLCByZWdpb25faW5kZXg7Ci0JdTY0IHBvcnQsIGJsa19zaXplLCBudW1fYmxvY2tzOwotCi0JcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X2luZm8oYnVzX2luZGV4LCBkZXZfaW5kZXgsICZwb3J0LAotCQkmYmxrX3NpemUsICZudW1fYmxvY2tzLCAmbnVtX3JlZ2lvbnMpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyIKLQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJZ290byBvdXQ7CisJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IHBvcnQgJWx1LCBibGtfc2l6ZSAlbHUsIG51bV9ibG9ja3MgIgotCQkgIiVsdSwgbnVtX3JlZ2lvbnMgJXVcbiIsCi0JCSBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBwb3J0LAotCQkgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c190eXBlICV1LCBidXNfaW5kZXggJXUsIGJ1c19pZCAldSwgbnVtX2RldiAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCB0bXAuYnVzX3R5cGUsIHRtcC5idXNfaW5kZXgsIHRtcC5idXNfaWQsCisJCW51bV9kZXYpOwogCi0JZm9yIChyZWdpb25faW5kZXggPSAwOyByZWdpb25faW5kZXggPCBudW1fcmVnaW9uczsgcmVnaW9uX2luZGV4KyspIHsKLQkJdW5zaWduZWQgaW50IHJlZ2lvbl9pZDsKLQkJdTY0IHJlZ2lvbl9zdGFydCwgcmVnaW9uX3NpemU7Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24oYnVzX2luZGV4LAotCQkJZGV2X2luZGV4LCByZWdpb25faW5kZXgsICZyZWdpb25faWQsICZyZWdpb25fc3RhcnQsCi0JCQkmcmVnaW9uX3NpemUpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQkgcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uIgotCQkJCSAgIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJCSAgYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdpb25faWQgJXUsIHN0YXJ0ICVseGgsIHNpemUgJWx4aFxuIiwKLQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCByZWdpb25faWQsCi0JCQkgcmVnaW9uX3N0YXJ0LCByZWdpb25fc2l6ZSk7CisJaWYgKHRtcC5kZXZfaW5kZXggPj0gbnVtX2RldikgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIGRldmljZSBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi1vdXQ6Ci0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmVzdWx0OworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUodG1wLmJ1c19pbmRleCwgdG1wLmRldl9pbmRleCwKKwkJJnRtcC5kZXZfdHlwZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl90eXBlIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCh0bXAuYnVzX2luZGV4LCB0bXAuZGV2X2luZGV4LAorCQkmdG1wLmRldl9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiBmb3VuZDogZGV2X3R5cGUgJXUsIGRldl9pbmRleCAldSwgZGV2X2lkICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIHRtcC5kZXZfdHlwZSwgdG1wLmRldl9pbmRleCwgdG1wLmRldl9pZCk7CisKKwkqcmVwbyA9IHRtcDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdW1wX2RldmljZV9pbmZvKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAotCQkJICAgIHVuc2lnbmVkIGludCBudW1fZGV2KQoraW50IF9fZGV2aW5pdCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZXMoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCisJaW50ICgqY2FsbGJhY2spKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pKQogewogCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBkZXZfaW5kZXg7CisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSByZXBvOwogCi0JcHJfZGVidWcoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7CisJcHJfZGVidWcoIiAtPiAlczolZDogZmluZCBidXNfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBidXNfdHlwZSk7CiAKLQlmb3IgKGRldl9pbmRleCA9IDA7IGRldl9pbmRleCA8IG51bV9kZXY7IGRldl9pbmRleCsrKSB7Ci0JCWVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlOwotCQl1bnNpZ25lZCBpbnQgZGV2X2lkOworCWZvciAocmVwby5idXNfaW5kZXggPSAwOyByZXBvLmJ1c19pbmRleCA8IDEwOyByZXBvLmJ1c19pbmRleCsrKSB7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZShidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCSZkZXZfdHlwZSk7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUiCi0JCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQoYnVzX2luZGV4LCBkZXZfaW5kZXgsCi0JCQkmZGV2X2lkKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQiCi0JCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBkZXZfdHlwZSAldSwgZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgZGV2X3R5cGUsIGRldl9pZCk7Ci0KLQkJcHMzX3JlcG9zaXRvcnlfZHVtcF9yZXNvdXJjZV9pbmZvKGJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQotCQlpZiAoYnVzX3R5cGUgPT0gUFMzX0JVU19UWVBFX1NUT1JBR0UpCi0JCQlkdW1wX3N0b3JfZGV2X2luZm8oYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCX0KLQotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfYnVzX2luZm8odm9pZCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OwotCi0JcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCWZvciAoYnVzX2luZGV4ID0gMDsgYnVzX2luZGV4IDwgMTA7IGJ1c19pbmRleCsrKSB7Ci0JCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlOwotCQl1bnNpZ25lZCBpbnQgYnVzX2lkOwotCQl1bnNpZ25lZCBpbnQgbnVtX2RldjsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKGJ1c19pbmRleCwgJmJ1c190eXBlKTsKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShyZXBvLmJ1c19pbmRleCwKKwkJCSZyZXBvLmJ1c190eXBlKTsKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfdHlwZSgldSkgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQoYnVzX2luZGV4LCAmYnVzX2lkKTsKKwkJaWYgKHJlcG8uYnVzX3R5cGUgIT0gYnVzX3R5cGUpIHsKKwkJCXByX2RlYnVnKCIlczolZDogc2tpcCwgYnVzX3R5cGUgJXVcbiIsIF9fZnVuY19fLAorCQkJCV9fTElORV9fLCByZXBvLmJ1c190eXBlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQocmVwby5idXNfaW5kZXgsCisJCQkmcmVwby5idXNfaWQpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19pZCgldSkgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKGJ1c19pbmRleCAhPSBidXNfaWQpCi0JCQlwcl9kZWJ1ZygiJXM6JWQgYnVzX2luZGV4ICE9IGJ1c19pZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlmb3IgKHJlcG8uZGV2X2luZGV4ID0gMDsgOyByZXBvLmRldl9pbmRleCsrKSB7CisJCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZSgmcmVwbyk7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2RldihidXNfaW5kZXgsICZudW1fZGV2KTsKKwkJCWlmIChyZXN1bHQgPT0gLUVOT0RFVikgeworCQkJCXJlc3VsdCA9IDA7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHJlc3VsdCkKKwkJCQlicmVhazsKIAotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldigldSkgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKLQkJCWNvbnRpbnVlOworCQkJcmVzdWx0ID0gY2FsbGJhY2soJnJlcG8pOworCisJCQlpZiAocmVzdWx0KSB7CisJCQkJcHJfZGVidWcoIiVzOiVkOiBhYm9ydCBhdCBjYWxsYmFja1xuIiwgX19mdW5jX18sCisJCQkJCV9fTElORV9fKTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQotCi0JCXByX2RlYnVnKCIlczolZCBidXNfJXU6IGJ1c190eXBlICV1LCBidXNfaWQgJXUsIG51bV9kZXYgJXVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgYnVzX3R5cGUsIGJ1c19pZCwKLQkJCW51bV9kZXYpOwotCi0JCWR1bXBfZGV2aWNlX2luZm8oYnVzX2luZGV4LCBidXNfdHlwZSwgbnVtX2Rldik7CisJCWJyZWFrOwogCX0KIAogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKSAqLwogCi1zdGF0aWMgaW50IGZpbmRfZGV2aWNlKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIHVuc2lnbmVkIGludCBudW1fZGV2LAotCXVuc2lnbmVkIGludCBzdGFydF9kZXZfaW5kZXgsIGVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlLAotCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldikKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2J1cyhlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwgdW5zaWduZWQgaW50IGZyb20sCisJdW5zaWduZWQgaW50ICpidXNfaW5kZXgpCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGRldl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgaTsKKwllbnVtIHBzM19idXNfdHlwZSB0eXBlOworCWludCBlcnJvcjsKIAotCXByX2RlYnVnKCIlczolZDogZmluZCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXZfdHlwZSk7Ci0KLQlkZXYtPmRldl9pbmRleCA9IFVJTlRfTUFYOwotCi0JZm9yIChkZXZfaW5kZXggPSBzdGFydF9kZXZfaW5kZXg7IGRldl9pbmRleCA8IG51bV9kZXY7IGRldl9pbmRleCsrKSB7Ci0JCWVudW0gcHMzX2Rldl90eXBlIHg7Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZShidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCSZ4KTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfdHlwZSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlpZiAoeCA9PSBkZXZfdHlwZSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChkZXZfaW5kZXggPT0gbnVtX2RldikKLQkJcmV0dXJuIC0xOwotCi0JcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBkZXZfdHlwZSAldSBhdCBkZXZfaW5kZXggJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2X3R5cGUsIGRldl9pbmRleCk7Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJJmRldi0+ZGlkLmRldl9pZCk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pZCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWRldi0+ZGV2X2luZGV4ID0gZGV2X2luZGV4OwotCi0JcHJfZGVidWcoIiVzOiVkIGZvdW5kOiBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJZGV2LT5kaWQuZGV2X2lkKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZSAoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCi0JZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCi0JY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqc3RhcnRfZGV2LAotCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldikKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OwotCXVuc2lnbmVkIGludCBudW1fZGV2OwotCi0JcHJfZGVidWcoIiVzOiVkOiBmaW5kIGJ1c190eXBlICV1LCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlidXNfdHlwZSwgZGV2X3R5cGUpOwotCi0JQlVHX09OKHN0YXJ0X2RldiAmJiBzdGFydF9kZXYtPmJ1c19pbmRleCA+IDEwKTsKLQotCWZvciAoYnVzX2luZGV4ID0gc3RhcnRfZGV2ID8gc3RhcnRfZGV2LT5idXNfaW5kZXggOiAwOyBidXNfaW5kZXggPCAxMDsKLQkJYnVzX2luZGV4KyspIHsKLQkJZW51bSBwczNfYnVzX3R5cGUgeDsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKGJ1c19pbmRleCwgJngpOwotCi0JCWlmIChyZXN1bHQpIHsKKwlmb3IgKGkgPSBmcm9tOyBpIDwgMTA7IGkrKykgeworCQllcnJvciA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoaSwgJnR5cGUpOworCQlpZiAoZXJyb3IpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlIGZhaWxlZFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJZGV2LT5idXNfaW5kZXggPSBVSU5UX01BWDsKLQkJCXJldHVybiByZXN1bHQ7CisJCQkqYnVzX2luZGV4ID0gVUlOVF9NQVg7CisJCQlyZXR1cm4gZXJyb3I7CiAJCX0KLQkJaWYgKHggPT0gYnVzX3R5cGUpCi0JCQlicmVhazsKKwkJaWYgKHR5cGUgPT0gYnVzX3R5cGUpIHsKKwkJCSpidXNfaW5kZXggPSBpOworCQkJcmV0dXJuIDA7CisJCX0KIAl9Ci0KLQlpZiAoYnVzX2luZGV4ID49IDEwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXByX2RlYnVnKCIlczolZDogZm91bmQgYnVzX3R5cGUgJXUgYXQgYnVzX2luZGV4ICV1XG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c190eXBlLCBidXNfaW5kZXgpOwotCi0JcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2RldihidXNfaW5kZXgsICZudW1fZGV2KTsKLQotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXN1bHQgPSBmaW5kX2RldmljZShidXNfaW5kZXgsIG51bV9kZXYsIHN0YXJ0X2RldgotCQk/IHN0YXJ0X2Rldi0+ZGV2X2luZGV4ICsgMSA6IDAsIGRldl90eXBlLCBkZXYpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgZ2V0X2RpZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQoYnVzX2luZGV4LCAmZGV2LT5kaWQuYnVzX2lkKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX2lkIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JZGV2LT5idXNfaW5kZXggPSBidXNfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQgZm91bmQ6IGJ1c19pZCAldSwgZGV2X2lkICV1XG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkKTsKLQotCXJldHVybiByZXN1bHQ7CisJKmJ1c19pbmRleCA9IFVJTlRfTUFYOworCXJldHVybiAtRU5PREVWOwogfQogCi1pbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCiAJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50cl90eXBlLCB1bnNpZ25lZCBpbnQgKmludGVycnVwdF9pZCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTY0NSw4ICs0NjEsOCBAQAogCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSB0OwogCQl1bnNpZ25lZCBpbnQgaWQ7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihkZXYtPmJ1c19pbmRleCwKLQkJCWRldi0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmaWQpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVzX2luZGV4LCAmdCwgJmlkKTsKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfaW50ciBmYWlsZWRcbiIsCkBAIC02NjksNyArNDg1LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCiAJZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGUsIHU2NCAqYnVzX2FkZHIsIHU2NCAqbGVuKQogewogCWludCByZXN1bHQgPSAwOwpAQCAtNjg0LDggKzUwMCw4IEBACiAJCXU2NCBhOwogCQl1NjQgbDsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcoZGV2LT5idXNfaW5kZXgsCi0JCQlkZXYtPmRldl9pbmRleCwgcmVzX2luZGV4LCAmdCwgJmEsICZsKTsKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVzX2luZGV4LCAmdCwgJmEsICZsKTsKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfcmVnIGZhaWxlZFxuIiwKQEAgLTk2NSw2ICs3ODEsMzYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9hdl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJ2aXJfdWFydCIsIDApLAorCQltYWtlX2ZpZWxkKCJwb3J0IiwgMCksCisJCW1ha2VfZmllbGQoImF2c2V0IiwgMCksCisJCSZ2MSwgMCk7CisJKnBvcnQgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9zeXNtZ3JfcG9ydCh1bnNpZ25lZCBpbnQgKnBvcnQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKKwkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKKwkJbWFrZV9maWVsZCgidmlyX3VhcnQiLCAwKSwKKwkJbWFrZV9maWVsZCgicG9ydCIsIDApLAorCQltYWtlX2ZpZWxkKCJzeXNtZ3IiLCAwKSwKKwkJJnYxLCAwKTsKKwkqcG9ydCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICAqIHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfaW5mbyAtIEdldCBhZGRyZXNzIGFuZCBzaXplIG9mIGNlbGxfZXh0X29zX2FyZWEuCiAgICogYWRkcmVzczogbHBhciBhZGRyZXNzIG9mIGNlbGxfZXh0X29zX2FyZWEKQEAgLTEwMjYsMyArODcyLDIwNSBAQAogCXJldHVybiByZXN1bHQgPyByZXN1bHQKIAkJOiBwczNfcmVwb3NpdG9yeV9yZWFkX3RiX2ZyZXEobm9kZV9pZCwgdGJfZnJlcSk7CiB9CisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9yZXNvdXJjZV9pbmZvKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IHJlc19pbmRleDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICgldToldSlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCisJZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50cl90eXBlOworCQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZpbnRyX3R5cGUsICZpbnRlcnJ1cHRfaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWlmIChyZXN1bHQgIT0gIExWMV9OT19FTlRSWSkKKwkJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50ciIKKwkJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIGludHJfdHlwZSAldSwgaW50ZXJydXB0X2lkICV1XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJCWludHJfdHlwZSwgaW50ZXJydXB0X2lkKTsKKwl9CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZTsKKwkJdTY0IGJ1c19hZGRyOworCQl1NjQgbGVuOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnJlZ190eXBlLCAmYnVzX2FkZHIsICZsZW4pOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWlmIChyZXN1bHQgIT0gIExWMV9OT19FTlRSWSkKKwkJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnIgorCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnX3R5cGUgJXUsIGJ1c19hZGRyICVseGgsIGxlbiAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJCXJlZ190eXBlLCBidXNfYWRkciwgbGVuKTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9zdG9yX2Rldl9pbmZvKHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IG51bV9yZWdpb25zLCByZWdpb25faW5kZXg7CisJdTY0IHBvcnQsIGJsa19zaXplLCBudW1fYmxvY2tzOworCisJcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X2luZm8ocmVwby0+YnVzX2luZGV4LAorCQlyZXBvLT5kZXZfaW5kZXgsICZwb3J0LCAmYmxrX3NpemUsICZudW1fYmxvY2tzLCAmbnVtX3JlZ2lvbnMpOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyIKKwkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBwb3J0ICVsdSwgYmxrX3NpemUgJWx1LCBudW1fYmxvY2tzICIKKwkJICIlbHUsIG51bV9yZWdpb25zICV1XG4iLAorCQkgX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwgcG9ydCwKKwkJIGJsa19zaXplLCBudW1fYmxvY2tzLCBudW1fcmVnaW9ucyk7CisKKwlmb3IgKHJlZ2lvbl9pbmRleCA9IDA7IHJlZ2lvbl9pbmRleCA8IG51bV9yZWdpb25zOyByZWdpb25faW5kZXgrKykgeworCQl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkOworCQl1NjQgcmVnaW9uX3N0YXJ0LCByZWdpb25fc2l6ZTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlZ2lvbl9pbmRleCwgJnJlZ2lvbl9pZCwKKwkJCSZyZWdpb25fc3RhcnQsICZyZWdpb25fc2l6ZSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCSBwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24iCisJCQkJICAiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJICByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ2lvbl9pZCAldSwgc3RhcnQgJWx4aCwgc2l6ZSAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJCXJlZ2lvbl9pZCwgcmVnaW9uX3N0YXJ0LCByZWdpb25fc2l6ZSk7CisJfQorCitvdXQ6CisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR1bXBfZGV2aWNlX2luZm8oc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKKwl1bnNpZ25lZCBpbnQgbnVtX2RldikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6IGJ1c18ldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgpOworCisJZm9yIChyZXBvLT5kZXZfaW5kZXggPSAwOyByZXBvLT5kZXZfaW5kZXggPCBudW1fZGV2OworCQlyZXBvLT5kZXZfaW5kZXgrKykgeworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCAmcmVwby0+ZGV2X3R5cGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlIgorCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgJnJlcG8tPmRldl9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIgorCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogZGV2X3R5cGUgJXUsIGRldl9pZCAldVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgsCisJCQlyZXBvLT5kZXZfdHlwZSwgcmVwby0+ZGV2X2lkKTsKKworCQlwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8ocmVwbyk7CisKKwkJaWYgKHJlcG8tPmJ1c190eXBlID09IFBTM19CVVNfVFlQRV9TVE9SQUdFKQorCQkJZHVtcF9zdG9yX2Rldl9pbmZvKHJlcG8pOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfYnVzX2luZm8odm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHJlcG87CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJbWVtc2V0KCZyZXBvLCAwLCBzaXplb2YocmVwbykpOworCisJZm9yIChyZXBvLmJ1c19pbmRleCA9IDA7IHJlcG8uYnVzX2luZGV4IDwgMTA7IHJlcG8uYnVzX2luZGV4KyspIHsKKwkJdW5zaWduZWQgaW50IG51bV9kZXY7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShyZXBvLmJ1c19pbmRleCwKKwkJCSZyZXBvLmJ1c190eXBlKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfdHlwZSgldSkgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChyZXBvLmJ1c19pbmRleCwKKwkJCSZyZXBvLmJ1c19pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX2lkKCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXBvLmJ1c19pbmRleCAhPSByZXBvLmJ1c19pZCkKKwkJCXByX2RlYnVnKCIlczolZCBidXNfaW5kZXggIT0gYnVzX2lkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2RldihyZXBvLmJ1c19pbmRleCwKKwkJCSZudW1fZGV2KTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldigldSkgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgYnVzXyV1OiBidXNfdHlwZSAldSwgYnVzX2lkICV1LCBudW1fZGV2ICV1XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCwgcmVwby5idXNfdHlwZSwKKwkJCXJlcG8uYnVzX2lkLCBudW1fZGV2KTsKKworCQlkdW1wX2RldmljZV9pbmZvKCZyZXBvLCBudW1fZGV2KTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKaW5kZXggOTM1Mzk2Ny4uYWEwNTI4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCkBAIC0zNywyOCArMzcsMzYgQEAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCiAjaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2RlZmluZSBEQkcgdWRiZ19wcmludGYKICNlbHNlCi0jZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZGVmaW5lIERCRyBwcl9kZWJ1ZwogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChDT05GSUdfU01QKQogc3RhdGljIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKSB7fQogI2VuZGlmCiAKLWludCBwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24odW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gKnYpCitzdGF0aWMgdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gcHMzX2Zpcm13YXJlX3ZlcnNpb247CisKK3ZvaWQgcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKHVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uICp2KQogewotCWludCByZXN1bHQgPSBsdjFfZ2V0X3ZlcnNpb25faW5mbygmdi0+cmF3KTsKLQotCWlmIChyZXN1bHQpIHsKLQkJdi0+cmF3ID0gMDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiByZXN1bHQ7CisJKnYgPSBwczNfZmlybXdhcmVfdmVyc2lvbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbik7CiAKK2ludCBwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKHUxNiBtYWpvciwgdTE2IG1pbm9yLCB1MTYgcmV2KQoreworCXVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uIHg7CisKKwl4LnBhZCA9IDA7CisJeC5tYWpvciA9IG1ham9yOworCXgubWlub3IgPSBtaW5vcjsKKwl4LnJldiA9IHJldjsKKworCXJldHVybiAocHMzX2Zpcm13YXJlX3ZlcnNpb24ucmF3IC0geC5yYXcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX2NvbXBhcmVfZmlybXdhcmVfdmVyc2lvbik7CisKIHN0YXRpYyB2b2lkIHBzM19wb3dlcl9zYXZlKHZvaWQpCiB7CiAJLyoKQEAgLTk5LDcgKzEwNyw4IEBACiAJd2hpbGUoMSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfRkJfUFMzCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUFMzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9QUzNfTU9EVUxFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfUFMzX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19QUzNfRkxBU0hfTU9EVUxFKQogc3RhdGljIHZvaWQgcHJlYWxsb2Moc3RydWN0IHBzM19wcmVhbGxvYyAqcCkKIHsKIAlpZiAoIXAtPnNpemUpCkBAIC0xMTUsMTIgKzEyNCwxNSBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzOiAlbHUgYnl0ZXMgYXQgJXBcbiIsIHAtPm5hbWUsIHAtPnNpemUsCiAJICAgICAgIHAtPmFkZHJlc3MpOwogfQorI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9QUzMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX1BTM19NT0RVTEUpCiBzdHJ1Y3QgcHMzX3ByZWFsbG9jIHBzM2ZiX3ZpZGVvbWVtb3J5ID0gewotICAgIC5uYW1lID0gInBzM2ZiIHZpZGVvbWVtb3J5IiwKLSAgICAuc2l6ZSA9IENPTkZJR19GQl9QUzNfREVGQVVMVF9TSVpFX00qMTAyNCoxMDI0LAotICAgIC5hbGlnbiA9IDEwMjQqMTAyNAkJCS8qIHRoZSBHUFUgcmVxdWlyZXMgMSBNaUIgYWxpZ25tZW50ICovCisJLm5hbWUgPSAicHMzZmIgdmlkZW9tZW1vcnkiLAorCS5zaXplID0gQ09ORklHX0ZCX1BTM19ERUZBVUxUX1NJWkVfTSoxMDI0KjEwMjQsCisJLmFsaWduID0gMTAyNCoxMDI0CQkvKiB0aGUgR1BVIHJlcXVpcmVzIDEgTWlCIGFsaWdubWVudCAqLwogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX3ZpZGVvbWVtb3J5KTsKICNkZWZpbmUgcHJlYWxsb2NfcHMzZmJfdmlkZW9tZW1vcnkoKQlwcmVhbGxvYygmcHMzZmJfdmlkZW9tZW1vcnkpCiAKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3BzM2ZiKGNoYXIgKnApCkBAIC0xMzcsNiArMTQ5LDMwIEBACiAjZGVmaW5lIHByZWFsbG9jX3BzM2ZiX3ZpZGVvbWVtb3J5KCkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUzNfRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX1BTM19GTEFTSF9NT0RVTEUpCitzdHJ1Y3QgcHMzX3ByZWFsbG9jIHBzM2ZsYXNoX2JvdW5jZV9idWZmZXIgPSB7CisJLm5hbWUgPSAicHMzZmxhc2ggYm91bmNlIGJ1ZmZlciIsCisJLnNpemUgPSAyNTYqMTAyNCwKKwkuYWxpZ24gPSAyNTYqMTAyNAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHBzM2ZsYXNoX2JvdW5jZV9idWZmZXIpOworI2RlZmluZSBwcmVhbGxvY19wczNmbGFzaF9ib3VuY2VfYnVmZmVyKCkJcHJlYWxsb2MoJnBzM2ZsYXNoX2JvdW5jZV9idWZmZXIpCisKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3BzM2ZsYXNoKGNoYXIgKnApCit7CisJaWYgKCFwKQorCQlyZXR1cm4gMTsKKworCWlmICghc3RyY21wKHAsICJvZmYiKSkKKwkJcHMzZmxhc2hfYm91bmNlX2J1ZmZlci5zaXplID0gMDsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oInBzM2ZsYXNoIiwgZWFybHlfcGFyc2VfcHMzZmxhc2gpOworI2Vsc2UKKyNkZWZpbmUgcHJlYWxsb2NfcHMzZmxhc2hfYm91bmNlX2J1ZmZlcigpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiBzdGF0aWMgaW50IHBzM19zZXRfZGFicih1NjQgZGFicikKIHsKIAllbnVtIHtEQUJSX1VTRVIgPSAxLCBEQUJSX0tFUk5FTCA9IDIsfTsKQEAgLTE0NiwxMyArMTgyLDEzIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwczNfc2V0dXBfYXJjaCh2b2lkKQogewotCXVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uIHY7CiAKIAlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAotCXBzM19nZXRfZmlybXdhcmVfdmVyc2lvbigmdik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUFMzIGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXVcbiIsIHYubWFqb3IsIHYubWlub3IsCi0JCXYucmV2KTsKKwlsdjFfZ2V0X3ZlcnNpb25faW5mbygmcHMzX2Zpcm13YXJlX3ZlcnNpb24ucmF3KTsKKwlwcmludGsoS0VSTl9JTkZPICJQUzMgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldVxuIiwKKwkgICAgICAgcHMzX2Zpcm13YXJlX3ZlcnNpb24ubWFqb3IsIHBzM19maXJtd2FyZV92ZXJzaW9uLm1pbm9yLAorCSAgICAgICBwczNfZmlybXdhcmVfdmVyc2lvbi5yZXYpOwogCiAJcHMzX3NwdV9zZXRfcGxhdGZvcm0oKTsKIAlwczNfbWFwX2h0YWIoKTsKQEAgLTE2Niw2ICsyMDIsOCBAQAogI2VuZGlmCiAKIAlwcmVhbGxvY19wczNmYl92aWRlb21lbW9yeSgpOworCXByZWFsbG9jX3BzM2ZsYXNoX2JvdW5jZV9idWZmZXIoKTsKKwogCXBwY19tZC5wb3dlcl9zYXZlID0gcHMzX3Bvd2VyX3NhdmU7CiAKIAlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKQEAgLTE4NCw3ICsyMjIsNyBAQAogCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCiAJZHRfcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShkdF9yb290LCAiUFMzIikpCisJaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUoZHRfcm9vdCwgInNvbnkscHMzIikpCiAJCXJldHVybiAwOwogCiAJcG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcyB8PSBGV19GRUFUVVJFX1BTM19QT1NTSUJMRTsKQEAgLTIwMSwzMSArMjM5LDEyIEBACiAjaWYgZGVmaW5lZChDT05GSUdfS0VYRUMpCiBzdGF0aWMgdm9pZCBwczNfa2V4ZWNfY3B1X2Rvd24oaW50IGNyYXNoX3NodXRkb3duLCBpbnQgc2Vjb25kYXJ5KQogewotCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoc2Vjb25kYXJ5KSB7Ci0JCWludCBjcHU7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQkJaWYgKGNwdSkKLQkJCQlwczNfc21wX2NsZWFudXBfY3B1KGNwdSk7Ci0JfSBlbHNlCi0JCXBzM19zbXBfY2xlYW51cF9jcHUoMCk7CisJREJHKCIgLT4gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKIAotCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotfQotCi1zdGF0aWMgdm9pZCBwczNfbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBwZV9pZDsKLQotCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcHBlX2lkKTsKLQlsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAocHBlX2lkLCAwLCAwKTsKLQlwczNfbW1fc2h1dGRvd24oKTsKLQlwczNfbW1fdmFzX2Rlc3Ryb3koKTsKLQotCWRlZmF1bHRfbWFjaGluZV9rZXhlYyhpbWFnZSk7CisJcHMzX3NtcF9jbGVhbnVwX2NwdShjcHUpOworCXBzM19zaHV0ZG93bl9JUlEoY3B1KTsKIAogCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQpAQCAtMjQ3LDcgKzI2Niw3IEBACiAJLnBvd2VyX29mZgkJCT0gcHMzX3Bvd2VyX29mZiwKICNpZiBkZWZpbmVkKENPTkZJR19LRVhFQykKIAkua2V4ZWNfY3B1X2Rvd24JCQk9IHBzM19rZXhlY19jcHVfZG93biwKLQkubWFjaGluZV9rZXhlYwkJCT0gcHMzX21hY2hpbmVfa2V4ZWMsCisJLm1hY2hpbmVfa2V4ZWMJCQk9IGRlZmF1bHRfbWFjaGluZV9rZXhlYywKIAkubWFjaGluZV9rZXhlY19wcmVwYXJlCQk9IGRlZmF1bHRfbWFjaGluZV9rZXhlY19wcmVwYXJlLAogCS5tYWNoaW5lX2NyYXNoX3NodXRkb3duCQk9IGRlZmF1bHRfbWFjaGluZV9jcmFzaF9zaHV0ZG93biwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwppbmRleCA1MzQxNmVjLi5mMGIxMmYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwpAQCAtMjcsOSArMjcsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogc3RhdGljIGlycXJldHVybl90IGlwaV9mdW5jdGlvbl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKm1zZykKQEAgLTM5LDExICszOSwxMSBAQAogfQogCiAvKioKLSAgKiB2aXJxcyAtIGEgcGVyIGNwdSBhcnJheSBvZiB2aXJxcyBmb3IgaXBpIHVzZQorICAqIHBzM19pcGlfdmlycXMgLSBhIHBlciBjcHUgYXJyYXkgb2YgdmlycXMgZm9yIGlwaSB1c2UKICAgKi8KIAogI2RlZmluZSBNU0dfQ09VTlQgNAotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgdmlycXNbTVNHX0NPVU5UXSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBwczNfaXBpX3ZpcnFzW01TR19DT1VOVF0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbTVNHX0NPVU5UXSA9IHsKIAkiaXBpIGNhbGwiLApAQCAtNjIsNyArNjIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JdmlycSA9IHBlcl9jcHUodmlycXMsIHRhcmdldClbbXNnXTsKKwl2aXJxID0gcGVyX2NwdShwczNfaXBpX3ZpcnFzLCB0YXJnZXQpW21zZ107CiAJcmVzdWx0ID0gcHMzX3NlbmRfZXZlbnRfbG9jYWxseSh2aXJxKTsKIAogCWlmIChyZXN1bHQpCkBAIC05NCwxMyArOTQsMTMgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBwczNfc21wX3NldHVwX2NwdShpbnQgY3B1KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50ICp2aXJxcyA9IHBlcl9jcHUodmlycXMsIGNwdSk7CisJdW5zaWduZWQgaW50ICp2aXJxcyA9IHBlcl9jcHUocHMzX2lwaV92aXJxcywgY3B1KTsKIAlpbnQgaTsKIAogCURCRygiIC0+ICVzOiVkOiAoJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNwdSk7CiAKIAkvKgotCSAqIENoZWNrIGFzc3VtcHRpb25zIG9uIHZpcnFzW10gaW5kZXhpbmcuIElmIHRoaXMKKwkgKiBDaGVjayBhc3N1bXB0aW9ucyBvbiBwczNfaXBpX3ZpcnFzW10gaW5kZXhpbmcuIElmIHRoaXMKIAkgKiBjaGVjayBmYWlscywgdGhlbiBhIGRpZmZlcmVudCBtYXBwaW5nIG9mIFBQQ19NU0dfCiAJICogdG8gaW5kZXggbmVlZHMgdG8gYmUgc2V0dXAuCiAJICovCkBAIC0xMzIsMTMgKzEzMiwxMyBAQAogCiB2b2lkIHBzM19zbXBfY2xlYW51cF9jcHUoaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdSh2aXJxcywgY3B1KTsKKwl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdShwczNfaXBpX3ZpcnFzLCBjcHUpOwogCWludCBpOwogCiAJREJHKCIgLT4gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKIAogCWZvciAoaSA9IDA7IGkgPCBNU0dfQ09VTlQ7IGkrKykgewotCQlmcmVlX2lycSh2aXJxc1tpXSwgKHZvaWQqKShsb25nKWkpOworCQkvKiBDYW4ndCBjYWxsIGZyZWVfaXJxIGZyb20gaW50ZXJydXB0IGNvbnRleHQuICovCiAJCXBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSh2aXJxc1tpXSk7CiAJCXZpcnFzW2ldID0gTk9fSVJROwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKaW5kZXggNjUxNDM3Yy4uNTAyZDgwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKQEAgLTE4MiwxNSArMTgyLDE4IEBACiB7CiAJc3RydWN0IHRhYmxlIHtjaGFyKiBuYW1lOyB1bnNpZ25lZCBsb25nIGFkZHI7IHVuc2lnbmVkIGxvbmcgc2l6ZTt9OwogCi0Jc3B1X3BkYXRhKHNwdSktPnNoYWRvdyA9IF9faW9yZW1hcCgKLQkJc3B1X3BkYXRhKHNwdSktPnNoYWRvd19hZGRyLCBzaXplb2Yoc3RydWN0IHNwZV9zaGFkb3cpLAotCQlwZ3Byb3RfdmFsKFBBR0VfUkVBRE9OTFkpIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKKwlzcHVfcGRhdGEoc3B1KS0+c2hhZG93ID0gaW9yZW1hcF9mbGFncyhzcHVfcGRhdGEoc3B1KS0+c2hhZG93X2FkZHIsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNwZV9zaGFkb3cpLAorCQkJCQkgICAgICAgcGdwcm90X3ZhbChQQUdFX1JFQURPTkxZKSB8CisJCQkJCSAgICAgICBfUEFHRV9OT19DQUNIRSk7CiAJaWYgKCFzcHVfcGRhdGEoc3B1KS0+c2hhZG93KSB7CiAJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBzaGFkb3cgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlnb3RvIGZhaWxfaW9yZW1hcDsKIAl9CiAKLQlzcHUtPmxvY2FsX3N0b3JlID0gaW9yZW1hcChzcHUtPmxvY2FsX3N0b3JlX3BoeXMsIExTX1NJWkUpOworCXNwdS0+bG9jYWxfc3RvcmUgPSAoX19mb3JjZSB2b2lkICopaW9yZW1hcF9mbGFncyhzcHUtPmxvY2FsX3N0b3JlX3BoeXMsCisJCUxTX1NJWkUsIF9QQUdFX05PX0NBQ0hFKTsKKwogCWlmICghc3B1LT5sb2NhbF9zdG9yZSkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgbG9jYWxfc3RvcmUgZmFpbGVkXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKQEAgLTE5OSw2ICsyMDIsNyBAQAogCiAJc3B1LT5wcm9ibGVtID0gaW9yZW1hcChzcHUtPnByb2JsZW1fcGh5cywKIAkJc2l6ZW9mKHN0cnVjdCBzcHVfcHJvYmxlbSkpOworCiAJaWYgKCFzcHUtPnByb2JsZW0pIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHByb2JsZW0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlnb3RvIGZhaWxfaW9yZW1hcDsKQEAgLTIwNiw2ICsyMTAsNyBAQAogCiAJc3B1LT5wcml2MiA9IGlvcmVtYXAoc3B1X3BkYXRhKHNwdSktPnByaXYyX2FkZHIsCiAJCXNpemVvZihzdHJ1Y3Qgc3B1X3ByaXYyKSk7CisKIAlpZiAoIXNwdS0+cHJpdjIpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHByaXYyIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJZ290byBmYWlsX2lvcmVtYXA7CkBAIC00MDAsMTEgKzQwNSwxMyBAQAogCQl9CiAJfQogCi0JaWYgKHJlc3VsdCkKKwlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiByZXN1bHQ7CisJfQogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gbnVtX3Jlc291cmNlX2lkOwogfQogCiBjb25zdCBzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzIHNwdV9tYW5hZ2VtZW50X3BzM19vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKaW5kZXggNmJkYTUxMC4uNGJiNjM0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwpAQCAtMzAsMjIgKzMwLDIyOCBAQAogCiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAorc3RhdGljIHN0cnVjdCBkZXZpY2UgcHMzX3N5c3RlbV9idXMgPSB7CisJLmJ1c19pZCA9ICJwczNfc3lzdGVtIiwKK307CisKKy8qIEZJWE1FOiBuZWVkIGRldmljZSB1c2FnZSBjb3VudGVycyEgKi8KK3N0cnVjdCB7CisJc3RydWN0IG11dGV4IG11dGV4OworCWludCBzYl8xMTsgLyogdXNiIDAgKi8KKwlpbnQgc2JfMTI7IC8qIHVzYiAwICovCisJaW50IGdwdTsKK30gc3RhdGljIHVzYWdlX2hhY2s7CisKK3N0YXRpYyBpbnQgcHMzX2lzX2RldmljZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJCQkgdW5zaWduZWQgaW50IGJ1c19pZCwgdW5zaWduZWQgaW50IGRldl9pZCkKK3sKKwlyZXR1cm4gZGV2LT5idXNfaWQgPT0gYnVzX2lkICYmIGRldi0+ZGV2X2lkID09IGRldl9pZDsKK30KKworc3RhdGljIGludCBwczNfb3Blbl9odl9kZXZpY2Vfc2Ioc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisKKwlCVUdfT04oIWRldi0+YnVzX2lkKTsKKwltdXRleF9sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMSkpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMSsrOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMSA+IDEpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAocHMzX2lzX2RldmljZShkZXYsIDEsIDIpKSB7CisJCXVzYWdlX2hhY2suc2JfMTIrKzsKKwkJaWYgKHVzYWdlX2hhY2suc2JfMTIgPiAxKSB7CisJCQlyZXN1bHQgPSAwOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKGRldi0+YnVzX2lkLCBkZXYtPmRldl9pZCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX29wZW5fZGV2aWNlIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfY2xvc2VfaHZfZGV2aWNlX3NiKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCisJQlVHX09OKCFkZXYtPmJ1c19pZCk7CisJbXV0ZXhfbG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisKKwlpZiAocHMzX2lzX2RldmljZShkZXYsIDEsIDEpKSB7CisJCXVzYWdlX2hhY2suc2JfMTEtLTsKKwkJaWYgKHVzYWdlX2hhY2suc2JfMTEpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAocHMzX2lzX2RldmljZShkZXYsIDEsIDIpKSB7CisJCXVzYWdlX2hhY2suc2JfMTItLTsKKwkJaWYgKHVzYWdlX2hhY2suc2JfMTIpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlyZXN1bHQgPSBsdjFfY2xvc2VfZGV2aWNlKGRldi0+YnVzX2lkLCBkZXYtPmRldl9pZCk7CisJQlVHX09OKHJlc3VsdCk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19vcGVuX2h2X2RldmljZV9ncHUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisKKwltdXRleF9sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCXVzYWdlX2hhY2suZ3B1Kys7CisJaWYgKHVzYWdlX2hhY2suZ3B1ID4gMSkgeworCQlyZXN1bHQgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVzdWx0ID0gbHYxX2dwdV9vcGVuKDApOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9ncHVfb3BlbiBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJcmVzdWx0ID0gLUVQRVJNOworCX0KKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX2Nsb3NlX2h2X2RldmljZV9ncHUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisKKwltdXRleF9sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCXVzYWdlX2hhY2suZ3B1LS07CisJaWYgKHVzYWdlX2hhY2suZ3B1KSB7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZ3B1X2Nsb3NlKCk7CisJQlVHX09OKHJlc3VsdCk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX29wZW5faHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlCVUdfT04oIWRldik7CisJcHJfZGVidWcoIiVzOiVkOiBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7CisKKwlzd2l0Y2ggKGRldi0+bWF0Y2hfaWQpIHsKKwljYXNlIFBTM19NQVRDSF9JRF9FSENJOgorCWNhc2UgUFMzX01BVENIX0lEX09IQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfR0VMSUM6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ESVNLOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfUk9NOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfRkxBU0g6CisJCXJldHVybiBwczNfb3Blbl9odl9kZXZpY2Vfc2IoZGV2KTsKKworCWNhc2UgUFMzX01BVENIX0lEX1NPVU5EOgorCWNhc2UgUFMzX01BVENIX0lEX0dSQVBISUNTOgorCQlyZXR1cm4gcHMzX29wZW5faHZfZGV2aWNlX2dwdShkZXYpOworCisJY2FzZSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1M6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVI6CisJCXByX2RlYnVnKCIlczolZDogdW5zdXBwb3J0ZWQgbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKwkJcHJfZGVidWcoIiVzOiVkOiBidXNfaWQ6ICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBkZXYtPmJ1c19pZCk7CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczolZDogdW5rbm93biBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisJQlVHKCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfb3Blbl9odl9kZXZpY2UpOworCitpbnQgcHMzX2Nsb3NlX2h2X2RldmljZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJQlVHX09OKCFkZXYpOworCXByX2RlYnVnKCIlczolZDogbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCisJc3dpdGNoIChkZXYtPm1hdGNoX2lkKSB7CisJY2FzZSBQUzNfTUFUQ0hfSURfRUhDSToKKwljYXNlIFBTM19NQVRDSF9JRF9PSENJOgorCWNhc2UgUFMzX01BVENIX0lEX0dFTElDOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfRElTSzoKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX1JPTToKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX0ZMQVNIOgorCQlyZXR1cm4gcHMzX2Nsb3NlX2h2X2RldmljZV9zYihkZXYpOworCisJY2FzZSBQUzNfTUFUQ0hfSURfU09VTkQ6CisJY2FzZSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M6CisJCXJldHVybiBwczNfY2xvc2VfaHZfZGV2aWNlX2dwdShkZXYpOworCisJY2FzZSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1M6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVI6CisJCXByX2RlYnVnKCIlczolZDogdW5zdXBwb3J0ZWQgbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKwkJcHJfZGVidWcoIiVzOiVkOiBidXNfaWQ6ICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBkZXYtPmJ1c19pZCk7CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczolZDogdW5rbm93biBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisJQlVHKCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfY2xvc2VfaHZfZGV2aWNlKTsKKwogI2RlZmluZSBkdW1wX21taW9fcmVnaW9uKF9hKSBfZHVtcF9tbWlvX3JlZ2lvbihfYSwgX19mdW5jX18sIF9fTElORV9fKQogc3RhdGljIHZvaWQgX2R1bXBfbW1pb19yZWdpb24oY29uc3Qgc3RydWN0IHBzM19tbWlvX3JlZ2lvbiogciwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6IGRldiAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGlkLmJ1c19pZCwKLQkJci0+ZGlkLmRldl9pZCk7CisJcHJfZGVidWcoIiVzOiVkOiBkZXYgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsIHItPmRldi0+YnVzX2lkLAorCQlyLT5kZXYtPmRldl9pZCk7CiAJcHJfZGVidWcoIiVzOiVkOiBidXNfYWRkciAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOwogCXByX2RlYnVnKCIlczolZDogbGVuICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmxlbik7CiAJcHJfZGVidWcoIiVzOiVkOiBscGFyX2FkZHIgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bHBhcl9hZGRyKTsKIH0KIAotaW50IHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3N0YXRpYyBpbnQgcHMzX3NiX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CiAKLQlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9tbWlvX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKIAkJci0+YnVzX2FkZHIsIHItPmxlbiwgci0+cGFnZV9zaXplLCAmci0+bHBhcl9hZGRyKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTU3LDEzICsyNjMsMjYgQEAKIAlkdW1wX21taW9fcmVnaW9uKHIpOwogCXJldHVybiByZXN1bHQ7CiB9CisKK3N0YXRpYyBpbnQgcHMzX2lvYzBfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJLyogZGV2aWNlIHNwZWNpZmljOyBkbyBub3RoaW5nIGN1cnJlbnRseSAqLworCXJldHVybiAwOworfQorCitpbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCXJldHVybiByLT5tbWlvX29wcy0+Y3JlYXRlKHIpOworfQogRVhQT1JUX1NZTUJPTF9HUEwocHMzX21taW9fcmVnaW9uX2NyZWF0ZSk7CiAKLWludCBwczNfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQorc3RhdGljIGludCBwczNfc2JfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CiAKLQlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJZHVtcF9tbWlvX3JlZ2lvbihyKTsKKzsKKwlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKIAkJci0+bHBhcl9hZGRyKTsKIAogCWlmIChyZXN1bHQpCkBAIC03MywxNCArMjkyLDYwIEBACiAJci0+bHBhcl9hZGRyID0gMDsKIAlyZXR1cm4gcmVzdWx0OwogfQorCitzdGF0aWMgaW50IHBzM19pb2MwX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwkvKiBkZXZpY2Ugc3BlY2lmaWM7IGRvIG5vdGhpbmcgY3VycmVudGx5ICovCisJcmV0dXJuIDA7Cit9CisKKworaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJcmV0dXJuIHItPm1taW9fb3BzLT5mcmVlKHIpOworfQorCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfZnJlZV9tbWlvX3JlZ2lvbik7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX29wcyBwczNfbW1pb19zYl9yZWdpb25fb3BzID0geworCS5jcmVhdGUgPSBwczNfc2JfbW1pb19yZWdpb25fY3JlYXRlLAorCS5mcmVlID0gcHMzX3NiX2ZyZWVfbW1pb19yZWdpb24KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX29wcyBwczNfbW1pb19pb2MwX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IHBzM19pb2MwX21taW9fcmVnaW9uX2NyZWF0ZSwKKwkuZnJlZSA9IHBzM19pb2MwX2ZyZWVfbW1pb19yZWdpb24KK307CisKK2ludCBwczNfbW1pb19yZWdpb25faW5pdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplKQoreworCXItPmRldiA9IGRldjsKKwlyLT5idXNfYWRkciA9IGJ1c19hZGRyOworCXItPmxlbiA9IGxlbjsKKwlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7CisJc3dpdGNoIChkZXYtPmRldl90eXBlKSB7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfU0I6CisJCXItPm1taW9fb3BzID0gJnBzM19tbWlvX3NiX3JlZ2lvbl9vcHM7CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVklDRV9UWVBFX0lPQzA6CisJCXItPm1taW9fb3BzID0gJnBzM19tbWlvX2lvYzBfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19tbWlvX3JlZ2lvbl9pbml0KTsKKwogc3RhdGljIGludCBwczNfc3lzdGVtX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpfZHJ2KQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0gdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kcnYpOwotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPSBwczNfZHJ2X3RvX3N5c3RlbV9idXNfZHJ2KF9kcnYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAKIAlyZXN1bHQgPSBkZXYtPm1hdGNoX2lkID09IGRydi0+bWF0Y2hfaWQ7CiAKQEAgLTkyLDMyICszNTcsMTQgQEAKIAogc3RhdGljIGludCBwczNfc3lzdGVtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOwotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9Ci0JCXRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcihfZGV2LT5kcml2ZXIpOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2OwogCi0JcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkLCAwKTsKKwlCVUdfT04oIWRldik7CisJcHJfaW5mbygiIC0+ICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBfZGV2LT5idXNfaWQpOwogCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9vcGVuX2RldmljZSBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVBQ0NFUzsKLQkJZ290byBjbGVhbl9ub25lOwotCX0KLQotCWlmIChkZXYtPmRfcmVnaW9uLT5kaWQuYnVzX2lkKSB7Ci0JCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2NyZWF0ZShkZXYtPmRfcmVnaW9uKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfcmVnaW9uX2NyZWF0ZSBmYWlsZWQgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7Ci0JCQlCVUdfT04oImNoZWNrIHJlZ2lvbiB0eXBlIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBjbGVhbl9kZXZpY2U7Ci0JCX0KLQl9Ci0KKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKIAlCVUdfT04oIWRydik7CiAKIAlpZiAoZHJ2LT5wcm9iZSkKQEAgLTEyNiw1NiArMzczLDEyNyBAQAogCQlwcl9pbmZvKCIlczolZDogJXMgbm8gcHJvYmUgbWV0aG9kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQlkZXYtPmNvcmUuYnVzX2lkKTsKIAotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBkcnYtPnByb2JlIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBjbGVhbl9kbWE7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLQotY2xlYW5fZG1hOgotCXBzM19kbWFfcmVnaW9uX2ZyZWUoZGV2LT5kX3JlZ2lvbik7Ci1jbGVhbl9kZXZpY2U6Ci0JbHYxX2Nsb3NlX2RldmljZShkZXYtPmRpZC5idXNfaWQsIGRldi0+ZGlkLmRldl9pZCk7Ci1jbGVhbl9ub25lOgorCXByX2luZm8oIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBwczNfc3lzdGVtX2J1c19yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnY7CisKKwlCVUdfT04oIWRldik7CisJcHJfaW5mbygiIC0+ICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBfZGV2LT5idXNfaWQpOworCisJZHJ2ID0gcHMzX3N5c3RlbV9idXNfZGV2X3RvX3N5c3RlbV9idXNfZHJ2KGRldik7CisJQlVHX09OKCFkcnYpOwogCiAJaWYgKGRydi0+cmVtb3ZlKQotCQlkcnYtPnJlbW92ZShkZXYpOworCQlyZXN1bHQgPSBkcnYtPnJlbW92ZShkZXYpOwogCWVsc2UKLQkJcHJfaW5mbygiJXM6JWQ6ICVzIG5vIHJlbW92ZSBtZXRob2RcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCWRldi0+Y29yZS5idXNfaWQpOworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCAlczogbm8gcmVtb3ZlIG1ldGhvZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogCi0JcHMzX2RtYV9yZWdpb25fZnJlZShkZXYtPmRfcmVnaW9uKTsKLQlwczNfZnJlZV9tbWlvX3JlZ2lvbihkZXYtPm1fcmVnaW9uKTsKLQlsdjFfY2xvc2VfZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkKTsKKwlwcl9pbmZvKCIgPC0gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOworCXJldHVybiByZXN1bHQ7Cit9CiAKK3N0YXRpYyB2b2lkIHBzM19zeXN0ZW1fYnVzX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnY7CisKKwlCVUdfT04oIWRldik7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWQ6IG1hdGNoX2lkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRldi0+bWF0Y2hfaWQpOworCisJaWYgKCFkZXYtPmNvcmUuZHJpdmVyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBkcml2ZXIgYm91bmRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCisJZHJ2ID0gcHMzX3N5c3RlbV9idXNfZGV2X3RvX3N5c3RlbV9idXNfZHJ2KGRldik7CisKKwlCVUdfT04oIWRydik7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXMgLT4gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5jb3JlLmJ1c19pZCwgZHJ2LT5jb3JlLm5hbWUpOworCisJaWYgKGRydi0+c2h1dGRvd24pCisJCWRydi0+c2h1dGRvd24oZGV2KTsKKwllbHNlIGlmIChkcnYtPnJlbW92ZSkgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCAlczogbm8gc2h1dGRvd24sIGNhbGxpbmcgcmVtb3ZlXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CisJCWRydi0+cmVtb3ZlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQgJXM6IG5vIHNodXRkb3duIG1ldGhvZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOworCQlCVUcoKTsKKwl9CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3N5c3RlbV9idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIGNoYXIgKiplbnZwLAorCQkJCSBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CisJaW50IGkgPSAwLCBsZW5ndGggPSAwOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwKKwkJCSAgICZsZW5ndGgsICJNT0RBTElBUz1wczM6JWQiLAorCQkJICAgZGV2LT5tYXRjaF9pZCkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW52cFtpXSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmEsCisJY2hhciAqYnVmKQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CisJaW50IGxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAicHMzOiVkXG4iLCBkZXYtPm1hdGNoX2lkKTsKKworCXJldHVybiAobGVuID49IFBBR0VfU0laRSkgPyAoUEFHRV9TSVpFIC0gMSkgOiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwczNfc3lzdGVtX2J1c19kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8obW9kYWxpYXMpLAorCV9fQVRUUl9OVUxMLAorfTsKKwogc3RydWN0IGJ1c190eXBlIHBzM19zeXN0ZW1fYnVzX3R5cGUgPSB7CiAJLm5hbWUgPSAicHMzX3N5c3RlbV9idXMiLAogCS5tYXRjaCA9IHBzM19zeXN0ZW1fYnVzX21hdGNoLAorCS51ZXZlbnQgPSBwczNfc3lzdGVtX2J1c191ZXZlbnQsCiAJLnByb2JlID0gcHMzX3N5c3RlbV9idXNfcHJvYmUsCiAJLnJlbW92ZSA9IHBzM19zeXN0ZW1fYnVzX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBwczNfc3lzdGVtX2J1c19zaHV0ZG93biwKKwkuZGV2X2F0dHJzID0gcHMzX3N5c3RlbV9idXNfZGV2X2F0dHJzLAogfTsKIAotaW50IF9faW5pdCBwczNfc3lzdGVtX2J1c19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwczNfc3lzdGVtX2J1c19pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKIAogCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJbXV0ZXhfaW5pdCgmdXNhZ2VfaGFjay5tdXRleCk7CisKKwlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJnBzM19zeXN0ZW1fYnVzKTsKKwlCVUdfT04ocmVzdWx0KTsKKwogCXJlc3VsdCA9IGJ1c19yZWdpc3RlcigmcHMzX3N5c3RlbV9idXNfdHlwZSk7CiAJQlVHX09OKHJlc3VsdCk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE4NSwxNiArNTAzLDEzIEBACiAgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQgc2V0cyBkbWFfaGFuZGxlCiAgKiB0byB0aGUgZG1hIGFkZHJlc3MgKG1hcHBpbmcpIG9mIHRoZSBmaXJzdCBwYWdlLgogICovCi0KIHN0YXRpYyB2b2lkICogcHMzX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHNpemVfdCBzaXplLAotCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCisJCQkJICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKIHsKIAlpbnQgcmVzdWx0OwotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyOwogCi0JQlVHX09OKCFkZXYtPmRfcmVnaW9uLT5idXNfYWRkcik7Ci0KIAlmbGFnICY9IH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSk7CiAJZmxhZyB8PSBfX0dGUF9aRVJPOwogCkBAIC0yMDUsNyArNTIwLDggQEAKIAkJZ290byBjbGVhbl9ub25lOwogCX0KIAotCXJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sIHZpcnRfYWRkciwgc2l6ZSwgZG1hX2hhbmRsZSk7CisJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgdmlydF9hZGRyLCBzaXplLCBkbWFfaGFuZGxlLAorCQkJICAgICBJT1BURV9QUF9XIHwgSU9QVEVfUFBfUiB8IElPUFRFX1NPX1JXIHwgSU9QVEVfTSk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCkBAIC0yMjYsNyArNTQyLDcgQEAKIHN0YXRpYyB2b2lkIHBzM19mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKIAlkbWFfYWRkcl90IGRtYV9oYW5kbGUpCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAKIAlwczNfZG1hX3VubWFwKGRldi0+ZF9yZWdpb24sIGRtYV9oYW5kbGUsIHNpemUpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7CkBAIC0yMzksMTUgKzU1NSwxNiBAQAogICogYnl0ZSB3aXRoaW4gdGhlIHBhZ2UgYXMgdmFkZHIuCiAgKi8KIAotc3RhdGljIGRtYV9hZGRyX3QgcHMzX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKK3N0YXRpYyBkbWFfYWRkcl90IHBzM19zYl9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKIAogCXJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sICh1bnNpZ25lZCBsb25nKXB0ciwgc2l6ZSwKLQkJJmJ1c19hZGRyKTsKKwkJCSAgICAgJmJ1c19hZGRyLAorCQkJICAgICBJT1BURV9QUF9SIHwgSU9QVEVfUFBfVyB8IElPUFRFX1NPX1JXIHwgSU9QVEVfTSk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCkBAIC0yNTcsMTAgKzU3NCw0NCBAQAogCXJldHVybiBidXNfYWRkcjsKIH0KIAorc3RhdGljIGRtYV9hZGRyX3QgcHMzX2lvYzBfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB2b2lkICpwdHIsCisJCQkJICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCXU2NCBpb3B0ZV9mbGFnOworCisJaW9wdGVfZmxhZyA9IElPUFRFX007CisJc3dpdGNoIChkaXJlY3Rpb24pIHsKKwljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQlpb3B0ZV9mbGFnIHw9IElPUFRFX1BQX1IgfCBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlc7CisJCWJyZWFrOworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJaW9wdGVfZmxhZyB8PSBJT1BURV9QUF9SIHwgSU9QVEVfU09fUjsKKwkJYnJlYWs7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCWlvcHRlX2ZsYWcgfD0gSU9QVEVfUFBfVyB8IElPUFRFX1NPX1JXOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBub3QgaGFwcG5lZCAqLworCQlCVUcoKTsKKwl9OworCXJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sICh1bnNpZ25lZCBsb25nKXB0ciwgc2l6ZSwKKwkJCSAgICAgJmJ1c19hZGRyLCBpb3B0ZV9mbGFnKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwl9CisJcmV0dXJuIGJ1c19hZGRyOworfQorCiBzdGF0aWMgdm9pZCBwczNfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCiAJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlpbnQgcmVzdWx0OwogCiAJcmVzdWx0ID0gcHMzX2RtYV91bm1hcChkZXYtPmRfcmVnaW9uLCBkbWFfYWRkciwgc2l6ZSk7CkBAIC0yNzEsMjAgKzYyMiwyMCBAQAogCX0KIH0KIAotc3RhdGljIGludCBwczNfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKK3N0YXRpYyBpbnQgcHMzX3NiX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogI2lmIGRlZmluZWQoQ09ORklHX1BTM19EWU5BTUlDX0RNQSkKIAlCVUdfT04oImRvIik7CiAJcmV0dXJuIC1FUEVSTTsKICNlbHNlCi0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewogCQlpbnQgcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwKIAkJCXBhZ2VfdG9fcGh5cyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoLAotCQkJJnNnLT5kbWFfYWRkcmVzcyk7CisJCQkJCSAmc2ctPmRtYV9hZGRyZXNzLCAwKTsKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLApAQCAtMjk5LDcgKzY1MCwxNSBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIHBzM191bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorc3RhdGljIGludCBwczNfaW9jMF9tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgIGludCBuZW50cywKKwkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzX3NiX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfUFMzX0RZTkFNSUNfRE1BKQpAQCAtMzA3LDE4ICs2NjYsMzQgQEAKICNlbmRpZgogfQogCitzdGF0aWMgdm9pZCBwczNfaW9jMF91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVRygpOworfQorCiBzdGF0aWMgaW50IHBzM19kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHU2NCBtYXNrKQogewogCXJldHVybiBtYXNrID49IERNQV8zMkJJVF9NQVNLOwogfQogCi1zdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyBwczNfZG1hX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBzM19zYl9kbWFfb3BzID0gewogCS5hbGxvY19jb2hlcmVudCA9IHBzM19hbGxvY19jb2hlcmVudCwKIAkuZnJlZV9jb2hlcmVudCA9IHBzM19mcmVlX2NvaGVyZW50LAotCS5tYXBfc2luZ2xlID0gcHMzX21hcF9zaW5nbGUsCisJLm1hcF9zaW5nbGUgPSBwczNfc2JfbWFwX3NpbmdsZSwKIAkudW5tYXBfc2luZ2xlID0gcHMzX3VubWFwX3NpbmdsZSwKLQkubWFwX3NnID0gcHMzX21hcF9zZywKLQkudW5tYXBfc2cgPSBwczNfdW5tYXBfc2csCisJLm1hcF9zZyA9IHBzM19zYl9tYXBfc2csCisJLnVubWFwX3NnID0gcHMzX3NiX3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkID0gcHMzX2RtYV9zdXBwb3J0ZWQKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBzM19pb2MwX2RtYV9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50ID0gcHMzX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50ID0gcHMzX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zaW5nbGUgPSBwczNfaW9jMF9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUgPSBwczNfdW5tYXBfc2luZ2xlLAorCS5tYXBfc2cgPSBwczNfaW9jMF9tYXBfc2csCisJLnVubWFwX3NnID0gcHMzX2lvYzBfdW5tYXBfc2csCiAJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZAogfTsKIApAQCAtMzI4LDcgKzcwMyw3IEBACiAKIHN0YXRpYyB2b2lkIHBzM19zeXN0ZW1fYnVzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJa2ZyZWUoZGV2KTsKIH0KIApAQCAtMzQzLDE4ICs3MTgsMzcgQEAKIGludCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBkZXZfY291bnQgPSAxOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X2lvYzBfY291bnQ7CisJc3RhdGljIHVuc2lnbmVkIGludCBkZXZfc2JfY291bnQ7CisJc3RhdGljIHVuc2lnbmVkIGludCBkZXZfdnVhcnRfY291bnQ7CiAKLQlkZXYtPmNvcmUucGFyZW50ID0gTlVMTDsKKwlpZiAoIWRldi0+Y29yZS5wYXJlbnQpCisJCWRldi0+Y29yZS5wYXJlbnQgPSAmcHMzX3N5c3RlbV9idXM7CiAJZGV2LT5jb3JlLmJ1cyA9ICZwczNfc3lzdGVtX2J1c190eXBlOwogCWRldi0+Y29yZS5yZWxlYXNlID0gcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2U7CiAKLQlkZXYtPmNvcmUuYXJjaGRhdGEub2Zfbm9kZSA9IE5VTEw7Ci0JZGV2LT5jb3JlLmFyY2hkYXRhLmRtYV9vcHMgPSAmcHMzX2RtYV9vcHM7Ci0JZGV2LT5jb3JlLmFyY2hkYXRhLm51bWFfbm9kZSA9IDA7CisJc3dpdGNoIChkZXYtPmRldl90eXBlKSB7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJZGV2LT5jb3JlLmFyY2hkYXRhLmRtYV9vcHMgPSAmcHMzX2lvYzBfZG1hX29wczsKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJImlvYzBfJTAyeCIsICsrZGV2X2lvYzBfY291bnQpOworCQlicmVhazsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9TQjoKKwkJZGV2LT5jb3JlLmFyY2hkYXRhLmRtYV9vcHMgPSAmcHMzX3NiX2RtYV9vcHM7CisJCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwKKwkJCSJzYl8lMDJ4IiwgKytkZXZfc2JfY291bnQpOwogCi0Jc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLCAic2JfJTAyeCIsCi0JCWRldl9jb3VudCsrKTsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfVlVBUlQ6CisJCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwKKwkJCSJ2dWFydF8lMDJ4IiwgKytkZXZfdnVhcnRfY291bnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9OworCisJZGV2LT5jb3JlLmFyY2hkYXRhLm9mX25vZGUgPSBOVUxMOworCWRldi0+Y29yZS5hcmNoZGF0YS5udW1hX25vZGUgPSAwOwogCiAJcHJfZGVidWcoIiVzOiVkIGFkZCAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKIApAQCAtMzY4LDkgKzc2MiwxNSBAQAogewogCWludCByZXN1bHQ7CiAKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCisJCXJldHVybiAtRU5PREVWOworCiAJZHJ2LT5jb3JlLmJ1cyA9ICZwczNfc3lzdGVtX2J1c190eXBlOwogCiAJcmVzdWx0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmUpOworCXByX2RlYnVnKCIgPC0gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zNzgsNyArNzc4LDkgQEAKIAogdm9pZCBwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpCiB7CisJcHJfZGVidWcoIiAtPiAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmNvcmUpOworCXByX2RlYnVnKCIgPC0gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwocHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jCmluZGV4IDFiYWU4YjEuLjgwMmE5Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKQEAgLTM5LDcgKzM5LDcgQEAKIH0KIAogI2RlZmluZSBkdW1wX3RpbWUoX2EpIF9kdW1wX3RpbWUoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF90aW1lKGludCB0aW1lLCBjb25zdCBjaGFyKiBmdW5jLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfdGltZShpbnQgdGltZSwgY29uc3QgY2hhciAqZnVuYywKIAlpbnQgbGluZSkKIHsKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKaW5kZXggYWUxZmM5Mi4uOTkyYmE2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIG9iai0kKENPTkZJR19TTVApCSs9IHNtcC5vCiBvYmotJChDT05GSUdfWElDUykJKz0geGljcy5vCiBvYmotJChDT05GSUdfU0NBTkxPRykJKz0gc2NhbmxvZy5vCi1vYmotJChDT05GSUdfRUVIKQkrPSBlZWgubyBlZWhfY2FjaGUubyBlZWhfZHJpdmVyLm8gZWVoX2V2ZW50Lm8KK29iai0kKENPTkZJR19FRUgpCSs9IGVlaC5vIGVlaF9jYWNoZS5vIGVlaF9kcml2ZXIubyBlZWhfZXZlbnQubyBlZWhfc3lzZnMubwogb2JqLSQoQ09ORklHX0tFWEVDKQkrPSBrZXhlYy5vCiBvYmotJChDT05GSUdfUENJKQkrPSBwY2kubyBwY2lfZGxwYXIubwogb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IG1zaS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKaW5kZXggNWYzZTZkOC4uYjg3NzAzOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwpAQCAtMSw2ICsxLDggQEAKIC8qCiAgKiBlZWguYwotICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmUgRW5nZWJyZXRzZW4gJiBUb2RkIEluZ2xldHQgSUJNIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEsIDIwMDUsIDIwMDYKKyAqIENvcHlyaWdodCBEYXZlIEVuZ2VicmV0c2VuICYgVG9kZCBJbmdsZXR0IDIwMDEKKyAqIENvcHlyaWdodCBMaW5hcyBWZXBzdGFzIDIwMDUsIDIwMDYKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE1LDYgKzE3LDggQEAKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICogUGxlYXNlIGFkZHJlc3MgY29tbWVudHMgYW5kIGZlZWRiYWNrIHRvIExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTE3LDcgKzEyMSw2IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpZ25vcmVkX2NoZWNrOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfbW1pb19mZnM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBmYWxzZV9wb3NpdGl2ZXM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpZ25vcmVkX2ZhaWx1cmVzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2xvdF9yZXNldHM7CiAKICNkZWZpbmUgSVNfQlJJREdFKGNsYXNzX2NvZGUpICgoKGNsYXNzX2NvZGUpPDwxNikgPT0gUENJX0JBU0VfQ0xBU1NfQlJJREdFKQpAQCAtNTA1LDYgKzUwOCw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogcmVhZF9zbG90X3Jlc2V0X3N0YXRlKCkgZmFpbGVkOyByYz0lZCBkbj0lc1xuIiwKIAkJICAgICAgIHJldCwgZG4tPmZ1bGxfbmFtZSk7CiAJCWZhbHNlX3Bvc2l0aXZlcysrOworCQlwZG4tPmVlaF9mYWxzZV9wb3NpdGl2ZXMgKys7CiAJCXJjID0gMDsKIAkJZ290byBkbl91bmxvY2s7CiAJfQpAQCAtNTEzLDYgKzUxNyw3IEBACiAJICogdGhleSBhcmUgZW1wdHkgd2hlbiB0aGV5IGRvbid0IGhhdmUgY2hpbGRyZW4uICovCiAJaWYgKChyZXRzWzBdID09IDUpICYmIChkbi0+Y2hpbGQgPT0gTlVMTCkpIHsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC01MjIsNiArNTI3LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiBldmVudCBvbiB1bnN1cHBvcnRlZCBkZXZpY2UsIHJjPSVkIGRuPSVzXG4iLAogCQkgICAgICAgcmV0LCBkbi0+ZnVsbF9uYW1lKTsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC01MjksNiArNTM1LDcgQEAKIAkvKiBJZiBub3QgdGhlIGtpbmQgb2YgZXJyb3Igd2Uga25vdyBhYm91dCwgcHVudC4gKi8KIAlpZiAocmV0c1swXSAhPSAxICYmIHJldHNbMF0gIT0gMiAmJiByZXRzWzBdICE9IDQgJiYgcmV0c1swXSAhPSA1KSB7CiAJCWZhbHNlX3Bvc2l0aXZlcysrOworCQlwZG4tPmVlaF9mYWxzZV9wb3NpdGl2ZXMgKys7CiAJCXJjID0gMDsKIAkJZ290byBkbl91bmxvY2s7CiAJfQpAQCAtOTIxLDYgKzkyOCw3IEBACiAJcGRuLT5lZWhfbW9kZSA9IDA7CiAJcGRuLT5lZWhfY2hlY2tfY291bnQgPSAwOwogCXBkbi0+ZWVoX2ZyZWV6ZV9jb3VudCA9IDA7CisJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzID0gMDsKIAogCWlmIChzdGF0dXMgJiYgc3RyY21wKHN0YXR1cywgIm9rIikgIT0gMCkKIAkJcmV0dXJuIE5VTEw7CS8qIGlnbm9yZSBkZXZpY2VzIHdpdGggYmFkIHN0YXR1cyAqLwpAQCAtMTEzOSw3ICsxMTQ3LDggQEAKIAlwZG4gPSBQQ0lfRE4oZG4pOwogCXBkbi0+cGNpZGV2ID0gZGV2OwogCi0JcGNpX2FkZHJfY2FjaGVfaW5zZXJ0X2RldmljZSAoZGV2KTsKKwlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlKGRldik7CisJZWVoX3N5c2ZzX2FkZF9kZXZpY2UoZGV2KTsKIH0KIAogdm9pZCBlZWhfYWRkX2RldmljZV90cmVlX2xhdGUoc3RydWN0IHBjaV9idXMgKmJ1cykKQEAgLTExNzgsNiArMTE4Nyw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIkVFSDogcmVtb3ZlIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAjZW5kaWYKIAlwY2lfYWRkcl9jYWNoZV9yZW1vdmVfZGV2aWNlKGRldik7CisJZWVoX3N5c2ZzX3JlbW92ZV9kZXZpY2UoZGV2KTsKIAogCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CiAJaWYgKFBDSV9ETihkbiktPnBjaWRldikgewpAQCAtMTIxNCwxMSArMTIyNCwxMCBAQAogCQkJCSJjaGVjayBub3Qgd2FudGVkPSVsZFxuIgogCQkJCSJlZWhfdG90YWxfbW1pb19mZnM9JWxkXG4iCiAJCQkJImVlaF9mYWxzZV9wb3NpdGl2ZXM9JWxkXG4iCi0JCQkJImVlaF9pZ25vcmVkX2ZhaWx1cmVzPSVsZFxuIgogCQkJCSJlZWhfc2xvdF9yZXNldHM9JWxkXG4iLAogCQkJCW5vX2RldmljZSwgbm9fZG4sIG5vX2NmZ19hZGRyLCAKIAkJCQlpZ25vcmVkX2NoZWNrLCB0b3RhbF9tbWlvX2ZmcywgCi0JCQkJZmFsc2VfcG9zaXRpdmVzLCBpZ25vcmVkX2ZhaWx1cmVzLCAKKwkJCQlmYWxzZV9wb3NpdGl2ZXMsCiAJCQkJc2xvdF9yZXNldHMpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCmluZGV4IGYyYmFlMDQuLmU0OWM4MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKQEAgLTIsNyArMiw4IEBACiAgKiBlZWhfY2FjaGUuYwogICogUENJIGFkZHJlc3MgY2FjaGU7IGFsbG93cyB0aGUgbG9va3VwIG9mIFBDSSBkZXZpY2VzIGJhc2VkIG9uIEkvTyBhZGRyZXNzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPiBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNAorICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPiAyMDA0CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yOTUsNiArMjk2LDggQEAKIAkJCWNvbnRpbnVlOwogCQlwY2lfZGV2X2dldCAoZGV2KTsgIC8qIG1hdGNoaW5nIHB1dCBpcyBpbiBlZWhfcmVtb3ZlX2RldmljZSgpICovCiAJCVBDSV9ETihkbiktPnBjaWRldiA9IGRldjsKKworCQllZWhfc3lzZnNfYWRkX2RldmljZShkZXYpOwogCX0KIAogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwppbmRleCAxNjFhNTg0Li4xNWUwMTVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogUENJIEVycm9yIFJlY292ZXJ5IERyaXZlciBmb3IgUlBBLWNvbXBsaWFudCBQUEM2NCBwbGF0Zm9ybS4KLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+CisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQgMjAwNQorICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4gMjAwNCwgMjAwNQogICoKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtMTksOCArMjAsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGxpbmFzQHVzLmlibS5jb20+Ci0gKgorICogU2VuZCBjb21tZW50cyBhbmQgZmVlZGJhY2sgdG8gTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTEzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIFN5c2ZzIGVudHJpZXMgZm9yIFBDSSBFcnJvciBSZWNvdmVyeSBmb3IgUEFQUi1jb21wbGlhbnQgcGxhdGZvcm0uCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDcKKyAqIENvcHlyaWdodCBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4gMjAwNworICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogU2VuZCBjb21tZW50cyBhbmQgZmVlZGJhY2sgdG8gTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorCisvKioKKyAqIEVFSF9TSE9XX0FUVFIgLS0gY3JlYXRlIHN5c2ZzIGVudHJ5IGZvciBlZWggc3RhdGlzdGljCisgKiBAX25hbWU6IG5hbWUgb2YgZmlsZSBpbiBzeXNmcyBkaXJlY3RvcnkKKyAqIEBfbWVtYjogbmFtZSBvZiBtZW1iZXIgaW4gc3RydWN0IHBjaV9kbiB0byBhY2Nlc3MKKyAqIEBfZm9ybWF0OiBwcmludGYgZm9ybWF0IGZvciBkaXNwbGF5CisgKgorICogQWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGxvb2sgdmVyeSBzaW1pbGFyLCBzbyBqdXN0CisgKiBhdXRvLWdlbiBhIGN1dC1uLXBhc3RlIHJvdXRpbmUgdG8gZGlzcGxheSB0aGVtLgorICovCisjZGVmaW5lIEVFSF9TSE9XX0FUVFIoX25hbWUsX21lbWIsX2Zvcm1hdCkgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBlZWhfc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgICAgICBcCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsgICAgICAgICAgICAgICBcCisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsgXAorCXN0cnVjdCBwY2lfZG4gKnBkbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCFkbiB8fCBQQ0lfRE4oZG4pID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXBkbiA9IFBDSV9ETihkbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIF9mb3JtYXQgIlxuIiwgcGRuLT5fbWVtYik7ICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgREVWSUNFX0FUVFIoX25hbWUsIFNfSVJVR08sIGVlaF9zaG93XyMjX25hbWUsIE5VTEwpOworCisKK0VFSF9TSE9XX0FUVFIoZWVoX21vZGUsIGVlaF9tb2RlLCAiMHgleCIpOworRUVIX1NIT1dfQVRUUihlZWhfY29uZmlnX2FkZHIsIGVlaF9jb25maWdfYWRkciwgIjB4JXgiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX3BlX2NvbmZpZ19hZGRyLCBlZWhfcGVfY29uZmlnX2FkZHIsICIweCV4Iik7CitFRUhfU0hPV19BVFRSKGVlaF9jaGVja19jb3VudCwgZWVoX2NoZWNrX2NvdW50LCAiJWQiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2ZyZWV6ZV9jb3VudCwgZWVoX2ZyZWV6ZV9jb3VudCwgIiVkIik7CitFRUhfU0hPV19BVFRSKGVlaF9mYWxzZV9wb3NpdGl2ZXMsIGVlaF9mYWxzZV9wb3NpdGl2ZXMsICIlZCIpOworCit2b2lkIGVlaF9zeXNmc19hZGRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByYz0wOworCisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfbW9kZSk7CisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfY29uZmlnX2FkZHIpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX3BlX2NvbmZpZ19hZGRyKTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jaGVja19jb3VudCk7CisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfZmFsc2VfcG9zaXRpdmVzKTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mcmVlemVfY291bnQpOworCisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IFVuYWJsZSB0byBjcmVhdGUgc3lzZnMgZW50cmllc1xuIik7Cit9CisKK3ZvaWQgZWVoX3N5c2ZzX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfbW9kZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfY29uZmlnX2FkZHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX3BlX2NvbmZpZ19hZGRyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jaGVja19jb3VudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfZmFsc2VfcG9zaXRpdmVzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mcmVlemVfY291bnQpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwppbmRleCAzNjJkZmJjLi44Y2M2ZWVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKQEAgLTM3MywxMiArMzczLDIzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBzaXplX2J5dGVzID0gMVVMIDw8IHBwYzY0X3BmdF9zaXplOwogCXVuc2lnbmVkIGxvbmcgaHB0ZV9jb3VudCA9IHNpemVfYnl0ZXMgPj4gNDsKLQl1bnNpZ25lZCBsb25nIGR1bW15MSwgZHVtbXkyOworCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTIsIGR3b3JkMDsKKwlsb25nIGxwYXJfcmM7CiAJaW50IGk7CiAKIAkvKiBUT0RPOiBVc2UgYnVsayBjYWxsICovCi0JZm9yIChpID0gMDsgaSA8IGhwdGVfY291bnQ7IGkrKykKLQkJcGxwYXJfcHRlX3JlbW92ZV9yYXcoMCwgaSwgMCwgJmR1bW15MSwgJmR1bW15Mik7CisJZm9yIChpID0gMDsgaSA8IGhwdGVfY291bnQ7IGkrKykgeworCQkvKiBkb250IHJlbW92ZSBIUFRFcyB3aXRoIFZSTUEgbWFwcGluZ3MgKi8KKwkJbHBhcl9yYyA9IHBscGFyX3B0ZV9yZW1vdmVfcmF3KEhfQU5EQ09ORCwgaSwgSFBURV9WXzFUQl9TRUcsCisJCQkJCQkmZHVtbXkxLCAmZHVtbXkyKTsKKwkJaWYgKGxwYXJfcmMgPT0gSF9OT1RfRk9VTkQpIHsKKwkJCWxwYXJfcmMgPSBwbHBhcl9wdGVfcmVhZF9yYXcoMCwgaSwgJmR3b3JkMCwgJmR1bW15MSk7CisJCQlpZiAoIWxwYXJfcmMgJiYgKChkd29yZDAgJiBIUFRFX1ZfVlJNQV9NQVNLKQorCQkJCSE9IEhQVEVfVl9WUk1BX01BU0spKQorCQkJCS8qIENhbiBiZSBocHRlIGZvciAxVEIgU2VnLiBTbyByZW1vdmUgaXQgKi8KKwkJCQlwbHBhcl9wdGVfcmVtb3ZlX3JhdygwLCBpLCAwLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwkJfQorCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwppbmRleCBmZmFmNmM1Li40N2YwZTA4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCkBAIC0xMTAsOCArMTEwLDYgQEAKIAkJCX0KIAkJfQogCX0KLQotCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShidXMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMpOwogCkBAIC0xMzksNiArMTM3LDggQEAKIAogCS8qIE1ha2UgdGhlIGRpc2NvdmVyZWQgZGV2aWNlcyBhdmFpbGFibGUgKi8KIAlwY2lfYnVzX2FkZF9kZXZpY2VzKGNoaWxkX2J1cyk7CisKKwllZWhfYWRkX2RldmljZV90cmVlX2xhdGUoY2hpbGRfYnVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcxLDYgKzE3MSw3IEBACiAJCWlmICghbGlzdF9lbXB0eSgmYnVzLT5kZXZpY2VzKSkgewogCQkJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAwKTsKIAkJCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwkJCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShidXMpOwogCQl9CiAJfSBlbHNlIGlmIChtb2RlID09IFBDSV9QUk9CRV9OT1JNQUwpIHsKIAkJLyogdXNlIGxlZ2FjeSBwcm9iZSAqLwpAQCAtMTc5LDYgKzE4MCw3IEBACiAJCWlmIChudW0pIHsKIAkJCXBjaWJpb3NfZml4dXBfbmV3X3BjaV9kZXZpY2VzKGJ1cywgMSk7CiAJCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CisJCQllZWhfYWRkX2RldmljZV90cmVlX2xhdGUoYnVzKTsKIAkJfQogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKQEAgLTIwMCw4ICsyMDIsNiBAQAogCXJ0YXNfc2V0dXBfcGhiKHBoYik7CiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRuLCAwKTsKIAotCXBjaV9zZXR1cF9waGJfaW9fZHluYW1pYyhwaGIsIHByaW1hcnkpOwotCiAJcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhwaGIpOwogCiAJaWYgKGRuLT5jaGlsZCkKQEAgLTIxMCw2ICsyMTAsNyBAQAogCXNjYW5fcGhiKHBoYik7CiAJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMocGhiLT5idXMsIDApOwogCXBjaV9idXNfYWRkX2RldmljZXMocGhiLT5idXMpOworCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShwaGItPmJ1cyk7CiAKIAlyZXR1cm4gcGhiOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BscGFyX3dyYXBwZXJzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaAppbmRleCAyZTRkMTBjLi5kMDAzYzgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaApAQCAtMTA4LDYgKzEwOCwyMSBAQAogCXJldHVybiByYzsKIH0KIAorLyogcGxwYXJfcHRlX3JlYWRfcmF3IGNhbiBiZSBjYWxsZWQgaW4gcmVhbCBtb2RlLiBJdCBjYWxscyBwbHBhcl9oY2FsbF9yYXcgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBwbHBhcl9wdGVfcmVhZF9yYXcodW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwdGV4LAorCQl1bnNpZ25lZCBsb25nICpvbGRfcHRlaF9yZXQsIHVuc2lnbmVkIGxvbmcgKm9sZF9wdGVsX3JldCkKK3sKKwlsb25nIHJjOworCXVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMX0JVRlNJWkVdOworCisJcmMgPSBwbHBhcl9oY2FsbF9yYXcoSF9SRUFELCByZXRidWYsIGZsYWdzLCBwdGV4KTsKKworCSpvbGRfcHRlaF9yZXQgPSByZXRidWZbMF07CisJKm9sZF9wdGVsX3JldCA9IHJldGJ1ZlsxXTsKKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGlubGluZSBsb25nIHBscGFyX3B0ZV9wcm90ZWN0KHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcHRleCwKIAkJdW5zaWduZWQgbG9uZyBhdnBuKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKaW5kZXggMjcyOWQ1NS4uNjFlMTlmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCkBAIC0zMyw2ICszMyw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfa2V4ZWNfY3B1X2Rvd25fbXBpYyh2b2lkKSB7IH0KICNlbmRpZgogCitleHRlcm4gdm9pZCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpOworCiAvKiBQb3dlcm9uIGZsYWcgdXNlZCBmb3IgZW5hYmxpbmcgYXV0byB1cHMgcmVzdGFydCAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcnRhc19wb3dlcm9uX2F1dG87CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKaW5kZXggNWFhOTdhZi4uYzAyZjg3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCXN0cmNweShucC0+ZnVsbF9uYW1lLCBwYXRoKTsKIAogCW5wLT5wcm9wZXJ0aWVzID0gcHJvcGxpc3Q7Ci0JT0ZfTUFSS19EWU5BTUlDKG5wKTsKKwlvZl9ub2RlX3NldF9mbGFnKG5wLCBPRl9EWU5BTUlDKTsKIAlrcmVmX2luaXQoJm5wLT5rcmVmKTsKIAogCW5wLT5wYXJlbnQgPSBkZXJpdmVfcGFyZW50KHBhdGgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCBhMDMxZDk5Li41OWU2OWYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtMzk5LDYgKzM5OSw3IEBACiAJICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgogCSAqLwogCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7CisJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDE7CiAKIAkvKgogCSAqIFdlIGNvbWUgaW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCBhbmQgbmVlZF9yZXNjaGVkKCkKQEAgLTQzMSw2ICs0MzIsNyBAQAogCiBvdXQ6CiAJSE1UX21lZGl1bSgpOworCWdldF9scHBhY2EoKS0+ZG9uYXRlX2RlZGljYXRlZF9jcHUgPSAwOwogCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCmluZGV4IGYxZGY5NDIuLjViZDkwYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwpAQCAtMTU2LDkgKzE1Niw5IEBACiAKIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIodW5zaWduZWQgaW50IHZpcnEpCitzdGF0aWMgaW50IGdldF9pcnFfc2VydmVyKHVuc2lnbmVkIGludCB2aXJxLCB1bnNpZ25lZCBpbnQgc3RyaWN0X2NoZWNrKQogewotCXVuc2lnbmVkIGludCBzZXJ2ZXI7CisJaW50IHNlcnZlcjsKIAkvKiBGb3IgdGhlIG1vbWVudCBvbmx5IGltcGxlbWVudCBkZWxpdmVyeSB0byBhbGwgY3B1cyBvciBvbmUgY3B1ICovCiAJY3B1bWFza190IGNwdW1hc2sgPSBpcnFfZGVzY1t2aXJxXS5hZmZpbml0eTsKIAljcHVtYXNrX3QgdG1wID0gQ1BVX01BU0tfTk9ORTsKQEAgLTE2NiwyMiArMTY2LDI1IEBACiAJaWYgKCFkaXN0cmlidXRlX2lycXMpCiAJCXJldHVybiBkZWZhdWx0X3NlcnZlcjsKIAotCWlmIChjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKLQkJc2VydmVyID0gZGVmYXVsdF9kaXN0cmliX3NlcnZlcjsKLQl9IGVsc2UgeworCWlmICghY3B1c19lcXVhbChjcHVtYXNrLCBDUFVfTUFTS19BTEwpKSB7CiAJCWNwdXNfYW5kKHRtcCwgY3B1X29ubGluZV9tYXAsIGNwdW1hc2spOwogCi0JCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQlzZXJ2ZXIgPSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyOwotCQllbHNlCi0JCQlzZXJ2ZXIgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGZpcnN0X2NwdSh0bXApKTsKKwkJc2VydmVyID0gZmlyc3RfY3B1KHRtcCk7CisKKwkJaWYgKHNlcnZlciA8IE5SX0NQVVMpCisJCQlyZXR1cm4gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChzZXJ2ZXIpOworCisJCWlmIChzdHJpY3RfY2hlY2spCisJCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dXJuIHNlcnZlcjsKKwlpZiAoY3B1c19lcXVhbChjcHVfb25saW5lX21hcCwgY3B1X3ByZXNlbnRfbWFwKSkKKwkJcmV0dXJuIGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7CiAKKwlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiB9CiAjZWxzZQotc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSkKK3N0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBzdHJpY3RfY2hlY2spCiB7CiAJcmV0dXJuIGRlZmF1bHRfc2VydmVyOwogfQpAQCAtMTkyLDcgKzE5NSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgY2FsbF9zdGF0dXM7Ci0JdW5zaWduZWQgaW50IHNlcnZlcjsKKwlpbnQgc2VydmVyOwogCiAJcHJfZGVidWcoInhpY3M6IHVubWFzayB2aXJxICVkXG4iLCB2aXJxKTsKIApAQCAtMjAxLDcgKzIwNCw3IEBACiAJaWYgKGlycSA9PSBYSUNTX0lQSSB8fCBpcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCiAJCXJldHVybjsKIAotCXNlcnZlciA9IGdldF9pcnFfc2VydmVyKHZpcnEpOworCXNlcnZlciA9IGdldF9pcnFfc2VydmVyKHZpcnEsIDApOwogCiAJY2FsbF9zdGF0dXMgPSBydGFzX2NhbGwoaWJtX3NldF94aXZlLCAzLCAxLCBOVUxMLCBpcnEsIHNlcnZlciwKIAkJCQlERUZBVUxUX1BSSU9SSVRZKTsKQEAgLTM5OCw4ICs0MDEsNyBAQAogCXVuc2lnbmVkIGludCBpcnE7CiAJaW50IHN0YXR1czsKIAlpbnQgeGljc19zdGF0dXNbMl07Ci0JdW5zaWduZWQgbG9uZyBuZXdtYXNrOwotCWNwdW1hc2tfdCB0bXAgPSBDUFVfTUFTS19OT05FOworCWludCBpcnFfc2VydmVyOwogCiAJaXJxID0gKHVuc2lnbmVkIGludClpcnFfbWFwW3ZpcnFdLmh3aXJxOwogCWlmIChpcnEgPT0gWElDU19JUEkgfHwgaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQpAQCAtNDEzLDE4ICs0MTUsMjEgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUgKi8KLQlpZiAoY3B1c19lcXVhbChjcHVtYXNrLCBDUFVfTUFTS19BTEwpKSB7Ci0JCW5ld21hc2sgPSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyOwotCX0gZWxzZSB7Ci0JCWNwdXNfYW5kKHRtcCwgY3B1X29ubGluZV9tYXAsIGNwdW1hc2spOwotCQlpZiAoY3B1c19lbXB0eSh0bXApKQotCQkJcmV0dXJuOwotCQluZXdtYXNrID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChmaXJzdF9jcHUodG1wKSk7CisJLyoKKwkgKiBGb3IgdGhlIG1vbWVudCBvbmx5IGltcGxlbWVudCBkZWxpdmVyeSB0byBhbGwgY3B1cyBvciBvbmUgY3B1LgorCSAqIEdldCBjdXJyZW50IGlycV9zZXJ2ZXIgZm9yIHRoZSBnaXZlbiBpcnEKKwkgKi8KKwlpcnFfc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIoaXJxLCAxKTsKKwlpZiAoaXJxX3NlcnZlciA9PSAtMSkgeworCQljaGFyIGNwdWxpc3RbMTI4XTsKKwkJY3B1bWFza19zY25wcmludGYoY3B1bGlzdCwgc2l6ZW9mKGNwdWxpc3QpLCBjcHVtYXNrKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAieGljc19zZXRfYWZmaW5pdHk6IE5vIG9ubGluZSBjcHVzIGluICIKKwkJCQkidGhlIG1hc2sgJXMgZm9yIGlycSAlZFxuIiwgY3B1bGlzdCwgdmlycSk7CisJCXJldHVybjsKIAl9CiAKIAlzdGF0dXMgPSBydGFzX2NhbGwoaWJtX3NldF94aXZlLCAzLCAxLCBOVUxMLAotCQkJCWlycSwgbmV3bWFzaywgeGljc19zdGF0dXNbMV0pOworCQkJCWlycSwgaXJxX3NlcnZlciwgeGljc19zdGF0dXNbMV0pOwogCiAJaWYgKHN0YXR1cykgewogCQlwcmludGsoS0VSTl9FUlIgInhpY3Nfc2V0X2FmZmluaXR5OiBpcnE9JXUgaWJtLHNldC14aXZlICIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IGMzY2UwYmQuLmY2NTA3OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtNSw3ICs1LDYgQEAKIG1waWMtbXNpLW9iai0kKENPTkZJR19QQ0lfTVNJKQkrPSBtcGljX21zaS5vIG1waWNfdTNtc2kubwogb2JqLSQoQ09ORklHX01QSUMpCQkrPSBtcGljLm8gJChtcGljLW1zaS1vYmoteSkKIAotb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDX01QQzEwNikJKz0gZ3JhY2tsZS5vCiBvYmotJChDT05GSUdfUFBDX0RDUikJCSs9IGRjci5vCiBvYmotJChDT05GSUdfUFBDX0RDUl9OQVRJVkUpCSs9IGRjci1sb3cubwpAQCAtMTMsMTYgKzEyLDE5IEBACiBvYmotJChDT05GSUdfVTNfREFSVCkJCSs9IGRhcnRfaW9tbXUubwogb2JqLSQoQ09ORklHX01NSU9fTlZSQU0pCSs9IG1taW9fbnZyYW0ubwogb2JqLSQoQ09ORklHX0ZTTF9TT0MpCQkrPSBmc2xfc29jLm8KLW9iai0kKENPTkZJR19GU0xfUENJRSkJCSs9IGZzbF9wY2llLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCiBtdjY0eDYwLSQoQ09ORklHX1BDSSkJCSs9IG12NjR4NjBfcGNpLm8KIG9iai0kKENPTkZJR19NVjY0WDYwKQkJKz0gJChtdjY0eDYwLXkpIG12NjR4NjBfcGljLm8gbXY2NHg2MF9kZXYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQ01PUykJKz0gcnRjX2Ntb3Nfc2V0dXAubwogCiAjIGNvbnRhaW5zIG9ubHkgdGhlIHN1c3BlbmQgaGFuZGxlciBmb3IgdGltZQoraWZlcSAoJChDT05GSUdfUlRDX0NMQVNTKSwpCiBvYmotJChDT05GSUdfUE0pCQkrPSB0aW1lci5vCitlbmRpZgogCiBpZmVxICgkKENPTkZJR19QUENfTUVSR0UpLHkpCitvYmotJChDT05GSUdfUFBDX0lORElSRUNUX1BDSSkJKz0gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19QUENfSTgyNTkpCQkrPSBpODI1OS5vCiBvYmotJChDT05GSUdfUFBDXzgzeHgpCQkrPSBpcGljLm8KIG9iai0kKENPTkZJR180eHgpCQkrPSB1aWMubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpZS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFjMDdlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogU3VwcG9ydCBmb3IgaW5kaXJlY3QgUENJIGJyaWRnZXMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IEdhYnJpZWwgUGF1YmVydC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICJUZW1wb3JhcnkiIE1QQzg1NDggRXJyYXRhIGZpbGUgLQotICogVGhlIHN0YW5kYXJkIGluZGlyZWN0X3BjaSBjb2RlIHNob3VsZCB3b3JrIHdpdGggZnV0dXJlIHNpbGljb24gdmVyc2lvbnMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotCi0jZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9iZTMyCi0KLS8qIEVSUkFUQSBQQ0ktRXggMTQgUENJRSBDb250cm9sbGVyIHRpbWVvdXQgKi8KLSNkZWZpbmUgUENJRV9GSVgJCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyKzB4NCwgMHgwNDAwZmZmZikKLQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF9yZWFkX2NvbmZpZ19wY2llKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKLQkJICAgICBpbnQgbGVuLCB1MzIgKnZhbCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7Ci0Jdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKLQl1MzIgdGVtcDsKLQotCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCS8qIFBvc3NpYmxlIGFydGlmYWN0IG9mIENEQ3BwNTA5MzcgbmVlZHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uICovCi0JaWYgKGRldmZuICE9IDB4MCAmJiBidXMtPm51bWJlciA9PSAweGZmKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JUENJRV9GSVg7Ci0JaWYgKGJ1cy0+bnVtYmVyID09IDB4ZmYpIHsKLQkJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCQkgICAgKDB4ODAwMDAwMDAgfCAoKG9mZnNldCAmIDB4ZjAwKSA8PCAxNikgfAotCQkJICAgICAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCQkgICAgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSApKSk7Ci0JfSBlbHNlIHsKLQkJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCQkgICAgKDB4ODAwMDAwMDEgfCAoKG9mZnNldCAmIDB4ZjAwKSA8PCAxNikgfAotCQkJICAgICAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCQkgICAgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSApKSk7Ci0JfQotCi0JLyoKLQkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKLQkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCi0JICovCi0JLyogRVJSQVRBIFBDSS1FeCAxMiAtIENvbmZpZ3VyYXRpb24gQWRkcmVzcy9EYXRhIEFsaWdubWVudCAqLwotCWNmZ19kYXRhID0gaG9zZS0+Y2ZnX2RhdGE7Ci0JUENJRV9GSVg7Ci0JdGVtcCA9IGluX2xlMzIoY2ZnX2RhdGEpOwotCXN3aXRjaCAobGVuKSB7Ci0JY2FzZSAxOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpKjgpKSAmIDB4ZmY7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJKnZhbCA9ICh0ZW1wID4+ICgoKG9mZnNldCAmIDMpKSo4KSkgJiAweGZmZmY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSp2YWwgPSB0ZW1wOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KLQotc3RhdGljIGludAotaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICAgICBpbnQgbGVuLCB1MzIgdmFsKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKLQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCi0JCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JLyogUG9zc2libGUgYXJ0aWZhY3Qgb2YgQ0RDcHA1MDkzNyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gKi8KLQlpZiAoZGV2Zm4gIT0gMHgwICYmIGJ1cy0+bnVtYmVyID09IDB4ZmYpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlQQ0lFX0ZJWDsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMHhmZikgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMCB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9IGVsc2UgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLSAgICAgICAgfQotCi0JLyoKLQkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKLQkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCi0JICovCi0JLyogRVJSQVRBIFBDSS1FeCAxMiAtIENvbmZpZ3VyYXRpb24gQWRkcmVzcy9EYXRhIEFsaWdubWVudCAqLwotCWNmZ19kYXRhID0gaG9zZS0+Y2ZnX2RhdGE7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCVBDSUVfRklYOwotCQl0ZW1wID0gaW5fbGUzMihjZmdfZGF0YSk7Ci0JCXRlbXAgPSAodGVtcCAmIH4oMHhmZiA8PCAoKG9mZnNldCAmIDMpICogOCkpKSB8Ci0JCQkodmFsIDw8ICgob2Zmc2V0ICYgMykgKiA4KSk7Ci0JCVBDSUVfRklYOwotCQlvdXRfbGUzMihjZmdfZGF0YSwgdGVtcCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJUENJRV9GSVg7Ci0JCXRlbXAgPSBpbl9sZTMyKGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmZmYgPDwgKChvZmZzZXQgJiAzKSAqIDgpKSk7Ci0JCXRlbXAgfD0gKHZhbCA8PCAoKG9mZnNldCAmIDMpICogOCkpIDsKLQkJUENJRV9GSVg7Ci0JCW91dF9sZTMyKGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUENJRV9GSVg7Ci0JCW91dF9sZTMyKGNmZ19kYXRhLCB2YWwpOwotCQlicmVhazsKLQl9Ci0JUENJRV9GSVg7Ci0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfb3BzIGluZGlyZWN0X3BjaWVfb3BzID0gewotCWluZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUsCi0JaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUKLX07Ci0KLXZvaWQgX19pbml0Ci1zZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdm9pZCBfX2lvbWVtICogY2ZnX2FkZHIsCi0Jdm9pZCBfX2lvbWVtICogY2ZnX2RhdGEpCi17Ci0JaG9zZS0+Y2ZnX2FkZHIgPSBjZmdfYWRkcjsKLQlob3NlLT5jZmdfZGF0YSA9IGNmZ19kYXRhOwotCWhvc2UtPm9wcyA9ICZpbmRpcmVjdF9wY2llX29wczsKLX0KLQotdm9pZCBfX2luaXQKLXNldHVwX2luZGlyZWN0X3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB1MzIgY2ZnX2FkZHIsIHUzMiBjZmdfZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGJhc2UgPSBjZmdfYWRkciAmIFBBR0VfTUFTSzsKLQl2b2lkIF9faW9tZW0gKm1iYXNlLCAqYWRkciwgKmRhdGE7Ci0KLQltYmFzZSA9IGlvcmVtYXAoYmFzZSwgUEFHRV9TSVpFKTsKLQlhZGRyID0gbWJhc2UgKyAoY2ZnX2FkZHIgJiB+UEFHRV9NQVNLKTsKLQlpZiAoKGNmZ19kYXRhICYgUEFHRV9NQVNLKSAhPSBiYXNlKQotCQltYmFzZSA9IGlvcmVtYXAoY2ZnX2RhdGEgJiBQQUdFX01BU0ssIFBBR0VfU0laRSk7Ci0JZGF0YSA9IG1iYXNlICsgKGNmZ19kYXRhICYgflBBR0VfTUFTSyk7Ci0Jc2V0dXBfaW5kaXJlY3RfcGNpZV9ub21hcChob3NlLCBhZGRyLCBkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKaW5kZXggY2FkMTc1Ny4uYzBkZGM4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKQEAgLTEwMjgsNiArMTAyOCwxOSBAQAogCiBhcmNoX2luaXRjYWxsKGZzX2VuZXRfb2ZfaW5pdCk7CiAKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9wY21jaWFfb2ZfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCS8qCisJICogUmVnaXN0ZXIgYWxsIHRoZSBkZXZpY2VzIHdoaWNoIHR5cGUgaXMgInBjbWNpYSIKKwkgKi8KKwl3aGlsZSAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsCisJCQkicGNtY2lhIiwgImZzbCxwcS1wY21jaWEiKSkgIT0gTlVMTCkKKwkJCSAgICBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAibTh4eC1wY21jaWEiLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChmc2xfcGNtY2lhX29mX2luaXQpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqc21jX3JlZ3MgPSAicmVncyI7CiBzdGF0aWMgY29uc3QgY2hhciAqc21jX3ByYW0gPSAicHJhbSI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYwppbmRleCBlNzE0ODg0Li5jN2U2ZTg1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMKQEAgLTMzLDE4ICszMywyNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOwogCXU4IGNmZ190eXBlID0gMDsKKwl1MzIgYnVzX25vLCByZWc7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAJCi0JaWYgKGhvc2UtPnNldF9jZmdfdHlwZSkKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX1NFVF9DRkdfVFlQRSkKIAkJaWYgKGJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKQogCQkJY2ZnX3R5cGUgPSAxOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsIAkJCQkJIAotCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisJYnVzX25vID0gKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vKSA/CisJCQlob3NlLT5zZWxmX2J1c25vIDogYnVzLT5udW1iZXI7CisKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcpCisJCXJlZyA9ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IChvZmZzZXQgJiAweGZjKTsKKwllbHNlCisJCXJlZyA9IG9mZnNldCAmIDB4ZmM7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikKKwkJICB8IChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CiAKIAkvKgogCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwpAQCAtNzIsMTggKzgxLDMzIEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CiAJdTggY2ZnX3R5cGUgPSAwOworCXUzMiBidXNfbm8sIHJlZzsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAotCWlmIChob3NlLT5zZXRfY2ZnX3R5cGUpCisJaWYgKGhvc2UtPmluZGlyZWN0X3R5cGUgJiBQUENfSU5ESVJFQ1RfVFlQRV9TRVRfQ0ZHX1RZUEUpCiAJCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5maXJzdF9idXNubykKIAkJCWNmZ190eXBlID0gMTsKIAotCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLCAJCQkJCSAKLQkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCWJ1c19ubyA9IChidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubykgPworCQkJaG9zZS0+c2VsZl9idXNubyA6IGJ1cy0+bnVtYmVyOworCisJaWYgKGhvc2UtPmluZGlyZWN0X3R5cGUgJiBQUENfSU5ESVJFQ1RfVFlQRV9FWFRfUkVHKQorCQlyZWcgPSAoKG9mZnNldCAmIDB4ZjAwKSA8PCAxNikgfCAob2Zmc2V0ICYgMHhmYyk7CisJZWxzZQorCQlyZWcgPSBvZmZzZXQgJiAweGZjOworCisJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCisJCSAoMHg4MDAwMDAwMCB8IChidXNfbm8gPDwgMTYpCisJCSAgfCAoZGV2Zm4gPDwgOCkgfCByZWcgfCBjZmdfdHlwZSkpOworCisJLyogc3VycHJlc3Mgc2V0dGluZyBvZiBQQ0lfUFJJTUFSWV9CVVMgKi8KKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX1NVUlBSRVNTX1BSSU1BUllfQlVTKQorCQlpZiAoKG9mZnNldCA9PSBQQ0lfUFJJTUFSWV9CVVMpICYmCisJCQkoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pKQorCQl2YWwgJj0gMHhmZmZmZmYwMDsKIAogCS8qCiAJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eF9waWMuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oCmluZGV4IGFmYTJlZTYuLjlmZTAwZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oCkBAIC00LDkgKzQsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotZXh0ZXJuIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBtcGM4eHhfcGljOwotCiBpbnQgbXBjOHh4X3BpY19pbml0KHZvaWQpOwogdW5zaWduZWQgaW50IG1wYzh4eF9nZXRfaXJxKHZvaWQpOwogCisvKgorICogU29tZSBpbnRlcm5hbCBpbnRlcnJ1cHQgcmVnaXN0ZXJzIHVzZSBhbiA4LWJpdCBtYXNrIGZvciB0aGUgaW50ZXJydXB0CisgKiBsZXZlbCBpbnN0ZWFkIG9mIGEgbnVtYmVyLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQgbWtfaW50X2ludF9tYXNrKHVpbnQgbWFzaykKK3sKKwlyZXR1cm4gKDEgPDwgKDcgLSAobWFzay8yKSkpOworfQorCiAjZW5kaWYgLyogX1BQQ19LRVJORUxfUFBDOHh4X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYwppbmRleCA0YjBhOWM4Li5iNjE4ZmE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKQEAgLTQyMCwzICs0MjEsMzAgQEAKIAlyZXR1cm4gZXJyOwogfQogYXJjaF9pbml0Y2FsbChtdjY0eDYwX2RldmljZV9zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IG12NjR4NjBfYWRkX21wc2NfY29uc29sZSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWNvbnN0IGNoYXIgKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CisJaWYgKHByb3AgPT0gTlVMTCkKKwkJZ290byBub3RfbXBzYzsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgocHJvcCk7CisJaWYgKCFucCkKKwkJZ290byBub3RfbXBzYzsKKworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJtYXJ2ZWxsLG1wc2MiKSkKKwkJZ290byBub3RfbXBzYzsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJibG9jay1pbmRleCIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJZ290byBub3RfbXBzYzsKKworCWFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5TU0iLCAqKGludCAqKXByb3AsIE5VTEwpOworCitub3RfbXBzYzoKKwlyZXR1cm4gMDsKK30KK2NvbnNvbGVfaW5pdGNhbGwobXY2NHg2MF9hZGRfbXBzY19jb25zb2xlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYwppbmRleCBiNWFlZjRjLi40NWRiODZjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCkBAIC0xMzcsMTggKzEzNywxNSBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7Ci0KIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKIAlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5zdGFydCArIDQpOwotCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKKwlob3NlLT5zZWxmX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNVjY0eDYwIFBDSSBob3N0IGJyaWRnZSBhdCAweCUwMTZsbHguICIKIAkgICAgICAgIkZpcm13YXJlIGJ1cyBudW1iZXI6ICVkLT4lZFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMKaW5kZXggYWMxMmE0NC4uZjk3MGU1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTQwLDYgKzQxLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh1Y2Nfc2V0X3FlX211eF9taWlfbW5nKTsKIAogaW50IHVjY19zZXRfdHlwZShpbnQgdWNjX251bSwgc3RydWN0IHVjY19jb21tb24gKnJlZ3MsCiAJCSBlbnVtIHVjY19zcGVlZF90eXBlIHNwZWVkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKaW5kZXggOTE0MzIzNi4uM2RmMjAyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaW1tYXBfcWUuaD4KQEAgLTcwLDYgKzcxLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJndWVtciA6IGFkZHIgLSAweCUwOHgsIHZhbCAtIDB4JTAyeCIsCiAJCSAgKHUzMikgJiB1Y2NmLT51Zl9yZWdzLT5ndWVtciwgdWNjZi0+dWZfcmVncy0+Z3VlbXIpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9kdW1wX3JlZ3MpOwogCiB1MzIgdWNjX2Zhc3RfZ2V0X3FlX2NyX3N1YmJsb2NrKGludCB1Y2NmX251bSkKIHsKQEAgLTg1LDExICs4NywxMyBAQAogCWRlZmF1bHQ6IHJldHVybiBRRV9DUl9TVUJCTE9DS19JTlZBTElEOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfZ2V0X3FlX2NyX3N1YmJsb2NrKTsKIAogdm9pZCB1Y2NfZmFzdF90cmFuc21pdF9vbl9kZW1hbmQoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKiB1Y2NmKQogewogCW91dF9iZTE2KCZ1Y2NmLT51Zl9yZWdzLT51dG9kciwgVUNDX0ZBU1RfVE9EKTsKIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfdHJhbnNtaXRfb25fZGVtYW5kKTsKIAogdm9pZCB1Y2NfZmFzdF9lbmFibGUoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKiB1Y2NmLCBlbnVtIGNvbW1fZGlyIG1vZGUpCiB7CkBAIC0xMTAsNiArMTE0LDcgQEAKIAl9CiAJb3V0X2JlMzIoJnVmX3JlZ3MtPmd1bXIsIGd1bXIpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9lbmFibGUpOwogCiB2b2lkIHVjY19mYXN0X2Rpc2FibGUoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKiB1Y2NmLCBlbnVtIGNvbW1fZGlyIG1vZGUpCiB7CkBAIC0xMzAsNiArMTM1LDcgQEAKIAl9CiAJb3V0X2JlMzIoJnVmX3JlZ3MtPmd1bXIsIGd1bXIpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9kaXNhYmxlKTsKIAogaW50IHVjY19mYXN0X2luaXQoc3RydWN0IHVjY19mYXN0X2luZm8gKiB1Zl9pbmZvLCBzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqKiB1Y2NmX3JldCkKIHsKQEAgLTM0MSw2ICszNDcsNyBAQAogCSp1Y2NmX3JldCA9IHVjY2Y7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2luaXQpOwogCiB2b2lkIHVjY19mYXN0X2ZyZWUoc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKiB1Y2NmKQogewpAQCAtMzU1LDMgKzM2Miw0IEBACiAKIAlrZnJlZSh1Y2NmKTsKIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfZnJlZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3J0Y19jbW9zX3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3J0Y19jbW9zX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3NjA0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogU2V0dXAgY29kZSBmb3IgUEMtc3R5bGUgUmVhbC1UaW1lIENsb2NrLgorICoKKyAqIEF1dGhvcjogV2FkZSBGYXJuc3dvcnRoIDx3ZmFybnN3b3J0aEBtdmlzdGEuY29tPgorICoKKyAqIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworc3RhdGljIGludCAgX19pbml0IGFkZF9ydGModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IHJldDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgInBucFBOUCxiMDAiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCW9mX25vZGVfcHV0KG5wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBSVENfUE9SVCh4KSBpcyBoYXJkY29kZWQgaW4gYXNtL21jMTQ2ODE4cnRjLmguICBWZXJpZnkgdGhhdCB0aGUKKwkgKiBhZGRyZXNzIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2Ugbm9kZSBtYXRjaGVzLgorCSAqLworCWlmIChyZXMuc3RhcnQgIT0gUlRDX1BPUlQoMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJydGNfY21vcyIsIC0xLAorCQkJCQkgICAgICZyZXMsIDEpOworCWlmIChJU19FUlIocGQpKQorCQlyZXR1cm4gUFRSX0VSUihwZCk7CisKKwlyZXR1cm4gMDsKK30KK2ZzX2luaXRjYWxsKGFkZF9ydGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90aW1lci5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90aW1lci5jCmluZGV4IDRhMDE3NDguLmU4MWU3ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdGltZXIuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMKQEAgLTI0LDcgKzI0LDEyIEBACiAKIAkvKiBnZXQgY3VycmVudCBSVEMgdGltZSBhbmQgY29udmVydCB0byBzZWNvbmRzICovCiAJZ2V0X3J0Y190aW1lKCZjdXJfcnRjX3RtKTsKLQlydGNfdG1fdG9fdGltZSgmY3VyX3J0Y190bSwgJmN1cl9ydGNfdGltZSk7CisJY3VyX3J0Y190aW1lID0gbWt0aW1lKGN1cl9ydGNfdG0udG1feWVhciArIDE5MDAsCisJCQkgICAgICBjdXJfcnRjX3RtLnRtX21vbiArIDEsCisJCQkgICAgICBjdXJfcnRjX3RtLnRtX21kYXksCisJCQkgICAgICBjdXJfcnRjX3RtLnRtX2hvdXIsCisJCQkgICAgICBjdXJfcnRjX3RtLnRtX21pbiwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fc2VjKTsKIAogCWRpZmYgPSBjdXJfcnRjX3RpbWUgLSBzdXNwZW5kX3J0Y190aW1lOwogCkBAIC00NCw3ICs0OSwxMiBAQAogCVdBUk5fT04oIXBwY19tZC5nZXRfcnRjX3RpbWUpOwogCiAJZ2V0X3J0Y190aW1lKCZzdXNwZW5kX3J0Y190bSk7Ci0JcnRjX3RtX3RvX3RpbWUoJnN1c3BlbmRfcnRjX3RtLCAmc3VzcGVuZF9ydGNfdGltZSk7CisJc3VzcGVuZF9ydGNfdGltZSA9IG1rdGltZShzdXNwZW5kX3J0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX21vbiArIDEsCisJCQkJICBzdXNwZW5kX3J0Y190bS50bV9tZGF5LAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1faG91ciwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX21pbiwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX3NlYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMKaW5kZXggN2QzYjA5Yi4uYTExM2Q4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMKQEAgLTcyLDEyICs3MiwxMSBAQAogCWludCByZXQ7CiAKIAlmb3IgKG5wID0gTlVMTCwgaSA9IDA7Ci0JICAgICAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm5ldHdvcmsiLCAidHNpLWV0aGVybmV0IikpICE9IE5VTEw7CisJICAgICAobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgIm5ldHdvcmsiLCAidHNpMTA4LWV0aGVybmV0IikpICE9IE5VTEw7CiAJICAgICBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlIHJbMl07Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5OworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeSwgKm1kaW87CiAJCWh3X2luZm8gdHNpX2V0aF9kYXRhOwotCQljb25zdCB1bnNpZ25lZCBpbnQgKmlkOwogCQljb25zdCB1bnNpZ25lZCBpbnQgKnBoeV9pZDsKIAkJY29uc3Qgdm9pZCAqbWFjX2FkZHI7CiAJCWNvbnN0IHBoYW5kbGUgKnBoOwpAQCAtMTExLDYgKzExMCwxMyBAQAogCQlpZiAobWFjX2FkZHIpCiAJCQltZW1jcHkodHNpX2V0aF9kYXRhLm1hY19hZGRyLCBtYWNfYWRkciwgNik7CiAKKwkJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJtZGlvLWhhbmRsZSIsIE5VTEwpOworCQltZGlvID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShtZGlvLCAwLCAmcmVzKTsKKwkJb2Zfbm9kZV9wdXQobWRpbyk7CisJCWlmIChyZXQpCisJCQlnb3RvIHVucmVnOworCiAJCXBoID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWhhbmRsZSIsIE5VTEwpOwogCQlwaHkgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOwogCkBAIC0xMTksMjAgKzEyNSwyNSBAQAogCQkJZ290byB1bnJlZzsKIAkJfQogCi0JCWlkID0gb2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOwotCQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicGh5LWlkIiwgTlVMTCk7Ci0JCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGh5LCAwLCAmcmVzKTsKLQkJaWYgKHJldCkgewotCQkJb2Zfbm9kZV9wdXQocGh5KTsKLQkJCWdvdG8gdW5yZWc7Ci0JCX0KKwkJcGh5X2lkID0gb2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOworCiAJCXRzaV9ldGhfZGF0YS5yZWdzID0gclswXS5zdGFydDsKIAkJdHNpX2V0aF9kYXRhLnBoeXJlZ3MgPSByZXMuc3RhcnQ7CiAJCXRzaV9ldGhfZGF0YS5waHkgPSAqcGh5X2lkOwogCQl0c2lfZXRoX2RhdGEuaXJxX251bSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBoeSwgImJjbTU0eHgiKSkKKworCQkvKiBTb21lIGJvYXJkcyB3aXRoIHRoZSBUU0kxMDggYnJpZGdlIChlLmcuIEhvbGx5KQorCQkgKiBoYXZlIGEgbWlzd2lyaW5nIG9mIHRoZSBldGhlcm5ldCBQSFlzIHdoaWNoCisJCSAqIHJlcXVpcmVzIGEgd29ya2Fyb3VuZC4gIFRoZSBzcGVjaWFsCisJCSAqICJ0eGMtcnhjLWRlbGF5LWRpc2FibGUiIHByb3BlcnR5IGVuYWJsZXMgdGhpcworCQkgKiB3b3JrYXJvdW5kLiAgRklYTUU6IE5lZWQgdG8gcG9ydCB0aGUgdHNpMTA4X2V0aAorCQkgKiBkcml2ZXIgaXRzZWxmIHRvIHBoeWxpYiBhbmQgdXNlIGEgbm9uLW1pc2xlYWRpbmcKKwkJICogbmFtZSBmb3IgdGhlIHdvcmthcm91bmQgZmxhZyAtIGl0J3Mgbm90IGFjdHVhbGx5IHRvCisJCSAqIGRvIHdpdGggdGhlIG1vZGVsIG9mIFBIWSBpbiB1c2UgKi8KKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShwaHksICJ0eGMtcnhjLWRlbGF5LWRpc2FibGUiLCBOVUxMKSkKIAkJCXRzaV9ldGhfZGF0YS5waHlfdHlwZSA9IFRTSTEwOF9QSFlfQkNNNTRYWDsKIAkJb2Zfbm9kZV9wdXQocGh5KTsKKwogCQlyZXQgPQogCQkgICAgcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHRzaV9ldGhfZGV2LCAmdHNpX2V0aF9kYXRhLAogCQkJCQkgICAgIHNpemVvZihod19pbmZvKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jCmluZGV4IDIxNTMxNjMuLjkwZGI4YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jCkBAIC02NCw5ICs2NCwxMCBAQAogCQkJICAgaW50IG9mZnNldCwgaW50IGxlbiwgdTMyIHZhbCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfYWRkcjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZ1bmMpKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2ZnVuYykpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJY2ZnX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSh0c2lfbWtfY29uZmlnX2FkZHIoYnVzLT5udW1iZXIsCkBAIC0xNDksMTAgKzE1MCwxMSBAQAogCQkJICBpbnQgbGVuLCB1MzIgKiB2YWwpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqY2ZnX2FkZHI7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXUzMiB0ZW1wOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJY2ZnX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSh0c2lfbWtfY29uZmlnX2FkZHIoYnVzLT5udW1iZXIsCkBAIC0yMTksMTQgKzIyMSwxMiBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAKIAlpZiAoIWhvc2UpIHsKIAkJcHJpbnRrKCJQQ0kgSG9zdCBicmlkZ2UgaW5pdCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggMjhmZGY0Zi4uNjY5ZTY1NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMjYzNCw3ICsyNjM0LDcgQEAKIF9faW5pdGNhbGwoc2V0dXBfeG1vbl9zeXNycSk7CiAjZW5kaWYgLyogQ09ORklHX01BR0lDX1NZU1JRICovCiAKLWludCBfX2luaXRkYXRhIHhtb25fZWFybHksIHhtb25fb2ZmOworc3RhdGljIGludCBfX2luaXRkYXRhIHhtb25fZWFybHksIHhtb25fb2ZmOwogCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV94bW9uKGNoYXIgKnApCiB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwppbmRleCBkMzE5ZjliLi4wZGE1NTM2OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL21pc2MuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCkBAIC0zMjgsNyArMzI4LDcgQEAKIAltdHNwciAgIFNQUk5fTDFDU1IwLHIzCiAJaXN5bmMKIAlibHIKLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkKIAltZnNwcglyMyxTUFJOX0wxQ1NSMQogCW9yaQlyMyxyMyxMMUNTUjFfSUNGSXxMMUNTUjFfSUNMRlIKIAltdHNwcglTUFJOX0wxQ1NSMSxyMwpAQCAtMzU1LDcgKzM1NSw3IEBACiBfR0xPQkFMKF9fZmx1c2hfaWNhY2hlX3JhbmdlKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUpCiAJbGkJcjUsTDFfQ0FDSEVfQllURVMtMQogCWFuZGMJcjMscjMscjUKIAlzdWJmCXI0LHIzLHI0CkBAIC00NzIsNyArNDcyLDcgQEAKIF9HTE9CQUwoX19mbHVzaF9kY2FjaGVfaWNhY2hlKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCXJsd2lubQlyMyxyMywwLDAsMTkJCQkvKiBHZXQgcGFnZSBiYXNlIGFkZHJlc3MgKi8KIAlsaQlyNCw0MDk2L0wxX0NBQ0hFX0JZVEVTCS8qIE51bWJlciBvZiBsaW5lcyBpbiBhIHBhZ2UgKi8KIAltdGN0cglyNApAQCAtNTAwLDcgKzUwMCw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZV9waHlzKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCW1mbXNyCXIxMAogCXJsd2lubQlyMCxyMTAsMCwyOCwyNgkJCS8qIGNsZWFyIERSICovCiAJbXRtc3IJcjAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBhNDE2NTIwLi42M2YwYTk4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCkBAIC02NCw3ICs2NCw2IEBACiAKIEVYUE9SVF9TWU1CT0woY2xlYXJfcGFnZXMpOwogRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChkb19zaWduYWwpOwogRVhQT1JUX1NZTUJPTCh0cmFuc2Zlcl90b19oYW5kbGVyKTsKIEVYUE9SVF9TWU1CT0woZG9fSVJRKTsKIEVYUE9SVF9TWU1CT0wobWFjaGluZV9jaGVja19leGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMgYi9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYwppbmRleCBjNzk3MDRmLi45NjdjMWVmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYwpAQCAtNTI2LDcgKzUyNiw3IEBACiAJICogU3lzdGVtcyB3aXRoIE9GIGNhbiBsb29rIGluIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBjcHUgbm9kZShzKQogCSAqIGZvciBhIHBvc3NpYmx5IG1vcmUgYWNjdXJhdGUgdmFsdWUuCiAJICovCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKSkgeworCWlmICghIGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpKSB7CiAJCWRjYWNoZV9ic2l6ZSA9IGN1cl9jcHVfc3BlYy0+ZGNhY2hlX2JzaXplOwogCQlpY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmljYWNoZV9ic2l6ZTsKIAkJdWNhY2hlX2JzaXplID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKaW5kZXggYWVhMTAwYi4uM2YzYjI5MiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMKQEAgLTkyLDYgKzkyLDcgQEAKIAlpZiAobmwpCiAJCXByaW50aygiXG4iKTsKIAlzaG93X3JlZ3MoZnApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCS8qIGRvX2V4aXQoKSBzaG91bGQgdGFrZSBjYXJlIG9mIHBhbmljJ2luZyBmcm9tIGFuIGludGVycnVwdAogCSAqIGNvbnRleHQgc28gd2UgZG9uJ3QgaGFuZGxlIGl0IGhlcmUKQEAgLTYxOSw3ICs2MjAsNyBAQAogCQkJcmV0dXJuOwogCiAJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9QUikgJiYgIC8qIG5vdCB1c2VyLW1vZGUgKi8KLQkJICAgIHJlcG9ydF9idWcocmVncy0+bmlwKSA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pIHsKKwkJICAgIHJlcG9ydF9idWcocmVncy0+bmlwLCByZWdzKSA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pIHsKIAkJCXJlZ3MtPm5pcCArPSA0OwogCQkJcmV0dXJuOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS90bGIuYyBiL2FyY2gvcHBjL21tL3RsYi5jCmluZGV4IGZhMjk3NDAuLjRmZjI2MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL3RsYi5jCisrKyBiL2FyY2gvcHBjL21tL3RsYi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCmluZGV4IDZmMjExMTAuLjNjNTY2NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYwpAQCAtNjksOSArNjksNiBAQAogCiBUT0RDX0FMTE9DKCk7CiAKLXVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldjsKLXVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldk1haiwgdWNCb2FyZFJldk1pbjsKLQogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcHJlcF9udnJhbV9yZWFkX3ZhbChpbnQgYWRkcik7CiBleHRlcm4gdm9pZCBwcmVwX252cmFtX3dyaXRlX3ZhbChpbnQgYWRkciwKIAkJCQkgdW5zaWduZWQgY2hhciB2YWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCmluZGV4IDk1Njk0MTU5Li41NDM3OTViIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogCiB3ZHQtbXBjOHh4LSQoQ09ORklHXzh4eF9XRFQpCSs9IG04eHhfd2R0Lm8KIAorb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDQlVHX05WUkFNKQkrPSBwcmVwX252cmFtLm8KIG9iai0kKENPTkZJR19QUENfT0NQKQkJKz0gb2NwLm8KIG9iai0kKENPTkZJR19JQk1fT0NQKQkJKz0gaWJtX29jcC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMzIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIGluZGlyZWN0IFBDSSBicmlkZ2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBHYWJyaWVsIFBhdWJlcnQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFCisjZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9iZTMyCisjZWxzZQorI2RlZmluZSBQQ0lfQ0ZHX09VVCBvdXRfbGUzMgorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2luZGlyZWN0X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbCA9IGluXzgoY2ZnX2RhdGEpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWwgPSBpbl9sZTE2KGNmZ19kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnZhbCA9IGluX2xlMzIoY2ZnX2RhdGEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludAoraW5kaXJlY3Rfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICAgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0XzgoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0X2xlMTYoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW91dF9sZTMyKGNmZ19kYXRhLCB2YWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGluZGlyZWN0X3BjaV9vcHMgPQoreworCWluZGlyZWN0X3JlYWRfY29uZmlnLAorCWluZGlyZWN0X3dyaXRlX2NvbmZpZworfTsKKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHZvaWQgX19pb21lbSAqIGNmZ19hZGRyLAorCXZvaWQgX19pb21lbSAqIGNmZ19kYXRhKQoreworCWhvc2UtPmNmZ19hZGRyID0gY2ZnX2FkZHI7CisJaG9zZS0+Y2ZnX2RhdGEgPSBjZmdfZGF0YTsKKwlob3NlLT5vcHMgPSAmaW5kaXJlY3RfcGNpX29wczsKK30KKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOworCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKKworCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOworCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOworCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCisJCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKKwlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKKwlzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoaG9zZSwgYWRkciwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCmluZGV4IDE2NTQ2NzguLmFjZTRlYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCkBAIC03MSw2ICs3MSwyMSBAQAogCX0sIFwKIH0KIAorLyoKKyAqIE1MMzAwL01MNDAzIFZpZGVvIERldmljZTogc2hvcnRjdXQgbWFjcm8gZm9yIHNpbmdsZSBpbnN0YW5jZQorICovCisjZGVmaW5lIFhQQVJfVEZUKG51bSkgeyBcCisJLm5hbWUgPSAieGlsaW54ZmIiLCBcCisJLmlkID0gbnVtLCBcCisJLm51bV9yZXNvdXJjZXMgPSAxLCBcCisJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7IFwKKwkJeyBcCisJCQkuc3RhcnQgPSBYUEFSX1RGVF8jI251bSMjX0JBU0VBRERSLCBcCisJCQkuZW5kID0gWFBBUl9URlRfIyNudW0jI19CQVNFQUREUis3LCBcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lPLCBcCisJCX0sIFwKKwl9LCBcCit9CiAKIC8qIFVBUlQgODI1MCBkcml2ZXIgcGxhdGZvcm0gZGF0YSB0YWJsZSAqLwogc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHZpcnRleF9zZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewpAQCAtMTQ2LDIwICsxNjEsMTcgQEAKIAlYUEFSX1NZU0FDRSgxKSwKICNlbmRpZgogCi0JLyogTUwzMDAvNDAzIHJlZmVyZW5jZSBkZXNpZ24gZnJhbWVidWZmZXIgKi8KICNpZiBkZWZpbmVkKFhQQVJfVEZUXzBfQkFTRUFERFIpCi0JewotCQkubmFtZQkJPSAieGlsaW54ZmIiLAotCQkuaWQJCT0gMCwKLQkJLm51bV9yZXNvdXJjZXMJPSAxLAotCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKLQkJCXsKLQkJCQkuc3RhcnQJPSBYUEFSX1RGVF8wX0JBU0VBRERSLAotCQkJCS5lbmQJPSBYUEFSX1RGVF8wX0JBU0VBRERSKzcsCi0JCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKLQkJCX0sCi0JCX0sCi0JfSwKKwlYUEFSX1RGVCgwKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMV9CQVNFQUREUikKKwlYUEFSX1RGVCgxKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMl9CQVNFQUREUikKKwlYUEFSX1RGVCgyKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfM19CQVNFQUREUikKKwlYUEFSX1RGVCgzKSwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmggYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAppbmRleCAzZDRiZTE0Li45ZjM4ZDkyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAorKysgYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaApAQCAtMzEsNCArMzEsMTEgQEAKICAqLwogaW50IHZpcnRleF9kZXZpY2VfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKIAorLyogU1BJIENvbnRyb2xsZXIgSVAgKi8KK3N0cnVjdCB4c3BpX3BsYXRmb3JtX2RhdGEgeworCXMxNiBidXNfbnVtOworCXUxNiBudW1fY2hpcHNlbGVjdDsKKwl1MzIgc3BlZWRfaHo7Cit9OworCiAjZW5kaWYgIC8qIF9fQVNNX1ZJUlRFWF9ERVZJQ0VTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmE4ZjA4Ny4uZjQ1MDNjYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC0yOTQsNyArMjk0LDYgQEAKIHN0YXRpYyBpbnQKIGRvX3B0cmFjZV9ub3JtYWwoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlwdHJhY2VfYXJlYSBwYXJlYTsgCiAJaW50IGNvcGllZCwgcmV0OwogCkBAIC0zMDQsMTAgKzMwMyw3IEBACiAJCS8qIFJlbW92ZSBoaWdoIG9yZGVyIGJpdCBmcm9tIGFkZHJlc3MgKG9ubHkgZm9yIDMxIGJpdCkuICovCiAJCWFkZHIgJj0gUFNXX0FERFJfSU5TTjsKIAkJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSBfX3VzZXIgKikgZGF0YSk7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgogCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KQEAgLTMxOCwxMCArMzE0LDcgQEAKIAkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KIAkJYWRkciAmPSBQU1dfQUREUl9JTlNOOwogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwxKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YoZGF0YSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCBlZTkxODZmLi44ZWM5ZGVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0yNjIsNiArMjYyLDcgQEAKIAlwcmludF9tb2R1bGVzKCk7CiAJc2hvd19yZWdzKHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMxOSw3ICszMjAsNyBAQAogCQllbHNlIHsKIAkJCWVudW0gYnVnX3RyYXBfdHlwZSBidHQ7CiAKLQkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKwkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOLCByZWdzKTsKIAkJCWlmIChidHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKQogCQkJCXJldHVybjsKIAkJCWRpZShzdHIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCAwMzgxNzllLi5kOGVkNjY3IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC01NSw4ICs1NSwyMSBAQAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlkZWZfYm9vbCBuCiAKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUE0KKwlib29sCisKIGNvbmZpZyBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgogCWJvb2wKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BNCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfU01QCisJYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX05VTUEKKwlib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUENJCisJYm9vbAogCiBjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAlib29sCkBAIC04MSwyNTcgKzk0LDggQEAKIAogbWVudSAiU3lzdGVtIHR5cGUiCiAKLWNvbmZpZyBTT0xVVElPTl9FTkdJTkUKLQlib29sCi0KLWNob2ljZQotCXByb21wdCAiU3VwZXJIIHN5c3RlbSB0eXBlIgotCWRlZmF1bHQgU0hfVU5LTk9XTgotCi1jb25maWcgU0hfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmUiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCWhlbHAKLQkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQotCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzIyX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzcyMiIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcyMgotCWhlbHAKLQkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MQotCWhlbHAKLQkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCi0JICBldmFsdWF0aW9uIGJvYXJkLgotCSAgCi1jb25maWcgU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTc3ODAiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODAKLQloZWxwCi0JICBTZWxlY3QgNzc4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFNINzc4MAotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzczMDBfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3MzAwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzAwCi0JaGVscAotCSAgU2VsZWN0IDczMDAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQotCSAgU0g3MzAwKFNILU1vYmlsZSBWKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzM0M19TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTczNDMiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczNDMKLQloZWxwCi0JICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKLSAgICAgICBib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzE4MAotCWhlbHAKLQkgIFNlbGVjdCA3MzE4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczMTgwKFNILU1vYmlsZSAzKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzc1MV9TWVNURU1ICi0JYm9vbCAiU3lzdGVtSDc3NTFSIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFN5c3RlbUggaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFN5c3RlbUgKLQkgIDc3NTFSIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF9IUDZYWAotCWJvb2wgIkhQNlhYIgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgotCWhlbHAKLQkgIFNlbGVjdCBIUDZYWCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBqb3JuYWRhIEhQNnh4LgotCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKLQkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCi0KLWNvbmZpZyBTSF9TQVRVUk4KLQlib29sICJTYXR1cm4iCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzYwNAotCWhlbHAKLQkgIFNlbGVjdCBTYXR1cm4gaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBTYXR1cm4uCi0KLWNvbmZpZyBTSF9EUkVBTUNBU1QKLQlib29sICJEcmVhbWNhc3QiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzA5MQotCWhlbHAKLQkgIFNlbGVjdCBEcmVhbWNhc3QgaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBEcmVhbWNhc3QuCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0Ci0JICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKLQkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KLQotY29uZmlnIFNIX01QQzEyMTEKLQlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKLQloZWxwCi0JICBDVFAvUENJLVNIMDIgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKLQkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgotCi1jb25maWcgU0hfU0gwMwotCWJvb2wgIkludGVyZmFjZSBDVFAvUENJLVNIMDMiCi0JaGVscAotCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCi0JICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KLQotY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCi0JYm9vbCAiU2VjdXJlRWRnZTU0MTAiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCi0JICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCi0JICBTTUUgcHJvZHVjdCBsaW5lLgotCi1jb25maWcgU0hfSFM3NzUxUlZPSVAKLQlib29sICJIUzc3NTFSVk9JUCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIFNlbGVjdCBIUzc3NTFSVk9JUCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKLQkgIFNhbGVzIFZvSVAgYm9hcmQuCi0KLWNvbmZpZyBTSF83NzEwVk9JUEdXCi0JYm9vbCAiU0g3NzEwLVZPSVAtR1ciCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcxMAotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIFNINzcxMCBiYXNlZAotCSAgVk9JUCBHVy4KLQotY29uZmlnIFNIX1JUUzc3NTFSMkQKLQlib29sICJSVFM3NzUxUjJEIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFJUUzc3NTFSMkQgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5Ci0JICBTYWxlcyBTSC1HcmFwaGljcyBib2FyZC4KLQotY29uZmlnIFNIX0hJR0hMQU5ERVIKLQlib29sICJIaWdobGFuZGVyIgotCi1jb25maWcgU0hfRURPU0s3NzA1Ci0JYm9vbCAiRURPU0s3NzA1IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDUKLQotY29uZmlnIFNIX1NINDIwMl9NSUNST0RFVgotCWJvb2wgIlNINC0yMDIgTWljcm9EZXYiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINF8yMDIKLQloZWxwCi0JICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKLQkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCi0KLWNvbmZpZyBTSF9MQU5ESVNLCi0JYm9vbCAiTEFORElTSyIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCi0KLWNvbmZpZyBTSF9USVRBTgotCWJvb2wgIlRJVEFOIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcwotCSAgTmV0RW5naW5lIE5QNTFSLgotCi1jb25maWcgU0hfU0hNSU4KLQlib29sICJTSE1JTiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzA2Ci0JaGVscAotCSAgU2VsZWN0IFNITUlOIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQuCi0KLWNvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JaGVscAotCSAgU2VsZWN0IDcyMDYgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDcyMDYKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NjE5X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzYxOSIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NjE5Ci0JaGVscAotCSAgU2VsZWN0IDc2MTkgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc2MTkKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0JCi1jb25maWcgU0hfTEJPWF9SRTIKLQlib29sICJMLUJPWCBSRTIiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgotCi1jb25maWcgU0hfVU5LTk9XTgotCWJvb2wgIkJhcmVDUFUiCi0JaGVscAotCSAgIkJhcmUgQ1BVIiBha2EgInVua25vd24iIG1lYW5zIGFuIFNILWJhc2VkIHN5c3RlbSB3aGljaCBpcyBub3Qgb25lCi0JICBvZiB0aGUgc3BlY2lmaWMgb25lcyBtZW50aW9uZWQgYWJvdmUsIHdoaWNoIG1lYW5zIHlvdSBuZWVkIHRvIGVudGVyCi0JICBhbGwgc29ydHMgb2Ygc3R1ZmYgbGlrZSBDT05GSUdfTUVNT1JZX1NUQVJUIGJlY2F1c2UgdGhlIGNvbmZpZwotCSAgc3lzdGVtIGRvZXNuJ3QgYWxyZWFkeSBrbm93IHdoYXQgaXQgaXMuICBZb3UgZ2V0IGEgbWFjaGluZSB2ZWN0b3IKLQkgIHdpdGhvdXQgYW55IHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgaW4gaXQsIHNvIHRoaW5ncyBsaWtlIHRoZSBSVEMgbWF5Ci0JICBub3Qgd29yay4KLQotCSAgVGhpcyBvcHRpb24gaXMgZm9yIHRoZSBlYXJseSBzdGFnZXMgb2YgcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lLgotCi1lbmRjaG9pY2UKLQotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCi1zb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL3NoL21tL0tjb25maWciCiAKLWNvbmZpZyBDRl9FTkFCTEVSCi0JYm9vbCAiQ29tcGFjdCBGbGFzaCBFbmFibGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTSF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfVU5LTk9XTiB8fCBTSF9TSDAzCi0JLS0taGVscC0tLQotCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCi0JICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91Ci0JICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KLQkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0Ci0JICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCi0KLQkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKLQkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcwotCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KLQotCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCi0KLWNob2ljZQotCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCi0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCBDRl9BUkVBNgotCi1jb25maWcgQ0ZfQVJFQTUKLQlib29sICJBcmVhNSIKLQloZWxwCi0JICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKLQkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KLQotCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQotCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCi0KLQkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KLQotY29uZmlnIENGX0FSRUE2Ci0JYm9vbCAiQXJlYTYiCi0KLWVuZGNob2ljZQotCi1jb25maWcgQ0ZfQkFTRV9BRERSCi0JaGV4Ci0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKLQlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQotCiBtZW51ICJQcm9jZXNzb3IgZmVhdHVyZXMiCiAKIGNob2ljZQpAQCAtMzUxLDcgKzExNSw3IEBACiAKIGNvbmZpZyBTSF9GUFUKIAlib29sICJGUFUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFDUFVfU0gzCisJZGVwZW5kcyBvbiBDUFVfU0g0CiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIFNIIHByb2Nlc3NvcnMgdGhhdApAQCAtNDM3LDYgKzIwMSwyMDkgQEAKIAogZW5kbWVudQogCittZW51ICJCb2FyZCBzdXBwb3J0IgorCitjb25maWcgU09MVVRJT05fRU5HSU5FCisJYm9vbAorCitjb25maWcgU0hfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmUiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA5IHx8IENQVV9TVUJUWVBFX1NINzc1MAorCWhlbHAKKwkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQorCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcyMDYKKwloZWxwCisJICBTZWxlY3QgNzIwNiBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzIwNgorCSAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc2MTlfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NjE5IgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzYxOQorCWhlbHAKKwkgIFNlbGVjdCA3NjE5IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NjE5CisJICBldmFsdWF0aW9uIGJvYXJkLgorCQorY29uZmlnIFNIXzc3MjJfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzIyIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcyMgorCWhlbHAKKwkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEKKwloZWxwCisJICBTZWxlY3QgNzc1MSBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzc1MQorCSAgZXZhbHVhdGlvbiBib2FyZC4KKwkgIAorY29uZmlnIFNIXzc3ODBfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCisJaGVscAorCSAgU2VsZWN0IDc3ODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTSDc3ODAKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzAwX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzMwMCIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczMDAKKwloZWxwCisJICBTZWxlY3QgNzMwMCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczMDAoU0gtTW9iaWxlIFYpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzQzX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzM0MyIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczNDMKKwloZWxwCisJICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzMxODAKKwloZWxwCisJICBTZWxlY3QgNzMxODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQorCSAgU0g3MzE4MChTSC1Nb2JpbGUgMykgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc3NTFfU1lTVEVNSAorCWJvb2wgIlN5c3RlbUg3NzUxUiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgU3lzdGVtSCBpZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgU3lzdGVtSAorCSAgNzc1MVIgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIX0hQNlhYCisJYm9vbCAiSFA2WFgiCisJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCisJc2VsZWN0IEhENjQ0NlhfU0VSSUVTCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKKwloZWxwCisJICBTZWxlY3QgSFA2WFggaWYgY29uZmlndXJpbmcgZm9yIGEgSFAgam9ybmFkYSBIUDZ4eC4KKwkgIE1vcmUgaW5mb3JtYXRpb24gKGhhcmR3YXJlIG9ubHkpIGF0CisJICA8aHR0cDovL3d3dy5ocC5jb20vam9ybmFkYS8+LgorCitjb25maWcgU0hfRFJFQU1DQVNUCisJYm9vbCAiRHJlYW1jYXN0IgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcwOTEKKwloZWxwCisJICBTZWxlY3QgRHJlYW1jYXN0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNFR0EgRHJlYW1jYXN0LgorCSAgTW9yZSBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubTE3bi5vcmcvbGludXgtc2gvZHJlYW1jYXN0Lz4uICBUaGVyZSBpcyBhCisJICBEcmVhbWNhc3QgcHJvamVjdCBpcyBhdCA8aHR0cDovL2xpbnV4ZGMuc291cmNlZm9yZ2UubmV0Lz4uCisKK2NvbmZpZyBTSF9NUEMxMjExCisJYm9vbCAiSW50ZXJmYWNlIE1QQzEyMTEiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEgJiYgQlJPS0VOCisJaGVscAorCSAgQ1RQL1BDSS1TSDAyIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NIMDMKKwlib29sICJJbnRlcmZhY2UgQ1RQL1BDSS1TSDAzIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxICYmIEJST0tFTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCisJYm9vbCAiU2VjdXJlRWRnZTU0MTAiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCisJICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCisJICBTTUUgcHJvZHVjdCBsaW5lLgorCitjb25maWcgU0hfSFM3NzUxUlZPSVAKKwlib29sICJIUzc3NTFSVk9JUCIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgSFM3NzUxUlZPSVAgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5CisJICBTYWxlcyBWb0lQIGJvYXJkLgorCitjb25maWcgU0hfNzcxMFZPSVBHVworCWJvb2wgIlNINzcxMC1WT0lQLUdXIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzEwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciB0aGUgU0g3NzEwIGJhc2VkCisJICBWT0lQIEdXLgorCitjb25maWcgU0hfUlRTNzc1MVIyRAorCWJvb2wgIlJUUzc3NTFSMkQiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKKwkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgorCitjb25maWcgU0hfSElHSExBTkRFUgorCWJvb2wgIkhpZ2hsYW5kZXIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1CisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKworY29uZmlnIFNIX0VET1NLNzcwNQorCWJvb2wgIkVET1NLNzcwNSIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNQorCitjb25maWcgU0hfU0g0MjAyX01JQ1JPREVWCisJYm9vbCAiU0g0LTIwMiBNaWNyb0RldiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKKwloZWxwCisJICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKKwkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCisKK2NvbmZpZyBTSF9MQU5ESVNLCisJYm9vbCAiTEFORElTSyIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCisKK2NvbmZpZyBTSF9USVRBTgorCWJvb2wgIlRJVEFOIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcworCSAgTmV0RW5naW5lIE5QNTFSLgorCitjb25maWcgU0hfU0hNSU4KKwlib29sICJTSE1JTiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNgorCWhlbHAKKwkgIFNlbGVjdCBTSE1JTiBpZiBjb25maWd1cmluZyBmb3IgdGhlIFNITUlOIGJvYXJkLgorCitjb25maWcgU0hfTEJPWF9SRTIKKwlib29sICJMLUJPWCBSRTIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgorCitlbmRtZW51CisKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWciCisKIG1lbnUgIlRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uIgogCiBjb25maWcgU0hfVE1VCkBAIC00NzMsMTMgKzQ0MCwxMyBAQAogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MCB8fCBDUFVfU1VCVFlQRV9TSDczNDMKIAlkZWZhdWx0ICIzMTI1MDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAiMzIwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzcyMgogCWRlZmF1bHQgIjMzMzMzMzMzIiBpZiBDUFVfU1VCVFlQRV9TSDczMDAgfHwgQ1BVX1NVQlRZUEVfU0g3NzcwIHx8IFwKIAkJCSAgICAgIENQVV9TVUJUWVBFX1NINzc2MCB8fCBDUFVfU1VCVFlQRV9TSDc3MDUgfHwgXAogCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JZGVmYXVsdCAiNTAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgXAotCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3Nzg1Ci0JZGVmYXVsdCAiNjAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MQorCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEgfHwgQ1BVX1NVQlRZUEVfU0g3NzUxUgogCWRlZmF1bHQgIjY2MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDRfMjAyCisJZGVmYXVsdCAiNTAwMDAwMDAiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeS4KIAkgIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkZXRlcm1pbmluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIHZhbHVlIG9uCkBAIC00ODcsOCArNDU0LDEwIEBACiAKIGNvbmZpZyBTSF9DTEtfTUQKIAlpbnQgIkNQVSBNb2RlIFBpbiBTZXR0aW5nIgotCWRlZmF1bHQgMAogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NjE5IHx8IENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgNiBpZiBDUFVfU1VCVFlQRV9TSDcyMDYKKwlkZWZhdWx0IDUgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAwCiAJaGVscAogCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgogCkBAIC01NjAsNiArNTI5LDcgQEAKIAogY29uZmlnIFNNUAogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKIAkgIGEgc3lzdGVtIHdpdGggb25seSBvbmUgQ1BVLCBsaWtlIG1vc3QgcGVyc29uYWwgY29tcHV0ZXJzLCBzYXkgTi4gSWYKQEAgLTU4NCw2ICs1NTQsNyBAQAogCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCiAJcmFuZ2UgMiAzMgogCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiNCIgaWYgQ1BVX1NIWDMKIAlkZWZhdWx0ICIyIgogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKQEAgLTYyMyw2ICs1OTQsNyBAQAogCiBjb25maWcgVUJDX1dBS0VVUAogCWJvb2wgIldha2V1cCBVQkMgb24gc3RhcnR1cCIKKwlkZXBlbmRzIG9uIENQVV9TSDQKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCB3YWtldXAgdGhlIFVzZXIgQnJlYWsgQ29udHJvbGxlciAoVUJDKSBvbgogCSAgc3RhcnR1cC4gQWx0aG91Z2ggdGhlIFVCQyBpcyBsZWZ0IGluIGFuIGF3YWtlIHN0YXRlIHdoZW4gdGhlIHByb2Nlc3NvcgpAQCAtNjUxLDggKzYyMyw4IEBACiAjIHdlJ3JlIG5vdCB1c2luZyBQQ01DSUEsIHNvIHdlIG1ha2UgaXQgZGVwZW5kZW50IG9uCiAjIFBDTUNJQSBvdXRyaWdodC4gLS0gUEZNLgogY29uZmlnIElTQQotCWJvb2wKLQlkZWZhdWx0IHkgaWYgUENNQ0lBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUENNQ0lBICYmIEhENjQ0NlhfU0VSSUVTCiAJaGVscAogCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKIAkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKQEAgLTY5MCw2ICs2NjIsNDkgQEAKIAl0cmlzdGF0ZSAiU3VwZXJIeXdheSBCdXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKIAorY29uZmlnIENGX0VOQUJMRVIKKwlib29sICJDb21wYWN0IEZsYXNoIEVuYWJsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPTFVUSU9OX0VOR0lORSB8fCBTSF9TSDAzCisJLS0taGVscC0tLQorCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCisJICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91CisJICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKwkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCisKKwkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKKwkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcworCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KKworCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCisKK2Nob2ljZQorCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCBDRl9BUkVBNgorCitjb25maWcgQ0ZfQVJFQTUKKwlib29sICJBcmVhNSIKKwloZWxwCisJICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKKwkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KKworCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQorCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCisKKwkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KKworY29uZmlnIENGX0FSRUE2CisJYm9vbCAiQXJlYTYiCisKK2VuZGNob2ljZQorCitjb25maWcgQ0ZfQkFTRV9BRERSCisJaGV4CisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKKwlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQorCiBzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgpAQCAtNzA3LDcgKzcyMiw3IEBACiBlbmRtZW51CiAKIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKSIKLWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCitkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTWVNfU1VQUE9SVFNfUE0KIAogc291cmNlIGtlcm5lbC9wb3dlci9LY29uZmlnCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwppbmRleCBiNTYzMDcyLi41MmY2YTk5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCkBAIC01Miw2ICs1MiwxMCBAQAogCSAgc2VsZWN0IGJvdGggdGhlIEVBUkxZX1NDSUZfQ09OU09MRSBhbmQgU0hfU1RBTkRBUkRfQklPUywgdXNpbmcKIAkgIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0b2dnbGUgYmFjayBhbmQgZm9ydGguCiAKK2NvbmZpZyBERUJVR19CT09UTUVNCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlib29sICJEZWJ1ZyBCT09UTUVNIGluaXRpYWxpemF0aW9uIgorCiBjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVwogCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTgyLDYgKzg2LDcgQEAKIAlib29sICJJbmNsdWRlIEtHREIga2VybmVsIGRlYnVnZ2VyIgogCXNlbGVjdCBGUkFNRV9QT0lOVEVSCiAJc2VsZWN0IERFQlVHX0lORk8KKwlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAogCWhlbHAKIAkgIEluY2x1ZGUgaW4ta2VybmVsIGhvb2tzIGZvciBrZ2RiLCB0aGUgTGludXgga2VybmVsIHNvdXJjZSBsZXZlbAogCSAgZGVidWdnZXIuICBTZWUgPGh0dHA6Ly9rZ2RiLnNvdXJjZWZvcmdlLm5ldC8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggODgzYjAzYi4uNzdmZWNjNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0zNCwyMCArMzQsMjAgQEAKIGVuZGlmCiBlbmRpZgogCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJOj0gLW0yYSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKLWNmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKK2NmbGFncy0kKENPTkZJR19DUFVfU0gyKQkJOj0gJChjYWxsIGNjLW9wdGlvbiwtbTIsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTJhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tMywpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NINCkJCTo9ICQoY2FsbCBjYy1vcHRpb24sLW00LCkgXAogCSQoY2FsbCBjYy1vcHRpb24sLW1uby1pbXBsaWNpdC1mcCwtbTQtbm9mcHUpCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NINEEpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEsKSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDRBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTRhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pCQkrPSAtbWIKIGNmbGFncy0kKENPTkZJR19DUFVfTElUVExFX0VORElBTikJKz0gLW1sCiAKIGNmbGFncy15CSs9ICQoY2FsbCBhcy1vcHRpb24sLVdhJChjb21tYSktaXNhPSQoaXNhLXkpLCkgLWZmcmVlc3RhbmRpbmcKIAotY2ZsYWdzLSQoQ09ORklHX1NIX0RTUCkJCQkrPSAtV2EsLWRzcAotCiBjZmxhZ3MtJChDT05GSUdfTU9SRV9DT01QSUxFX09QVElPTlMpCSs9IFwKIAkkKHNoZWxsIGVjaG8gJChDT05GSUdfQ09NUElMRV9PUFRJT05TKSB8IHNlZCAtZSAncy8iLy9nJykKIApAQCAtODcsMzkgKzg3LDM3IEBACiBjb3JlLSQoQ09ORklHX1NIX0ZQVV9FTVUpCSs9IGFyY2gvc2gvbWF0aC1lbXUvCiAKICMgQm9hcmRzCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkJCTo9IHNlLzc3MHgKLW1hY2hkaXItJChDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3MjIKLW1hY2hkaXItJChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3NTEKLW1hY2hkaXItJChDT05GSUdfU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3ODAKLW1hY2hkaXItJChDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczMDAKLW1hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczNDMKLW1hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzE4MAotbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAotbWFjaGRpci0kKENPTkZJR19TSF9TQVRVUk4pCQkJOj0gc2F0dXJuCi1tYWNoZGlyLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCQk6PSBkcmVhbWNhc3QKLW1hY2hkaXItJChDT05GSUdfU0hfTVBDMTIxMSkJCQk6PSBtcGMxMjExCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NIMDMpCQkJOj0gc2gwMwotbWFjaGRpci0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCTo9IHNuYXBnZWFyCi1tYWNoZGlyLSQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKQkJOj0gcmVuZXNhcy9oczc3NTFydm9pcAotbWFjaGRpci0kKENPTkZJR19TSF9SVFM3NzUxUjJEKQkJCTo9IHJlbmVzYXMvcnRzNzc1MXIyZAotbWFjaGRpci0kKENPTkZJR19TSF83NzUxX1NZU1RFTUgpCQk6PSByZW5lc2FzL3N5c3RlbWgKLW1hY2hkaXItJChDT05GSUdfU0hfRURPU0s3NzA1KQkJCTo9IHJlbmVzYXMvZWRvc2s3NzA1Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0hJR0hMQU5ERVIpCQkJOj0gcmVuZXNhcy9yNzc4MHJwCi1tYWNoZGlyLSQoQ09ORklHX1NIXzc3MTBWT0lQR1cpCQkJOj0gcmVuZXNhcy9zaDc3MTB2b2lwZ3cKLW1hY2hkaXItJChDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWKQkJOj0gc3VwZXJoL21pY3JvZGV2Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0xBTkRJU0spCQkJOj0gbGFuZGlzawotbWFjaGRpci0kKENPTkZJR19TSF9USVRBTikJCQk6PSB0aXRhbgotbWFjaGRpci0kKENPTkZJR19TSF9TSE1JTikJCQk6PSBzaG1pbgotbWFjaGRpci0kKENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzIwNgotbWFjaGRpci0kKENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzYxOQotbWFjaGRpci0kKENPTkZJR19TSF9MQk9YX1JFMikJCQk6PSBsYm94cmUyCi1tYWNoZGlyLSQoQ09ORklHX1NIX1VOS05PV04pCQkJOj0gdW5rbm93bgorbWFjaGRpci0kKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCQkrPSBzZS83NzB4CittYWNoZGlyLSQoQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzIyCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzUxCittYWNoZGlyLSQoQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzgwCittYWNoZGlyLSQoQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzAwCittYWNoZGlyLSQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzQzCittYWNoZGlyLSQoQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSkJKz0gc2UvNzMxODAKK21hY2hkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJKz0gaHA2eHgKK21hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCSs9IGRyZWFtY2FzdAorbWFjaGRpci0kKENPTkZJR19TSF9NUEMxMjExKQkJCSs9IG1wYzEyMTEKK21hY2hkaXItJChDT05GSUdfU0hfU0gwMykJCQkrPSBzaDAzCittYWNoZGlyLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJKz0gc25hcGdlYXIKK21hY2hkaXItJChDT05GSUdfU0hfSFM3NzUxUlZPSVApCQkrPSByZW5lc2FzL2hzNzc1MXJ2b2lwCittYWNoZGlyLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkJKz0gcmVuZXNhcy9ydHM3NzUxcjJkCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU1lTVEVNSCkJCSs9IHJlbmVzYXMvc3lzdGVtaAorbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJKz0gcmVuZXNhcy9lZG9zazc3MDUKK21hY2hkaXItJChDT05GSUdfU0hfSElHSExBTkRFUikJCQkrPSByZW5lc2FzL3I3NzgwcnAKK21hY2hkaXItJChDT05GSUdfU0hfNzcxMFZPSVBHVykJCQkrPSByZW5lc2FzL3NoNzcxMHZvaXBndworbWFjaGRpci0kKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCQkrPSBzdXBlcmgvbWljcm9kZXYKK21hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQkrPSBsYW5kaXNrCittYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCSs9IHRpdGFuCittYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCSs9IHNobWluCittYWNoZGlyLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MjA2CittYWNoZGlyLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NjE5CittYWNoZGlyLSQoQ09ORklHX1NIX0xCT1hfUkUyKQkJCSs9IGxib3hyZTIKIAotaW5jZGlyLXkJCQk6PSAkKG5vdGRpciAkKG1hY2hkaXIteSkpCi1pbmNkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJOj0gaHA2eHgKK2luY2Rpci15CTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKIAogaWZuZXEgKCQobWFjaGRpci15KSwpCi1jb3JlLXkJCQkJKz0gYXJjaC9zaC9ib2FyZHMvJChtYWNoZGlyLXkpLworY29yZS15CSs9ICQoYWRkcHJlZml4IGFyY2gvc2gvYm9hcmRzLywgXAorCSAgICAgJChmaWx0ZXItb3V0IC4sICQocGF0c3Vic3QgJSwlLywkKG1hY2hkaXIteSkpKSkKIGVuZGlmCiAKICMgQ29tcGFuaW9uIGNoaXBzCkBAIC0xNTcsMTkgKzE1NSwzMSBAQAogIwlNb3N0IGJvYXJkcyBoYXZlIHRoZWlyIG93biBtYWNoIGRpcmVjdG9yaWVzLiAgRm9yIHRoZSBvbmVzIHRoYXQKICMJZG9uJ3QsIGp1c3QgcmVmZXJlbmNlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHNvIHRoZSBzZW1hbnRpY3MgYXJlCiAjCWtlcHQgcm91Z2hseSB0aGUgc2FtZS4KKyMKKyMJV2hlbiBtdWx0aXBsZSBib2FyZHMgYXJlIGNvbXBpbGVkIGluIGF0IHRoZSBzYW1lIHRpbWUsIHByZWZlcmVuY2UKKyMJZm9yIHRoZSBtYWNoIGxpbmsgaXMgZ2l2ZW4gdG8gd2hpY2hldmVyIGhhcyBhIGRpcmVjdG9yeSBmb3IgaXRzCisjCWhlYWRlcnMuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIHdvcmthcm91bmQgdW50aWwgcGxhdGZvcm1zIHRoYXQKKyMJY2FuIGxpdmUgaW4gdGhlIHNhbWUga2VybmVsIGltYWdlIGJhY2sgYXdheSBmcm9tIHJlbHlpbmcgb24gdGhlCisjCW1hY2ggbGluay4KIAogaW5jbHVkZS9hc20tc2gvLm1hY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvc2gvKi5oKSBcCiAJCSAgICAgIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiBGT1JDRQotCUBlY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnCiAJJChRKWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaCBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUvYXNtLXNoOyBmaQotCSQoUSlpZiBbIC1kICQoaW5jZGlyLXByZWZpeCkkKGluY2Rpci15KSBdOyB0aGVuIFwKLQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gvJChpbmNkaXIteSknOyBcCi0JCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIFwKKwkkKFEpcm0gLWYgaW5jbHVkZS9hc20tc2gvbWFjaAorCSQoUSlmb3IgaSBpbiAkKGluY2Rpci15KTsgZG8gXAorCWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQkaSBdOyB0aGVuIFwKKwkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQllY2hvIC1lICJpbmNsdWRlL2FzbS1zaC8kJGkiOyBcCisJCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQkaSBcCiAJCQlpbmNsdWRlL2FzbS1zaC9tYWNoOyBcCiAJZWxzZSBcCi0JCWVjaG8gLWUgJ2luY2x1ZGUvYXNtLXNoJzsgXAotCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAotCWZpCisJCWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaC9tYWNoIF07IHRoZW4gXAorCQkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gnOyBcCisJCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAorCQlmaTsgXAorCWZpOyBcCisJZG9uZQogCUB0b3VjaCAkQAogCiBhcmNocHJlcGFyZTogaW5jbHVkZS9hc20tc2gvLmNwdSBpbmNsdWRlL2FzbS1zaC8ubWFjaCBtYWtldG9vbHMKQEAgLTE4OCw3ICsxOTgsOSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oIFwKKwkgICAgICAgaW5jbHVkZS9hc20tc2gvY3B1IGluY2x1ZGUvYXNtLXNoLy5jcHUgXAorCSAgICAgICBpbmNsdWRlL2FzbS1zaC9tYWNoIGluY2x1ZGUvYXNtLXNoLy5tYWNoCiAKIGRlZmluZSBhcmNoaGVscAogCUBlY2hvICcqIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCBmMTMwMTdlLi44Nzk5ZGY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwpAQCAtNjAsNyArNjAsNyBAQAogI2VuZGlmCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9kcmVhbWNhc3QgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2RyZWFtY2FzdCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU2VnYSBEcmVhbWNhc3QiLAogCS5tdl9zZXR1cAkJPSBkcmVhbWNhc3Rfc2V0dXAsCiAJLm12X2lycV9kZW11eAkJPSBzeXN0ZW1hc2ljX2lycV9kZW11eCwKQEAgLTcwLDQgKzcwLDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gZHJlYW1jYXN0X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKGRyZWFtY2FzdCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkYmJhOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBNYWNoaW5lIHZlY3RvciBmb3IgdGhlIEhQNjgwCi0gKi8KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2eHggX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCi0KLQkubXZfaW5iID0gaGQ2NDQ2MV9pbmIsCi0JLm12X2ludyA9IGhkNjQ0NjFfaW53LAotCS5tdl9pbmwgPSBoZDY0NDYxX2lubCwKLQkubXZfb3V0YiA9IGhkNjQ0NjFfb3V0YiwKLQkubXZfb3V0dyA9IGhkNjQ0NjFfb3V0dywKLQkubXZfb3V0bCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbmJfcCA9IGhkNjQ0NjFfaW5iX3AsCi0JLm12X2lud19wID0gaGQ2NDQ2MV9pbncsCi0JLm12X2lubF9wID0gaGQ2NDQ2MV9pbmwsCi0JLm12X291dGJfcCA9IGhkNjQ0NjFfb3V0Yl9wLAotCS5tdl9vdXR3X3AgPSBoZDY0NDYxX291dHcsCi0JLm12X291dGxfcCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbnNiID0gaGQ2NDQ2MV9pbnNiLAotCS5tdl9pbnN3ID0gaGQ2NDQ2MV9pbnN3LAotCS5tdl9pbnNsID0gaGQ2NDQ2MV9pbnNsLAotCS5tdl9vdXRzYiA9IGhkNjQ0NjFfb3V0c2IsCi0JLm12X291dHN3ID0gaGQ2NDQ2MV9vdXRzdywKLQkubXZfb3V0c2wgPSBoZDY0NDYxX291dHNsLAotCi0JLm12X3JlYWR3ID0gaGQ2NDQ2MV9yZWFkdywKLQkubXZfd3JpdGV3ID0gaGQ2NDQ2MV93cml0ZXcsCi0KLQkubXZfaXJxX2RlbXV4ID0gaGQ2NDQ2MV9pcnFfZGVtdXgsCi19OwotCi1BTElBU19NVihocDZ4eCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCmluZGV4IDZhZWVlODUuLjdhZTcwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYwpAQCAtOTgsMTAgKzk4LDkgQEAKIH0KIGRldmljZV9pbml0Y2FsbChocDZ4eF9kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hwNnh4IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDZ4eCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9ICJocDZ4eCIsCiAJLm12X3NldHVwID0gaHA2eHhfc2V0dXAsCiAJLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCiAJLm12X2lycV9kZW11eCA9IGhkNjQ0NjFfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jCmluZGV4IGY5NTNjNzQuLmVkYTcxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMKQEAgLTk3LDEwICs5Nyw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIkxBTkRJU0siLAogCS5tdl9ucl9pcnFzID0gNzIsCiAJLm12X3NldHVwID0gbGFuZGlza19zZXR1cCwKIAkubXZfaW5pdF9pcnEgPSBpbml0X2xhbmRpc2tfSVJRLAogfTsKLUFMSUFTX01WKGxhbmRpc2spCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMKaW5kZXggNGUyMGY3Yy4uOWM4MzBmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbGJveHJlMi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xib3hyZTIvc2V0dXAuYwpAQCAtNzcsOSArNzcsOCBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiTC1CT1ggUkUyIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9sYm94cmUyX0lSUSwKIH07Ci1BTElBU19NVihsYm94cmUyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCmluZGV4IDFhMDYwNGIuLjhjZTAzZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKQEAgLTMzOCwxMSArMzM4LDEwIEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJJbnRlcmZhY2UgTVBDLTEyMTEoQ1RQL1BDSS9NUEMtU0gwMikiLAogCS5tdl9zZXR1cAkJPSBtcGMxMjExX3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCiB9OwotQUxJQVNfTVYobXBjMTIxMSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9zZXR1cC5jCmluZGV4IGVjNWJlMDEuLmYwNzZjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYwpAQCAtMjEsNyArMjEsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZWRvc2s3NzA1IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lZG9zazc3MDUgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkVET1NLNzcwNSIsCiAJLm12X25yX2lycXMJCT0gODAsCiAKQEAgLTQxLDQgKzQxLDMgQEAKIAkubXZfaXNhX3BvcnQyYWRkcgk9IHNoX2Vkb3NrNzcwNV9pc2FfcG9ydDJhZGRyLAogCS5tdl9pbml0X2lycQkJPSBzaF9lZG9zazc3MDVfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoZWRvc2s3NzA1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCmluZGV4IGY3ZDBlMzAuLmZhNWZhMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgSFM3NzUxUlZvSVAtMiBzdXBwb3J0LlxuIik7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oczc3NTFydm9pcCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHM3NzUxcnZvaXAgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkhTNzc1MVJWb0lQIiwKIAkubXZfc2V0dXAJCT0gaHM3NzUxcnZvaXBfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xMTgsNCArMTE4LDMgQEAKIAkubXZfaW5pdF9pcnEJCT0gaHM3NzUxcnZvaXBfaW5pdF9pcnEsCiAJLm12X2lvcG9ydF9tYXAJCT0gaHM3NzUxcnZvaXBfaW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihoczc3NTFydm9pcCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKaW5kZXggOWZiMTE2NC4uZmM4ZjI4ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnCkBAIC02LDE4ICs2LDE4IEBACiAKIGNvbmZpZyBTSF9SNzc4MFJQCiAJYm9vbCAiUjc3ODBSUC0xIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4MAorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCiAKIGNvbmZpZyBTSF9SNzc4ME1QCiAJYm9vbCAiUjc3ODBNUCBib2FyZCBzdXBwb3J0IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODAKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc4MAogCWhlbHAKIAkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgbWFzcy1wcm9kdWN0aW9uCiAJICB2ZXJzaW9uIG9mIHRoZSBSNzc4MFJQLiBJZiBpbiBkb3VidCwgc2F5IFkuCiAKIGNvbmZpZyBTSF9SNzc4NVJQCiAJYm9vbCAiUjc3ODVSUCBib2FyZCBzdXBwb3J0IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc4NQogCiBlbmRjaG9pY2UKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwppbmRleCAwNzI3ZWY5Li41YWZiODY0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwpAQCAtMTY2LDEwICsxNjYsOSBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaGlnaGxhbmRlciBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaGlnaGxhbmRlciBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiSGlnaGxhbmRlciIsCiAJLm12X25yX2lycXMJCT0gMTA5LAogCS5tdl9zZXR1cAkJPSBoaWdobGFuZGVyX3NldHVwLAogCS5tdl9pbml0X2lycQkJPSBoaWdobGFuZGVyX2luaXRfaXJxLAogfTsKLUFMSUFTX01WKGhpZ2hsYW5kZXIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCmluZGV4IDU5M2YyNmEuLjY1NmZkYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3J0czc3NTFyMmQgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3J0czc3NTFyMmQgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlJUUzc3NTFSMkQiLAogCS5tdl9zZXR1cAkJPSBydHM3NzUxcjJkX3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDcyLApAQCAtMTg5LDQgKzE4OSwzIEBACiAJLm12X2NvbnNpc3RlbnRfZnJlZQk9IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUsCiAjZW5kaWYKIH07Ci1BTElBU19NVihydHM3NzUxcjJkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKaW5kZXggMTgwODEwYi4uMmRjZThiZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCkBAIC04OCw5ICs4OCw4IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDc3MTB2b2lwZ3cgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNzcxMHZvaXBndyBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU0g3NzEwIFZvSVAgR2F0ZXdheSIsCiAJLm12X25yX2lycXMJCT0gMTA0LAogCS5tdl9pbml0X2lycQkJPSBzaDc3MTB2b2lwZ3dfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoc2g3NzEwdm9pcGd3KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvc2V0dXAuYwppbmRleCA5MzYxMTc2Li5lZTc4YWY4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvc2V0dXAuYwpAQCAtMjgsNyArMjgsNyBAQAogCW1ha2Vfc3lzdGVtaF9pcnEoMHhiKTsJLyogRXRoZXJuZXQgaW50ZXJydXB0ICovCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc3lzdGVtaCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzc1MXN5c3RlbWggX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIjc3NTEgU3lzdGVtSCIsCiAJLm12X25yX2lycXMJCT0gNzIsCiAKQEAgLTU1LDQgKzU1LDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBzaDc3NTFzeXN0ZW1oX2luaXRfaXJxLAogfTsKLUFMSUFTX01WKDc3NTFzeXN0ZW1oKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWEzMDQyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIFNlZ2EgU2F0dXJuIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwotCi1vYmotJChDT05GSUdfU01QKSArPSBzbXAubwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU0ZjdmLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvYm9hcmRzL3NhdHVybi9pby5jCi0gKgotICogSS9PIHJvdXRpbmVzIGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGFzbS9zYXR1cm4vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotCi11bnNpZ25lZCBsb25nIHNhdHVybl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLXZvaWQgKnNhdHVybl9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuICh2b2lkICopb2Zmc2V0OwotfQotCi12b2lkIHNhdHVybl9pb3VubWFwKHZvaWQgKmFkZHIpCi17Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkMWQzZi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvYm9hcmRzL3NhdHVybi9pcnEuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0vKgotICogSW50ZXJydXB0cyBtYXAgb3V0IGFzIGZvbGxvd3M6Ci0gKgotICogIFZlY3RvcglOYW1lCQlNYXNrCi0gKgotICogCTY0CVZCTEFOS0lOCTB4MDAwMQotICogCTY1CVZCTEFOS09VVAkweDAwMDIKLSAqCTY2CUhCTEFOS0lOCTB4MDAwNAotICoJNjcJVElNRVIwCQkweDAwMDgKLSAqCTY4CVRJTUVSMQkJMHgwMDEwCi0gKgk2OQlEU1BFTkQJCTB4MDAyMAotICoJNzAJU09VTkRSRVFVRVNUCTB4MDA0MAotICoJNzEJU1lTVEVNTUFOQUdFUgkweDAwODAKLSAqCTcyCVBBRAkJMHgwMTAwCi0gKgk3MwlMRVZFTDJETUFFTkQJMHgwMjAwCi0gKgk3NAlMRVZFTDFETUFFTkQJMHgwNDAwCi0gKgk3NQlMRVZFTDBETUFFTkQJMHgwODAwCi0gKgk3NglETUFJTExFR0FMCTB4MTAwMAotICoJNzcJU1JJVEVEUkFXRU5ECTB4MjAwMAotICoJNzgJQUJVUwkJMHg4MDAwCi0gKgotICovCi0jZGVmaW5lIFNBVFVSTl9JUlFfTUlOCQk2NAkvKiBWQkxBTktJTiAqLwotI2RlZmluZSBTQVRVUk5fSVJRX01BWAkJNzgJLyogQUJVUyAqLwotCi0jZGVmaW5lIFNBVFVSTl9JUlFfTUFTSwkJMHhiZmZmCi0KLXN0YXRpYyBpbmxpbmUgdTMyIHNhdHVybl9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXUzMiBtYXNrOwotCi0JbWFzayA9ICgxIDw8IChpcnFfbnIgLSBTQVRVUk5fSVJRX01JTikpOwotCW1hc2sgPDw9IChpcnFfbnIgPT0gU0FUVVJOX0lSUV9NQVgpOwotCW1hc2sgJj0gU0FUVVJOX0lSUV9NQVNLOwotCi0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1MzIgbWFzazsKLQotCW1hc2sgPSBjdHJsX2lubChTQVRVUk5fSU1SKTsKLQltYXNrIHw9IHNhdHVybl9pcnFfbWFzayhpcnFfbnIpOwotCWN0cmxfb3V0bChtYXNrLCBTQVRVUk5fSU1SKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVubWFza19zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdTMyIG1hc2s7Ci0KLQltYXNrID0gY3RybF9pbmwoU0FUVVJOX0lNUik7Ci0JbWFzayAmPSB+c2F0dXJuX2lycV9tYXNrKGlycV9ucik7Ci0JY3RybF9vdXRsKG1hc2ssIFNBVFVSTl9JTVIpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQltYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1bm1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCW1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCWlmICghKGlycV9kZXNjW2lycV9ucl0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpCi0JCXVubWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdW5tYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JbWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgc2F0dXJuX2ludCA9IHsKLQkudHlwZW5hbWUJPSAiU2F0dXJuIiwKLQkuZW5hYmxlCQk9IGVuYWJsZV9zYXR1cm5faXJxLAotCS5kaXNhYmxlCT0gZGlzYWJsZV9zYXR1cm5faXJxLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX3NhdHVybl9pcnEsCi0JLmVuZAkJPSBlbmRfc2F0dXJuX2lycSwKLQkuc3RhcnR1cAk9IHN0YXJ0dXBfc2F0dXJuX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9zYXR1cm5faXJxLAotfTsKLQotaW50IHNhdHVybl9pcnFfZGVtdXgoaW50IGlycV9ucikKLXsKLQkvKiBGSVhNRSAqLwotCXJldHVybiBpcnFfbnI7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTM3YzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAKLSAqIGFyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jCi0gKgotICogSGFyZHdhcmUgc3VwcG9ydCBmb3IgdGhlIFNlZ2EgU2F0dXJuLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pby5oPgotCi1leHRlcm4gaW50IHNhdHVybl9pcnFfZGVtdXgoaW50IGlycV9ucik7Ci0KLS8qCi0gKiBUaGUgTWFjaGluZSBWZWN0b3IKLSAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NhdHVybiBfX2luaXRtdiA9IHsKLQkubXZfbmFtZQkJPSAiU2VnYSBTYXR1cm4iLAotCS5tdl9ucl9pcnFzCQk9IDgwLAkvKiBGaXggdGhpcyBsYXRlciAqLwotCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBzYXR1cm5faXNhX3BvcnQyYWRkciwKLQkubXZfaXJxX2RlbXV4CQk9IHNhdHVybl9pcnFfZGVtdXgsCi0KLQkubXZfaW9yZW1hcAkJPSBzYXR1cm5faW9yZW1hcCwKLQkubXZfaW91bm1hcAkJPSBzYXR1cm5faW91bm1hcCwKLX07Ci1BTElBU19NVihzYXR1cm4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc21wLmMgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDYwOTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogCi0gKiBhcmNoL3NoL2JvYXJkcy9zYXR1cm4vc21wLmMKLSAqCi0gKiBTTVAgc3VwcG9ydCBmb3IgdGhlIFNlZ2EgU2F0dXJuLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2F0dXJuL3NtcGMuaD4KLQotZXh0ZXJuIHZvaWQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQpOwotCi12b2lkIF9fc21wX3NlbmRfaXBpKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCi17Ci0JLyogTm90aGluZyBoZXJlIHlldCAuLiAqLwotfQotCi11bnNpZ25lZCBpbnQgX19zbXBfcHJvYmVfY3B1cyh2b2lkKQotewotCS8qCi0JICogVGhpcyBpcyBqdXN0IGEgc3RyYWlnaHRmb3J3YXJkIG1hc3Rlci9zbGF2ZSBjb25maWd1cmF0aW9uLAotCSAqIGFuZCBwcm9iaW5nIGlzbid0IHJlYWxseSBzdXBwb3J0ZWQuLgotCSAqLwotCXJldHVybiAyOwotfQotCi0vKgotICogV2UncmUgb25seSBhbGxvd2VkIHRvIGRvIGJ5dGUtYWNjZXNzIHRvIFNNUEMgcmVnaXN0ZXJzLiBJbgotICogYWRkaXRpb24gdG8gd2hpY2gsIHdlIHRyZWF0IHRoZW0gYXMgd3JpdGUtb25seSwgc2luY2UKLSAqIHJlYWRpbmcgZnJvbSB0aGVtIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBkYXRhLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wY19zbGF2ZV9zdG9wKHVuc2lnbmVkIGludCBjcHUpCi17Ci0Jc21wY19iYXJyaWVyKCk7Ci0JY3RybF9vdXRiKDEsIFNNUENfU1RBVFVTKTsKLQotCWN0cmxfb3V0YihTTVBDX0NNRF9TU0hPRkYsIFNNUENfQ09NTUFORCk7Ci0Jc21wY19iYXJyaWVyKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXBjX3NsYXZlX3N0YXJ0KHVuc2lnbmVkIGludCBjcHUpCi17Ci0JY3RybF9vdXRiKDEsIFNNUENfU1RBVFVTKTsKLQljdHJsX291dGIoU01QQ19DTURfU1NIT04sIFNNUENfQ09NTUFORCk7Ci0KLQlzbXBjX2JhcnJpZXIoKTsKLX0KLQotdm9pZCBfX3NtcF9zbGF2ZV9pbml0KHVuc2lnbmVkIGludCBjcHUpCi17Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB2YnI7Ci0Jdm9pZCAqKmVudHJ5OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGMgdmJyLCAlMFxuXHQiIDogIj1yIiAodmJyKSk7Ci0JZW50cnkgPSAodm9pZCAqKikodmJyICsgMHgzMTAgKyAweDk0KTsKLQotCXNtcGNfc2xhdmVfc3RvcChjcHUpOwotCi0JKih2b2lkICoqKWVudHJ5ID0gKHZvaWQgKilzdGFydF9zZWNvbmRhcnk7Ci0KLQlzbXBjX3NsYXZlX3N0YXJ0KGNwdSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYwppbmRleCBjYTcxNDg3Li5hMDc0YjYyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCkBAIC03MCw3ICs3MCw3IEBACiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTb2x1dGlvbkVuZ2luZSIsCiAJLm12X25yX2lycXMJCT0gMjU2LAogCS5tdl9pbmIJCQk9IHNlNzIwNl9pbmIsCkBAIC05Niw0ICs5NiwzIEBACiAKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zZTcyMDZfSVJRLAogfTsKLUFMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCmluZGV4IGYxOTYwOTUuLmViNDY5ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMDBzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzMwMHNlIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczMDAiLAogCS5tdl9ucl9pcnFzID0gMTA5LAogCS5tdl9pbmIgPSBzaDczMDBzZV9pbmIsCkBAIC03Miw0ICs3MiwzIEBACiAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczMDBzZV9JUlEsCiB9OwotQUxJQVNfTVYoNzMwMHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKaW5kZXggZTE0MzAxNy4uMWRlZWU4NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCkBAIC00Niw3ICs0Niw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzE4MHNlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzE4MHNlIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczMTgwIiwKIAkubXZfbnJfaXJxcyA9IDEwOCwKIAkubXZfaW5iID0gc2g3MzE4MHNlX2luYiwKQEAgLTczLDQgKzczLDMgQEAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczMTgwc2VfSVJRLAogCS5tdl9pcnFfZGVtdXggPSBzaG1zZV9pcnFfZGVtdXgsCiB9OwotQUxJQVNfTVYoNzMxODBzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYwppbmRleCAzZmRiMTZmLi44ZmVjMTU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCkBAIC02NCw3ICs2NCw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzQzc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczNDNzZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9ICJTb2x1dGlvbkVuZ2luZSA3MzQzIiwKIAkubXZfc2V0dXAgPSBzaDczNDNzZV9zZXR1cCwKIAkubXZfbnJfaXJxcyA9IDEwOCwKQEAgLTkyLDQgKzkyLDMgQEAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczNDNzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKIH07Ci1BTElBU19NVig3MzQzc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMKaW5kZXggNTJkMmM0ZC4uMWQwZWY3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYwpAQCAtMTUsOCArMTUsNyBAQAogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAogCS5tdl9ucl9pcnFzCQk9IDEwOCwKIH07Ci1BTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCmluZGV4IGM4ZWNjZmYuLmNkYjA4MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYwpAQCAtMTUsNDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2UuaD4KIAotLyogCi0gKiBJZiB0aGUgcHJvYmxlbSBvZiBtYWtlX2lwcl9pcnEgaXMgc29sdmVkLCAKLSAqIHRoaXMgY29kZSB3aWxsIGJlY29tZSB1bm5lY2Vzc2FyeS4gOi0pIAotICovCi1zdGF0aWMgdm9pZCBzZTc3MHhfZGlzYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQotCWN0cmxfb3V0dyhjdHJsX2ludyhwLT5hZGRyKSAmICgweGZmZmYgXiAoMHhmIDw8IHAtPnNoaWZ0KSksIHAtPmFkZHIpOwotfQotCi1zdGF0aWMgdm9pZCBzZTc3MHhfZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpIHwgKHAtPnByaW9yaXR5IDw8IHAtPnNoaWZ0KSwgcC0+YWRkcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc2U3NzB4X2lycV9jaGlwID0gewotCS5uYW1lICAgICAgICAgICA9ICJNUzc3MHhTRS1GUEdBIiwKLQkubWFzayAgICAgICAgICAgPSBzZTc3MHhfZGlzYWJsZV9pcHJfaXJxLAotCS51bm1hc2sgICAgICAgICA9IHNlNzcweF9lbmFibGVfaXByX2lycSwKLQkubWFza19hY2sgICAgICAgPSBzZTc3MHhfZGlzYWJsZV9pcHJfaXJxLAotfTsKLQotdm9pZCBtYWtlX3NlNzcweF9pcnEoc3RydWN0IGlwcl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBpcnEgPSB0YWJsZVtpXS5pcnE7Ci0JCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZzZTc3MHhfaXJxX2NoaXAsCi0JCQloYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKLQkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCAmdGFibGVbaV0pOwotCQlzZTc3MHhfZW5hYmxlX2lwcl9pcnEoaXJxKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3NzB4X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qCiAJKiBTdXBlciBJL08gKEp1c3QgbWltaWMgUEMpOgogCSogIDE6IGtleWJvYXJkCkBAIC02OCw0NiArMjksNjcgQEAKIAkqLwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKIAkvKiBUaGlzIGlzIGRlZmF1bHQgdmFsdWUgKi8KLQl7IDEzLCAwLCA4LCAgMHgwZi0xMyAsQkNSX0lMQ1JBfSwKLQl7IDUgLCAwLCA0LCAgMHgwZi0gNSAsQkNSX0lMQ1JBfSwKLQl7IDEwLCAwLCAwLCAgMHgwZi0xMCwgQkNSX0lMQ1JCfSwKLQl7IDcgLCAwLCA0LCAgMHgwZi0gNywgQkNSX0lMQ1JDfSwKLQl7IDMgLCAwLCAwLCAgMHgwZi0gMywgQkNSX0lMQ1JDfSwKLQl7IDEgLCAwLCAxMiwgMHgwZi0gMSwgQkNSX0lMQ1JEfSwKLQl7IDEyLCAwLCA0LCAgMHgwZi0xMiwgQkNSX0lMQ1JEfSwgLyogTEFOICovCi0JeyAyICwgMCwgOCwgIDB4MGYtIDIsIEJDUl9JTENSRX0sIC8qIFBDSVJRMiAqLwotCXsgNiAsIDAsIDQsICAweDBmLSA2LCBCQ1JfSUxDUkV9LCAvKiBQQ0lSUTEgKi8KLQl7IDE0LCAwLCAwLCAgMHgwZi0xNCwgQkNSX0lMQ1JFfSwgLyogUENJUlEwICovCi0JeyAwICwgMCwgMTIsIDB4MGYgICAsIEJDUl9JTENSRn0sIAotCXsgNCAsIDAsIDQsICAweDBmLSA0LCBCQ1JfSUxDUkZ9LAotCXsgOCAsIDAsIDEyLCAweDBmLSA4LCBCQ1JfSUxDUkd9LAotCXsgOSAsIDAsIDgsICAweDBmLSA5LCBCQ1JfSUxDUkd9LAotCXsgMTEsIDAsIDQsICAweDBmLTExLCBCQ1JfSUxDUkd9LAorCXsgMTMsIDAsIDgsICAweDBmLTEzLCB9LAorCXsgNSAsIDAsIDQsICAweDBmLSA1LCB9LAorCXsgMTAsIDEsIDAsICAweDBmLTEwLCB9LAorCXsgNyAsIDIsIDQsICAweDBmLSA3LCB9LAorCXsgMyAsIDIsIDAsICAweDBmLSAzLCB9LAorCXsgMSAsIDMsIDEyLCAweDBmLSAxLCB9LAorCXsgMTIsIDMsIDQsICAweDBmLTEyLCB9LCAvKiBMQU4gKi8KKwl7IDIgLCA0LCA4LCAgMHgwZi0gMiwgfSwgLyogUENJUlEyICovCisJeyA2ICwgNCwgNCwgIDB4MGYtIDYsIH0sIC8qIFBDSVJRMSAqLworCXsgMTQsIDQsIDAsICAweDBmLTE0LCB9LCAvKiBQQ0lSUTAgKi8KKwl7IDAgLCA1LCAxMiwgMHgwZiAgICwgfSwgCisJeyA0ICwgNSwgNCwgIDB4MGYtIDQsIH0sCisJeyA4ICwgNiwgMTIsIDB4MGYtIDgsIH0sCisJeyA5ICwgNiwgOCwgIDB4MGYtIDksIH0sCisJeyAxMSwgNiwgNCwgIDB4MGYtMTEsIH0sCiAjZWxzZQotCXsgMTQsIDAsICA4LCAweDBmLTE0ICxCQ1JfSUxDUkF9LAotCXsgMTIsIDAsICA0LCAweDBmLTEyICxCQ1JfSUxDUkF9LAotCXsgIDgsIDAsICA0LCAweDBmLSA4ICxCQ1JfSUxDUkJ9LAotCXsgIDYsIDAsIDEyLCAweDBmLSA2ICxCQ1JfSUxDUkN9LAotCXsgIDUsIDAsICA4LCAweDBmLSA1ICxCQ1JfSUxDUkN9LAotCXsgIDQsIDAsICA0LCAweDBmLSA0ICxCQ1JfSUxDUkN9LAotCXsgIDMsIDAsICAwLCAweDBmLSAzICxCQ1JfSUxDUkN9LAotCXsgIDEsIDAsIDEyLCAweDBmLSAxICxCQ1JfSUxDUkR9LAorCXsgMTQsIDAsICA4LCAweDBmLTE0LCB9LAorCXsgMTIsIDAsICA0LCAweDBmLTEyLCB9LAorCXsgIDgsIDEsICA0LCAweDBmLSA4LCB9LAorCXsgIDYsIDIsIDEyLCAweDBmLSA2LCB9LAorCXsgIDUsIDIsICA4LCAweDBmLSA1LCB9LAorCXsgIDQsIDIsICA0LCAweDBmLSA0LCB9LAorCXsgIDMsIDIsICAwLCAweDBmLSAzLCB9LAorCXsgIDEsIDMsIDEyLCAweDBmLSAxLCB9LAogI2lmIGRlZmluZWQoQ09ORklHX1NUTklDKQogCS8qIFNUIE5JQyAqLwotCXsgMTAsIDAsICA0LCAweDBmLTEwICxCQ1JfSUxDUkR9LCAJLyogTEFOICovCisJeyAxMCwgMywgIDQsIDB4MGYtMTAsIH0sIAkvKiBMQU4gKi8KICNlbmRpZgogCS8qIE1SU0hQQyBJUlFzIHNldHRpbmcgKi8KLQl7ICAwLCAwLCAxMiwgMHgwZi0gMCAsQkNSX0lMQ1JFfSwJLyogUENJUlEzICovCi0JeyAxMSwgMCwgIDgsIDB4MGYtMTEgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTIgKi8KLQl7ICA5LCAwLCAgNCwgMHgwZi0gOSAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMSAqLwotCXsgIDcsIDAsICAwLCAweDBmLSA3ICxCQ1JfSUxDUkV9LCAJLyogUENJUlEwICovCisJeyAgMCwgNCwgMTIsIDB4MGYtIDAsIH0sCS8qIFBDSVJRMyAqLworCXsgMTEsIDQsICA4LCAweDBmLTExLCB9LCAJLyogUENJUlEyICovCisJeyAgOSwgNCwgIDQsIDB4MGYtIDksIH0sIAkvKiBQQ0lSUTEgKi8KKwl7ICA3LCA0LCAgMCwgMHgwZi0gNywgfSwgCS8qIFBDSVJRMCAqLwogCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwogCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgMCwgIDQsIDB4MGYtMTMgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMiAqLwotCXsgIDIsIDAsICAwLCAweDBmLSAyICxCQ1JfSUxDUkd9LCAJLyogU0xPVElSUTEgKi8KKwl7IDEzLCA2LCAgNCwgMHgwZi0xMywgfSwgCS8qIFNMT1RJUlEyICovCisJeyAgMiwgNiwgIDAsIDB4MGYtIDIsIH0sIAkvKiBTTE9USVJRMSAqLwogI2VuZGlmCiB9OwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCUJDUl9JTENSQSwKKwlCQ1JfSUxDUkIsCisJQkNSX0lMQ1JDLAorCUJDUl9JTENSRCwKKwlCQ1JfSUxDUkUsCisJQkNSX0lMQ1JGLAorCUJDUl9JTENSRywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNlNzcweCIsCisJfSwKK307CisKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCiAgKi8KQEAgLTEyMiw1ICsxMDQsNSBAQAogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkYpOwogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkcpOwogCi0JbWFrZV9zZTc3MHhfaXJxKHNlNzcweF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzcweF9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKaW5kZXggMTdhMjYzMS4uMjk2MmRhMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNvbHV0aW9uRW5naW5lIiwKIAkubXZfc2V0dXAJCT0gc21zY19zZXR1cCwKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQpAQCAtMTYwLDQgKzE2MCwzIEBACiAKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zZV9JUlEsCiB9OwotQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9pcnEuYwppbmRleCAwOTllNWRlLi4yNmNmZjBlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMKQEAgLTE5LDE1ICsxOSwyNCBAQAogI2RlZmluZSBJTlRDX0lOVE1TSzAgICAgICAgICAgICAgMHhGRkQwMDA0NAogI2RlZmluZSBJTlRDX0lOVE1TS0NMUjAgICAgICAgICAgMHhGRkQwMDA2NAogCitzdHJ1Y3Qgc2U3NzIyX2RhdGEgeworCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgaXByX2lkeDsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0OworCXVuc2lnbmVkIHNob3J0IHByaW9yaXR5OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKK307CisKKwogc3RhdGljIHZvaWQgZGlzYWJsZV9zZTc3MjJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc2U3NzIyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWN0cmxfb3V0dyggY3RybF9pbncoIHAtPmFkZHIgKSB8IHAtPnByaW9yaXR5ICwgcC0+YWRkciApOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfc2U3NzIyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHNlNzcyMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAljdHJsX291dHcoIGN0cmxfaW53KCBwLT5hZGRyICkgJiB+cC0+cHJpb3JpdHkgLCBwLT5hZGRyICk7CiB9CiAKQEAgLTM4LDcgKzQ3LDcgQEAKIAkubWFza19hY2sgICAgICAgPSBkaXNhYmxlX3NlNzcyMl9pcnEsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2U3NzIyX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIGlycSAgICAgICAgLGlkeCxzZnQsIHByaW9yaXR5ICAgICAsIGFkZHIgICAqLwogCXsgTVJTSFBDX0lSUTAgLCAwICwgMCAsIE1SU0hQQ19CSVQwICwgSVJRMDFfTUFTSyB9ICwKIAl7IE1SU0hQQ19JUlExICwgMCAsIDAgLCBNUlNIUENfQklUMSAsIElSUTAxX01BU0sgfSAsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL3NldHVwLmMKaW5kZXggNjM2Y2E2Yy4uNmNjYTZjYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZTc3MjIgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzcyMiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSAgICAgICAgICAgICAgICA9ICJTb2x1dGlvbiBFbmdpbmUgNzcyMiIgLAogCS5tdl9zZXR1cCAgICAgICAgICAgICAgID0gc2U3NzIyX3NldHVwICwKIAkubXZfbnJfaXJxcwkJPSAxMDkgLApAQCAtMTQ1LDQgKzE0NSwzIEBACiAJLm12X2lycV9kZW11eCAgICAgICAgICAgPSBzZTc3MjJfaXJxX2RlbXV4LAogCiB9OwotQUxJQVNfTVYoc2U3NzIyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKaW5kZXggZTRjNjNhNC4uYzNkMTI1OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCkBAIC0xNCw0NCArMTQsMzEgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NlNzc1MS5oPgogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzc1MV9pcHJfbWFwW10gPSB7Ci0gIC8qIExlYXZlIG9sZCBTb2x1dGlvbiBFbmdpbmUgY29kZSBpbiBmb3IgcmVmZXJlbmNlLiAqLwotI2lmIGRlZmluZWQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkKLQkvKgotCSAqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6Ci0JICogIDE6IGtleWJvYXJkCi0JICogIDM6IHNlcmlhbCAwCi0JICogIDQ6IHNlcmlhbCAxCi0JICogIDU6IHByaW50ZXIKLQkgKiAgNjogZmxvcHB5Ci0JICogIDg6IHJ0YwotCSAqIDEyOiBtb3VzZQotCSAqIDE0OiBpZGUwCi0JICovCi0JeyAxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0IH0sCi0JeyAxMiwgQkNSX0lMQ1JBLCAxLCAweDBmLTEyIH0sCi0JeyAgOCwgQkNSX0lMQ1JCLCAxLCAweDBmLSA4IH0sCi0JeyAgNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2IH0sCi0JeyAgNSwgQkNSX0lMQ1JDLCAyLCAweDBmLSA1IH0sCi0JeyAgNCwgQkNSX0lMQ1JDLCAxLCAweDBmLSA0IH0sCi0JeyAgMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzIH0sCi0JeyAgMSwgQkNSX0lMQ1JELCAzLCAweDBmLSAxIH0sCi0KLQl7IDEwLCBCQ1JfSUxDUkQsIDEsIDB4MGYtMTAgfSwgLyogTEFOICovCi0KLQl7ICAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDAgfSwgLyogUENJUlEzICovCi0JeyAxMSwgQkNSX0lMQ1JFLCAyLCAweDBmLTExIH0sIC8qIFBDSVJRMiAqLwotCXsgIDksIEJDUl9JTENSRSwgMSwgMHgwZi0gOSB9LCAvKiBQQ0lSUTEgKi8KLQl7ICA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcgfSwgLyogUENJUlEwICovCi0KLQkvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KLQkvKiBOT1RFOiAjMiBhbmQgIzEzIGFyZSBub3QgdXNlZCBvbiBQQyAqLwotCXsgMTMsIEJDUl9JTENSRywgMSwgMHgwZi0xMyB9LCAvKiBTTE9USVJRMiAqLwotCXsgIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMiB9LCAvKiBTTE9USVJRMSAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCi0JeyAxMywgQkNSX0lMQ1JELCAzLCAyIH0sCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKKwl7IDEzLCAzLCAzLCAyIH0sCiAJLyogQWRkIGFkZGl0aW9uYWwgZW50cmllcyBoZXJlIGFzIGRyaXZlcnMgYXJlIGFkZGVkIGFuZCB0ZXN0ZWQuICovCi0jZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJQkNSX0lMQ1JBLAorCUJDUl9JTENSQiwKKwlCQ1JfSUxDUkMsCisJQkNSX0lMQ1JELAorCUJDUl9JTENSRSwKKwlCQ1JfSUxDUkYsCisJQkNSX0lMQ1JHLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zZTc3NTEiLAorCX0sCiB9OwogCiAvKgpAQCAtNTksNSArNDYsNSBAQAogICovCiB2b2lkIF9faW5pdCBpbml0Xzc3NTFzZV9JUlEodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2U3NzUxX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzUxX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYwppbmRleCA1MmM3YmZhLi43ODczZDA3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCkBAIC00OCw3ICs0OCw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiNzc1MSBTb2x1dGlvbkVuZ2luZSIsCiAJLm12X25yX2lycXMJCT0gNzIsCiAKQEAgLTcxLDQgKzcxLDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0Xzc3NTFzZV9JUlEsCiB9OwotQUxJQVNfTVYoNzc1MXNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvaXJxLmMKaW5kZXggM2QwNjI1Yy4uODc0OTE0NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jCkBAIC0xNiwyOCArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZTc3ODAuaD4KIAotI2RlZmluZSBJTlRDX0lOVE1TSzAgICAgICAgICAgICAgMHhGRkQwMDA0NAotI2RlZmluZSBJTlRDX0lOVE1TS0NMUjAgICAgICAgICAgMHhGRkQwMDA2NAotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX3NlNzc4MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDX0lOVE1TSzAgKyBwLT5tc2tfb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX3NlNzc4MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDX0lOVE1TS0NMUjAgKyBwLT5tc2tfb2Zmc2V0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzZTc3ODBfaXJxX2NoaXAgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiU0U3NzgwIiwKLQkubWFzayAgICAgICAgICAgPSBkaXNhYmxlX3NlNzc4MF9pcnEsCi0JLnVubWFzayAgICAgICAgID0gZW5hYmxlX3NlNzc4MF9pcnEsCi0JLm1hc2tfYWNrICAgICAgID0gZGlzYWJsZV9zZTc3ODBfaXJxLAotfTsKLQogc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2lycV90YWJsZVtdID0gewogCXsgMiwgIDAsIDMxLCAwLCAzMSwgMyB9LCAvKiBkYXVnaHRlciBib2FyZCBFWFRJTlQxICovCiAJeyA0LCAgMCwgMzAsIDAsIDMwLCAzIH0sIC8qIGRhdWdodGVyIGJvYXJkIEVYVElOVDIgKi8KQEAgLTUxLDEzICsyOSwyNCBAQAogCXsgMCAsIDAsIDI0LCAwLCAyNCwgMyB9LCAvKiBTTTUwMSAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDAsIC8qIE4vQSAqLworCS5tc2tfYmFzZQk9IDB4ZmZkMDAwNDQsCisJLm1za2Nscl9iYXNlCT0gMHhmZmQwMDA2NCwKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLXNlNzc4MCIsCisJfSwKK307CisKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCiAgKi8KIHZvaWQgX19pbml0IGluaXRfc2U3NzgwX0lSUSh2b2lkKQogewotCWludCBpIDsKLQogCS8qIGVuYWJsZSBhbGwgaW50ZXJydXB0IGF0IEZQR0EgKi8KIAljdHJsX291dHcoMCwgRlBHQV9JTlRNU0sxKTsKIAkvKiBtYXNrIFNNNTAxIGludGVycnVwdCAqLwpAQCAtNzksMTEgKzY4LDUgQEAKIAkvKiBGUEdBICsgMHgwQSAqLwogCWN0cmxfb3V0dygoSVJRUElOX1BDQ1BXIDw8IElSUVBPU19QQ0NQVyksIEZQR0FfSU5UU0VMMyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpOyBpKyspIHsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGludGMyX2lycV90YWJsZVtpXS5pcnEpOwotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZSggaW50YzJfaXJxX3RhYmxlW2ldLmlycSwgJnNlNzc4MF9pcnFfY2hpcCwKLQkJCWhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwotCQlzZXRfaXJxX2NoaXBfZGF0YSggaW50YzJfaXJxX3RhYmxlW2ldLmlycSwgJmludGMyX2lycV90YWJsZVtpXSApOwotCQlkaXNhYmxlX3NlNzc4MF9pcnEoaW50YzJfaXJxX3RhYmxlW2ldLmlycSk7Ci0JfQorCXJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoJmludGMyX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvc2V0dXAuYwppbmRleCBkZjdkMDhhLi43MjNmMmZkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jCkBAIC0xMTMsMTAgKzExMyw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZTc3ODAgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzc4MCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSAgICAgICAgICAgICAgICA9ICJTb2x1dGlvbiBFbmdpbmUgNzc4MCIgLAogCS5tdl9zZXR1cCAgICAgICAgICAgICAgID0gc2U3NzgwX3NldHVwICwKIAkubXZfbnJfaXJxcwkJPSAxMTEgLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlNzc4MF9JUlEsCiB9OwotQUxJQVNfTVYoc2U3NzgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCmluZGV4IGMwNjljNDQuLjljMDMxYTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKQEAgLTE1LDE3ICsxNSwzMyBAQAogI2luY2x1ZGUgPGFzbS9zaDAzL3NoMDMuaD4KICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2gwM19pcHJfbWFwW10gPSB7Ci0JeyBJUkwwX0lSUSwgSVJMMF9JUFJfQUREUiwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZIH0sCi0JeyBJUkwxX0lSUSwgSVJMMV9JUFJfQUREUiwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZIH0sCi0JeyBJUkwyX0lSUSwgSVJMMl9JUFJfQUREUiwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZIH0sCi0JeyBJUkwzX0lSUSwgSVJMM19JUFJfQUREUiwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZIH0sCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKKwl7IElSTDBfSVJRLCAwLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKKwl7IElSTDFfSVJRLCAwLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKKwl7IElSTDJfSVJRLCAwLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKKwl7IElSTDNfSVJRLCAwLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJSU5UQ19JUFJELAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDAzIiwKKwl9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfc2gwM19JUlEodm9pZCkKIHsKIAljdHJsX291dHcoY3RybF9pbncoSU5UQ19JQ1IpIHwgSU5UQ19JQ1JfSVJMTSwgSU5UQ19JQ1IpOwotCW1ha2VfaXByX2lycShzaDAzX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2gwM19pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CiAKIGV4dGVybiB2b2lkICpjZl9pb19iYXNlOwpAQCAtNzQsMTEgKzkwLDEwIEBACiB9CiBfX2luaXRjYWxsKHNoMDNfZGV2aWNlc19zZXR1cCk7CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDAzIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDAzIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJJbnRlcmZhY2UgKENUUC9QQ0ktU0gwMykiLAogCS5tdl9zZXR1cAkJPSBzaDAzX3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pb3BvcnRfbWFwCQk9IHNoMDNfaW9wb3J0X21hcCwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zaDAzX0lSUSwKIH07Ci1BTElBU19NVihzaDAzKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKaW5kZXggNGE5ZGY0YS4uZGZkMTI0NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCkBAIC02LDI4ICs2LDQ0IEBACiAgKiBTSE1JTiBTdXBwb3J0LgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3NobWluLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIFBGQ19QSENSCTB4YTQwMDAxMGVVTAogI2RlZmluZSBJTlRDX0lDUjEJMHhhNDAwMDAxMFVMCiAjZGVmaW5lIElOVENfSVBSQwkweGE0MDAwMDE2VUwKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaG1pbl9pcHJfbWFwW10gPSB7Ci0JeyAuaXJxPTMyLCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gMCwgLnByaW9yaXR5PTAgfSwKLQl7IC5pcnE9MzMsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSA0LCAucHJpb3JpdHk9MCB9LAotCXsgLmlycT0zNCwgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDgsIC5wcmlvcml0eT04IH0sCi0JeyAuaXJxPTM1LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0xMiwgLnByaW9yaXR5PTAgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgMzIsIDAsIDAsIDAgfSwKKwl7IDMzLCAwLCA0LCAwIH0sCisJeyAzNCwgMCwgOCwgOCB9LAorCXsgMzUsIDAsIDEyLCAwIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCUlOVENfSVBSQywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2htaW4iLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zaG1pbl9pcnEodm9pZCkKIHsKIAljdHJsX291dHcoMHgyYTAwLCBQRkNfUEhDUik7CS8vIElSUTAtMz1JUlEKIAljdHJsX291dHcoMHgwYWFhLCBJTlRDX0lDUjEpOwkvLyBJUlEwLTM9SVJRLW1vZGUsTG93LWFjdGl2ZS4KLQltYWtlX2lwcl9pcnEoc2htaW5faXByX21hcCwgQVJSQVlfU0laRShzaG1pbl9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnNobWluX2lvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKQEAgLTQzLDkgKzU5LDggQEAKIAogfQogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2htaW4gX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NobWluIF9faW5pdG12ID0gewogCS5tdl9uYW1lCT0gIlNITUlOIiwKIAkubXZfaW5pdF9pcnEJPSBpbml0X3NobWluX2lycSwKIAkubXZfaW9wb3J0X21hcAk9IHNobWluX2lvcG9ydF9tYXAsCiB9OwotQUxJQVNfTVYoc2htaW4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwppbmRleCA2NTBmYjM2Li44NDI3MWQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKQEAgLTY4LDExICs2OCwyNyBAQAogICogSVJMMyA9IGNyeXB0bwogICovCiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc25hcGdlYXJfaXByX21hcFtdID0gewotCW1ha2VfaXByX2lycShJUkwwX0lSUSwgSVJMMF9JUFJfQUREUiwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMV9JUlEsIElSTDFfSVBSX0FERFIsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwzX0lSUSwgSVJMM19JUFJfQUREUiwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZKTsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgSVJMMF9JUlEsIDAsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSB9LAorCXsgSVJMMV9JUlEsIDAsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSB9LAorCXsgSVJMMl9JUlEsIDAsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSB9LAorCXsgSVJMM19JUlEsIDAsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlJTlRDX0lQUkQsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNuYXBnZWFyIiwKKwl9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfc25hcGdlYXJfSVJRKHZvaWQpCkBAIC04Miw3ICs5OCw3IEBACiAKIAlwcmludGsoIlNldHVwIFNuYXBHZWFyIElSUS9JUFIgLi4uXG4iKTsKIAotCW1ha2VfaXByX2lycShzbmFwZ2Vhcl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNuYXBnZWFyX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogLyoKQEAgLTk2LDcgKzExMiw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zbmFwZ2VhciBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc25hcGdlYXIgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNuYXBHZWFyIFNlY3VyZUVkZ2U1NDEwIiwKIAkubXZfc2V0dXAJCT0gc25hcGdlYXJfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xMTcsNCArMTMzLDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NuYXBnZWFyX0lSUSwKIH07Ci1BTElBU19NVihzbmFwZ2VhcikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMKaW5kZXggNjM5NmNlYS4uZmM4Y2QwNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMKQEAgLTM3MSw3ICszNzEsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g0MjAyX21pY3JvZGV2IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDQyMDJfbWljcm9kZXYgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNINC0yMDIgTWljcm9EZXYiLAogCS5tdl9zZXR1cAkJPSBtaWNyb2Rldl9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwJCS8qIFFRUSBuZWVkIHRvIGNoZWNrIHRoaXMgLSB1c2UgdGhlIE1BQ1JPICovCkBAIC00MDMsNCArNDAzLDMgQEAKIAkubXZfaGVhcnRiZWF0CQk9IG1pY3JvZGV2X2hlYXJ0YmVhdCwKICNlbmRpZgogfTsKLUFMSUFTX01WKHNoNDIwMl9taWNyb2RldikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCmluZGV4IDZiY2Q5MzkuLjYwNmQyNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGFzbS90aXRhbi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHRpdGFuX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSIGlkeCwgc2hpZnQsIHByaW8gKi8KIAl7IFRJVEFOX0lSUV9XQU4sICAgMywgMTIsIDggfSwJLyogZXRoMCAoV0FOKSAqLwogCXsgVElUQU5fSVJRX0xBTiwgICAzLCAgOCwgOCB9LAkvKiBldGgxIChMQU4pICovCkBAIC0yMCwxNSArMjAsMzMgQEAKIAl7IFRJVEFOX0lSUV9VU0IsICAgMywgIDAsIDggfSwJLyogbVBDSSBCIChib3R0b20pLCBVU0IgKi8KIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7IC8qIHN0b2xlbiBmcm9tIHNldHVwLXNoNzc1MC5jICovCisJMHhmZmQwMDAwNFVMLAkvKiAwOiBJUFJBICovCisJMHhmZmQwMDAwOFVMLAkvKiAxOiBJUFJCICovCisJMHhmZmQwMDAwY1VMLAkvKiAyOiBJUFJDICovCisJMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXRpdGFuIiwKKwl9LAorfTsKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RpdGFuX2lycSh2b2lkKQogewogCS8qIGVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbHMgKi8KIAlpcHJfaXJxX2VuYWJsZV9pcmxtKCk7CiAJLyogcmVnaXN0ZXIgaXByIGlycXMgKi8KLQltYWtlX2lwcl9pcnEodGl0YW5faXByX21hcCwgQVJSQVlfU0laRSh0aXRhbl9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdGl0YW4gX19pbml0bXYgPSB7CiAJLm12X25hbWUgPQkiVGl0YW4iLAogCiAJLm12X2luYiA9CXRpdGFuX2luYiwKQEAgLTUyLDQgKzcwLDMgQEAKIAogCS5tdl9pbml0X2lycSA9CWluaXRfdGl0YW5faXJxLAogfTsKLUFMSUFTX01WKHRpdGFuKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMThmNDAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdW5rbm93biBTSCBib2FyZHMgCi0jCi0KLW9iai15CSA6PSBzZXR1cC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNDYxMi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogU2V0dXAgY29kZSBmb3IgYW4gdW5rbm93biBtYWNoaW5lIChpbnRlcm5hbCBwZXJpcGhlcmFscyBvbmx5KQotICoKLSAqIFRoaXMgaXMgdGhlIHNpbXBsZXN0IG9mIGFsbCBib2FyZHMsIGFuZCBzZXJ2ZXMgb25seSBhcyBhIHF1aWNrIGFuZCBkaXJ0eQotICogbWV0aG9kIHRvIHN0YXJ0IGRlYnVnZ2luZyBhIG5ldyBib2FyZCBkdXJpbmcgYnJpbmctdXAgdW50aWwgcHJvcGVyIGJvYXJkCi0gKiBzZXR1cCBjb2RlIGlzIHdyaXR0ZW4uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3Vua25vd24gX19pbml0bXYgPSB7Ci0JLm12X25hbWUJCT0gIlVua25vd24iLAotfTsKLUFMSUFTX01WKHVua25vd24pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy9LY29uZmlnIGIvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZwppbmRleCAwNTgyY2E4Li4yZTUxNmU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCisrKyBiL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKQEAgLTEzLDEwICsxMyw4IEBACiAJICBhcmUgYWRkaXRpb25hbCBHUElPIGJpdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcmZhY2UgdG8KIAkgIGV4dGVybmFsIGFzIHdlbGwuCiAKLSMgQSBib2FyZCBtdXN0IGhhdmUgZGVmaW5lZCBIRDY0NDZYX1NFUklFUyBpbiBvcmRlciB0byBzZWUgdGhlc2UKIGNvbmZpZyBIRDY0NDZYX1NFUklFUwotCWJvb2wgIkhENjQ0Nnggc3VwcG9ydCIKLQlkZWZhdWx0IG4KKwlib29sCiAKIGNob2ljZQogCXByb21wdCAiSEQ2NDQ2eCBvcHRpb25zIgpAQCAtMjUsNyArMjMsNiBAQAogCiBjb25maWcgSEQ2NDQ2MQogCWJvb2wgIkhpdGFjaGkgSEQ2NDQ2MSBjb21wYW5pb24gY2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA5CiAJLS0taGVscC0tLQogCSAgVGhlIEhpdGFjaGkgSEQ2NDQ2MSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yCiAJICB0aGUgU0g3NzA5IENQVSwgc3VwcG9ydGluZyBhIExDRCBjb250cm9sbGVyLApAQCAtNDAsNyArMzcsNiBAQAogCiBjb25maWcgSEQ2NDQ2NQogCWJvb2wgIkhpdGFjaGkgSEQ2NDQ2NSBjb21wYW5pb24gY2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUwCiAJLS0taGVscC0tLQogCSAgVGhlIEhpdGFjaGkgSEQ2NDQ2NSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yCiAJICB0aGUgU0g3NzUwIENQVSwgc3VwcG9ydGluZyBhIExDRCBjb250cm9sbGVyLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2RyZWFtY2FzdF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZwppbmRleCA4YjZiNWE3Li4zZmRkMjcwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZwpAQCAtMSwxNSArMSwyMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4Ci0jIFR1ZSBPY3QgIDMgMTA6NTE6NTUgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBTYXQgSnVsICA3IDAzOjQ3OjQ1IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19QQ0k9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwpAQCAtMjgsNiArMzYsNyBAQAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CkBAIC0zNSw4ICs0NCwxMCBAQAogIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKQEAgLTUwLDE0ICs2MSwxOSBAQAogQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15Ci1DT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTkzLDQ0ICsxMDksOSBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0Ci1DT05GSUdfU0hfRFJFQU1DQVNUPXkKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0g0PXkKLQotIwotIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0Ci0jCi0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldApAQCAtMTM4LDc5ICsxMTksOTMgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCi1DT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MT15Ci1DT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUj15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAotCi0jCi0jIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAotCi0jCi0jIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKLQotIwotIyBTSDRBTC1EU1AgUHJvY2Vzc29yIFN1cHBvcnQKLSMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDAxMDAwMDAwCiBDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAogQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQogIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCiAjCiAjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCiAjCiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX1NIX0ZQVT15CiAjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAogQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CiBDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiBDT05GSUdfQ1BVX0hBU19TUl9SQj15CitDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIwotIyBUaW1lciBzdXBwb3J0CisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TSF9EUkVBTUNBU1Q9eQorCisjCisjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9USU1FUl9JUlE9MTYKIENPTkZJR19TSF9QQ0xLX0ZSRVE9NDk4NzY1MDQKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjMyLDYgKzIyNyw3IEBACiAjCiAjIERNQSBzdXBwb3J0CiAjCitDT05GSUdfU0hfRE1BX0FQST15CiBDT05GSUdfU0hfRE1BPXkKIENPTkZJR19OUl9PTkNISVBfRE1BX0NIQU5ORUxTPTQKIENPTkZJR19OUl9ETUFfQ0hBTk5FTFNfQk9PTD15CkBAIC0yNDAsMTcgKzIzNiwyMyBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKKworIworIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgZmVhdHVyZXMKICMKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CkBAIC0yNjksMzMgKzI3MSwyMyBAQAogIyBCdXMgb3B0aW9ucwogIwogQ09ORklHX1BDST15Ci0jIENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfUENJX0FVVE89eQotIyBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKICMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCiAjIE5ldHdvcmtpbmcKICMKIENPTkZJR19ORVQ9eQpAQCAtMzAzLDEzICsyOTUsMTMgQEAKICMKICMgTmV0d29ya2luZyBvcHRpb25zCiAjCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTMyNywzMCArMzE5LDIwIEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzc2LDcgKzM1OCwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtMzk0LDEwICszODUsNiBAQAogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKQEAgLTQwOCw2ICszOTUsNyBAQAogIwogIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKICMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAogCiAjCiAjIEJsb2NrIGRldmljZXMKQEAgLTQyMSwxMyArNDA5LDE2IEBACiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQzNiwxMCArNDI3LDYgQEAKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwpAQCAtNDU1LDYgKzQ0Miw3IEBACiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKIAogIwpAQCAtNDcwLDE1ICs0NTgsNyBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwogIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTUyMSw0NyArNTAxLDE2IEBACiAjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLR0UgaXMgbm90IHNldAotIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMgV2lyZWxlc3MgTEFOCiAjCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZEREkgaXMgbm90IHNldAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldApAQCAtNjA0LDE3ICs1NTMsMTkgQEAKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTU9VU0U9eQotQ09ORklHX01PVVNFX1BTMj15CisjIENPTkZJR19NT1VTRV9QUzIgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0FQUExFVE9VQ0ggaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTY2MCwxMCArNjExLDYgQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtNjgwLDE0ICs2MjcsOCBAQAogIyBDT05GSUdfUENJUENXQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19XRFRQQ0kgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCkBAIC02OTUsMTEgKzYzNiw3IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIworQ09ORklHX0RFVlBPUlQ9eQogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtNzExLDQ0ICs2NDgsNTEgQEAKICMKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCi1DT05GSUdfSFdNT049eQotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLUNPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CitDT05GSUdfRklSTVdBUkVfRURJRD15CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CitDT05GSUdfRkJfREVGRVJSRURfSU89eQorIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisKKyMKKyMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKKyMKICMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKQEAgLTc2MywxMyArNzA3LDE3IEBACiAjIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAogIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAogIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZUODYyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FSSyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QTTMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTc4OSwxMCArNzM3LDYgQEAKICMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfMTB4MTggaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwogQ09ORklHX0xPR089eQogIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldApAQCAtODAwLDcgKzc0NCw2IEBACiAjIENPTkZJR19MT0dPX1NVUEVSSF9NT05PIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fU1VQRVJIX1ZHQTE2IGlzIG5vdCBzZXQKIENPTkZJR19MT0dPX1NVUEVSSF9DTFVUMjI0PXkKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTgwOCw2ICs3NTEsMTIgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CkBAIC04MjMsMTAgKzc3Miw2IEBACiAjIFVTQiBHYWRnZXQgU3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKIAogIwpAQCAtODc0LDEwICs4MTksMTIgQEAKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtOTU3LDYgKzkwNCwxMSBAQAogIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKIAogIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKICMgUHJvZmlsaW5nIHN1cHBvcnQKICMKIENPTkZJR19QUk9GSUxJTkc9eQpAQCAtOTY1LDE3ICs5MTcsMTggQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0tHREIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTk5MSw4ICs5NDQsMTMgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yNzc4MG1wX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yNzc4MG1wX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Y3NDAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTIyMyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBNb24gSnVuIDExIDEwOjI0OjU3IDIwMDcKKyMKK0NPTkZJR19TVVBFUkg9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorCisjCisjIFN5c3RlbSB0eXBlCisjCitDT05GSUdfQ1BVX1NIND15CitDT05GSUdfQ1BVX1NINEE9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODA9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1FVSUNLTElTVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA4MDAwMDAwCisjIENPTkZJR18zMkJJVCBpcyBub3Qgc2V0CitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9GUFU9eQorIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9TVE9SRV9RVUVVRVM9eQorQ09ORklHX1NQRUNVTEFUSVZFX0VYRUNVVElPTj15CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRPXkKK0NPTkZJR19DUFVfSEFTX1NSX1JCPXkKKworIworIyBCb2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19TSF83NzgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CitDT05GSUdfU0hfSElHSExBTkRFUj15CisjIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9SNzc4ME1QPXkKKyMgQ09ORklHX1NIX1I3Nzg1UlAgaXMgbm90IHNldAorCisjCisjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCisjCitDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9USU1FUl9JUlE9MjgKK0NPTkZJR19TSF9QQ0xLX0ZSRVE9MzIwMDAwMDAKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorCisjCisjIERNQSBzdXBwb3J0CisjCisjIENPTkZJR19TSF9ETUEgaXMgbm90IHNldAorCisjCisjIENvbXBhbmlvbiBDaGlwcworIworIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAorQ09ORklHX1BVU0hfU1dJVENIPXkKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19LRVhFQz15CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX1BSRUVNUFRfQktMPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKKyMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9zZGExIgorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfUENJPXkKK0NPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQ9eQorQ09ORklHX1BDSV9BVVRPPXkKK0NPTkZJR19QQ0lfQVVUT19VUERBVEVfUkVTT1VSQ0VTPXkKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19BU0tfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEggaXMgbm90IHNldAorIyBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorQ09ORklHX0xMQz1tCisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9bQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CitDT05GSUdfQ0hSX0RFVl9TRz1tCisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAorQ09ORklHX0FUQT15CisjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9TSUw9eQorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9JTklDMTYyWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX1BMQVRGT1JNPXkKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU0FTIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfUENORVQzMj1tCisjIENPTkZJR19QQ05FVDMyX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfODEzOUNQPW0KK0NPTkZJR184MTM5VE9PPW0KKyMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5VE9PXzgxMjk9eQorIyBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CitDT05GSUdfVklBX1JISU5FPW0KK0NPTkZJR19WSUFfUkhJTkVfTU1JTz15CisjIENPTkZJR19WSUFfUkhJTkVfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQzkyMDMxIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CitDT05GSUdfRTEwMDA9bQorIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKK0NPTkZJR19SODE2OT15CisjIENPTkZJR19SODE2OV9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMDA9eQorIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD1tCisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCisjIENPTkZJR19TTkQgaXMgbm90IHNldAorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCitDT05GSUdfU09VTkRfUFJJTUU9bQorIyBDT05GSUdfT1NTX09CU09MRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0CisKKyMKKyMgSElEIERldmljZXMKKyMKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKKyMKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlOSVhfRlM9eQorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRlVTRV9GUz1tCisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKK0NPTkZJR19OVEZTX0ZTPXkKKyMgQ09ORklHX05URlNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX05URlNfUlc9eQorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19IVUdFVExCRlM9eQorQ09ORklHX0hVR0VUTEJfUEFHRT15CitDT05GSUdfUkFNRlM9eQorQ09ORklHX0NPTkZJR0ZTX0ZTPW0KKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU0RfVjQ9eQorQ09ORklHX05GU0RfVENQPXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCisjCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT1tCisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19GT1JDRURfSU5MSU5JTkc9eQorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQorIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CitDT05GSUdfQ1JZUFRPX0hNQUM9eQorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fQ0JDPXkKK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKaW5kZXggMGY1ZWM2NC4uNWMyOTMzOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMS1yYzMKLSMgTW9uIE1hciAxMiAxNDoyNjozMyAyMDA3CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFRodSBKdWwgMTIgMTI6MzM6MTUgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CkBAIC0xMSw3ICsxMSw5IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLSMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfUENJPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApAQCAtNDMsNiArNDUsNyBAQAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKQEAgLTYwLDEzICs2MywxOCBAQAogQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC0xMDIsNTUgKzExMCwxMSBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9ISUdITEFOREVSPXkKLSMgQ09ORklHX1NIX0VET1NLNzcwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYgaXMgbm90IHNldAotIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBNUCBpcyBub3Qgc2V0Ci1DT05GSUdfU0hfUjc3ODVSUD15Ci0KLSMKLSMgUHJvY2Vzc29yIHNlbGVjdGlvbgotIwogQ09ORklHX0NQVV9TSDQ9eQogQ09ORklHX0NQVV9TSDRBPXkKIENPTkZJR19DUFVfU0hYMj15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldApAQCAtMTU4LDEwICsxMjIsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAotCi0jCi0jIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKLSMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldApAQCAtMTcwLDIzICsxMzEsMTIgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAotCi0jCi0jIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAotCi0jCi0jIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODU9eQotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldApAQCAtMTk0LDYgKzE0NCw3IEBACiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKICMKK0NPTkZJR19RVUlDS0xJU1Q9eQogQ09ORklHX01NVT15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDA4MDAwMDAwCkBAIC0yMDEsNiArMTUyLDEyIEBACiBDT05GSUdfMzJCSVQ9eQogIyBDT05GSUdfWDJUTEIgaXMgbm90IHNldAogQ09ORklHX1ZTWVNDQUxMPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQorQ09ORklHX01BWF9BQ1RJVkVfUkVHSU9OUz0xCitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfUEFHRV9TSVpFXzRLQj15CiAjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKQEAgLTIxNSwxNyArMTcyLDE3IEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCiAjCiAjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCkBAIC0yNDEsMTIgKzE5OCwyMiBAQAogQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NIX0hJR0hMQU5ERVI9eQorIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9SNzc4ME1QIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9SNzc4NVJQPXkKKworIwogIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgogIwogQ09ORklHX1NIX1RNVT15CiBDT05GSUdfU0hfVElNRVJfSVJRPTI4Ci1DT05GSUdfTk9fSURMRV9IWj15CiBDT05GSUdfU0hfUENMS19GUkVRPTUwMDAwMDAwCisjIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTI2MSw3ICsyMjgsNiBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwpAQCAtMjc4LDcgKzI0NCw3IEBACiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKIENPTkZJR19LRVhFQz15Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQpAQCAtMzAwLDMxICsyNjYsMjIgQEAKIENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQ9eQogQ09ORklHX1BDSV9BVVRPPXkKIENPTkZJR19QQ0lfQVVUT19VUERBVEVfUkVTT1VSQ0VTPXkKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAogIwogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCiAjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CiAKICMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTMzMiw3ICsyODksNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQpAQCAtMzc3LDIwICszMzMsOCBAQAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKIENPTkZJR19CUklER0U9bQpAQCAtNDE3LDggKzM2MSwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC00MzgsMTAgKzM5MCw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwpAQCAtNDc1LDEyICs0MjMsMTAgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKICMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNTA5LDYgKzQ1NSw3IEBACiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCiAKICMKICMgU0NTSSBUcmFuc3BvcnRzCkBAIC01NTQsMTAgKzUwMSw2IEBACiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKQEAgLTU4MCw2ICs1MjMsNyBAQAogIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldApAQCAtNjI5LDYgKzU3Myw3IEBACiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKIAogIwpAQCAtNjQ0LDE1ICs1ODksNyBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwogIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTY3MywxMCArNjEwLDcgQEAKICMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIworQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKICMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKQEAgLTY4OSw1NSArNjIzLDI2IEBACiAjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLWTIgaXMgbm90IHNldAogIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKKyMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjIFdpcmVsZXNzIExBTgogIwotQ09ORklHX05FVF9SQURJTz15Ci0jIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LIGlzIG5vdCBzZXQKLQotIwotIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQotIwotIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JUFcyMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVzIyMDAgaXMgbm90IHNldAotIyBDT05GSUdfSEVSTUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKLQotIwotIyBQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1dJUkVMRVNTPXkKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKQEAgLTc4OSw2ICs2OTQsNyBAQAogIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCkBAIC04MzEsMTQgKzczNyw4IEBACiAjIElQTUkKICMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CkBAIC04NDgsMTAgKzc0OCw3IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIworQ09ORklHX0RFVlBPUlQ9eQogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtODY0LDE2ICs3NjEsMTUgQEAKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIwogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKQEAgLTg4NSwyMiArNzgxLDMwIEBACiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCiAjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiBDT05GSUdfRkI9eQogIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CitDT05GSUdfRkJfREVGRVJSRURfSU89eQogIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldApAQCAtOTA4LDcgKzgxMiw3IEBACiAjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAogCiAjCi0jIEZyYW1idWZmZXIgaGFyZHdhcmUgZHJpdmVycworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwogIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CkBAIC05MzAsMTIgKzgzNCwxMSBAQAogIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKICMgQ09ORklHX0xPR08gaXMgbm90IHNldAogCiAjCkBAIC05NTIsMTMgKzg1NSwxMCBAQAogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPW0KLSMgQ09ORklHX09CU09MRVRFX09TUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9JQ0ggaXMgbm90IHNldAorIyBDT05GSUdfT1NTX09CU09MRVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX1RSSURFTlQgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9WSUE4MkNYWFggaXMgbm90IHNldAogCiAjCiAjIEhJRCBEZXZpY2VzCkBAIC05ODIsMTAgKzg4Miw2IEBACiAjIFVTQiBHYWRnZXQgU3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAyNiwxOCArOTIyLDMwIEBACiBDT05GSUdfUlRDX0lOVEZfUFJPQz15CiBDT05GSUdfUlRDX0lOVEZfREVWPXkKICMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFJUQyBkcml2ZXJzCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9TSD15Ci0jIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKQEAgLTEwNTEsMTQgKzk1OSw2IEBACiAjCiAKICMKLSMgQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydAotIwotCi0jCi0jIFZpcnR1YWxpemF0aW9uCi0jCi0KLSMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CkBAIC0xMTU3LDYgKzEwNTcsNyBAQAogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiBDT05GSUdfU1VOUlBDX0dTUz15CisjIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldApAQCAtMTIzOSw3ICsxMTQwLDYgQEAKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CkBAIC0xMjY2LDYgKzExNjYsNyBAQAogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQogIyBDT05GSUdfNEtTVEFDS1MgaXMgbm90IHNldApAQCAtMTMwMCw2ICsxMjAxLDcgQEAKIENPTkZJR19DUllQVE9fQ0JDPXkKIENPTkZJR19DUllQVE9fUENCQz1tCiAjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19ERVM9eQogIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldApAQCAtMTMyOCw3ICsxMjMwLDkgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTcyMDZfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcKaW5kZXggODdhYjkwOC4uZjJmMmEzYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcKQEAgLTEsMTggKzEsMjIgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOQotIyBXZWQgRGVjICA2IDE0OjQwOjE1IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgRnJpIEp1biAxNSAxOTozNzo0NiAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiAjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zNCw4ICszOCwxMCBAQAogIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKQEAgLTQ4LDEyICs1NCwxNyBAQAogIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVVEVYIGlzIG5vdCBzZXQKK0NPTkZJR19BTk9OX0lOT0RFUz15CiAjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0Ci1DT05GSUdfU0xBQj15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogIyBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlMgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTEKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC04Myw1MyArOTQsMTAgQEAKICMKICMgU3lzdGVtIHR5cGUKICMKLSMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLUNPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIMj15CiBDT05GSUdfQ1BVX1NIMkE9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2PXkKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xMzcsMTAgKzEwNSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CkBAIC0xNDksMzIgKzExNCwyOCBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKLQotIwotIyBTSDRBTC1EU1AgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHgwMDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMTg0LDM1ICsxNDUsNDIgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19TSF9GUFUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfRlBVX0VNVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiAKICMKLSMgVGltZXIgc3VwcG9ydAorIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU09MVVRJT05fRU5HSU5FPXkKK0NPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORT15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9DTVQ9eQogIyBDT05GSUdfU0hfTVRVMiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfVElNRVJfSVJRPTE0MAotIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTMzMzMzMzMzCiBDT05GSUdfU0hfQ0xLX01EPTYKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMjcsMTEgKzE5NSwxMSBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwogIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKIAogIwpAQCAtMjM5LDEwICsyMDcsMTEgQEAKICMKIENPTkZJR19IWl8xMDA9eQogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0yNTIsMjMgKzIyMSwxOCBAQAogIwogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAotIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRkxBVD15CkBAIC0yNzcsMTEgKzI0MSw2IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogQ09ORklHX05FVD15CkBAIC0yODksNyArMjQ4LDYgQEAKICMKICMgTmV0d29ya2luZyBvcHRpb25zCiAjCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAogIyBDT05GSUdfVU5JWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKQEAgLTMxNCwyNSArMjcyLDE0IEBACiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtMzU4LDcgKzMwNSwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtMzc1LDEwICszMzEsNiBAQAogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKQEAgLTM5Myw2ICszNDUsNyBAQAogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKQEAgLTQyNCw3ICszNzcsNiBAQAogIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCkBAIC00NTIsMTYgKzQwNCwxMyBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApAQCAtNDcxLDYgKzQyMCw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtNDc5LDE4ICs0MjksMTMgQEAKICMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQ5OSwxMCArNDQ0LDYgQEAKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwpAQCAtNTExLDE5ICs0NTIsNiBAQAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogCiAjCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19ORVRERVZJQ0VTPXkKQEAgLTUzMSwxMCArNDU5LDYgQEAKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUEhZIGRldmljZSBzdXBwb3J0Ci0jCiAjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAogCiAjCkBAIC01NDQsMjcgKzQ2OCwxNCBAQAogQ09ORklHX01JST15CiAjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CiBDT05GSUdfU01DOTFYPXkKK0NPTkZJR19ORVRERVZfMTAwMD15CitDT05GSUdfTkVUREVWXzEwMDAwPXkKIAogIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIyBXaXJlbGVzcyBMQU4KICMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldApAQCAtNjA0LDYgKzUxNSw3IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTYzOSwyOSArNTUxLDE1IEBACiAjIElQTUkKICMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKICMKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC02NzQsMjcgKzU3MiwzMCBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0RBQj15CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTcwMyw2ICs2MDQsMTIgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKQEAgLTcxNywxMCArNjI0LDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC04MDIsNyArNzA1LDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiAjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKQEAgLTgxNiw3ICs3MTgsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldApAQCAtODQ5LDYgKzc1MCwxMSBAQAogIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKIAogIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKICMgUHJvZmlsaW5nIHN1cHBvcnQKICMKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CkBAIC04NjEsMTQgKzc2NywxMSBAQAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOV0lORF9JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtODgzLDggKzc4NiwxMyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc2MTlfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcKaW5kZXggMjBhYzdmNC4uM2EzYzNjMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcKQEAgLTEsMTggKzEsMjIgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOQotIyBXZWQgRGVjICA2IDE2OjM1OjM2IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgRnJpIEp1biAxNSAxOTo0MzowNiAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiAjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyBpcyBub3Qgc2V0CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zMSw4ICszNSwxMCBAQAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNDUsMTIgKzUxLDE3IEBACiAjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTgwLDUyICs5MSw5IEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9CSUdTVVIgaXMgbm90IHNldAotIyBDT05GSUdfU0hfTVBDMTIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDAzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hTNzc1MVJWT0lQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3MTBWT0lQR1cgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUlRTNzc1MVIyRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VET1NLNzcwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYgaXMgbm90IHNldAotIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci1DT05GSUdfU0hfNzYxOV9TT0xVVElPTl9FTkdJTkU9eQotIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHNlbGVjdGlvbgotIwogQ09ORklHX0NQVV9TSDI9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5PXkKLQotIwotIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xMzMsMTAgKzEwMSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CkBAIC0xNDUsMzIgKzExMCwyOCBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKLQotIwotIyBTSDRBTC1EU1AgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHgwMDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMTgwLDM0ICsxNDEsNDEgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogQ09ORklHX1NIX1dSSVRFVEhST1VHSD15Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCiAjCiAjIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0JJR19FTkRJQU49eQotIyBDT05GSUdfU0hfRlBVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0ZQVV9FTVUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX0lQUl9JUlE9eQogCiAjCi0jIFRpbWVyIHN1cHBvcnQKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NPTFVUSU9OX0VOR0lORT15CitDT05GSUdfU0hfNzYxOV9TT0xVVElPTl9FTkdJTkU9eQorCisjCisjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfQ01UPXkKIENPTkZJR19TSF9USU1FUl9JUlE9ODYKLSMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogQ09ORklHX1NIX1BDTEtfRlJFUT0zMTI1MDAwMAogQ09ORklHX1NIX0NMS19NRD01CisjIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjIyLDExICsxOTAsMTEgQEAKICMKICMgQ29tcGFuaW9uIENoaXBzCiAjCi0jIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CiAKICMKICMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKICMKKyMgQ09ORklHX0hFQVJUQkVBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CiAKICMKQEAgLTIzNCwxMCArMjAyLDExIEBACiAjCiBDT05GSUdfSFpfMTAwPXkKICMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MTAwCiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApAQCAtMjQ3LDIzICsyMTYsMTggQEAKICMKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKLSMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucwogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCiAKICMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwotCi0jCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0ZMQVQ9eQpAQCAtMjcyLDExICsyMzYsNiBAQAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCiAjIE5ldHdvcmtpbmcKICMKICMgQ09ORklHX05FVCBpcyBub3Qgc2V0CkBAIC0yOTUsMTAgKzI1NCw2IEBACiAjCiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NPTkNBVD15CkBAIC0zMTMsNiArMjY4LDcgQEAKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKICMKIENPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQogQ09ORklHX01URF9CTE9DSz15CiAjIENPTkZJR19GVEwgaXMgbm90IHNldAogIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CkBAIC0zNDQsNyArMzAwLDYgQEAKICMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CiAKICMKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwpAQCAtMzcyLDE2ICszMjcsMTMgQEAKICMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwogIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAogCiAjCi0jIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCiAjCi0jIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKIAogIwogIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKQEAgLTM5MSw2ICszNDMsNyBAQAogIwogIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKICMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAogCiAjCiAjIEJsb2NrIGRldmljZXMKQEAgLTM5OCwxNyArMzUxLDEyIEBACiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwogIwotIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC00MTcsMTAgKzM2NSw2IEBACiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKLSMKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAKICMKQEAgLTQyOSwxOSArMzczLDYgQEAKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIAogIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLQotIwogIyBJU0ROIHN1YnN5c3RlbQogIwogCkBAIC00NzEsNiArNDAyLDcgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNTA2LDI5ICs0MzgsMTUgQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTU0MSwyNiArNDU5LDI5IEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIwotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKK0NPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogIyBDT05GSUdfRkIgaXMgbm90IHNldAogCiAjCkBAIC01NjksNiArNDkwLDEyIEBACiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiAKICMKKyMgSElEIERldmljZXMKKyMKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKworIwogIyBVU0Igc3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CkBAIC01ODMsMTAgKzUxMCw2IEBACiAjIFVTQiBHYWRnZXQgU3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKIAogIwpAQCAtNjY4LDcgKzU5MSw2IEBACiBDT05GSUdfUFJPQ19TWVNDVEw9eQogIyBDT05GSUdfU1lTRlMgaXMgbm90IHNldAogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogCkBAIC02ODIsNyArNjA0LDYgQEAKICMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTcxNSwxNCArNjM2LDExIEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC03MzcsOCArNjU1LDEzIEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzcyMl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZwppbmRleCBjYTRjNjYzLi43NjRiODEzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMS1yYzcKLSMgRnJpIEFwciAyNyAxNjozMDozMCAyMDA3CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFdlZCBKdW4gMjAgMTg6MDg6MDQgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CkBAIC0xMSw3ICsxMSw5IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLSMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfTlVNQT15CiBDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKIENPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKQEAgLTQzLDYgKzQ1LDcgQEAKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQpAQCAtNjAsMTQgKzYzLDIwIEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtMTAzLDU3ICsxMTIsMTIgQEAKICMKICMgU3lzdGVtIHR5cGUKICMKLUNPTkZJR19TT0xVVElPTl9FTkdJTkU9eQotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19TSF83NzIyX1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfU0hfTVBDMTIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDAzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hTNzc1MVJWT0lQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3MTBWT0lQR1cgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUlRTNzc1MVIyRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9ISUdITEFOREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VET1NLNzcwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYgaXMgbm90IHNldAotIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQk9YX1JFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIND15CiBDT05GSUdfQ1BVX1NINEE9eQogQ09ORklHX0NQVV9TSDRBTF9EU1A9eQogQ09ORklHX0NQVV9TSFgyPXkKLQotIwotIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0Ci0jCi0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKLQotIwotIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xNjIsMTAgKzEyNiw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE3NCwyMyArMTM0LDExIEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMj15CkBAIC0xOTgsMTUgKzE0NiwyMSBAQAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKLSMgQ09ORklHXzMyQklUIGlzIG5vdCBzZXQKICMgQ09ORklHX1gyVExCIGlzIG5vdCBzZXQKIENPTkZJR19WU1lTQ0FMTD15Ci1DT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfTlVNQT15CitDT05GSUdfTk9ERVNfU0hJRlQ9MQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTIKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CiBDT05GSUdfUEFHRV9TSVpFXzRLQj15CiAjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKQEAgLTIxNiwyNiArMTcwLDI1IEBACiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRkxBVE1FTV9NQU5VQUwgaXMgbm90IHNldAogIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19GTEFUTUVNPXkKLUNPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKK0NPTkZJR19TUEFSU0VNRU09eQorQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVM9eQorQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQorIyBDT05GSUdfTUVNT1JZX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKK0NPTkZJR19NSUdSQVRJT049eQogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAotIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAotQ09ORklHX0NGX0VOQUJMRVI9eQotIyBDT05GSUdfQ0ZfQVJFQTUgaXMgbm90IHNldAotQ09ORklHX0NGX0FSRUE2PXkKLUNPTkZJR19DRl9CQVNFX0FERFI9MHhiODAwMDAwMAogCiAjCiAjIFByb2Nlc3NvciBmZWF0dXJlcwpAQCAtMjUyLDEyICsyMDUsMjAgQEAKIENPTkZJR19DUFVfSEFTX1BURUE9eQogCiAjCisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FPXkKKworIwogIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgogIwogQ09ORklHX1NIX1RNVT15CiBDT05GSUdfU0hfVElNRVJfSVJRPTE2Ci1DT05GSUdfTk9fSURMRV9IWj15CiBDT05GSUdfU0hfUENMS19GUkVRPTMzMzMzMzMzCitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTI3Miw3ICsyMzMsNiBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwpAQCAtMjkwLDcgKzI1MCw2IEBACiBDT05GSUdfSFo9MjUwCiBDT05GSUdfS0VYRUM9eQogIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKQEAgLTMwNyw3ICsyNjYsMTEgQEAKICMKICMgQnVzIG9wdGlvbnMKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZfRU5BQkxFUj15CisjIENPTkZJR19DRl9BUkVBNSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZfQVJFQTY9eQorQ09ORklHX0NGX0JBU0VfQUREUj0weGI4MDAwMDAwCisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydApAQCAtMzE1LDIyICsyNzgsMTIgQEAKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwotCi0jCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogQ09ORklHX05FVD15CkBAIC0zMzgsNyArMjkxLDYgQEAKICMKICMgTmV0d29ya2luZyBvcHRpb25zCiAjCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19QQUNLRVRfTU1BUD15CiBDT05GSUdfVU5JWD15CkBAIC0zNzUsMjAgKzMyNyw4IEBACiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTQxNCw3ICszNTQsMTYgQEAKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0lSREEgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQzMiwxMCArMzgxLDYgQEAKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogCiAjCkBAIC00NjQsMTAgKzQwOSw3IEBACiAjCiAjIE1pc2MgZGV2aWNlcwogIwotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQ5Niw2ICs0MzgsNyBAQAogIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQogCiAjCiAjIFNDU0kgVHJhbnNwb3J0cwpAQCAtNTExLDEwICs0NTQsNiBAQAogIwogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogQ09ORklHX1BBVEFfUExBVEZPUk09eQpAQCAtNTI1LDE5ICs0NjQsNiBAQAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogCiAjCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19ORVRERVZJQ0VTPXkKQEAgLTU0NSwxMCArNDcxLDYgQEAKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUEhZIGRldmljZSBzdXBwb3J0Ci0jCiAjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAogCiAjCkBAIC01NTgsMjcgKzQ4MCwxNCBAQAogQ09ORklHX01JST15CiAjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CiBDT05GSUdfU01DOTFYPXkKK0NPTkZJR19ORVRERVZfMTAwMD15CitDT05GSUdfTkVUREVWXzEwMDAwPXkKIAogIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIyBXaXJlbGVzcyBMQU4KICMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldApAQCAtNjI3LDYgKzUzNiw3IEBACiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTY2NywxNCArNTc3LDggQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY4MiwxMCArNTg2LDYgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC02OTgsMTYgKzU5OCwxNSBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwpAQCAtNzE5LDE2ICs2MTgsMTkgQEAKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCiAjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc1NywxMCArNjU5LDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC04MDAsMTggKzY5OCwzMCBAQAogQ09ORklHX1JUQ19JTlRGX1BST0M9eQogQ09ORklHX1JUQ19JTlRGX0RFVj15CiAjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKIAogIwotIyBSVEMgZHJpdmVycworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIwogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAotQ09ORklHX1JUQ19EUlZfU0g9eQotIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfU0g9eQorCisjCiAjIERNQSBFbmdpbmUgc3VwcG9ydAogIwogIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CkBAIC04MjUsMTQgKzczNSw2IEBACiAjCiAKICMKLSMgQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydAotIwotCi0jCi0jIFZpcnR1YWxpemF0aW9uCi0jCi0KLSMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CkBAIC05MzcsMjMgKzgzOSwyNCBAQAogIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9GSUxJTkc9eQorIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15Ci0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLX1RJTUU9eQogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX01BR0lDX1NZU1JRPXkKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9TVEFOREFSRF9CSU9TPXkKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAogIyBDT05GSUdfU0hfS0dEQiBpcyBub3Qgc2V0CiAKICMKQEAgLTk3Myw4ICs4NzYsMTAgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfUExJU1Q9eQogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5YmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDc1NiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBXZWQgSnVuIDIwIDE0OjA5OjI3IDIwMDcKKyMKK0NPTkZJR19TVVBFUkg9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKKworIworIyBTeXN0ZW0gdHlwZQorIworQ09ORklHX0NQVV9TSDQ9eQorQ09ORklHX0NQVV9TSDRBPXkKK0NPTkZJR19DUFVfU0hYMz15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMz15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19RVUlDS0xJU1Q9eQorQ09ORklHX01NVT15CitDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAorQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCitDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAorQ09ORklHX1ZTWVNDQUxMPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQorQ09ORklHX01BWF9BQ1RJVkVfUkVHSU9OUz0xCitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKK0NPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEs9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMjU2SyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8xTUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNE1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0TUIgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgorCisjCisjIENhY2hlIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgZmVhdHVyZXMKKyMKK0NPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRlBVX0VNVSBpcyBub3Qgc2V0CitDT05GSUdfU0hfRFNQPXkKK0NPTkZJR19TSF9TVE9SRV9RVUVVRVM9eQorQ09ORklHX0NQVV9IQVNfSU5URVZUPXkKK0NPTkZJR19DUFVfSEFTX0lOVEMyX0lSUT15CitDT05GSUdfQ1BVX0hBU19TUl9SQj15CisKKyMKKyMgQm9hcmQgc3VwcG9ydAorIworCisjCisjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCisjCitDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9USU1FUl9JUlE9MTYKK0NPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorCisjCisjIERNQSBzdXBwb3J0CisjCisjIENPTkZJR19TSF9ETUEgaXMgbm90IHNldAorCisjCisjIENvbXBhbmlvbiBDaGlwcworIworCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSEVBUlRCRUFUPXkKKyMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19LRVhFQz15CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfUFJFRU1QVF9CS0w9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgaXA9MTkyLjE2OC4xLjI6OjoyNTUuMjU1LjI1NS4wIHJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjEuMTovZXhwb3J0cy9kZXZlbC9yZnMvbW9iaWxlciBub2FsaWVuY2FjaGUgZWFybHlwcmludGs9YmlvcyBpZ25vcmVfbG9nbGV2ZWwiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0FUQT15CisjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBISUQgRGV2aWNlcworIworIyBDT05GSUdfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKworIworIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKKyMKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJGUz15CitDT05GSUdfSFVHRVRMQl9QQUdFPXkKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19QUk9GSUxJTkc9eQorIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfUFJJTlRLX1RJTUU9eQorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NMQUI9eQorQ09ORklHX0RFQlVHX1NMQUJfTEVBSz15CitDT05GSUdfREVCVUdfUFJFRU1QVD15CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1BJTkxPQ0s9eQorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0M9eQorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0RFUD15CitDT05GSUdfREVCVUdfTE9DS0RFUD15CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WTT15CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19GT1JDRURfSU5MSU5JTkc9eQorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQorIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorIyBDT05GSUdfREVCVUdfQk9PVE1FTSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CitDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQorIyBDT05GSUdfNEtTVEFDS1MgaXMgbm90IHNldAorIyBDT05GSUdfU0hfS0dEQiBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggOTk5MzVmOS4uMzMzODk4MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMzYsMjMgKzM2LDYgQEAKIAkgIHN1cHBvcnQuIFNldHRpbmcgdGhpcyB0byBhIGhpZ2hlciB2YWx1ZSBhbGxvd3MgZm9yIGNhc2NhZGluZyBETUFDcwogCSAgd2l0aCBhZGRpdGlvbmFsIGNoYW5uZWxzLgogCi1jb25maWcgRE1BX1BBR0VfT1BTCi0JYm9vbCAiVXNlIERNQUMgZm9yIHBhZ2UgY29weS9jbGVhciIKLQlkZXBlbmRzIG9uIFNIX0RNQSAmJiBCUk9LRU4KLQloZWxwCi0JICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCB1c2UgYSBkdWFsLWFkZHJlc3MgbW9kZSBjb25maWd1cmVkIGNoYW5uZWwKLQkgIGluIHRoZSBTSCBETUFDIGZvciBjb3B5X3BhZ2UoKS9jbGVhcl9wYWdlKCkuIFByaW1hcmlseSBhIHBlcmZvcm1hbmNlCi0JICBoYWNrLgotCi1jb25maWcgRE1BX1BBR0VfT1BTX0NIQU5ORUwKLQlkZXBlbmRzIG9uIERNQV9QQUdFX09QUwotCWludCAiRE1BIGNoYW5uZWwgZm9yIHNoIG1lbW9yeS1tYW5hZ2VyIHBhZ2UgY29weS9jbGVhciIKLQlkZWZhdWx0ICIzIgotCWhlbHAKLQkgIFRoaXMgYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBkdWFsIGFkZHJlc3MgZG1hIGNoYW5uZWwsCi0JICBpbiBjYXNlIGNoYW5uZWwgMyBpcyB1bmF2YWlsYWJsZS4gT24gdGhlIFNINCwgY2hhbm5lbHMgMSwyLCBhbmQgMwotCSAgYXJlIGR1YWwtYWRkcmVzcyBjYXBhYmxlLgotCiBjb25maWcgU0hfRE1BQlJHCiAJYm9vbCAiU0g3NzYwIERNQUJSRyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzYwCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKaW5kZXggNmQxY2JiZS4uZmJjNmYyYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19QQ0kKIAloZWxwCiAJICBGaW5kIG91dCB3aGV0aGVyIHlvdSBoYXZlIGEgUENJIG1vdGhlcmJvYXJkLiBQQ0kgaXMgdGhlIG5hbWUgb2YgYQogCSAgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmIGluc2lkZQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQppbmRleCA5MTA0YjYyLi4xZjE0MWE4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCwxMCArNCw5IEBACiAKIGV4dHJhLXkJOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCiAKLW9iai15CTo9IHByb2Nlc3MubyBzaWduYWwubyB0cmFwcy5vIGlycS5vIFwKLQlwdHJhY2UubyBzZXR1cC5vIHRpbWUubyBzeXNfc2gubyBzZW1hcGhvcmUubyBcCi0JaW8ubyBpb19nZW5lcmljLm8gc2hfa3N5bXMubyBzeXNjYWxscy5vIFwKLQlkZWJ1Z3RyYXBzLm8KK29iai15CTo9IGRlYnVndHJhcHMubyBpby5vIGlvX2dlbmVyaWMubyBpcnEubyBtYWNodmVjLm8gcHJvY2Vzcy5vIHB0cmFjZS5vIFwKKwkgICBzZW1hcGhvcmUubyBzZXR1cC5vIHNpZ25hbC5vIHN5c19zaC5vIHN5c2NhbGxzLm8gXAorCSAgIHRpbWUubyB0b3BvbG9neS5vIHRyYXBzLm8KIAogb2JqLXkJCQkJKz0gY3B1LyB0aW1lcnMvCiBvYmotJChDT05GSUdfVlNZU0NBTEwpCQkrPSB2c3lzY2FsbC8KQEAgLTE3LDcgKzE2LDcgQEAKIG9iai0kKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQkrPSBzaF9iaW9zLm8KIG9iai0kKENPTkZJR19TSF9LR0RCKQkJKz0ga2dkYl9zdHViLm8ga2dkYl9qbXAubwogb2JqLSQoQ09ORklHX1NIX0NQVV9GUkVRKQkrPSBjcHVmcmVxLm8KLW9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KK29iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gc2hfa3N5bXMubyBtb2R1bGUubwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KIG9iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApCSs9IGNyYXNoX2R1bXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jIGIvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jCmluZGV4IGViYzczYjguLjFjM2I5OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NmLWVuYWJsZXIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMKQEAgLTc1LDExICs3NSw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkKIAlhbGxvY2F0ZV9jZl9hcmVhKCk7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9VTktOT1dOKQotCS8qIFRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gZWFjaCBib2FyZCdzIGluaXRfeHh4X2lycS4gKi8KLQltYWtlX2ltYXNrX2lycSgxNCk7Ci0JZGlzYWJsZV9pcnEoMTQpOwotI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKaW5kZXggNjQ1MWFkNi4uOTE3MmU5NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCkBAIC0yMSw4ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLQotZXh0ZXJuIHZvaWQgZGV0ZWN0X2NwdV9hbmRfY2FjaGVfc3lzdGVtKHZvaWQpOworI2luY2x1ZGUgPGFzbS91YmMuaD4KIAogLyoKICAqIEdlbmVyaWMgd3JhcHBlciBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBkaXNhYmxlIG9uLWNoaXAKQEAgLTE1MiwxNSArMTUxLDYgQEAKIAlmbGFncyB8PSBDQ1JfQ0FDSEVfQ0I7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TSF9PQ1JBTQotCS8qIFR1cm4gb24gT0NSQU0gLS0gaGFsdmUgdGhlIE9DICovCi0JZmxhZ3MgfD0gQ0NSX0NBQ0hFX09SQTsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzID4+PSAxOwotCi0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X3NpemUgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzICoKLQkJCQkgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6OwotI2VuZGlmCi0KIAljdHJsX291dGwoZmxhZ3MsIENDUik7CiAJYmFja190b19QMSgpOwogfQpAQCAtMjY5LDcgKzI1OSw2IEBACiAJfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVUJDX1dBS0VVUAogCS8qCiAJICogU29tZSBicmFpbi1kYW1hZ2VkIGxvYWRlcnMgZGVjaWRlZCBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0byBwdXQKIAkgKiB0aGUgVUJDIHRvIHNsZWVwLiBUaGlzIGNhdXNlcyBzb21lIGlzc3VlcyB3aGVuIGl0IGNvbWVzIHRvIHRoaW5ncwpAQCAtMjc3LDcgKzI2Niw1IEBACiAJICogd2Ugd2FrZSBpdCB1cCBhbmQgaG9wZSB0aGF0IGFsbCBpcyB3ZWxsLgogCSAqLwogCXViY193YWtldXAoKTsKLSNlbmRpZgotCiAJc3BlY3VsYXRpdmVfZXhlY3V0aW9uX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYwppbmRleCBkOGUyMmY0Li5jYzUyMjEzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCkBAIC0xMywzNiArMTMsMzEgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLSNkZWZpbmUgSU5UQzJfQkFTRQkweGZlMDgwMDAwCi0jZGVmaW5lIElOVEMyX0lOVE1TSwkoSU5UQzJfQkFTRSArIDB4NDApCi0jZGVmaW5lIElOVEMyX0lOVE1TS0NMUgkoSU5UQzJfQkFTRSArIDB4NjApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkKLSNkZWZpbmUgSU5UQzJfQkFTRQkweGZmZDQwMDAwCi0jZGVmaW5lIElOVEMyX0lOVE1TSwkoSU5UQzJfQkFTRSArIDB4MzgpCi0jZGVmaW5lIElOVEMyX0lOVE1TS0NMUgkoSU5UQzJfQkFTRSArIDB4M2MpCi0jZW5kaWYKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGludGMyX2Rlc2MgKmdldF9pbnRjMl9kZXNjKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwKGlycSk7CisJcmV0dXJuICh2b2lkICopKChjaGFyICopY2hpcCAtIG9mZnNldG9mKHN0cnVjdCBpbnRjMl9kZXNjLCBjaGlwKSk7Cit9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGludGMyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgSU5UQzJfSU5UTVNLICsgcC0+bXNrX29mZnNldCk7CisJc3RydWN0IGludGMyX2Rlc2MgKmQgPSBnZXRfaW50YzJfZGVzYyhpcnEpOworCisJY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBkLT5tc2tfYmFzZSArIHAtPm1za19vZmZzZXQgKworCQkJCSAgICAgKGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpICogNCkpOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGludGMyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgSU5UQzJfSU5UTVNLQ0xSICsgcC0+bXNrX29mZnNldCk7Ci19CisJc3RydWN0IGludGMyX2Rlc2MgKmQgPSBnZXRfaW50YzJfZGVzYyhpcnEpOwogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGludGMyX2lycV9jaGlwID0gewotCS5uYW1lCQk9ICJJTlRDMiIsCi0JLm1hc2sJCT0gZGlzYWJsZV9pbnRjMl9pcnEsCi0JLnVubWFzawkJPSBlbmFibGVfaW50YzJfaXJxLAotCS5tYXNrX2Fjawk9IGRpc2FibGVfaW50YzJfaXJxLAotfTsKKwljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIGQtPm1za2Nscl9iYXNlICsgcC0+bXNrX29mZnNldCArCisJCQkJICAgICAoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgKiA0KSk7Cit9CiAKIC8qCiAgKiBTZXR1cCBhbiBJTlRDMiBzdHlsZSBpbnRlcnJ1cHQuCkBAIC01NiwzMCArNTEsMzYgQEAKICAqCiAgKiBpbiB0aGUgaW50YzJfZGF0YSB0YWJsZS4KICAqLwotdm9pZCBtYWtlX2ludGMyX2lycShzdHJ1Y3QgaW50YzJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQordm9pZCByZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKHN0cnVjdCBpbnRjMl9kZXNjICpkZXNjKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgeworCWRlc2MtPmNoaXAubWFzayA9IGRpc2FibGVfaW50YzJfaXJxOworCWRlc2MtPmNoaXAudW5tYXNrID0gZW5hYmxlX2ludGMyX2lycTsKKwlkZXNjLT5jaGlwLm1hc2tfYWNrID0gZGlzYWJsZV9pbnRjMl9pcnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bnJfaXJxczsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgaXByLCBmbGFnczsKLQkJc3RydWN0IGludGMyX2RhdGEgKnAgPSB0YWJsZSArIGk7CisJCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZGVzYy0+aW50YzJfZGF0YSArIGk7CiAKIAkJZGlzYWJsZV9pcnFfbm9zeW5jKHAtPmlycSk7CiAKLQkJLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWlmIChkZXNjLT5wcmlvX2Jhc2UpIHsKKwkJCS8qIFNldCB0aGUgcHJpb3JpdHkgbGV2ZWwgKi8KKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCQlpcHIgPSBjdHJsX2lubChJTlRDMl9CQVNFICsgcC0+aXByX29mZnNldCk7Ci0JCWlwciAmPSB+KDB4ZiA8PCBwLT5pcHJfc2hpZnQpOwotCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OwotCQljdHJsX291dGwoaXByLCBJTlRDMl9CQVNFICsgcC0+aXByX29mZnNldCk7CisJCQlpcHIgPSBjdHJsX2lubChkZXNjLT5wcmlvX2Jhc2UgKyBwLT5pcHJfb2Zmc2V0KTsKKwkJCWlwciAmPSB+KDB4ZiA8PCBwLT5pcHJfc2hpZnQpOworCQkJaXByIHw9IHAtPnByaW9yaXR5IDw8IHAtPmlwcl9zaGlmdDsKKwkJCWN0cmxfb3V0bChpcHIsIGRlc2MtPnByaW9fYmFzZSArIHAtPmlwcl9vZmZzZXQpOwogCi0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJfQogCi0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmludGMyX2lycV9jaGlwLAorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShwLT5pcnEsICZkZXNjLT5jaGlwLAogCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKIAkJc2V0X2lycV9jaGlwX2RhdGEocC0+aXJxLCBwKTsKIAotCQllbmFibGVfaW50YzJfaXJxKHAtPmlycSk7CisJCWRpc2FibGVfaW50YzJfaXJxKHAtPmlycSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKaW5kZXggMjEwMjgwYi4uOThlODRmNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCkBAIC0yMiw1OCArMjIsNTcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHJfZGVzYyAqZ2V0X2lwcl9kZXNjKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwKGlycSk7CisJcmV0dXJuICh2b2lkICopKChjaGFyICopY2hpcCAtIG9mZnNldG9mKHN0cnVjdCBpcHJfZGVzYywgY2hpcCkpOworfQorCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9pcHJfZGVzYyhpcnEpLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XTsKIAkvKiBTZXQgdGhlIHByaW9yaXR5IGluIElQUiB0byAwICovCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpICYgKDB4ZmZmZiBeICgweGYgPDwgcC0+c2hpZnQpKSwgcC0+YWRkcik7CisJY3RybF9vdXR3KGN0cmxfaW53KGFkZHIpICYgKDB4ZmZmZiBeICgweGYgPDwgcC0+c2hpZnQpKSwgYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfaXByX2Rlc2MoaXJxKS0+aXByX29mZnNldHNbcC0+aXByX2lkeF07CiAJLyogU2V0IHByaW9yaXR5IGluIElQUiBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlICovCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpIHwgKHAtPnByaW9yaXR5IDw8IHAtPnNoaWZ0KSwgcC0+YWRkcik7CisJY3RybF9vdXR3KGN0cmxfaW53KGFkZHIpIHwgKHAtPnByaW9yaXR5IDw8IHAtPnNoaWZ0KSwgYWRkcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXByX2lycV9jaGlwID0gewotCS5uYW1lCQk9ICJJUFIiLAotCS5tYXNrCQk9IGRpc2FibGVfaXByX2lycSwKLQkudW5tYXNrCQk9IGVuYWJsZV9pcHJfaXJxLAotCS5tYXNrX2Fjawk9IGRpc2FibGVfaXByX2lycSwKLX07CisvKgorICogVGhlIHNoaWZ0IHZhbHVlIGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQsIG5vdCB0aGUgbnVtYmVyIG9mCisgKiBiaXRzLzQuIFRoaXMgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUKKyAqIGRhdGFzaGVldHMuIFRoZSBJUFIgYWRkcmVzcyBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBpcHJfb2Zmc2V0IHRhYmxlLgorICovCiAKLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtYWtlX2lwcl9pcnEoc3RydWN0IGlwcl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCit2b2lkIHJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKHN0cnVjdCBpcHJfZGVzYyAqZGVzYykKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycSA9IHRhYmxlW2ldLmlycTsKKwlkZXNjLT5jaGlwLm1hc2sgPSBkaXNhYmxlX2lwcl9pcnE7CisJZGVzYy0+Y2hpcC51bm1hc2sgPSBlbmFibGVfaXByX2lycTsKKwlkZXNjLT5jaGlwLm1hc2tfYWNrID0gZGlzYWJsZV9pcHJfaXJxOwogCi0JCWlmICghaXJxKQotCQkJaXJxID0gdGFibGVbaV0uaXJxID0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bnJfaXJxczsgaSsrKSB7CisJCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGRlc2MtPmlwcl9kYXRhICsgaTsKIAotCQkvKiBjb3VsZCB0aGUgSVBSIGluZGV4IGJlIG1hcHBlZCwgaWYgbm90IHdlIGlnbm9yZSB0aGlzICovCi0JCWlmICghdGFibGVbaV0uYWRkcikgewotCQkJdGFibGVbaV0uYWRkciA9IG1hcF9pcHJpZHhfdG9fYWRkcih0YWJsZVtpXS5pcHJfaWR4KTsKLQkJCWlmICghdGFibGVbaV0uYWRkcikKLQkJCQljb250aW51ZTsKLQkJfQorCQlCVUdfT04ocC0+aXByX2lkeCA+PSBkZXNjLT5ucl9vZmZzZXRzKTsKKwkJQlVHX09OKCFkZXNjLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XSk7CiAKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlwcl9pcnFfY2hpcCwKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKHAtPmlycSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmRlc2MtPmNoaXAsCiAJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7Ci0JCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgJnRhYmxlW2ldKTsKLQkJZW5hYmxlX2lwcl9pcnEoaXJxKTsKKwkJc2V0X2lycV9jaGlwX2RhdGEocC0+aXJxLCBwKTsKKwkJZGlzYWJsZV9pcHJfaXJxKHAtPmlycSk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChtYWtlX2lwcl9pcnEpOworCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19DUFVfSEFTX1BJTlRfSVJRKQogaW50IGlwcl9pcnFfZGVtdXgoaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwppbmRleCBjMTZkYzhmLi5lZThmMWZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCkBAIC0zMTEsNiArMzExLDcgQEAKIAlydGUKIAkgbm9wCiAKKwkuYWxpZ24gMgogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwogMTogICAgIC5sb25nICAgdHJhY2VfaGFyZGlycXNfb2ZmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYwppbmRleCAxMDhlODFiLi5hYmJmMTc0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCkBAIC05LDIzICs5LDE0IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAKIGludCBfX2luaXQgZGV0ZWN0X2NwdV9hbmRfY2FjaGVfc3lzdGVtKHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0KQotCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYwNDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTApOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gNjQ7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncwkJPSAwOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKIAljdXJyZW50X2NwdV9kYXRhLnR5cGUJCQk9IENQVV9TSDc2MTk7CiAJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cwkJPSA0OwogCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyCT0gKDE8PDEyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCmluZGV4IGY4M2ZmOGEuLjFhMTA3ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwpAQCAtNTIsNyArNTIsNyBAQAogfQogX19pbml0Y2FsbChzaDc2MTlfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NjE5X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCXsgODYsIDAsICA0LCAyIH0sCS8qIENNSTAgKi8KIAl7IDg4LCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9FUkkgKi8KIAl7IDg5LCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9SWEkgKi8KQEAgLTY4LDcgKzY4LDcgQEAKIAl7IDk5LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9UWEkgKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CiAJMHhmODA4MDAwMCwJLyogSVBSQyAqLwogCTB4ZjgwODAwMDIsCS8qIElQUkQgKi8KIAkweGY4MDgwMDA0LAkvKiBJUFJFICovCkBAIC03NiwxNSArNzYsMTkgQEAKIAkweGY4MDgwMDA4LAkvKiBJUFJHICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc2MTkiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NjE5X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NjE5X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKaW5kZXggNGVkOTExMC4uYjZlM2E2MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKQEAgLTU3LDcgKzU3LDcgQEAKIH0KIF9faW5pdGNhbGwoc2g3MjA2X2RldmljZXNfc2V0dXApOwogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzIwNl9pcHJfbWFwW10gPSB7CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKIAl7IDE0MCwgIDcsIDEyLCAyIH0sCS8qIENNSTAgKi8KIAl7IDE2NCwgIDgsICA0LCAyIH0sCS8qIE1UVTJfVEdJMUEgKi8KIAl7IDI0MCwgMTMsIDEyLCAzIH0sCS8qIFNDSUYwX0JSSSAqLwpAQCAtNzgsNyArNzgsNyBAQAogCXsgMjU1LCAxMywgIDAsIDMgfSwJLyogU0NJRjNfVFhJICovCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwcl9vZmZzZXRzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewogCTB4ZmZmZTA4MTgsCS8qIElQUjAxICovCiAJMHhmZmZlMDgxYSwJLyogSVBSMDIgKi8KIAkwLAkJLyogdW51c2VkICovCkBAIC05NSwxNSArOTUsMTkgQEAKIAkweGZmZmUwYzEwLAkvKiBJUFIxNCAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmICh1bmxpa2VseShpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKLX0KK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3MjA2IiwKKwl9LAorfTsKIAogdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzIwNl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzIwNl9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKaW5kZXggYjBiNTlkNC4uZDhlMTIyOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwpAQCAtMzQwLDggKzM0MCwyNyBAQAogZ2VuZXJhbF9leGNlcHRpb246CiAJbW92LmwJMWYsIGsyCiAJbW92LmwJMmYsIGszCisjaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMKKwltb3YubAlAazIsIGsyCisKKwkhIElzIEVYUEVWVCBsYXJnZXIgdGhhbiAweDgwMD8KKwltb3YJIzB4OCwgazAKKwlzaGxsOAlrMAorCWNtcC9ocwlrMCwgazIKKwliZgkwZgorCisJISB0aGVuIGFkZCAweDU4MCAoazIgaXMgMHhkODAgb3IgMHhkYTApCisJbW92CSMweDU4LCBrMAorCXNobGwyCWswCisJc2hsbDIJazAKKwlhZGQJazAsIGsyCiswOgorCWJyYQloYW5kbGVfZXhjZXB0aW9uCisJIG5vcAorI2Vsc2UKIAlicmEJaGFuZGxlX2V4Y2VwdGlvbgogCSBtb3YubAlAazIsIGsyCisjZW5kaWYKIAkuYWxpZ24JMgogMToJLmxvbmcJRVhQRVZUCiAyOgkubG9uZwlyZXRfZnJvbV9leGNlcHRpb24KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCmluZGV4IDE5ODNmYjcuLmE1NWI4Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYwpAQCAtNDgsNyArNDgsNyBAQAogfQogX19pbml0Y2FsbChzaDc3MDVfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzA1X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTcwLDI1ICs3MCwyOSBAQAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKLQkweEZGRkZGRUUyCS8qIDA6IElQUkEgKi8KLSwJMHhGRkZGRkVFNAkvKiAxOiBJUFJCICovCi0sCTB4QTQwMDAwMTYJLyogMjogSVBSQyAqLwotLAkweEE0MDAwMDE4CS8qIDM6IElQUkQgKi8KLSwJMHhBNDAwMDAxQQkvKiA0OiBJUFJFICovCi0sCTB4QTQwODAwMDAJLyogNTogSVBSRiAqLwotLAkweEE0MDgwMDAyCS8qIDY6IElQUkcgKi8KLSwJMHhBNDA4MDAwNAkvKiA3OiBJUFJIICovCisJMHhGRkZGRkVFMiwJLyogMDogSVBSQSAqLworCTB4RkZGRkZFRTQsCS8qIDE6IElQUkIgKi8KKwkweEE0MDAwMDE2LAkvKiAyOiBJUFJDICovCisJMHhBNDAwMDAxOCwJLyogMzogSVBSRCAqLworCTB4QTQwMDAwMUEsCS8qIDQ6IElQUkUgKi8KKwkweEE0MDgwMDAwLAkvKiA1OiBJUFJGICovCisJMHhBNDA4MDAwMiwJLyogNjogSVBSRyAqLworCTB4QTQwODAwMDQsCS8qIDc6IElQUkggKi8KIH07CiAKLS8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKLXsKLQlpZiAoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKLX0KK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCiAKLXZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzcwNSIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc3MDVfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MDVfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKaW5kZXggYzdkN2MzNS4uZDc5ZWMwYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCkBAIC0xMiw2ICsxMiwyNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9zY2kuaD4KIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0JeworCQkuc3RhcnQJPSAweGZmZmZmZWMwLAorCQkuZW5kCT0gMHhmZmZmZmVjMCArIDB4MWUsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPLAorCX0sCisJWzFdID0JeworCQkuc3RhcnQgID0gMjAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0JeworCQkuc3RhcnQJPSAyMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbM10gPQl7CisJCS5zdGFydAk9IDIyLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKIAkJLm1hcGJhc2UJPSAweGZmZmZmZTgwLApAQCAtNDEsOCArNjEsMTYgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtcnRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHJ0Y19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHJ0Y19yZXNvdXJjZXMsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzA5X2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzY2lfZGV2aWNlLAorCSZydGNfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g3NzA5X2RldmljZXNfc2V0dXAodm9pZCkKQEAgLTUyLDMyICs4MCw2NiBAQAogfQogX19pbml0Y2FsbChzaDc3MDlfZGV2aWNlc19zZXR1cCk7CiAKLSNkZWZpbmUgSVBSeChBLE4pCS5hZGRyPUEsIC5zaGlmdD1OCi0jZGVmaW5lIElQUkEoTikJSVBSeCgweGZmZmZmZWUyVUwsTikKLSNkZWZpbmUgSVBSQihOKQlJUFJ4KDB4ZmZmZmZlZTRVTCxOKQotI2RlZmluZSBJUFJDKE4pCUlQUngoMHhhNDAwMDAxNlVMLE4pCi0jZGVmaW5lIElQUkQoTikJSVBSeCgweGE0MDAwMDE4VUwsTikKLSNkZWZpbmUgSVBSRShOKQlJUFJ4KDB4YTQwMDAwMWFVTCxOKQorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VIFRVTkkwICovCisJeyAxNywgMCwgOCwgIDQgfSwgLyogVE1VIFRVTkkxICovCisJeyAxOCwgMCwgNCwgIDEgfSwgLyogVE1VIFRVTkkxICovCisJeyAxOSwgMCwgNCwgIDEgfSwgLyogVE1VIFRVTkkxICovCisJeyAyMCwgMCwgMCwgIDIgfSwgLyogUlRDIENVSSAqLworCXsgMjEsIDAsIDAsICAyIH0sIC8qIFJUQyBDVUkgKi8KKwl7IDIyLCAwLCAwLCAgMiB9LCAvKiBSVEMgQ1VJICovCiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzA5X2lwcl9tYXBbXSA9IHsKLQlbMTZdCQk9IHsgSVBSQSgxMiksIDIgfSwgLyogVE1VIFRVTkkwICovCi0JWzE3XQkJPSB7IElQUkEoOCksICA0IH0sIC8qIFRNVSBUVU5JMSAqLwotCVsxOCAuLi4gMTldCT0geyBJUFJBKDQpLCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KLQlbMjAgLi4uIDIyXQk9IHsgSVBSQSgwKSwgIDIgfSwgLyogUlRDIENVSSAqLwotCVsyMyAuLi4gMjZdCT0geyBJUFJCKDQpLCAgMyB9LCAvKiBTQ0kgKi8KLQlbMjddCQk9IHsgSVBSQigxMiksIDIgfSwgLyogV0RUIElUSSAqLwotCVszMl0JCT0geyBJUFJDKDApLCAgMSB9LCAvKiBJUlEgMCAqLwotCVszM10JCT0geyBJUFJDKDQpLCAgMSB9LCAvKiBJUlEgMSAqLwotCVszNF0JCT0geyBJUFJDKDgpLCAgMSB9LCAvKiBJUlEgMiBBUE0gKi8KLQlbMzVdCQk9IHsgSVBSQygxMiksIDEgfSwgLyogSVJRIDMgVE9VQ0hTQ1JFRU4gKi8KLQlbMzZdCQk9IHsgSVBSRCgwKSwgIDEgfSwgLyogSVJRIDQgKi8KLQlbMzddCQk9IHsgSVBSRCg0KSwgIDEgfSwgLyogSVJRIDUgKi8KLQlbNDggLi4uIDUxXQk9IHsgSVBSRSgxMiksIDcgfSwgLyogRE1BICovCi0JWzUyIC4uLiA1NV0JPSB7IElQUkUoOCksICAzIH0sIC8qIElSREEgKi8KLQlbNTYgLi4uIDU5XQk9IHsgSVBSRSg0KSwgIDMgfSwgLyogU0NJRiAqLworCXsgMjMsIDEsIDQsICAzIH0sIC8qIFNDSSAqLworCXsgMjQsIDEsIDQsICAzIH0sIC8qIFNDSSAqLworCXsgMjUsIDEsIDQsICAzIH0sIC8qIFNDSSAqLworCXsgMjYsIDEsIDQsICAzIH0sIC8qIFNDSSAqLworCXsgMjcsIDEsIDEyLCAzIH0sIC8qIFdEVCBJVEkgKi8KKworCXsgMzIsIDIsIDAsICAxIH0sIC8qIElSUSAwICovCisJeyAzMywgMiwgNCwgIDEgfSwgLyogSVJRIDEgKi8KKwl7IDM0LCAyLCA4LCAgMSB9LCAvKiBJUlEgMiBBUE0gKi8KKwl7IDM1LCAyLCAxMiwgMSB9LCAvKiBJUlEgMyBUT1VDSFNDUkVFTiAqLworCisJeyAzNiwgMywgMCwgIDEgfSwgLyogSVJRIDQgKi8KKwl7IDM3LCAzLCA0LCAgMSB9LCAvKiBJUlEgNSAqLworCisJeyA0OCwgNCwgMTIsIDcgfSwgLyogRE1BICovCisJeyA0OSwgNCwgMTIsIDcgfSwgLyogRE1BICovCisJeyA1MCwgNCwgMTIsIDcgfSwgLyogRE1BICovCisJeyA1MSwgNCwgMTIsIDcgfSwgLyogRE1BICovCisKKwl7IDUyLCA0LCA4LCAgMyB9LCAvKiBJUkRBICovCisJeyA1MywgNCwgOCwgIDMgfSwgLyogSVJEQSAqLworCXsgNTQsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKwl7IDU1LCA0LCA4LCAgMyB9LCAvKiBJUkRBICovCisKKwl7IDU2LCA0LCA0LCAgMyB9LCAvKiBTQ0lGICovCisJeyA1NywgNCwgNCwgIDMgfSwgLyogU0NJRiAqLworCXsgNTgsIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KKwl7IDU5LCA0LCA0LCAgMyB9LCAvKiBTQ0lGICovCiB9OwogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pcHIoKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZmZmZWUyLAkvKiAwOiBJUFJBICovCisJMHhmZmZmZmVlNCwJLyogMTogSVBSQiAqLworCTB4YTQwMDAwMTYsCS8qIDI6IElQUkMgKi8KKwkweGE0MDAwMDE4LAkvKiAzOiBJUFJEICovCisJMHhhNDAwMDAxYSwJLyogNDogSVBSRSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MDkiLAorCX0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzA5X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzA5X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCmluZGV4IDUxNzYwYTcuLmY0MGU2ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYwpAQCAtNDksNyArNDksNyBAQAogfQogX19pbml0Y2FsbChzaDc3MTBfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzEwX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTc4LDI2ICs3OCwzMCBAQAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKLQkweEE0MTRGRUUyCS8qIDA6IElQUkEgKi8KLSwJMHhBNDE0RkVFNAkvKiAxOiBJUFJCICovCi0sCTB4QTQxNDAwMTYJLyogMjogSVBSQyAqLwotLAkweEE0MTQwMDE4CS8qIDM6IElQUkQgKi8KLSwJMHhBNDE0MDAxQQkvKiA0OiBJUFJFICovCi0sCTB4QTQwODAwMDAJLyogNTogSVBSRiAqLwotLAkweEE0MDgwMDAyCS8qIDY6IElQUkcgKi8KLSwJMHhBNDA4MDAwNAkvKiA3OiBJUFJIICovCi0sCTB4QTQwODAwMDYJLyogODogSVBSSSAqLworCTB4QTQxNEZFRTIsCS8qIDA6IElQUkEgKi8KKwkweEE0MTRGRUU0LAkvKiAxOiBJUFJCICovCisJMHhBNDE0MDAxNiwJLyogMjogSVBSQyAqLworCTB4QTQxNDAwMTgsCS8qIDM6IElQUkQgKi8KKwkweEE0MTQwMDFBLAkvKiA0OiBJUFJFICovCisJMHhBNDA4MDAwMCwJLyogNTogSVBSRiAqLworCTB4QTQwODAwMDIsCS8qIDY6IElQUkcgKi8KKwkweEE0MDgwMDA0LAkvKiA3OiBJUFJIICovCisJMHhBNDA4MDAwNiwJLyogODogSVBSSSAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKIAotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzEwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzcxMF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcxMF9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQppbmRleCA4YWRkMTBiLi5kYWRkNmJmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDExIEBACiAKICMgQ1BVIHN1YnR5cGUgc2V0dXAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUikJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKQkrPSBzZXR1cC1zaDc3NTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkJKz0gc2V0dXAtc2g3NzUwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikJKz0gc2V0dXAtc2g3NzUwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCSs9IHNldHVwLXNoNzc2MC5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikJKz0gc2V0dXAtc2g0LTIwMi5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYwppbmRleCBmYWIyZWIwLi42NmMzZjc1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCkBAIC0xNDEsNiArMTQxLDE0IEBACiAJCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfTExTQzsKIAkJfQogCQlicmVhazsKKwljYXNlIDB4NDAwMDoJLyogMXN0IGN1dCAqLworCWNhc2UgMHg0MDAxOgkvKiAybmQgY3V0ICovCisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSFgzOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8CisJCQkJCSAgQ1BVX0hBU19MTFNDOworCQlicmVhazsKIAljYXNlIDB4ODAwMDoKIAkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NUNDBSQTsKIAkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCmluZGV4IDAzYjE0Y2YuLmRhMTUzYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwpAQCAtODIsNyArODIsNyBAQAogfQogX19pbml0Y2FsbChzaDc3NTBfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzUwX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAxMiwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTEwNiw4ICsxMDYsMjcgQEAKIAl7IDM4LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNQUUgKi8KIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJMHhmZmQwMDAwNFVMLAkvKiAwOiBJUFJBICovCisJMHhmZmQwMDAwOFVMLAkvKiAxOiBJUFJCICovCisJMHhmZmQwMDAwY1VMLAkvKiAyOiBJUFJDICovCisJMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzc1MCIsCisJfSwKK307CisKICNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzc1MV9pcHJfbWFwW10gPSB7CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVfc2g3NzUxW10gPSB7CiAJeyA0NCwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNCAqLwogCXsgNDUsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTUgKi8KIAl7IDQ2LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU2ICovCkBAIC0xMTgsMjEgKzEzNywyNiBAQAogCS8qeyA3MiwgSU5UUFJJMDAsICA4LCA/IH0sKi8gLyogVE1VMyBUVU5JICovCiAJLyp7IDc2LCBJTlRQUkkwMCwgMTIsID8gfSwqLyAvKiBUTVU0IFRVTkkgKi8KIH07CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjX3NoNzc1MSA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZV9zaDc3NTEsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGVfc2g3NzUxKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzUxIiwKKwl9LAorfTsKICNlbmRpZgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4ZmZkMDAwMDRVTCwJLyogMDogSVBSQSAqLwotCTB4ZmZkMDAwMDhVTCwJLyogMTogSVBSQiAqLwotCTB4ZmZkMDAwMGNVTCwJLyogMjogSVBSQyAqLwotCTB4ZmZkMDAwMTBVTCwJLyogMzogSVBSRCAqLwotfTsKLQotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CisjaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MQorCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2Nfc2g3NzUxKTsKKyNlbmRpZgogfQogCiAjZGVmaW5lIElOVENfSUNSCTB4ZmZkMDAwMDBVTApAQCAtMTQzLDExICsxNjcsMyBAQAogewogCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7CiB9Ci0KLXZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCi17Ci0JbWFrZV9pcHJfaXJxKHNoNzc1MF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc1MF9pcHJfbWFwKSk7Ci0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MQotCW1ha2VfaXByX2lycShzaDc3NTFfaXByX21hcCwgQVJSQVlfU0laRShzaDc3NTFfaXByX21hcCkpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwppbmRleCBiN2M3MDI4Li4zZGYxNjk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKQEAgLTk2LDcgKzk2LDI1IEBACiAJezEwOSwxMiwgIDAsIDQsICAwLCAgM30sCS8qIENNVEkgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzYwX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGVzYyBpbnRjMl9pcnFfZGVzYyBfX3JlYWRfbW9zdGx5ID0geworCS5wcmlvX2Jhc2UJPSAweGZlMDgwMDAwLAorCS5tc2tfYmFzZQk9IDB4ZmUwODAwNDAsCisJLm1za2Nscl9iYXNlCT0gMHhmZTA4MDA2MCwKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLXNoNzc2MCIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit7CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOworfQorCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKIAkvKiBJUlEsIElQUi1pZHgsIHNoaWZ0LCBwcmlvcml0eSAqLwogCXsgMTYsIDAsIDEyLCAyIH0sIC8qIFRNVTAgVFVOSSovCiAJeyAxNywgMCwgIDgsIDIgfSwgLyogVE1VMSBUVU5JICovCkBAIC0xMzMsMjAgKzE1MSwxOSBAQAogCTB4ZmZkMDAwMTBVTCwJLyogMzogSVBSRCAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKIAotdm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKLXsKLQltYWtlX2ludGMyX2lycShpbnRjMl9pcnFfdGFibGUsIEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSk7Ci19CisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCiAKLXZvaWQgX19pbml0ICBpbml0X0lSUV9pcHIodm9pZCkKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzc2MCIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc3NjBfaXByX21hcCwgQVJSQVlfU0laRShzaDc3NjBfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZQppbmRleCBhYjc0MjJmLi40MDA2MjMyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZQpAQCAtOSw2ICs5LDcgQEAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQkrPSBzZXR1cC1zaDczMTgwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCSs9IHNldHVwLXNoNzM0My5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQkrPSBzZXR1cC1zaDc3MjIubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCQkrPSBzZXR1cC1zaHgzLm8KIAogIyBQcmltYXJ5IG9uLWNoaXAgY2xvY2tzIChjb21tb24pCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQk6PSBjbG9jay1zaDczMTgwLm8KQEAgLTE3LDUgKzE4LDYgQEAKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkJOj0gY2xvY2stc2g3Nzg1Lm8KIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJOj0gY2xvY2stc2g3MzQzLm8KIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikJOj0gY2xvY2stc2g3NzIyLm8KK2Nsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCTo9IGNsb2NrLXNoeDMubwogCiBvYmoteQkrPSAkKGNsb2NrLXkpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaHgzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaHgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzMGIyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2h4My5jCisgKgorICogU0gtWDMgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUmVuZXNhcyBUZWNobm9sb2d5IENvcnAuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IGlmY19kaXZpc29yc1tdID0geyAxLCAyLCA0ICw2IH07CitzdGF0aWMgaW50IGJmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxMiwgMTYsIDE4LCAyNCwgMzIsIDM2LCA0OCB9Oworc3RhdGljIGludCBwZmNfZGl2aXNvcnNbXSA9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMTgsIDI0LCAzMiwgMzYsIDQ4IH07CitzdGF0aWMgaW50IGNmY19kaXZpc29yc1tdID0geyAxLCAxLCA0LCA2IH07CisKKyNkZWZpbmUgSUZDX1BPUwkJMjgKKyNkZWZpbmUgSUZDX01TSwkJMHgwMDAzCisjZGVmaW5lIEJGQ19NU0sJCTB4MDAwZgorI2RlZmluZSBQRkNfTVNLCQkweDAwMGYKKyNkZWZpbmUgQ0ZDX01TSwkJMHgwMDAzCisjZGVmaW5lIEJGQ19QT1MJCTE2CisjZGVmaW5lIFBGQ19QT1MJCTAKKyNkZWZpbmUgQ0ZDX1BPUwkJMjAKKworc3RhdGljIHZvaWQgbWFzdGVyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPnJhdGUgKj0gcGZjX2Rpdmlzb3JzWyhjdHJsX2lubChGUlFDUikgPj4gUEZDX1BPUykgJiBQRkNfTVNLXTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfbWFzdGVyX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBQRkNfUE9TKSAmIFBGQ19NU0spOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX21vZHVsZV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IEJGQ19QT1MpICYgQkZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfYnVzX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gSUZDX1BPUykgJiBJRkNfTVNLKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaHgzX2Nsa19vcHNbXSA9IHsKKwkmc2h4M19tYXN0ZXJfY2xrX29wcywKKwkmc2h4M19tb2R1bGVfY2xrX29wcywKKwkmc2h4M19idXNfY2xrX29wcywKKwkmc2h4M19jcHVfY2xrX29wcywKK307CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgaWR4KQoreworCWlmIChpZHggPCBBUlJBWV9TSVpFKHNoeDNfY2xrX29wcykpCisJCSpvcHMgPSBzaHgzX2Nsa19vcHNbaWR4XTsKK30KKworc3RhdGljIHZvaWQgc2h5d2F5X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBDRkNfUE9TKSAmIENGQ19NU0spOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gY2ZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX3NoeXdheV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gc2h5d2F5X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzaHgzX3NoeXdheV9jbGsgPSB7CisJLm5hbWUJCT0gInNoeXdheV9jbGsiLAorCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCisJLm9wcwkJPSAmc2h4M19zaHl3YXlfY2xrX29wcywKK307CisKKy8qCisgKiBBZGRpdGlvbmFsIFNIeDMtc3BlY2lmaWMgb24tY2hpcCBjbG9ja3MgdGhhdCBhcmVuJ3QgYWxyZWFkeSBwYXJ0IG9mIHRoZQorICogY2xvY2sgZnJhbWV3b3JrCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrICpzaHgzX29uY2hpcF9jbG9ja3NbXSA9IHsKKwkmc2h4M19zaHl3YXlfY2xrLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2h4M19jbGtfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNoeDNfb25jaGlwX2Nsb2Nrcyk7IGkrKykgeworCQlzdHJ1Y3QgY2xrICpjbGtwID0gc2h4M19vbmNoaXBfY2xvY2tzW2ldOworCisJCWNsa3AtPnBhcmVudCA9IGNsazsKKwkJY2xrX3JlZ2lzdGVyKGNsa3ApOworCQljbGtfZW5hYmxlKGNsa3ApOworCX0KKworCS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgY2xvY2tzIHJlZ2lzdGVyZWQsIHdlIG5lZWQgdG8KKwkgKiBmb3JjZSB0aGUgcGFyZW50IGNsb2NrIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IHRoZXNlIGNsb2NrcyB3aWxsCisJICogYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IHRoZWlyIHJhdGUuIFdlIGNoZWF0IGJ5IGhhbmRpbmcgdGhlCisJICogcGFyZW50IGNsb2NrIGl0cyBjdXJyZW50IHJhdGUgYW5kIGZvcmNpbmcgY2hpbGQgcHJvcGFnYXRpb24uCisJICovCisJY2xrX3NldF9yYXRlKGNsaywgY2xrX2dldF9yYXRlKGNsaykpOworCisJY2xrX3B1dChjbGspOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHNoeDNfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYwppbmRleCAxMTQzZmJmLi5hM2UxNTllIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBTSDc3MjIgU2V0dXAKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyAgUGF1bCBNdW5kdAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMCw2ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9zY2kuaD4KIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CkBAIC00Miw3ICs0NCw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcyMl9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MjJfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpbyAqLwogCXsgMTYsIDAsIDEyLCAyIH0sIC8qIFRNVTAgKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxICovCkBAIC02NywxNCArNjksMjUgQEAKIAkweGE0MDgwMDJjLCAvKiAxMTogSVBSTCAqLwogfTsKIAotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmICh1bmxpa2VseShpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKLX0KK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzIyIiwKKwl9LAorfTsKIAogdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzcyMl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcyMl9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCit7CisJLyogUmVnaXN0ZXIgdGhlIFVSQU0gc3BhY2UgYXMgTm9kZSAxICovCisJc2V0dXBfYm9vdG1lbV9ub2RlKDEsIDB4MDU1ZjAwMDAsIDB4MDU2MTAwMDApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwppbmRleCA5YWVhYTJkLi5iNTdjNzYwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwpAQCAtMTAyLDcgKzEwMiwyMCBAQAogCXsgNjgsIDB4MTQsICA4LCAwLCAxOCwgMiB9LAkvKiBQQ0lDNCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmZkNDAwMDAsCisJLm1za19iYXNlCT0gMHhmZmQ0MDAzOCwKKwkubXNrY2xyX2Jhc2UJPSAweGZmZDQwMDNjLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2g3NzgwIiwKKwl9LAorfTsKKwogdm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKIHsKLQltYWtlX2ludGMyX2lycShpbnRjMl9pcnFfdGFibGUsIEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSk7CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYwppbmRleCAwN2IwZGU4Li5jZTEwZWM1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYwpAQCAtOTcsNyArOTcsMjEgQEAKIAl7IDYwLCAxMiwgMTYsIDAsIDcsIDMgfSwJLyogU0NJRjUgRVJJLCBSWEksIEJSSSwgVFhJICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMHhmZmQ0MDAwMCwKKwkubXNrX2Jhc2UJPSAweGZmZDQwMDM4LAorCS5tc2tjbHJfYmFzZQk9IDB4ZmZkNDAwM2MsCisKKwkuaW50YzJfZGF0YQk9IGludGMyX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJTlRDMi1zaDc3ODUiLAorCX0sCit9OworCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQogewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7CiB9CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY4M2VhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBTSC1YMyBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9zY2kuaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4ZmZjMzAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDQwLCA0MSwgNDMsIDQyIH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmZjNDAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDQ0LCA0NSwgNDcsIDQ2IH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmZjNTAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDQ4LCA0OSwgNTEsIDUwIH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmZjNjAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDUyLCA1MywgNTUsIDU0IH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2h4M19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2NpX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoeDNfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaHgzX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoc2h4M19kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNoeDNfZGV2aWNlc19zZXR1cCk7CisKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGF0YSBpbnRjMl9pcnFfdGFibGVbXSA9IHsKKwl7IDE2LCAwLCAwLCAwLCAxLCAyIH0sCQkvKiBUTVUwICovCisJeyA0MCwgNCwgMCwgMHgyMCwgMCwgMyB9LAkvKiBTQ0lGMCBFUkkgKi8KKwl7IDQxLCA0LCAwLCAweDIwLCAxLCAzIH0sCS8qIFNDSUYwIFJYSSAqLworCXsgNDIsIDQsIDAsIDB4MjAsIDIsIDMgfSwJLyogU0NJRjAgQlJJICovCisJeyA0MywgNCwgMCwgMHgyMCwgMywgMyB9LAkvKiBTQ0lGMCBUWEkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGVzYyBpbnRjMl9pcnFfZGVzYyBfX3JlYWRfbW9zdGx5ID0geworCS5wcmlvX2Jhc2UJPSAweGZlNDEwMDAwLAorCS5tc2tfYmFzZQk9IDB4ZmU0MTA4MjAsCisJLm1za2Nscl9iYXNlCT0gMHhmZTQxMDg1MCwKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLVNIWDMiLAorCX0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQoreworCXJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoJmludGMyX2lycV9kZXNjKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2lycS5jIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKaW5kZXggMjdiOTIzYy4uMjc4OTc3OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaXJxLmMKQEAgLTE1OCwxNSArMTU4LDExIEBACiB9CiAKICNpZmRlZiBDT05GSUdfNEtTVEFDS1MKLS8qCi0gKiBUaGVzZSBzaG91bGQgcmVhbGx5IGJlIF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpIGFzIHdlbGwsIGJ1dAotICogZ2NjJ3MgMy4wIGFuZCBlYXJsaWVyIGRvbid0IGhhbmRsZSB0aGF0IGNvcnJlY3RseS4KLSAqLwogc3RhdGljIGNoYXIgc29mdGlycV9zdGFja1tOUl9DUFVTICogVEhSRUFEX1NJWkVdCi0JCV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFRIUkVBRF9TSVpFKSkpOworCQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmJzcy5wYWdlX2FsaWduZWQiKSkpOwogCiBzdGF0aWMgY2hhciBoYXJkaXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KLQkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKIC8qCiAgKiBhbGxvY2F0ZSBwZXItY3B1IHN0YWNrcyBmb3IgaGFyZGlycSBhbmQgZm9yIHNvZnRpcnEgcHJvY2Vzc2luZwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvbWFjaHZlYy5jIGIvYXJjaC9zaC9rZXJuZWwvbWFjaHZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzU5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKKyAqCisgKiBUaGUgU3VwZXJIIG1hY2hpbmUgdmVjdG9yIHNldHVwIGhhbmRsZXJzLCB5YW5rZWQgZnJvbSBzZXR1cC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSAgTmlpYmUgWXV0YWthCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgTVZfTkFNRV9TSVpFIDMyCisKKyNkZWZpbmUgZm9yX2VhY2hfbXYobXYpIFwKKwlmb3IgKChtdikgPSAoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICopJl9fbWFjaHZlY19zdGFydDsgXAorCSAgICAgKG12KSAmJiAodW5zaWduZWQgbG9uZykobXYpIDwgKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19lbmQ7IFwKKwkgICAgIChtdikrKykKKworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciAqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdjsKKworCWZvcl9lYWNoX212KG12KQorCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBtdi0+bXZfbmFtZSkgPT0gMCkKKwkJCXJldHVybiBtdjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbWFjaHZlY19zZWxlY3RlZDsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfbXYoY2hhciAqZnJvbSkKK3sKKwljaGFyIG12X25hbWVbTVZfTkFNRV9TSVpFXSA9ICIiOworCWNoYXIgKm12X2VuZDsKKwljaGFyICptdl9jb21tYTsKKwlpbnQgbXZfbGVuOworCXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciAqbXZwOworCisJbXZfZW5kID0gc3RyY2hyKGZyb20sICcgJyk7CisJaWYgKG12X2VuZCA9PSBOVUxMKQorCQltdl9lbmQgPSBmcm9tICsgc3RybGVuKGZyb20pOworCisJbXZfY29tbWEgPSBzdHJjaHIoZnJvbSwgJywnKTsKKwltdl9sZW4gPSBtdl9lbmQgLSBmcm9tOworCWlmIChtdl9sZW4gPiAoTVZfTkFNRV9TSVpFLTEpKQorCQltdl9sZW4gPSBNVl9OQU1FX1NJWkUtMTsKKwltZW1jcHkobXZfbmFtZSwgZnJvbSwgbXZfbGVuKTsKKwltdl9uYW1lW212X2xlbl0gPSAnXDAnOworCWZyb20gPSBtdl9lbmQ7CisKKwltYWNodmVjX3NlbGVjdGVkID0gMTsKKworCS8qIEJvb3Qgd2l0aCB0aGUgZ2VuZXJpYyB2ZWN0b3IgKi8KKwlpZiAoc3RyY21wKG12X25hbWUsICJnZW5lcmljIikgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltdnAgPSBnZXRfbXZfYnluYW1lKG12X25hbWUpOworCWlmICh1bmxpa2VseSghbXZwKSkgeworCQlwcmludGsoIkF2YWlsYWJsZSB2ZWN0b3JzOlxuXG5cdCclcycsICIsIHNoX212Lm12X25hbWUpOworCQlmb3JfZWFjaF9tdihtdnApCisJCQlwcmludGsoIiclcycsICIsIG12cC0+bXZfbmFtZSk7CisJCXByaW50aygiXG5cbiIpOworCQlwYW5pYygiRmFpbGVkIHRvIHNlbGVjdCBtYWNodmVjICclcycgLS0gaGFsdGluZy5cbiIsCisJCSAgICAgIG12X25hbWUpOworCX0gZWxzZQorCQlzaF9tdiA9ICptdnA7CisKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJzaF9tdiIsIGVhcmx5X3BhcnNlX212KTsKKwordm9pZCBfX2luaXQgc2hfbXZfc2V0dXAodm9pZCkKK3sKKwkvKgorCSAqIE9ubHkgb3ZlcmxvYWQgdGhlIG1hY2h2ZWMgaWYgb25lIGhhc24ndCBiZWVuIHNlbGVjdGVkIG9uCisJICogdGhlIGNvbW1hbmQgbGluZSB3aXRoIHNoX212PQorCSAqLworCWlmICghbWFjaHZlY19zZWxlY3RlZCkgeworCQl1bnNpZ25lZCBsb25nIG1hY2h2ZWNfc2l6ZTsKKworCQltYWNodmVjX3NpemUgPSAoKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19lbmQgLQorCQkJCSh1bnNpZ25lZCBsb25nKSZfX21hY2h2ZWNfc3RhcnQpOworCisJCS8qCisJCSAqIElmIHRoZSBtYWNodmVjIGhhc24ndCBiZWVuIHByZXNlbGVjdGVkLCB1c2UgdGhlIGZpcnN0CisJCSAqIHZlY3RvciAodXN1YWxseSB0aGUgb25seSBvbmUpIGZyb20gLm1hY2h2ZWMuaW5pdC4KKwkJICovCisJCWlmIChtYWNodmVjX3NpemUgPj0gc2l6ZW9mKHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvcikpCisJCQlzaF9tdiA9ICooc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICopJl9fbWFjaHZlY19zdGFydDsKKwl9CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIkJvb3RpbmcgbWFjaHZlYzogJXNcbiIsIGdldF9zeXN0ZW1fdHlwZSgpKTsKKworCS8qCisJICogTWFudWFsbHkgd2FsayB0aGUgdmVjLCBmaWxsIGluIGFueXRoaW5nIHRoYXQgdGhlIGJvYXJkIGhhc24ndCB5ZXQKKwkgKiBieSBoYW5kLCB3cmFwcGluZyB0byB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKyNkZWZpbmUgbXZfc2V0KGVsZW0pIGRvIHsgXAorCWlmICghc2hfbXYubXZfIyNlbGVtKSBcCisJCXNoX212Lm12XyMjZWxlbSA9IGdlbmVyaWNfIyNlbGVtOyBcCit9IHdoaWxlICgwKQorCisJbXZfc2V0KGluYik7CW12X3NldChpbncpOwltdl9zZXQoaW5sKTsKKwltdl9zZXQob3V0Yik7CW12X3NldChvdXR3KTsJbXZfc2V0KG91dGwpOworCisJbXZfc2V0KGluYl9wKTsJbXZfc2V0KGlud19wKTsJbXZfc2V0KGlubF9wKTsKKwltdl9zZXQob3V0Yl9wKTsJbXZfc2V0KG91dHdfcCk7CW12X3NldChvdXRsX3ApOworCisJbXZfc2V0KGluc2IpOwltdl9zZXQoaW5zdyk7CW12X3NldChpbnNsKTsKKwltdl9zZXQob3V0c2IpOwltdl9zZXQob3V0c3cpOwltdl9zZXQob3V0c2wpOworCisJbXZfc2V0KHJlYWRiKTsJbXZfc2V0KHJlYWR3KTsJbXZfc2V0KHJlYWRsKTsKKwltdl9zZXQod3JpdGViKTsJbXZfc2V0KHdyaXRldyk7CW12X3NldCh3cml0ZWwpOworCisJbXZfc2V0KGlvcG9ydF9tYXApOworCW12X3NldChpb3BvcnRfdW5tYXApOworCW12X3NldChpcnFfZGVtdXgpOworCisJaWYgKCFzaF9tdi5tdl9ucl9pcnFzKQorCQlzaF9tdi5tdl9ucl9pcnFzID0gTlJfSVJRUzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYwppbmRleCBhMTFlMmFhLi42MzM0YTRjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpAQCAtMzE5LDkgKzMyMCw3IEBACiAJY3RybF9vdXRsKHBjLCBVQkNfQkFSQSk7CiAKICNpZmRlZiBDT05GSUdfTU1VCi0JLyogV2UgZG9uJ3QgaGF2ZSBhbnkgQVNJRCBzZXR0aW5ncyBmb3IgdGhlIFNILTIhICovCi0JaWYgKGN1cnJlbnRfY3B1X2RhdGEudHlwZSAhPSBDUFVfU0g3NjA0KQotCQljdHJsX291dGIoYXNpZCwgVUJDX0JBU1JBKTsKKwljdHJsX291dGIoYXNpZCwgVUJDX0JBU1JBKTsKICNlbmRpZgogCiAJY3RybF9vdXRsKDAsIFVCQ19CQU1SQSk7CkBAIC00MDUsOCArNDA0LDggQEAKIAkJCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCiAJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogI2lmZGVmIENPTkZJR19NTVUKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAJcmV0dXJuIGRvX2ZvcmsoU0lHQ0hMRCwgcmVncy0+cmVnc1sxNV0sIHJlZ3MsIDAsIE5VTEwsIE5VTEwpOwogI2Vsc2UKIAkvKiBmb3JrIGFsbW9zdCB3b3JrcywgZW5vdWdoIHRvIHRyaWNrIHlvdSBpbnRvIGxvb2tpbmcgZWxzZXdoZXJlIDotKCAqLwpAQCAtNDQ5LDIzICs0NDgsMjAgQEAKIC8qCiAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KICAqLwotYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyICp1ZmlsZW5hbWUsIGNoYXIgKip1YXJndiwKLQkJCSAgY2hhciAqKnVlbnZwLCB1bnNpZ25lZCBsb25nIHI3LAorYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqdWZpbGVuYW1lLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqdWFyZ3YsCisJCQkgIGNoYXIgX191c2VyICogX191c2VyICp1ZW52cCwgdW5zaWduZWQgbG9uZyByNywKIAkJCSAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlpbnQgZXJyb3I7CiAJY2hhciAqZmlsZW5hbWU7CiAKLQlmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopdWZpbGVuYW1lKTsKKwlmaWxlbmFtZSA9IGdldG5hbWUodWZpbGVuYW1lKTsKIAllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwogCWlmIChJU19FUlIoZmlsZW5hbWUpKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLAotCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKil1YXJndiwKLQkJCSAgKGNoYXIgX191c2VyICogX191c2VyICopdWVudnAsCi0JCQkgIHJlZ3MpOworCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCB1YXJndiwgdWVudnAsIHJlZ3MpOwogCWlmIChlcnJvciA9PSAwKSB7CiAJCXRhc2tfbG9jayhjdXJyZW50KTsKIAkJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jCmluZGV4IDNmYjVmYzAuLjg5MWQxZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jCkBAIC05MSwxNyArOTEsOCBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCWJyZWFrOwotCX0KKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTI4LDE3ICsxMTksMTQgQEAKIAkJCXRtcCA9ICEhdHNrX3VzZWRfbWF0aChjaGlsZCk7CiAJCWVsc2UKIAkJCXRtcCA9IDA7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKilkYXRhKTsKKwkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhKTsKIAkJYnJlYWs7CiAJfQogCiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KQEAgLTE5Niw3ICsxODQsNyBAQAogCiAJY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDogeyAgLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCiAJCWxvbmcgcGM7Ci0JCXN0cnVjdCBwdF9yZWdzICpkdW1teSA9IE5VTEw7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gTlVMTDsKIAogCQlyZXQgPSAtRUlPOwogCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKQEAgLTIwNyw3ICsxOTUsNyBAQAogCQkJY2hpbGQtPnB0cmFjZSB8PSBQVF9EVFJBQ0U7CiAJCX0KIAotCQlwYyA9IGdldF9zdGFja19sb25nKGNoaWxkLCAobG9uZykmZHVtbXktPnBjKTsKKwkJcGMgPSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgKGxvbmcpJnJlZ3MtPnBjKTsKIAogCQkvKiBOZXh0IHNjaGVkdWxpbmcgd2lsbCBzZXQgdXAgVUJDICovCiAJCWlmIChjaGlsZC0+dGhyZWFkLnViY19wYyA9PSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKaW5kZXggYzI3NzI5MS4uZGU4ZTZlMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtNDEsMjAgKzQyLDE5IEBACiAgKiBUaGUgYmlnZ2VyIHZhbHVlIG1lYW5zIG5vIHByb2JsZW0uCiAgKi8KIHN0cnVjdCBzaF9jcHVpbmZvIGJvb3RfY3B1X2RhdGEgPSB7IENQVV9TSF9OT05FLCAxMDAwMDAwMCwgfTsKKworLyoKKyAqIFRoZSBtYWNoaW5lIHZlY3Rvci4gRmlyc3QgZW50cnkgaW4gLm1hY2h2ZWMuaW5pdCwgb3IgY2xvYmJlcmVkIGJ5CisgKiBzaF9tdj0gb24gdGhlIGNvbW1hbmQgbGluZSwgcHJpb3IgdG8gLm1hY2h2ZWMuaW5pdCB0ZWFyZG93bi4KKyAqLworc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212ID0geyAubXZfbmFtZSA9ICJnZW5lcmljIiwgfTsKKwogI2lmZGVmIENPTkZJR19WVAogc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9VTktOT1dOKQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212OwotI2VuZGlmCi0KIGV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCi0jZGVmaW5lIE1WX05BTUVfU0laRSAzMgotCi1zdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKiBfX2luaXQgZ2V0X212X2J5bmFtZShjb25zdCBjaGFyKiBuYW1lKTsKLQogLyoKICAqIFRoaXMgaXMgc2V0IHVwIGJ5IHRoZSBzZXR1cC1yb3V0aW5lIGF0IGJvb3QtdGltZQogICovCkBAIC04MCwxMzEgKzgwLDE3IEBACiAKIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0LCBtZW1vcnlfZW5kOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFyc2VfY21kbGluZSAoY2hhciAqKiBjbWRsaW5lX3AsIGNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdLAotCQkJCSAgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKiogbXZwLAotCQkJCSAgdW5zaWduZWQgbG9uZyAqbXZfaW9fYmFzZSkKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX21lbShjaGFyICpwKQogewotCWNoYXIgYyA9ICcgJywgKnRvID0gY29tbWFuZF9saW5lLCAqZnJvbSA9IENPTU1BTkRfTElORTsKLQlpbnQgbGVuID0gMDsKLQotCS8qIFNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KLQltZW1jcHkoYm9vdF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORSwgQ09NTUFORF9MSU5FX1NJWkUpOwotCWJvb3RfY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFLTFdID0gJ1wwJzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CiAKIAltZW1vcnlfc3RhcnQgPSAodW5zaWduZWQgbG9uZylQQUdFX09GRlNFVCtfX01FTU9SWV9TVEFSVDsKLQltZW1vcnlfZW5kID0gbWVtb3J5X3N0YXJ0ICsgX19NRU1PUllfU0laRTsKLQotCWZvciAoOzspIHsKLQkJLyoKLQkJICogIm1lbT1YWFhba0ttTV0iIGRlZmluZXMgYSBzaXplIG9mIG1lbW9yeS4KLQkJICovCi0JCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJtZW09IiwgNCkpIHsKLQkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCi0JCQkJdG8tLTsKLQkJCXsKLQkJCQl1bnNpZ25lZCBsb25nIG1lbV9zaXplOwotCi0JCQkJbWVtX3NpemUgPSBtZW1wYXJzZShmcm9tKzQsICZmcm9tKTsKLQkJCQltZW1vcnlfZW5kID0gbWVtb3J5X3N0YXJ0ICsgbWVtX3NpemU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYyA9PSAnICcgJiYgIW1lbWNtcChmcm9tLCAic2hfbXY9IiwgNikpIHsKLQkJCWNoYXIqIG12X2VuZDsKLQkJCWNoYXIqIG12X2NvbW1hOwotCQkJaW50IG12X2xlbjsKLQkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCi0JCQkJdG8tLTsKLQkJCWZyb20gKz0gNjsKLQkJCW12X2VuZCA9IHN0cmNocihmcm9tLCAnICcpOwotCQkJaWYgKG12X2VuZCA9PSBOVUxMKQotCQkJCW12X2VuZCA9IGZyb20gKyBzdHJsZW4oZnJvbSk7Ci0KLQkJCW12X2NvbW1hID0gc3RyY2hyKGZyb20sICcsJyk7Ci0JCQlpZiAoKG12X2NvbW1hICE9IE5VTEwpICYmIChtdl9jb21tYSA8IG12X2VuZCkpIHsKLQkJCQlpbnQgaW50c1szXTsKLQkJCQlnZXRfb3B0aW9ucyhtdl9jb21tYSsxLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQkJCQkqbXZfaW9fYmFzZSA9IGludHNbMV07Ci0JCQkJbXZfbGVuID0gbXZfY29tbWEgLSBmcm9tOwotCQkJfSBlbHNlIHsKLQkJCQltdl9sZW4gPSBtdl9lbmQgLSBmcm9tOwotCQkJfQotCQkJaWYgKG12X2xlbiA+IChNVl9OQU1FX1NJWkUtMSkpCi0JCQkJbXZfbGVuID0gTVZfTkFNRV9TSVpFLTE7Ci0JCQltZW1jcHkobXZfbmFtZSwgZnJvbSwgbXZfbGVuKTsKLQkJCW12X25hbWVbbXZfbGVuXSA9ICdcMCc7Ci0JCQlmcm9tID0gbXZfZW5kOwotCi0JCQkqbXZwID0gZ2V0X212X2J5bmFtZShtdl9uYW1lKTsKLQkJfQotCi0JCWMgPSAqKGZyb20rKyk7Ci0JCWlmICghYykKLQkJCWJyZWFrOwotCQlpZiAoQ09NTUFORF9MSU5FX1NJWkUgPD0gKytsZW4pCi0JCQlicmVhazsKLQkJKih0bysrKSA9IGM7Ci0JfQotCSp0byA9ICdcMCc7Ci0JKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc2hfbXZfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKLXsKLSNpZmRlZiBDT05GSUdfU0hfVU5LTk9XTgotCWV4dGVybiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdW5rbm93bjsKLSNlbmRpZgotCXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciAqbXYgPSBOVUxMOwotCWNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdID0gIiI7Ci0JdW5zaWduZWQgbG9uZyBtdl9pb19iYXNlID0gMDsKLQotCXBhcnNlX2NtZGxpbmUoY21kbGluZV9wLCBtdl9uYW1lLCAmbXYsICZtdl9pb19iYXNlKTsKLQotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JaWYgKG12ID09IE5VTEwpIHsKLQkJbXYgPSAmbXZfdW5rbm93bjsKLQkJaWYgKCptdl9uYW1lICE9ICdcMCcpIHsKLQkJCXByaW50aygiV2FybmluZzogVW5zdXBwb3J0ZWQgbWFjaGluZSAlcywgdXNpbmcgdW5rbm93blxuIiwKLQkJCSAgICAgICBtdl9uYW1lKTsKLQkJfQotCX0KLQlzaF9tdiA9ICptdjsKLSNlbmRpZgotCi0JLyoKLQkgKiBNYW51YWxseSB3YWxrIHRoZSB2ZWMsIGZpbGwgaW4gYW55dGhpbmcgdGhhdCB0aGUgYm9hcmQgaGFzbid0IHlldAotCSAqIGJ5IGhhbmQsIHdyYXBwaW5nIHRvIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgotCSAqLwotI2RlZmluZSBtdl9zZXQoZWxlbSkgZG8geyBcCi0JaWYgKCFzaF9tdi5tdl8jI2VsZW0pIFwKLQkJc2hfbXYubXZfIyNlbGVtID0gZ2VuZXJpY18jI2VsZW07IFwKLX0gd2hpbGUgKDApCi0KLQltdl9zZXQoaW5iKTsJbXZfc2V0KGludyk7CW12X3NldChpbmwpOwotCW12X3NldChvdXRiKTsJbXZfc2V0KG91dHcpOwltdl9zZXQob3V0bCk7Ci0KLQltdl9zZXQoaW5iX3ApOwltdl9zZXQoaW53X3ApOwltdl9zZXQoaW5sX3ApOwotCW12X3NldChvdXRiX3ApOwltdl9zZXQob3V0d19wKTsJbXZfc2V0KG91dGxfcCk7Ci0KLQltdl9zZXQoaW5zYik7CW12X3NldChpbnN3KTsJbXZfc2V0KGluc2wpOwotCW12X3NldChvdXRzYik7CW12X3NldChvdXRzdyk7CW12X3NldChvdXRzbCk7Ci0KLQltdl9zZXQocmVhZGIpOwltdl9zZXQocmVhZHcpOwltdl9zZXQocmVhZGwpOwotCW12X3NldCh3cml0ZWIpOwltdl9zZXQod3JpdGV3KTsJbXZfc2V0KHdyaXRlbCk7Ci0KLQltdl9zZXQoaW9wb3J0X21hcCk7Ci0JbXZfc2V0KGlvcG9ydF91bm1hcCk7Ci0JbXZfc2V0KGlycV9kZW11eCk7Ci0KLSNpZmRlZiBDT05GSUdfU0hfVU5LTk9XTgotCV9fc2V0X2lvX3BvcnRfYmFzZShtdl9pb19iYXNlKTsKLSNlbmRpZgotCi0JaWYgKCFzaF9tdi5tdl9ucl9pcnFzKQotCQlzaF9tdi5tdl9ucl9pcnFzID0gTlJfSVJRUzsKKwlzaXplID0gbWVtcGFyc2UocCwgJnApOworCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBzaXplOwogCiAJcmV0dXJuIDA7CiB9CitlYXJseV9wYXJhbSgibWVtIiwgZWFybHlfcGFyc2VfbWVtKTsKIAogLyoKICAqIFJlZ2lzdGVyIGZ1bGx5IGF2YWlsYWJsZSBsb3cgUkFNIHBhZ2VzIHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgpAQCAtMjMwLDcgKzExNiw3IEBACiAJZnJlZV9ib290bWVtKFBGTl9QSFlTKGN1cnJfcGZuKSwgUEZOX1BIWVMocGFnZXMpKTsKIH0KIAotdm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3IodW5zaWduZWQgbG9uZyBzdGFydF9wZm4pCit2b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih1bnNpZ25lZCBsb25nIGZyZWVfcGZuKQogewogCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOwogCkBAIC0yMzksOSArMTI1LDEwIEBACiAJICogYm9vdHN0cmFwIHN0ZXAgYWxsIGFsbG9jYXRpb25zICh1bnRpbCB0aGUgcGFnZSBhbGxvY2F0b3IKIAkgKiBpcyBpbnRhY3QpIG11c3QgYmUgZG9uZSB2aWEgYm9vdG1lbV9hbGxvYygpLgogCSAqLwotCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgc3RhcnRfcGZuLAorCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgZnJlZV9wZm4sCiAJCQkJCSBtaW5fbG93X3BmbiwgbWF4X2xvd19wZm4pOwogCisJYWRkX2FjdGl2ZV9yYW5nZSgwLCBtaW5fbG93X3BmbiwgbWF4X2xvd19wZm4pOwogCXJlZ2lzdGVyX2Jvb3RtZW1fbG93X3BhZ2VzKCk7CiAKIAlub2RlX3NldF9vbmxpbmUoMCk7CkBAIC0yNTQsNyArMTQxLDcgQEAKIAkgKiBhbiBpbnZhbGlkIFJBTSBhcmVhLgogCSAqLwogCXJlc2VydmVfYm9vdG1lbShfX01FTU9SWV9TVEFSVCtQQUdFX1NJWkUsCi0JCShQRk5fUEhZUyhzdGFydF9wZm4pK2Jvb3RtYXBfc2l6ZStQQUdFX1NJWkUtMSktX19NRU1PUllfU1RBUlQpOworCQkoUEZOX1BIWVMoZnJlZV9wZm4pK2Jvb3RtYXBfc2l6ZStQQUdFX1NJWkUtMSktX19NRU1PUllfU1RBUlQpOwogCiAJLyoKIAkgKiByZXNlcnZlIHBoeXNpY2FsIHBhZ2UgMCAtIGl0J3MgYSBzcGVjaWFsIEJJT1MgcGFnZSBvbiBtYW55IGJveGVzLApAQCAtMjYyLDYgKzE0OSw4IEBACiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJULCBQQUdFX1NJWkUpOwogCisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoMCk7CisKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlST09UX0RFViA9IE1LREVWKFJBTURJU0tfTUFKT1IsIDApOwogCWlmICgmX19yZF9zdGFydCAhPSAmX19yZF9lbmQpIHsKQEAgLTMxNSwxMCArMjA0LDYgQEAKIHsKIAllbmFibGVfbW11KCk7CiAKLSNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCi0Jc3RyY3B5KENPTU1BTkRfTElORSwgQ09ORklHX0NNRExJTkUpOwotI2VuZGlmCi0KIAlST09UX0RFViA9IG9sZF9kZWNvZGVfZGV2KE9SSUdfUk9PVF9ERVYpOwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCkBAIC0zMzksOSArMjI0LDIyIEBACiAJZGF0YV9yZXNvdXJjZS5zdGFydCA9IHZpcnRfdG9fcGh5cyhfZXRleHQpOwogCWRhdGFfcmVzb3VyY2UuZW5kID0gdmlydF90b19waHlzKF9lZGF0YSktMTsKIAorCW1lbW9yeV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKVBBR0VfT0ZGU0VUK19fTUVNT1JZX1NUQVJUOworCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBfX01FTU9SWV9TSVpFOworCisjaWZkZWYgQ09ORklHX0NNRExJTkVfQk9PTAorCXN0cmxjcHkoY29tbWFuZF9saW5lLCBDT05GSUdfQ01ETElORSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOworI2Vsc2UKKwlzdHJsY3B5KGNvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FLCBzaXplb2YoY29tbWFuZF9saW5lKSk7CisjZW5kaWYKKworCS8qIFNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KKwltZW1jcHkoYm9vdF9jb21tYW5kX2xpbmUsIGNvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOworCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CisKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCi0Jc2hfbXZfc2V0dXAoY21kbGluZV9wKTsKKwlzaF9tdl9zZXR1cCgpOwogCiAJLyoKIAkgKiBGaW5kIHRoZSBoaWdoZXN0IHBhZ2UgZnJhbWUgbnVtYmVyIHdlIGhhdmUgYXZhaWxhYmxlCkBAIC0zNTUsOCArMjUzLDkgQEAKIAltaW5fbG93X3BmbiA9IF9fTUVNT1JZX1NUQVJUID4+IFBBR0VfU0hJRlQ7CiAKIAlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCisJLyogU2V0dXAgYm9vdG1lbSB3aXRoIGF2YWlsYWJsZSBSQU0gKi8KIAlzZXR1cF9tZW1vcnkoKTsKLQlwYWdpbmdfaW5pdCgpOwogCXNwYXJzZV9pbml0KCk7CiAKICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQpAQCAtMzY2LDQ2ICsyNjUsMTMgQEAKIAkvKiBQZXJmb3JtIHRoZSBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uICovCiAJaWYgKGxpa2VseShzaF9tdi5tdl9zZXR1cCkpCiAJCXNoX212Lm12X3NldHVwKGNtZGxpbmVfcCk7CisKKwlwYWdpbmdfaW5pdCgpOwogfQogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0JZXh0ZXJuIGxvbmcgX19tYWNodmVjX3N0YXJ0LCBfX21hY2h2ZWNfZW5kOwotCXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciAqYWxsX3ZlY3MgPQotCQkoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICopJl9fbWFjaHZlY19zdGFydDsKLQotCWludCBpLCBuID0gKCh1bnNpZ25lZCBsb25nKSZfX21hY2h2ZWNfZW5kCi0JCSAgICAtICh1bnNpZ25lZCBsb25nKSZfX21hY2h2ZWNfc3RhcnQpLwotCQlzaXplb2Yoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdiA9ICZhbGxfdmVjc1tpXTsKLQkJaWYgKG12ID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaWYgKHN0cmNhc2VjbXAobmFtZSwgZ2V0X3N5c3RlbV90eXBlKCkpID09IDApIHsKLQkJCXJldHVybiBtdjsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBjcHUgY3B1W05SX0NQVVNdOwotCi1zdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCi17Ci0JaW50IGNwdV9pZDsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHVfaWQpCi0JCXJlZ2lzdGVyX2NwdSgmY3B1W2NwdV9pZF0sIGNwdV9pZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3Vic3lzX2luaXRjYWxsKHRvcG9sb2d5X2luaXQpOwotCiBzdGF0aWMgY29uc3QgY2hhciAqY3B1X25hbWVbXSA9IHsKIAlbQ1BVX1NINzIwNl0JPSAiU0g3MjA2IiwJW0NQVV9TSDc2MTldCT0gIlNINzYxOSIsCi0JW0NQVV9TSDc2MDRdCT0gIlNINzYwNCIsCVtDUFVfU0g3MzAwXQk9ICJTSDczMDAiLAorCVtDUFVfU0g3MzAwXQk9ICJTSDczMDAiLAogCVtDUFVfU0g3NzA1XQk9ICJTSDc3MDUiLAlbQ1BVX1NINzcwNl0JPSAiU0g3NzA2IiwKIAlbQ1BVX1NINzcwN10JPSAiU0g3NzA3IiwJW0NQVV9TSDc3MDhdCT0gIlNINzcwOCIsCiAJW0NQVV9TSDc3MDldCT0gIlNINzcwOSIsCVtDUFVfU0g3NzEwXQk9ICJTSDc3MTAiLApAQCAtNDE5LDcgKzI4NSw3IEBACiAJW0NQVV9TSDc3NzBdCT0gIlNINzc3MCIsCVtDUFVfU0g3NzgwXQk9ICJTSDc3ODAiLAogCVtDUFVfU0g3NzgxXQk9ICJTSDc3ODEiLAlbQ1BVX1NINzM0M10JPSAiU0g3MzQzIiwKIAlbQ1BVX1NINzc4NV0JPSAiU0g3Nzg1IiwJW0NQVV9TSDc3MjJdCT0gIlNINzcyMiIsCi0JW0NQVV9TSF9OT05FXQk9ICJVbmtub3duIgorCVtDUFVfU0hYM10JPSAiU0gtWDMiLAlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCiB9OwogCiBjb25zdCBjaGFyICpnZXRfY3B1X3N1YnR5cGUoc3RydWN0IHNoX2NwdWluZm8gKmMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwppbmRleCBjMWNmY2I5Li5jOTY4ZGNmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKQEAgLTc4LDYgKzc4LDE2IEBACiBERUNMQVJFX0VYUE9SVChfX21vdm1lbV9pNF9ldmVuKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtX2k0X29kZCk7CiBERUNMQVJFX0VYUE9SVChfX21vdm1lbVNJMTJfaTQpOworCisjaWYgKF9fR05VQ19NSU5PUl9fID09IDIgfHwgZGVmaW5lZChfX0dOVUNfU1RNX1JFTEVBU0VfXykpCisvKgorICogR0NDIDQuMiBlbWl0cyB0aGVzZSBmb3IgZGl2aXNpb24sIGFzIGRvIEdDQyA0LjEueCB2ZXJzaW9ucyBvZiB0aGUgU1QKKyAqIGNvbXBpbGVyIHdoaWNoIGluY2x1ZGUgYmFja3BvcnRlZCBwYXRjaGVzLgorICovCitERUNMQVJFX0VYUE9SVChfX3NkaXZzaTNfaTRpKTsKK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdl9xcm5uZF8xNik7CitERUNMQVJFX0VYUE9SVChfX3VkaXZzaTNfaTRpKTsKKyNlbmRpZgogI2Vsc2UgLyogR0NDIDMueCAqLwogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJfaTRfZXZlbik7CiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9vZGQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYwppbmRleCBlMzIzZTI5Li43MDZkODFjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjYxLDcgKzI2Miw3IEBACiAJCWdvdG8gYmFkZnJhbWU7CiAJLyogSXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gYXZvaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoYW4gdG8KIAkgICBjYWxsIGl0IGFuZCBpZ25vcmUgZXJyb3JzLiAgKi8KLQlkb19zaWdhbHRzdGFjaygmc3QsIE5VTEwsIHJlZ3MtPnJlZ3NbMTVdKTsKKwlkb19zaWdhbHRzdGFjaygoY29uc3Qgc3RhY2tfdCBfX3VzZXIgKikmc3QsIE5VTEwsICh1bnNpZ25lZCBsb25nKWZyYW1lKTsKIAogCXJldHVybiByMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggN2RiMWMyZC4uZmY1NjU2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0zMDgsOSArMzA4LDkgQEAKIAkubG9uZyBzeXNfdXRpbWVzCiAgCS5sb25nIHN5c19mYWR2aXNlNjRfNjRfd3JhcHBlcgogCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIFJlc2VydmVkIGZvciB2c2VydmVyICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIG1iaW5kICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMjc1IC0gZ2V0X21lbXBvbGljeSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHNldF9tZW1wb2xpY3kgKi8KKwkubG9uZyBzeXNfbWJpbmQKKwkubG9uZyBzeXNfZ2V0X21lbXBvbGljeQkJLyogMjc1ICovCisJLmxvbmcgc3lzX3NldF9tZW1wb2xpY3kKIAkubG9uZyBzeXNfbXFfb3BlbgogCS5sb25nIHN5c19tcV91bmxpbmsKIAkubG9uZyBzeXNfbXFfdGltZWRzZW5kCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKaW5kZXggMmQ5OTdlMi4uMDk3ZWJkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwpAQCAtMzAsNyArMzAsNyBAQAogCiBzdGF0aWMgaW50IHRtdV90aW1lcl9zdGFydCh2b2lkKQogewotCWN0cmxfb3V0YihjdHJsX2luYihUTVVfVFNUUikgfCAweDMsIFRNVV9UU1RSKTsKKwljdHJsX291dGIoY3RybF9pbmIoVE1VXzAxMl9UU1RSKSB8IDB4MywgVE1VXzAxMl9UU1RSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTIsNyArNTIsNyBAQAogCiBzdGF0aWMgaW50IHRtdV90aW1lcl9zdG9wKHZvaWQpCiB7Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV9UU1RSKSAmIH4weDMsIFRNVV9UU1RSKTsKKwljdHJsX291dGIoY3RybF9pbmIoVE1VXzAxMl9UU1RSKSAmIH4weDMsIFRNVV8wMTJfVFNUUik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NCw3ICsxNzQsOCBAQAogCiAjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgJiYgXAogICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApICYmIFwKLSAgICAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQorICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKIAljdHJsX291dGIoVE1VX1RPQ1JfSU5JVCwgVE1VX1RPQ1IpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTg0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKKworc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisKKyNpZmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUworCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCisJCXJlZ2lzdGVyX29uZV9ub2RlKGkpOworI2VuZGlmCisKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7CisJCXJldCA9IHJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGV2aWNlcywgaSksIGkpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWdpc3Rlcl9jcHUgJWQgZmFpbGVkICglZClcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBpLCByZXQpOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmICFkZWZpbmVkKENPTkZJR19TTVApCisJLyoKKwkgKiBJbiB0aGUgVVAgY2FzZSwgbWFrZSBzdXJlIHRoZSBDUFUgYXNzb2NpYXRpb24gaXMgc3RpbGwKKwkgKiByZWdpc3RlcmVkIHVuZGVyIGVhY2ggbm9kZS4gV2l0aG91dCB0aGlzLCBzeXNmcyBmYWlscworCSAqIHRvIG1ha2UgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBub2RlcyBvdGhlciB0aGFuIG5vZGUwCisJICogYW5kIGNwdTAuCisJICovCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJaWYgKGkgIT0gbnVtYV9ub2RlX2lkKCkpCisJCQlyZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBpKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwppbmRleCA4ZjE4OTMwLi41MDJkNDNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogCQkJICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShjdXJyZW50KSk7CiAKIAlidXN0X3NwaW5sb2NrcygwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkpCkBAIC01ODQsNyArNTg1LDcgQEAKIAkJaW5mby5zaV9zaWdubyA9IFNJR0JVUzsKIAkJaW5mby5zaV9lcnJubyA9IDA7CiAJCWluZm8uc2lfY29kZSA9IHNpX2NvZGU7Ci0JCWluZm8uc2lfYWRkciA9ICh2b2lkICopIGFkZHJlc3M7CisJCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CiAJCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJmluZm8sIGN1cnJlbnQpOwogCX0gZWxzZSB7CiAJCWlmIChyZWdzLT5wYyAmIDEpCkBAIC02MTcsNyArNjE4LDcgQEAKICAqLwogaW50IGlzX2RzcF9pbnN0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIHNob3J0IGluc3Q7CisJdW5zaWduZWQgc2hvcnQgaW5zdCA9IDA7CiAKIAkvKgogCSAqIFNhZmUgZ3VhcmQgaWYgRFNQIG1vZGUgaXMgYWxyZWFkeSBlbmFibGVkIG9yIHdlJ3JlIGxhY2tpbmcKQEAgLTY0NSw3ICs2NDYsNiBAQAogCQkJCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCiAJCQkJc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlzaWdpbmZvX3QgaW5mbzsKIAogCXN3aXRjaCAocjQpIHsKQEAgLTg3NCw3ICs4NzQsNyBAQAogdm9pZCBoYW5kbGVfQlVHKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWVudW0gYnVnX3RyYXBfdHlwZSB0dDsKLQl0dCA9IHJlcG9ydF9idWcocmVncy0+cGMpOworCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wYywgcmVncyk7CiAJaWYgKHR0ID09IEJVR19UUkFQX1RZUEVfV0FSTikgewogCQlyZWdzLT5wYyArPSAyOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA0YzViNTdlLi4wNjk2NDAyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTk3LDE4ICs5NywyMCBAQAogICBfX2luaXRyYW1mc19lbmQgPSAuOwogI2VuZGlmCiAKKyAuID0gQUxJR04oNCk7CiAgIF9fbWFjaHZlY19zdGFydCA9IC47Ci0gIC5pbml0Lm1hY2h2ZWMgOiB7ICooLmluaXQubWFjaHZlYykgfQorICAubWFjaHZlYy5pbml0IDogeyAqKC5tYWNodmVjLmluaXQpIH0KICAgX19tYWNodmVjX2VuZCA9IC47CisKICAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIC4gPSBBTElHTig0KTsKLSAgX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCi0gIC5ic3MgOiB7ICooLmJzcykgfQotCi0gIC4gPSBBTElHTig0KTsKLSAgX2VuZCA9IC4gOworICAuYnNzIDogeworCV9faW5pdF9lbmQgPSAuOworCV9fYnNzX3N0YXJ0ID0gLjsJCS8qIEJTUyAqLworICAJKiguYnNzLnBhZ2VfYWxpZ25lZCkKKyAgCSooLmJzcykKKwkuID0gQUxJR04oNCk7CisJX2VuZCA9IC4gOworICB9CiAKICAgLyogV2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbCBpcyBOT1QgY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoZQogICAgKiBtb2R1bGUgY2xlYW51cCBjb2RlIGFuZCBkYXRhIGFyZSBwdXQgaW50byB0aGVzZSBzZWdtZW50cy4gIEJvdGgKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbGliL2RpdjY0LWdlbmVyaWMuYyBiL2FyY2gvc2gvbGliL2RpdjY0LWdlbmVyaWMuYwppbmRleCBjMDI0NzNhLi40YmVmM2I1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2xpYi9kaXY2NC1nZW5lcmljLmMKKysrIGIvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jCkBAIC00LDE2ICs0LDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi1leHRlcm4gdTY0IF9feGRpdjY0XzMyKHU2NCBuLCB1MzIgZCk7CitleHRlcm4gdWludDY0X3QgX194ZGl2NjRfMzIodTY0IG4sIHUzMiBkKTsKIAotdTY0IF9fZGl2NjRfMzIodTY0ICp4cCwgdTMyIHkpCit1aW50MzJfdCBfX2RpdjY0XzMyKHU2NCAqeHAsIHUzMiB5KQogewotCXU2NCByZW07Ci0JdTY0IHEgPSBfX3hkaXY2NF8zMigqeHAsIHkpOworCXVpbnQzMl90IHJlbTsKKwl1aW50NjRfdCBxID0gX194ZGl2NjRfMzIoKnhwLCB5KTsKIAogCXJlbSA9ICp4cCAtIHEgKiB5OwogCSp4cCA9IHE7CiAKIAlyZXR1cm4gcmVtOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2xpYi9kaXY2NC5TIGIvYXJjaC9zaC9saWIvZGl2NjQuUwppbmRleCBlZWZjMjc1Li41ZWU3MzM0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2xpYi9kaXY2NC5TCisrKyBiL2FyY2gvc2gvbGliL2RpdjY0LlMKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCQotICogdW5zaWduZWQgbG9uZyBsb25nIF9feGRpdjY0XzMyKHVuc2lnbmVkIGxvbmcgbG9uZyBuLCB1bnNpZ25lZCBsb25nIGQpOyAKKyAqIHVuc2lnbmVkIGxvbmcgX194ZGl2NjRfMzIodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCk7IAogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKIC50ZXh0CiBFTlRSWShfX3hkaXY2NF8zMikKLSNpZmRlZiAgX19MSVRUTEVfRU5ESUFOX18KKyNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KIAltb3YJcjQsIHIwCiAJbW92CXI1LCByMQogI2Vsc2UKQEAgLTM0LDcgKzM0LDcgQEAKIAlyb3RjbAlyMAogCWRpdjEJcjYsIHIxCiAJLmVuZHIKLSNpZmRlZiAgX19MSVRUTEVfRU5ESUFOX18KKyNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KIAltb3YJcjIsIHIxCiAJcnRzCiAJIHJvdGNsCXIwCmRpZmYgLS1naXQgYS9hcmNoL3NoL21hdGgtZW11L21hdGguYyBiL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jCmluZGV4IGEzOGUxZWUuLmFjMmQ3YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jCisrKyBiL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jCkBAIC01MDcsNiArNTA3LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBpbnNuID0gKih1bnNpZ25lZCBzaG9ydCAqKXJlZ3MtPnBjOwogCXVuc2lnbmVkIHNob3J0IGZpbnNuOwogCXVuc2lnbmVkIGxvbmcgbmV4dHBjOworCXNpZ2luZm9fdCBpbmZvOwogCWludCBuaWJbNF0gPSB7CiAJCShpbnNuID4+IDEyKSAmIDB4ZiwKIAkJKGluc24gPj4gOCkgJiAweGYsCkBAIC01NTksOSArNTYwLDExIEBACiAJCQkJfihGUFNDUl9DQVVTRV9NQVNLIHwgRlBTQ1JfRkxBR19NQVNLKTsKIAkJCXNldF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfVVNFREZQVSk7CiAJCX0gZWxzZSB7Ci0JCQl0c2stPnRocmVhZC50cmFwX25vID0gMTE7Ci0JCQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKLQkJCWZvcmNlX3NpZyhTSUdGUEUsIHRzayk7CisJCQlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCQkJaW5mby5zaV9lcnJubyA9IDA7CisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCQkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopcmVncy0+cGM7CisJCQlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0c2spOwogCQl9CiAKIAkJcmVncy0+cGMgPSBuZXh0cGM7CkBAIC01NzYsMTQgKzU3OSwxNyBAQAogCQkJICAgICBzdHJ1Y3QgcHRfcmVncyByZWdzKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlzaWdpbmZvX3QgaW5mbzsKIAogCWlmIChpZWVlX2ZwZV9oYW5kbGVyICgmcmVncykpCiAJCXJldHVybjsKIAogCXJlZ3MucGMgKz0gMjsKLQl0c2stPnRocmVhZC50cmFwX25vID0gMTE7Ci0JdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IDA7Ci0JZm9yY2Vfc2lnKFNJR0ZQRSwgdHNrKTsKKwlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopcmVncy5wYzsKKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0c2spOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwppbmRleCAyNTMzNDZkLi4yOGQ3OWE0IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL0tjb25maWcKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotbWVudSAiUHJvY2Vzc29yIHNlbGVjdGlvbiIKLQogIwogIyBQcm9jZXNzb3IgZmFtaWxpZXMKICMKQEAgLTM4LDI3ICszNiwzMSBAQAogY29uZmlnIENQVV9TSFgyCiAJYm9vbAogCitjb25maWcgQ1BVX1NIWDMKKwlib29sCisKK2Nob2ljZQorCXByb21wdCAiUHJvY2Vzc29yIHN1Yi10eXBlIHNlbGVjdGlvbiIKKwogIwogIyBQcm9jZXNzb3Igc3VidHlwZXMKICMKIAotY29tbWVudCAiU0gtMiBQcm9jZXNzb3IgU3VwcG9ydCIKLQotY29uZmlnIENQVV9TVUJUWVBFX1NINzYwNAotCWJvb2wgIlN1cHBvcnQgU0g3NjA0IHByb2Nlc3NvciIKLQlzZWxlY3QgQ1BVX1NIMgorIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc2MTkKIAlib29sICJTdXBwb3J0IFNINzYxOSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDIKKwlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKLWNvbW1lbnQgIlNILTJBIFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjA2CiAJYm9vbCAiU3VwcG9ydCBTSDcyMDYgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAotY29tbWVudCAiU0gtMyBQcm9jZXNzb3IgU3VwcG9ydCIKKyMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MzAwCiAJYm9vbCAiU3VwcG9ydCBTSDczMDAgcHJvY2Vzc29yIgpAQCAtMTEzLDcgKzExNSw3IEBACiAJaGVscAogCSAgU2VsZWN0IFNINzcxMiBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzEyIENQVS4KIAotY29tbWVudCAiU0gtNCBQcm9jZXNzb3IgU3VwcG9ydCIKKyMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJYm9vbCAiU3VwcG9ydCBTSDc3NTAgcHJvY2Vzc29yIgpAQCAtMTI1LDcgKzEyNyw3IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MDkxCiAJYm9vbCAiU3VwcG9ydCBTSDcwOTEgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0Ci0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MAorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAloZWxwCiAJICBTZWxlY3QgU0g3MDkxIGlmIHlvdSBoYXZlIGFuIFNILTQgYmFzZWQgU2VnYSBkZXZpY2UgKHN1Y2ggYXMKIAkgIHRoZSBEcmVhbWNhc3QsIE5hb21pLCBhbmQgTmFvbWkgMikuCkBAIC0xMzMsMTMgKzEzNSwxMSBAQAogY29uZmlnIENQVV9TVUJUWVBFX1NINzc1MFIKIAlib29sICJTdXBwb3J0IFNINzc1MFIgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0Ci0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MAogCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzc1MFMKIAlib29sICJTdXBwb3J0IFNINzc1MFMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0Ci0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MAogCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzc1MQpAQCAtMTUzLDcgKzE1Myw2IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUxUgogCWJvb2wgIlN1cHBvcnQgU0g3NzUxUiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzYwCkBAIC0xNjYsNyArMTY1LDcgQEAKIAlib29sICJTdXBwb3J0IFNINC0yMDIgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0CiAKLWNvbW1lbnQgIlNUNDAgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKIAogY29uZmlnIENQVV9TVUJUWVBFX1NUNDBTVEIxCiAJYm9vbCAiU3VwcG9ydCBTVDQwU1RCMS9TVDQwUkEgcHJvY2Vzc29ycyIKQEAgLTE4MSw3ICsxODAsNyBAQAogCWhlbHAKIAkgIFNlbGVjdCBTVDQwR1gxIGlmIHlvdSBoYXZlIGEgU1Q0MEdYMSBDUFUuCiAKLWNvbW1lbnQgIlNILTRBIFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzcwCiAJYm9vbCAiU3VwcG9ydCBTSDc3NzAgcHJvY2Vzc29yIgpAQCAtMTk4LDcgKzE5NywxMyBAQAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBDUFVfSEFTX0lOVEMyX0lSUQogCi1jb21tZW50ICJTSDRBTC1EU1AgUHJvY2Vzc29yIFN1cHBvcnQiCitjb25maWcgQ1BVX1NVQlRZUEVfU0hYMworCWJvb2wgIlN1cHBvcnQgU0gtWDMgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0g0QQorCXNlbGVjdCBDUFVfU0hYMworCXNlbGVjdCBDUFVfSEFTX0lOVEMyX0lSUQorCisjIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MzE4MAogCWJvb2wgIlN1cHBvcnQgU0g3MzE4MCBwcm9jZXNzb3IiCkBAIC0yMTMsOCArMjE4LDEwIEBACiAJc2VsZWN0IENQVV9TSDRBTF9EU1AKIAlzZWxlY3QgQ1BVX1NIWDIKIAlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCisJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTlVNQQogCi1lbmRtZW51CitlbmRjaG9pY2UKIAogbWVudSAiTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucyIKIApAQCAtMjY2LDcgKzI3Myw3IEBACiAKIGNvbmZpZyAzMkJJVAogCWJvb2wgIlN1cHBvcnQgMzItYml0IHBoeXNpY2FsIGFkZHJlc3NpbmcgdGhyb3VnaCBQTUIiCi0JZGVwZW5kcyBvbiBDUFVfU0g0QSAmJiBNTVUgJiYgKCFYMlRMQiB8fCBCUk9LRU4pCisJZGVwZW5kcyBvbiBNTVUgJiYgKENQVV9TVUJUWVBFX1NINzc4MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODUpCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHBoeXNpY2FsIGFkZHJlc3Npbmcgd2lsbCBiZSBleHRlbmRlZCB0bwpAQCAtMjk1LDYgKzMwMiwxNyBAQAogCSAgRm9yIHN5c3RlbXMgd2l0aCBhbiBNTVUgdGhhdCBjYW4gYWZmb3JkIHRvIGdpdmUgdXAgYSBwYWdlLAogCSAgKHRoZSBkZWZhdWx0IHZhbHVlKSBzYXkgWS4KIAorY29uZmlnIE5VTUEKKwlib29sICJOb24gVW5pZm9ybSBNZW1vcnkgQWNjZXNzIChOVU1BKSBTdXBwb3J0IgorCWRlcGVuZHMgb24gTU1VICYmIFNZU19TVVBQT1JUU19OVU1BICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNvbWUgU0ggc3lzdGVtcyBoYXZlIG1hbnkgdmFyaW91cyBtZW1vcmllcyBzY2F0dGVyZWQgYXJvdW5kCisJICB0aGUgYWRkcmVzcyBzcGFjZSwgZWFjaCB3aXRoIHZhcnlpbmcgbGF0ZW5jaWVzLiBUaGlzIGVuYWJsZXMKKwkgIHN1cHBvcnQgZm9yIHRoZXNlIGJsb2NrcyBieSBiaW5kaW5nIHRoZW0gdG8gbm9kZXMgYW5kIGFsbG93aW5nCisJICBtZW1vcnkgcG9saWNpZXMgdG8gYmUgdXNlZCBmb3IgcHJpb3JpdGl6aW5nIGFuZCBjb250cm9sbGluZworCSAgYWxsb2NhdGlvbiBiZWhhdmlvdXIuCisKIGNvbmZpZyBOT0RFU19TSElGVAogCWludAogCWRlZmF1bHQgIjEiCkBAIC0zMDIsMTQgKzMyMCwzNCBAQAogCiBjb25maWcgQVJDSF9GTEFUTUVNX0VOQUJMRQogCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uICFOVU1BCisKK2NvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKKwlkZWZfYm9vbCB5CisJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0RFRkFVTFQKKwlkZWZfYm9vbCB5CiAKIGNvbmZpZyBNQVhfQUNUSVZFX1JFR0lPTlMKIAlpbnQKKwlkZWZhdWx0ICIyIiBpZiAoQ1BVX1NVQlRZUEVfU0g3NzIyICYmIFNQQVJTRU1FTSkKIAlkZWZhdWx0ICIxIgogCiBjb25maWcgQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBBUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFNQQVJTRU1FTQorCitjb25maWcgQVJDSF9NRU1PUllfUFJPQkUKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBNRU1PUllfSE9UUExVRworCiBjaG9pY2UKIAlwcm9tcHQgIktlcm5lbCBwYWdlIHNpemUiCiAJZGVmYXVsdCBQQUdFX1NJWkVfNEtCCkBAIC0zOTQsMTUgKzQzMiw0IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBTSF9PQ1JBTQotCWJvb2wgIk9wZXJhbmQgQ2FjaGUgUkFNIChPQ1JBTSkgc3VwcG9ydCIKLQloZWxwCi0JICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IHRlYXIgZG93biB0aGUgbnVtYmVyIG9mCi0JICBzZXRzIGluIHRoZSBkY2FjaGUgYnkgaGFsZiwgd2hpY2ggaW4gdHVybiBleHBvc2VzIGEgbWVtb3J5IHJhbmdlLgotCi0JICBUaGUgYWRkcmVzc2VzIGZvciB0aGUgT0MgUkFNIGJhc2Ugd2lsbCB2YXJ5IGFjY29yZGluZyB0byB0aGUKLQkgIHByb2Nlc3NvciB2ZXJzaW9uLiBDb25zdWx0IHZlbmRvciBkb2N1bWVudGF0aW9uIGZvciBzcGVjaWZpY3MuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vTWFrZWZpbGUgYi9hcmNoL3NoL21tL01ha2VmaWxlCmluZGV4IDNmZmQ3ZjYuLmQ2NzdkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9tbS9NYWtlZmlsZQpAQCAtOCw5ICs4LDYgQEAKIG9iai0kKENPTkZJR19DUFVfU0gzKQkrPSBjYWNoZS1zaDMubwogb2JqLSQoQ09ORklHX0NQVV9TSDQpCSs9IGNhY2hlLXNoNC5vCiAKLW9iai0kKENPTkZJR19ETUFfUEFHRV9PUFMpCSs9IHBnLWRtYS5vCi1vYmotJChDT05GSUdfSFVHRVRMQl9QQUdFKQkrPSBodWdldGxicGFnZS5vCi0KIG1tdS15CQkJOj0gZmF1bHQtbm9tbXUubyB0bGItbm9tbXUubyBwZy1ub21tdS5vCiBtbXUtJChDT05GSUdfTU1VKQk6PSBmYXVsdC5vIGNsZWFyX3BhZ2UubyBjb3B5X3BhZ2UubyB0bGItZmx1c2gubwlcCiAJCQkgICBpb3JlbWFwLm8KQEAgLTI3LDUgKzI0LDcgQEAKIG9iai0kKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikgKz0gcGctc2g3NzA1Lm8KIGVuZGlmCiAKK29iai0kKENPTkZJR19IVUdFVExCX1BBR0UpCSs9IGh1Z2V0bGJwYWdlLm8KIG9iai0kKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikJKz0gY2FjaGUtc2g3NzA1Lm8KIG9iai0kKENPTkZJR18zMkJJVCkJCSs9IHBtYi5vCitvYmotJChDT05GSUdfTlVNQSkJCSs9IG51bWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9mYXVsdC5jIGIvYXJjaC9zaC9tbS9mYXVsdC5jCmluZGV4IGM4NzhmYWEuLjBiM2VhZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vZmF1bHQuYworKysgYi9hcmNoL3NoL21tL2ZhdWx0LmMKQEAgLTMyLDcgKzMyLDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWE7Ci0JdW5zaWduZWQgbG9uZyBwYWdlOwogCWludCBzaV9jb2RlOwogCXNpZ2luZm9fdCBpbmZvOwogCkBAIC0xNzAsMjQgKzE2OSwzOCBAQAogICogdGVybWluYXRlIHRoaW5ncyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgogICoKICAqLwotCWlmIChhZGRyZXNzIDwgUEFHRV9TSVpFKQotCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiKTsKLQlwcmludGsoIiBhdCB2aXJ0dWFsIGFkZHJlc3MgJTA4bHhcbiIsIGFkZHJlc3MpOwotCXByaW50ayhLRVJOX0FMRVJUICJwYyA9ICUwOGx4XG4iLCByZWdzLT5wYyk7Ci0JcGFnZSA9ICh1bnNpZ25lZCBsb25nKWdldF9UVEIoKTsKLQlpZiAocGFnZSkgewotCQlwYWdlID0gKCh1bnNpZ25lZCBsb25nICopIHBhZ2UpW2FkZHJlc3MgPj4gUEdESVJfU0hJRlRdOwotCQlwcmludGsoS0VSTl9BTEVSVCAiKnBkZSA9ICUwOGx4XG4iLCBwYWdlKTsKLQkJaWYgKHBhZ2UgJiBfUEFHRV9QUkVTRU5UKSB7Ci0JCQlwYWdlICY9IFBBR0VfTUFTSzsKLQkJCWFkZHJlc3MgJj0gMHgwMDNmZjAwMDsKLQkJCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgX192YShwYWdlKSlbYWRkcmVzcyA+PiBQQUdFX1NISUZUXTsKLQkJCXByaW50ayhLRVJOX0FMRVJUICIqcHRlID0gJTA4bHhcbiIsIHBhZ2UpOworCisJYnVzdF9zcGlubG9ja3MoMSk7CisKKwlpZiAob29wc19tYXlfcHJpbnQoKSkgeworCQlfX3R5cGVvZl9fKHB0ZV92YWwoX19wdGUoMCkpKSBwYWdlOworCisJCWlmIChhZGRyZXNzIDwgUEFHRV9TSVpFKQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIE5VTEwgIgorCQkJCQkgICJwb2ludGVyIGRlcmVmZXJlbmNlIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgIgorCQkJCQkgICJyZXF1ZXN0Iik7CisJCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIiwgYWRkcmVzcyk7CisJCXByaW50ayhLRVJOX0FMRVJUICJwYyA9ICUwOGx4XG4iLCByZWdzLT5wYyk7CisJCXBhZ2UgPSAodW5zaWduZWQgbG9uZylnZXRfVFRCKCk7CisJCWlmIChwYWdlKSB7CisJCQlwYWdlID0gKChfX3R5cGVvZl9fKHBhZ2UpICopIF9fdmEocGFnZSkpW2FkZHJlc3MgPj4KKwkJCQkJCQkJIFBHRElSX1NISUZUXTsKKwkJCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOworCQkJaWYgKHBhZ2UgJiBfUEFHRV9QUkVTRU5UKSB7CisJCQkJcGFnZSAmPSBQQUdFX01BU0s7CisJCQkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOworCQkJCXBhZ2UgPSAoKF9fdHlwZW9mX18ocGFnZSkgKikKKwkJCQkJCV9fdmEocGFnZSkpW2FkZHJlc3MgPj4KKwkJCQkJCQkgICAgUEFHRV9TSElGVF07CisJCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwdGUgPSAlMDhseFxuIiwgcGFnZSk7CisJCQl9CiAJCX0KIAl9CisKIAlkaWUoIk9vcHMiLCByZWdzLCB3cml0ZWFjY2Vzcyk7CisJYnVzdF9zcGlubG9ja3MoMCk7CiAJZG9fZXhpdChTSUdLSUxMKTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW5pdC5jIGIvYXJjaC9zaC9tbS9pbml0LmMKaW5kZXggZTBlNjQ0Zi4uODJiNjhjNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKQEAgLTM2LDE0ICszNywxMSBAQAogCXNob3dfZnJlZV9hcmVhcygpOwogCiAJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlLCAqZW5kOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpOwogCiAJCXBnZGF0X3Jlc2l6ZV9sb2NrKHBnZGF0LCAmZmxhZ3MpOwotCQlwYWdlID0gcGdkYXQtPm5vZGVfbWVtX21hcDsKLQkJZW5kID0gcGFnZSArIHBnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXM7Ci0KLQkJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBnZGF0X3BhZ2VfbnIocGdkYXQsIGkpOwogCQkJdG90YWwrKzsKIAkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCiAJCQkJcmVzZXJ2ZWQrKzsKQEAgLTU1LDkgKzUzLDcgQEAKIAkJCQlmcmVlKys7CiAJCQllbHNlCiAJCQkJc2hhcmVkICs9IHBhZ2VfY291bnQocGFnZSkgLSAxOwotCQkJcGFnZSsrOwotCQl9IHdoaWxlIChwYWdlIDwgZW5kKTsKLQorCQl9CiAJCXBnZGF0X3Jlc2l6ZV91bmxvY2socGdkYXQsICZmbGFncyk7CiAJfQogCkBAIC0xMzcsMTYgKzEzMywxMiBAQAogfQogI2VuZGlmCS8qIENPTkZJR19NTVUgKi8KIAotLyogUmVmZXJlbmNlcyB0byBzZWN0aW9uIGJvdW5kYXJpZXMgKi8KLQotZXh0ZXJuIGNoYXIgX3RleHQsIF9ldGV4dCwgX2VkYXRhLCBfX2Jzc19zdGFydCwgX2VuZDsKLWV4dGVybiBjaGFyIF9faW5pdF9iZWdpbiwgX19pbml0X2VuZDsKLQogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMKICAqLwogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXTsKIAlpbnQgbmlkOwogCiAJLyogV2UgZG9uJ3QgbmVlZCB0byBtYXAgdGhlIGtlcm5lbCB0aHJvdWdoIHRoZSBUTEIsIGFzCkBAIC0xNTgsNDMgKzE1MCwzOSBAQAogCSAqIGNoZWNrIGZvciBhIG51bGwgdmFsdWUuICovCiAJc2V0X1RUQihzd2FwcGVyX3BnX2Rpcik7CiAKKwltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKKwogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewogCQlwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCQl1bnNpZ25lZCBsb25nIGxvdywgc3RhcnRfcGZuOwogCi0JCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOwotCiAJCXN0YXJ0X3BmbiA9IHBnZGF0LT5iZGF0YS0+bm9kZV9ib290X3N0YXJ0ID4+IFBBR0VfU0hJRlQ7CiAJCWxvdyA9IHBnZGF0LT5iZGF0YS0+bm9kZV9sb3dfcGZuOwogCi0JCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbG93OwotCQlhZGRfYWN0aXZlX3JhbmdlKG5pZCwgc3RhcnRfcGZuLCBsb3cpOworCQlpZiAobWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPCBsb3cpCisJCQltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IGxvdzsKIAogCQlwcmludGsoIk5vZGUgJXU6IHN0YXJ0X3BmbiA9IDB4JWx4LCBsb3cgPSAweCVseFxuIiwKIAkJICAgICAgIG5pZCwgc3RhcnRfcGZuLCBsb3cpOwotCi0JCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwotCi0JCXByaW50aygiTm9kZSAldTogbWVtX21hcCBzdGFydHMgYXQgJXBcbiIsCi0JCSAgICAgICBwZ2RhdC0+bm9kZV9pZCwgcGdkYXQtPm5vZGVfbWVtX21hcCk7CiAJfQorCisJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qga2NvcmVfbGlzdCBrY29yZV9tZW0sIGtjb3JlX3ZtYWxsb2M7CiAKIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7Ci0JaW50IGNvZGVzaXplLCByZXNlcnZlZHBhZ2VzLCBkYXRhc2l6ZSwgaW5pdHNpemU7CisJaW50IGNvZGVzaXplLCBkYXRhc2l6ZSwgaW5pdHNpemU7CiAJaW50IG5pZDsKIAotCXJlc2VydmVkcGFnZXMgPSAwOworCW51bV9waHlzcGFnZXMgPSAwOworCWhpZ2hfbWVtb3J5ID0gTlVMTDsKIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewogCQlwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CiAJCXVuc2lnbmVkIGxvbmcgbm9kZV9wYWdlcyA9IDA7CiAJCXZvaWQgKm5vZGVfaGlnaF9tZW1vcnk7Ci0JCWludCBpOwogCiAJCW51bV9waHlzcGFnZXMgKz0gcGdkYXQtPm5vZGVfcHJlc2VudF9wYWdlczsKIApAQCAtMjAzLDEzICsxOTEsOSBAQAogCiAJCXRvdGFscmFtX3BhZ2VzICs9IG5vZGVfcGFnZXM7CiAKLQkJZm9yIChpID0gMDsgaSA8IG5vZGVfcGFnZXM7IGkrKykKLQkJCWlmIChQYWdlUmVzZXJ2ZWQocGdkYXQtPm5vZGVfbWVtX21hcCArIGkpKQotCQkJCXJlc2VydmVkcGFnZXMrKzsKLQotCQlub2RlX2hpZ2hfbWVtb3J5ID0gKHZvaWQgKikoKHBnZGF0LT5ub2RlX3N0YXJ0X3BmbiArCi0JCQkJCSAgICAgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcykgPDwKLQkJCQkJCVBBR0VfU0hJRlQpOworCQlub2RlX2hpZ2hfbWVtb3J5ID0gKHZvaWQgKilfX3ZhKChwZ2RhdC0+bm9kZV9zdGFydF9wZm4gKworCQkJCQkJIHBnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXMpIDw8CisJCQkJCQkgUEFHRV9TSElGVCk7CiAJCWlmIChub2RlX2hpZ2hfbWVtb3J5ID4gaGlnaF9tZW1vcnkpCiAJCQloaWdoX21lbW9yeSA9IG5vZGVfaGlnaF9tZW1vcnk7CiAJfQpAQCAtMjM5LDExICsyMjMsMTAgQEAKIAkJICAgVk1BTExPQ19FTkQgLSBWTUFMTE9DX1NUQVJUKTsKIAogCXByaW50ayhLRVJOX0lORk8gIk1lbW9yeTogJWx1ay8lbHVrIGF2YWlsYWJsZSAoJWRrIGtlcm5lbCBjb2RlLCAiCi0JICAgICAgICIlZGsgcmVzZXJ2ZWQsICVkayBkYXRhLCAlZGsgaW5pdClcbiIsCisJICAgICAgICIlZGsgZGF0YSwgJWRrIGluaXQpXG4iLAogCQkodW5zaWduZWQgbG9uZykgbnJfZnJlZV9wYWdlcygpIDw8IChQQUdFX1NISUZULTEwKSwKLQkJdG90YWxyYW1fcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAorCQludW1fcGh5c3BhZ2VzIDw8IChQQUdFX1NISUZULTEwKSwKIAkJY29kZXNpemUgPj4gMTAsCi0JCXJlc2VydmVkcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAogCQlkYXRhc2l6ZSA+PiAxMCwKIAkJaW5pdHNpemUgPj4gMTApOwogCkBAIC0yNjQsNyArMjQ3LDkgQEAKIAkJZnJlZV9wYWdlKGFkZHIpOwogCQl0b3RhbHJhbV9wYWdlcysrOwogCX0KLQlwcmludGsgKCJGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAlZGsgZnJlZWRcbiIsICgmX19pbml0X2VuZCAtICZfX2luaXRfYmVnaW4pID4+IDEwKTsKKwlwcmludGsoIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsCisJICAgICAgICgodW5zaWduZWQgbG9uZykmX19pbml0X2VuZCAtCisJICAgICAgICAodW5zaWduZWQgbG9uZykmX19pbml0X2JlZ2luKSA+PiAxMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKQEAgLTI3Nyw2ICsyNjIsNTAgQEAKIAkJZnJlZV9wYWdlKHApOwogCQl0b3RhbHJhbV9wYWdlcysrOwogCX0KLQlwcmludGsgKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOworCXByaW50aygiRnJlZWluZyBpbml0cmQgbWVtb3J5OiAlbGRrIGZyZWVkXG4iLCAoZW5kIC0gc3RhcnQpID4+IDEwKTsKIH0KICNlbmRpZgorCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCit2b2lkIG9ubGluZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCWluaXRfcGFnZV9jb3VudChwYWdlKTsKKwlfX2ZyZWVfcGFnZShwYWdlKTsKKwl0b3RhbHJhbV9wYWdlcysrOworCW51bV9waHlzcGFnZXMrKzsKK30KKworaW50IGFyY2hfYWRkX21lbW9yeShpbnQgbmlkLCB1NjQgc3RhcnQsIHU2NCBzaXplKQoreworCXBnX2RhdGFfdCAqcGdkYXQ7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJaW50IHJldDsKKworCXBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CisKKwkvKiBXZSBvbmx5IGhhdmUgWk9ORV9OT1JNQUwsIHNvIHRoaXMgaXMgZWFzeS4uICovCisJcmV0ID0gX19hZGRfcGFnZXMocGdkYXQtPm5vZGVfem9uZXMgKyBaT05FX05PUk1BTCwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByaW50aygiJXM6IEZhaWxlZCwgX19hZGRfcGFnZXMoKSA9PSAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFyY2hfYWRkX21lbW9yeSk7CisKK2ludCByZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZW1vdmVfbWVtb3J5KTsKKworI2lmZGVmIENPTkZJR19OVU1BCitpbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IGFkZHIpCit7CisJLyogTm9kZSAwIGZvciBub3cuLiAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQpOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vbnVtYS5jIGIvYXJjaC9zaC9tbS9udW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmZjA2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvbW0vbnVtYS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBhcmNoL3NoL21tL251bWEuYyAtIE11bHRpcGxlIG5vZGUgc3VwcG9ydCBmb3IgU0ggbWFjaGluZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9udW1hLmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKK3N0YXRpYyBib290bWVtX2RhdGFfdCBwbGF0X25vZGVfYmRhdGFbTUFYX05VTU5PREVTXTsKK3N0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5vZGVfZGF0YSk7CisKKy8qCisgKiBPbiBTSCBtYWNoaW5lcyB0aGUgY29udmVudGlvbmFsIGFwcHJvYWNoIGlzIHRvIHN0YXNoIHN5c3RlbSBSQU0KKyAqIGluIG5vZGUgMCwgYW5kIG90aGVyIG1lbW9yeSBibG9ja3MgaW4gdG8gbm9kZSAxIGFuZCB1cCwgb3JkZXJlZCBieQorICogbGF0ZW5jeS4gRWFjaCBub2RlJ3MgcGdkYXQgaXMgbm9kZS1sb2NhbCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBub2RlLAorICogaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIG5vZGUgbWVtIG1hcC4KKyAqLwordm9pZCBfX2luaXQgc2V0dXBfbWVtb3J5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmcmVlX3BmbiA9IFBGTl9VUChfX3BhKF9lbmQpKTsKKworCS8qCisJICogTm9kZSAwIHNldHMgdXAgaXRzIHBnZGF0IGF0IHRoZSBmaXJzdCBhdmFpbGFibGUgcGZuLAorCSAqIGFuZCBidW1wcyBpdCB1cCBiZWZvcmUgc2V0dGluZyB1cCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCisJICovCisJTk9ERV9EQVRBKDApID0gcGZuX3RvX2thZGRyKGZyZWVfcGZuKTsKKwltZW1zZXQoTk9ERV9EQVRBKDApLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJZnJlZV9wZm4gKz0gUEZOX1VQKHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlOT0RFX0RBVEEoMCktPmJkYXRhID0gJnBsYXRfbm9kZV9iZGF0YVswXTsKKworCS8qIFNldCB1cCBub2RlIDAgKi8KKwlzZXR1cF9ib290bWVtX2FsbG9jYXRvcihmcmVlX3Bmbik7CisKKwkvKiBHaXZlIHRoZSBwbGF0Zm9ybXMgYSBjaGFuY2UgdG8gaG9vayB1cCB0aGVpciBub2RlcyAqLworCXBsYXRfbWVtX3NldHVwKCk7Cit9CisKK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fbm9kZShpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGJvb3RtYXBfcGFnZXMsIGJvb3RtYXBfc3RhcnQsIGJvb3RtYXBfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZnJlZV9wZm4sIGVuZF9wZm47CisKKwkvKiBEb24ndCBhbGxvdyBib2d1cyBub2RlIGFzc2lnbm1lbnQgKi8KKwlCVUdfT04obmlkID4gTUFYX05VTU5PREVTIHx8IG5pZCA9PSAwKTsKKworCS8qCisJICogVGhlIGZyZWUgcGZuIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZSwgYW5kIGlzCisJICogYWR2YW5jZWQgYXMgbmVjZXNzYXJ5IGZvciBwZ2RhdCBhbmQgbm9kZSBtYXAgYWxsb2NhdGlvbnMuCisJICovCisJZnJlZV9wZm4gPSBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOworCWVuZF9wZm4gPSBlbmQgPj4gUEFHRV9TSElGVDsKKworCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOworCisJLyogTm9kZS1sb2NhbCBwZ2RhdCAqLworCU5PREVfREFUQShuaWQpID0gcGZuX3RvX2thZGRyKGZyZWVfcGZuKTsKKwlmcmVlX3BmbiArPSBQRk5fVVAoc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCW1lbXNldChOT0RFX0RBVEEobmlkKSwgMCwgc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCisJTk9ERV9EQVRBKG5pZCktPmJkYXRhID0gJnBsYXRfbm9kZV9iZGF0YVtuaWRdOworCU5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwlOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKKworCS8qIE5vZGUtbG9jYWwgYm9vdG1hcCAqLworCWJvb3RtYXBfcGFnZXMgPSBib290bWVtX2Jvb3RtYXBfcGFnZXMoZW5kX3BmbiAtIHN0YXJ0X3Bmbik7CisJYm9vdG1hcF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBmbl90b19rYWRkcihmcmVlX3Bmbik7CisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIGZyZWVfcGZuLCBzdGFydF9wZm4sCisJCQkJICAgIGVuZF9wZm4pOworCisJZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBlbmRfcGZuKTsKKworCS8qIFJlc2VydmUgdGhlIHBnZGF0IGFuZCBib290bWFwIHNwYWNlIHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yICovCisJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULAorCQkJICAgICBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIGZyZWVfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgIGJvb3RtYXBfcGFnZXMgPDwgUEFHRV9TSElGVCk7CisKKwkvKiBJdCdzIHVwICovCisJbm9kZV9zZXRfb25saW5lKG5pZCk7CisKKwkvKiBLaWNrIHNwYXJzZW1lbSAqLworCXNwYXJzZV9tZW1vcnlfcHJlc2VudF93aXRoX2FjdGl2ZV9yZWdpb25zKG5pZCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3BnLWRtYS5jIGIvYXJjaC9zaC9tbS9wZy1kbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyMzY3OS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL21tL3BnLWRtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvbW0vcGctZG1hLmMKLSAqCi0gKiBGYXN0IGNsZWFyX3BhZ2UoKS9jb3B5X3BhZ2UoKSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgU0ggRE1BQwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0vKiBDaGFubmVsIHRvIHVzZSBmb3IgcGFnZSBvcHMsIG11c3QgYmUgZHVhbC1hZGRyZXNzIG1vZGUgY2FwYWJsZS4gKi8KLXN0YXRpYyBpbnQgZG1hX2NoYW5uZWwgPSBDT05GSUdfRE1BX1BBR0VfT1BTX0NIQU5ORUw7Ci0KLXN0YXRpYyB2b2lkIGNvcHlfcGFnZV9kbWEodm9pZCAqdG8sIHZvaWQgKmZyb20pCi17Ci0JLyogCi0JICogVGhpcyBkb2Vzbid0IHNlZW0gdG8gZ2V0IHRyaWdnZXJlZCB1bnRpbCBmdXJ0aGVyIGFsb25nIGluIHRoZQotCSAqIGJvb3QgcHJvY2VzcywgYXQgd2hpY2ggcG9pbnQgdGhlIERNQUMgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4KLQkgKiBGaXggdGhpcyBpbiB0aGUgc2FtZSBmYXNoaW9uIGFzIGNsZWFyX3BhZ2VfZG1hKCkgaW4gdGhlIGV2ZW50Ci0JICogdGhhdCB0aGlzIGNyYXNoZXMgZHVlIHRvIHRoZSBETUFDIG5vdCBiZWluZyBpbml0aWFsaXplZC4KLQkgKi8KLQotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylmcm9tLCBQQUdFX1NJWkUpOwotCWRtYV93cml0ZV9wYWdlKGRtYV9jaGFubmVsLCAodW5zaWduZWQgbG9uZylmcm9tLCAodW5zaWduZWQgbG9uZyl0byk7Ci0JZG1hX3dhaXRfZm9yX2NvbXBsZXRpb24oZG1hX2NoYW5uZWwpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhcl9wYWdlX2RtYSh2b2lkICp0bykKLXsKLQkvKgotCSAqIFdlIGdldCBpbnZva2VkIHF1aXRlIGVhcmx5IG9uLCBpZiB0aGUgRE1BQyBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZAotCSAqIHlldCwgZmFsbCBiYWNrIG9uIHRoZSBzbG93IG1hbnVhbCBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlpZiAoZG1hX2luZm9bZG1hX2NoYW5uZWxdLmNoYW4gIT0gZG1hX2NoYW5uZWwpIHsKLQkJY2xlYXJfcGFnZV9zbG93KHRvKTsKLQkJcmV0dXJuOwotCX0KLQotCWRtYV93cml0ZV9wYWdlKGRtYV9jaGFubmVsLCAodW5zaWduZWQgbG9uZyllbXB0eV96ZXJvX3BhZ2UsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nKXRvKTsKLQotCS8qCi0JICogRklYTUU6IFNvbWV0aGluZyBpcyBhIGJpdCByYWN5IGhlcmUsIGlmIHdlIHBvbGwgdGhlIGNvdW50ZXIgcmlnaHQKLQkgKiBhd2F5LCB3ZSBzZWVtIHRvIGxvY2suIGZsdXNoaW5nIHRoZSBwYWdlIGZyb20gdGhlIGRjYWNoZSBkb2Vzbid0Ci0JICogc2VlbSB0byBtYWtlIGEgZGlmZmVyZW5jZSBvbmUgd2F5IG9yIHRoZSBvdGhlciwgdGhvdWdoIGVpdGhlciBhIGZ1bGwKLQkgKiBpY2FjaGUgb3IgZGNhY2hlIGZsdXNoIGRvZXMuCi0JICoKLQkgKiBUaGUgbG9jYXRpb24gb2YgdGhpcyBpcyBpbXBvcnRhbnQgYXMgd2VsbCwgYW5kIG11c3QgaGFwcGVuIHByaW9yIHRvCi0JICogdGhlIGNvbXBsZXRpb24gbG9vcCBidXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQuCi0JICoKLQkgKiBPZGRseSBlbm91Z2gsIHRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW4gaXNzdWUgZm9yIGNvcHlfcGFnZSgpLi4KLQkgKi8KLQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpdG8sIFBBR0VfU0laRSk7Ci0KLQlkbWFfd2FpdF9mb3JfY29tcGxldGlvbihkbWFfY2hhbm5lbCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBnX2RtYV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQkKLQlyZXQgPSByZXF1ZXN0X2RtYShkbWFfY2hhbm5lbCwgInBhZ2Ugb3BzIik7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JY29weV9wYWdlID0gY29weV9wYWdlX2RtYTsKLQljbGVhcl9wYWdlID0gY2xlYXJfcGFnZV9kbWE7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGdfZG1hX2V4aXQodm9pZCkKLXsKLQlmcmVlX2RtYShkbWFfY2hhbm5lbCk7Ci19Ci0KLW1vZHVsZV9pbml0KHBnX2RtYV9pbml0KTsKLW1vZHVsZV9leGl0KHBnX2RtYV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiT3B0aW1pemVkIHBhZ2UgY29weS9jbGVhciByb3V0aW5lcyB1c2luZyBhIGR1YWwtYWRkcmVzcyBtb2RlIGNhcGFibGUgRE1BQyBjaGFubmVsIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvdG9vbHMvTWFrZWZpbGUgYi9hcmNoL3NoL3Rvb2xzL01ha2VmaWxlCmluZGV4IDNjMzcwYTEuLjU2NzUxNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC90b29scy9NYWtlZmlsZQpAQCAtMTIsNCArMTIsNSBAQAogCiBpbmNsdWRlL2FzbS1zaC9tYWNodHlwZXMuaDogJChzcmMpL2dlbi1tYWNoLXR5cGVzICQoc3JjKS9tYWNoLXR5cGVzCiAJQGVjaG8gJyAgR2VuZXJhdGluZyAkQCcKKwkkKFEpaWYgWyAhIC1kIGluY2x1ZGUvYXNtLXNoIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZS9hc20tc2g7IGZpCiAJJChRKSQoQVdLKSAtZiAkXiA+ICRAIHx8IHsgcm0gLWYgJEA7IC9iaW4vZmFsc2U7IH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcwppbmRleCBmYjQwZjE4Li40YjVlOTMwIDEwMDY0NAotLS0gYS9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKKysrIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCkBAIC0xOCw3ICsxOCw2IEBACiBIUDZYWAkJCVNIX0hQNlhYCiBIRDY0NDYxCQkJSEQ2NDQ2MQogSEQ2NDQ2NQkJCUhENjQ0NjUKLVNBVFVSTgkJCVNIX1NBVFVSTgogRFJFQU1DQVNUCQlTSF9EUkVBTUNBU1QKIE1QQzEyMTEJCQlTSF9NUEMxMjExCiBTTkFQR0VBUgkJU0hfU0VDVVJFRURHRTU0MTAKQEAgLTM0LDMgKzMzLDQgQEAKIFRJVEFOCQkJU0hfVElUQU4KIFNITUlOCQkJU0hfU0hNSU4KIDc3MTBWT0lQR1cJCVNIXzc3MTBWT0lQR1cKK0xCT1hSRTIJCQlTSF9MQk9YX1JFMgpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc2g2NC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNGU5NWUxOC4uZGYwNmM2NCAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jCkBAIC0xMjksMTcgKzEyOSw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xNjYsMTAgKzE1OCw3IEBACiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2xpYi9jLWNoZWNrc3VtLmMgYi9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYwppbmRleCA0YjI2NzYzLi5iZDU1MDE3IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYworKysgYi9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYwpAQCAtMjEzLDMgKzIxMyw0IEBACiAKIAlyZXR1cm4gKF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggODU2N2NjOS4uNzNkZjcxMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjE3LDYgKzIxNyw5IEBACiAKIGVuZGlmCiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCAhUENJCisKIGNvbmZpZyBTVU5fT1BFTlBST01GUwogCXRyaXN0YXRlICJPcGVucHJvbSB0cmVlIGFwcGVhcnMgaW4gL3Byb2Mvb3BlbnByb20iCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKaW5kZXggZGM5ZmZlYS4uM2JjM2JmZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCkBAIC0xMDEsNiArMTAxLDcgQEAKIAogCXByaW50aygiJXMoJWQpOiAlcyBbIyVkXVxuIiwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBzdHIsICsrZGllX2NvdW50ZXIpOwogCXNob3dfcmVncyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAogCV9fU0FWRTsgX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsKIAlfX1NBVkU7IF9fU0FWRTsgX19TQVZFOyBfX1NBVkU7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3NybW11LmMgYi9hcmNoL3NwYXJjL21tL3NybW11LmMKaW5kZXggZTVlYWE4MC4uY2EyNjIzMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwpAQCAtMTYwLDkgKzE2MCw2IEBACiBzdGF0aWMgaW5saW5lIGludCBzcm1tdV9wdGVfcHJlc2VudChwdGVfdCBwdGUpCiB7IHJldHVybiAoKHB0ZV92YWwocHRlKSAmIFNSTU1VX0VUX01BU0spID09IFNSTU1VX0VUX1BURSk7IH0KIAotc3RhdGljIGlubGluZSBpbnQgc3JtbXVfcHRlX3JlYWQocHRlX3QgcHRlKQoteyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBTUk1NVV9OT1JFQUQpOyB9Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzcm1tdV9wdGVfY2xlYXIocHRlX3QgKnB0ZXApCiB7IHNybW11X3NldF9wdGUocHRlcCwgX19wdGUoMCkpOyB9CiAKQEAgLTIxODEsNyArMjE3OCw2IEBACiAKIAlCVEZJWFVQU0VUX0NBTEwocHRlX3ByZXNlbnQsIHNybW11X3B0ZV9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocHRlX2NsZWFyLCBzcm1tdV9wdGVfY2xlYXIsIEJURklYVVBDQUxMX1NXQVBPMEcwKTsKLQlCVEZJWFVQU0VUX0NBTEwocHRlX3JlYWQsIHNybW11X3B0ZV9yZWFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAogCUJURklYVVBTRVRfQ0FMTChwbWRfYmFkLCBzcm1tdV9wbWRfYmFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocG1kX3ByZXNlbnQsIHNybW11X3BtZF9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYyBiL2FyY2gvc3BhcmMvbW0vc3VuNGMuYwppbmRleCA0MzYwMjFjLi5iZGQ4MzVmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3N1bjRjLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCkBAIC0xNzQ4LDExICsxNzQ4LDYgQEAKIH0KIHN0YXRpYyB2b2lkIHN1bjRjX3B0ZV9jbGVhcihwdGVfdCAqcHRlcCkJeyAqcHRlcCA9IF9fcHRlKDApOyB9CiAKLXN0YXRpYyBpbnQgc3VuNGNfcHRlX3JlYWQocHRlX3QgcHRlKQotewotCXJldHVybiAocHRlX3ZhbChwdGUpICYgX1NVTjRDX1BBR0VfUkVBRCk7Ci19Ci0KIHN0YXRpYyBpbnQgc3VuNGNfcG1kX2JhZChwbWRfdCBwbWQpCiB7CiAJcmV0dXJuICgoKHBtZF92YWwocG1kKSAmIH5QQUdFX01BU0spICE9IFBHRF9UQUJMRSkgfHwKQEAgLTIyMTIsNyArMjIwNyw2IEBACiAKIAlCVEZJWFVQU0VUX0NBTEwocHRlX3ByZXNlbnQsIHN1bjRjX3B0ZV9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocHRlX2NsZWFyLCBzdW40Y19wdGVfY2xlYXIsIEJURklYVVBDQUxMX1NURzBPMCk7Ci0JQlRGSVhVUFNFVF9DQUxMKHB0ZV9yZWFkLCBzdW40Y19wdGVfcmVhZCwgQlRGSVhVUENBTExfTk9STSk7CiAKIAlCVEZJWFVQU0VUX0NBTEwocG1kX2JhZCwgc3VuNGNfcG1kX2JhZCwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKHBtZF9wcmVzZW50LCBzdW40Y19wbWRfcHJlc2VudCwgQlRGSVhVUENBTExfTk9STSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmluZGV4IDY1NjZkMTMuLmI4NGI2YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCkBAIC0xMDgsNiArMTA4LDE1IEBACiAKIHNvdXJjZSBrZXJuZWwvS2NvbmZpZy5oegogCitjb25maWcgSE9UUExVR19DUFUKKwlib29sICJTdXBwb3J0IGZvciBob3QtcGx1Z2dhYmxlIENQVXMiCisJZGVwZW5kcyBvbiBTTVAKKwlzZWxlY3QgSE9UUExVRworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gZXhwZXJpbWVudCB3aXRoIHR1cm5pbmcgQ1BVcyBvZmYgYW5kIG9uLiAgQ1BVcworCSAgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjLgorCSAgU2F5IE4gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBDUFUgaG90cGx1Zy4KKwogc291cmNlICJpbml0L0tjb25maWciCiAKIGNvbmZpZyBTWVNWSVBDX0NPTVBBVApAQCAtMzA1LDYgKzMxNCwxMiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIFNVTl9MRE9NUworCWJvb2wgIlN1biBMb2dpY2FsIERvbWFpbnMgc3VwcG9ydCIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlzIHlvdSB3YW50IHRvIHN1cHBvcnQgdmlydHVhbCBkZXZpY2VzIHZpYQorCSAgTG9naWNhbCBEb21haW5zLgorCiBjb25maWcgUENJCiAJYm9vbCAiUENJIHN1cHBvcnQiCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQppbmRleCBmOTY0YmYyLi5iNjY4NzZiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDcgQEAKIG9iai0kKENPTkZJR19QQ0kpCSArPSBlYnVzLm8gaXNhLm8gcGNpX2NvbW1vbi5vIHBjaV9pb21tdS5vIFwKIAkJCSAgICBwY2lfcHN5Y2hvLm8gcGNpX3NhYnJlLm8gcGNpX3NjaGl6by5vIFwKIAkJCSAgICBwY2lfc3VuNHYubyBwY2lfc3VuNHZfYXNtLm8gcGNpX2ZpcmUubwotb2JqLSQoQ09ORklHX1NNUCkJICs9IHNtcC5vIHRyYW1wb2xpbmUubworb2JqLSQoQ09ORklHX1NNUCkJICs9IHNtcC5vIHRyYW1wb2xpbmUubyBodnRyYW1wLm8KIG9iai0kKENPTkZJR19TUEFSQzMyX0NPTVBBVCkgKz0gc3lzMzIubyBzeXNfc3BhcmMzMi5vIHNpZ25hbDMyLm8KIG9iai0kKENPTkZJR19CSU5GTVRfRUxGMzIpICs9IGJpbmZtdF9lbGYzMi5vCiBvYmotJChDT05GSUdfQklORk1UX0FPVVQzMikgKz0gYmluZm10X2FvdXQzMi5vCkBAIC0yNiw2ICsyNiw3IEBACiBvYmotJChDT05GSUdfVVMzX0ZSRVEpICs9IHVzM19jcHVmcmVxLm8KIG9iai0kKENPTkZJR19VUzJFX0ZSRVEpICs9IHVzMmVfY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfS1BST0JFUykgKz0ga3Byb2Jlcy5vCitvYmotJChDT05GSUdfU1VOX0xET01TKSArPSBsZGMubyB2aW8ubyB2aW9ocy5vIGRzLm8KIG9iai0kKENPTkZJR19BVURJVCkgKz0gYXVkaXQubwogb2JqLSQoQ09ORklHX0FVRElUKSQoQ09ORklHX1NQQVJDMzJfQ09NUEFUKSArPSBjb21wYXRfYXVkaXQubwogb2JqLXkgKz0gJChvYmoteXkpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2RzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYwpAQCAtMCwwICsxLDExNjggQEAKKy8qIGRzLmM6IERvbWFpbiBTZXJ2aWNlcyBkcml2ZXIgZm9yIExvZ2ljYWwgRG9tYWlucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL3Bvd2VyLmg+CisjaW5jbHVkZSA8YXNtL21kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2hlYWQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiZHMiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdWwgMTEsIDIwMDciCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuIExET00gZG9tYWluIHNlcnZpY2VzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworc3RydWN0IGRzX21zZ190YWcgeworCV9fdTMyCQkJdHlwZTsKKyNkZWZpbmUgRFNfSU5JVF9SRVEJCTB4MDAKKyNkZWZpbmUgRFNfSU5JVF9BQ0sJCTB4MDEKKyNkZWZpbmUgRFNfSU5JVF9OQUNLCQkweDAyCisjZGVmaW5lIERTX1JFR19SRVEJCTB4MDMKKyNkZWZpbmUgRFNfUkVHX0FDSwkJMHgwNAorI2RlZmluZSBEU19SRUdfTkFDSwkJMHgwNQorI2RlZmluZSBEU19VTlJFR19SRVEJCTB4MDYKKyNkZWZpbmUgRFNfVU5SRUdfQUNLCQkweDA3CisjZGVmaW5lIERTX1VOUkVHX05BQ0sJCTB4MDgKKyNkZWZpbmUgRFNfREFUQQkJCTB4MDkKKyNkZWZpbmUgRFNfTkFDSwkJCTB4MGEKKworCV9fdTMyCQkJbGVuOworfTsKKworLyogUmVzdWx0IGNvZGVzICovCisjZGVmaW5lIERTX09LCQkJMHgwMAorI2RlZmluZSBEU19SRUdfVkVSX05BQ0sJCTB4MDEKKyNkZWZpbmUgRFNfUkVHX0RVUAkJMHgwMgorI2RlZmluZSBEU19JTlZfSERMCQkweDAzCisjZGVmaW5lIERTX1RZUEVfVU5LTk9XTgkJMHgwNAorCitzdHJ1Y3QgZHNfdmVyc2lvbiB7CisJX191MTYJCQltYWpvcjsKKwlfX3UxNgkJCW1pbm9yOworfTsKKworc3RydWN0IGRzX3Zlcl9yZXEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlzdHJ1Y3QgZHNfdmVyc2lvbgl2ZXI7Cit9OworCitzdHJ1Y3QgZHNfdmVyX2FjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTE2CQkJbWlub3I7Cit9OworCitzdHJ1Y3QgZHNfdmVyX25hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3UxNgkJCW1ham9yOworfTsKKworc3RydWN0IGRzX3JlZ19yZXEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKKwlfX3UxNgkJCW1ham9yOworCV9fdTE2CQkJbWlub3I7CisJY2hhcgkJCXN2Y19pZFswXTsKK307CisKK3N0cnVjdCBkc19yZWdfYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7CisJX191MTYJCQltaW5vcjsKK307CisKK3N0cnVjdCBkc19yZWdfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTE2CQkJbWFqb3I7Cit9OworCitzdHJ1Y3QgZHNfdW5yZWdfcmVxIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7Cit9OworCitzdHJ1Y3QgZHNfdW5yZWdfYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7Cit9OworCitzdHJ1Y3QgZHNfdW5yZWdfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworfTsKKworc3RydWN0IGRzX2RhdGEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc19kYXRhX25hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKKwlfX3U2NAkJCXJlc3VsdDsKK307CisKK3N0cnVjdCBkc19jYXBfc3RhdGUgeworCV9fdTY0CQkJaGFuZGxlOworCisJdm9pZAkJCSgqZGF0YSkoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQkJCXZvaWQgKmJ1ZiwgaW50IGxlbik7CisKKwljb25zdCBjaGFyCQkqc2VydmljZV9pZDsKKworCXU4CQkJc3RhdGU7CisjZGVmaW5lIENBUF9TVEFURV9VTktOT1dOCTB4MDAKKyNkZWZpbmUgQ0FQX1NUQVRFX1JFR19TRU5UCTB4MDEKKyNkZWZpbmUgQ0FQX1NUQVRFX1JFR0lTVEVSRUQJMHgwMgorfTsKKworc3RhdGljIHZvaWQgbWRfdXBkYXRlX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQkgICB2b2lkICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgZG9tYWluX3NodXRkb3duX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQkJIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkb21haW5fcGFuaWNfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQkgICAgICB2b2lkICpidWYsIGludCBsZW4pOworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIHZvaWQgZHJfY3B1X2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgZHNfcHJpX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRzX3Zhcl9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCXZvaWQgKmJ1ZiwgaW50IGxlbik7CisKK3N0cnVjdCBkc19jYXBfc3RhdGUgZHNfc3RhdGVzW10gPSB7CisJeworCQkuc2VydmljZV9pZAk9ICJtZC11cGRhdGUiLAorCQkuZGF0YQkJPSBtZF91cGRhdGVfZGF0YSwKKwl9LAorCXsKKwkJLnNlcnZpY2VfaWQJPSAiZG9tYWluLXNodXRkb3duIiwKKwkJLmRhdGEJCT0gZG9tYWluX3NodXRkb3duX2RhdGEsCisJfSwKKwl7CisJCS5zZXJ2aWNlX2lkCT0gImRvbWFpbi1wYW5pYyIsCisJCS5kYXRhCQk9IGRvbWFpbl9wYW5pY19kYXRhLAorCX0sCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJeworCQkuc2VydmljZV9pZAk9ICJkci1jcHUiLAorCQkuZGF0YQkJPSBkcl9jcHVfZGF0YSwKKwl9LAorI2VuZGlmCisJeworCQkuc2VydmljZV9pZAk9ICJwcmkiLAorCQkuZGF0YQkJPSBkc19wcmlfZGF0YSwKKwl9LAorCXsKKwkJLnNlcnZpY2VfaWQJPSAidmFyLWNvbmZpZyIsCisJCS5kYXRhCQk9IGRzX3Zhcl9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJ2YXItY29uZmlnLWJhY2t1cCIsCisJCS5kYXRhCQk9IGRzX3Zhcl9kYXRhLAorCX0sCit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRzX2xvY2spOworCitzdHJ1Y3QgZHNfaW5mbyB7CisJc3RydWN0IGxkY19jaGFubmVsCSpscDsKKwl1OAkJCWhzX3N0YXRlOworI2RlZmluZSBEU19IU19TVEFSVAkJMHgwMQorI2RlZmluZSBEU19IU19ET05FCQkweDAyCisKKwl2b2lkCQkJKnJjdl9idWY7CisJaW50CQkJcmN2X2J1Zl9sZW47Cit9OworCitzdGF0aWMgc3RydWN0IGRzX2luZm8gKmRzX2luZm87CisKK3N0YXRpYyBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpmaW5kX2NhcCh1NjQgaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBpbmRleCA9IGhhbmRsZSA+PiAzMjsKKworCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKGRzX3N0YXRlcykpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZHNfc3RhdGVzW2luZGV4XTsKK30KKworc3RhdGljIHN0cnVjdCBkc19jYXBfc3RhdGUgKmZpbmRfY2FwX2J5X3N0cmluZyhjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNfc3RhdGVzKTsgaSsrKSB7CisJCWlmIChzdHJjbXAoZHNfc3RhdGVzW2ldLnNlcnZpY2VfaWQsIG5hbWUpKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuICZkc19zdGF0ZXNbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZHNfc2VuZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWludCBlcnIsIGxpbWl0ID0gMTAwMDsKKworCWVyciA9IC1FSU5WQUw7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCWVyciA9IGxkY193cml0ZShscCwgZGF0YSwgbGVuKTsKKwkJaWYgKCFlcnIgfHwgKGVyciAhPSAtRUFHQUlOKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkc19zZW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwllcnIgPSBfX2RzX3NlbmQobHAsIGRhdGEsIGxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGRzX21kX3VwZGF0ZV9yZXEgeworCV9fdTY0CQkJCXJlcV9udW07Cit9OworCitzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3UzMgkJCQlyZXN1bHQ7Cit9OworCitzdGF0aWMgdm9pZCBtZF91cGRhdGVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQkgICB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX21kX3VwZGF0ZV9yZXEgKnJwOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcwlyZXM7CisJfSBwa3Q7CisKKwlycCA9IChzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk1hY2hpbmUgZGVzY3JpcHRpb24gdXBkYXRlLlxuIik7CisKKwltZGVzY191cGRhdGUoKTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJcGt0LmRhdGEudGFnLnR5cGUgPSBEU19EQVRBOworCXBrdC5kYXRhLnRhZy5sZW4gPSBzaXplb2YocGt0KSAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisJcGt0LmRhdGEuaGFuZGxlID0gZHAtPmhhbmRsZTsKKwlwa3QucmVzLnJlcV9udW0gPSBycC0+cmVxX251bTsKKwlwa3QucmVzLnJlc3VsdCA9IERTX09LOworCisJZHNfc2VuZChscCwgJnBrdCwgc2l6ZW9mKHBrdCkpOworfQorCitzdHJ1Y3QgZHNfc2h1dGRvd25fcmVxIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCW1zX2RlbGF5OworfTsKKworc3RydWN0IGRzX3NodXRkb3duX3JlcyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisJY2hhcgkJCQlyZWFzb25bMV07Cit9OworCitzdGF0aWMgdm9pZCBkb21haW5fc2h1dGRvd25fZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpkcCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gYnVmOworCXN0cnVjdCBkc19zaHV0ZG93bl9yZXEgKnJwOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHNfc2h1dGRvd25fcmVzCXJlczsKKwl9IHBrdDsKKworCXJwID0gKHN0cnVjdCBkc19zaHV0ZG93bl9yZXEgKikgKGRwa3QgKyAxKTsKKworCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiU2h1dGRvd24gcmVxdWVzdCBmcm9tICIKKwkgICAgICAgIkxET00gbWFuYWdlciByZWNlaXZlZC5cbiIpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEudGFnLmxlbiA9IHNpemVvZihwa3QpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBkcC0+aGFuZGxlOworCXBrdC5yZXMucmVxX251bSA9IHJwLT5yZXFfbnVtOworCXBrdC5yZXMucmVzdWx0ID0gRFNfT0s7CisJcGt0LnJlcy5yZWFzb25bMF0gPSAwOworCisJZHNfc2VuZChscCwgJnBrdCwgc2l6ZW9mKHBrdCkpOworCisJd2FrZV91cF9wb3dlcmQoKTsKK30KKworc3RydWN0IGRzX3BhbmljX3JlcSB7CisJX191NjQJCQkJcmVxX251bTsKK307CisKK3N0cnVjdCBkc19wYW5pY19yZXMgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJcmVzdWx0OworCWNoYXIJCQkJcmVhc29uWzFdOworfTsKKworc3RhdGljIHZvaWQgZG9tYWluX3BhbmljX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICAgIHN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJICAgICAgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gYnVmOworCXN0cnVjdCBkc19wYW5pY19yZXEgKnJwOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHNfcGFuaWNfcmVzCXJlczsKKwl9IHBrdDsKKworCXJwID0gKHN0cnVjdCBkc19wYW5pY19yZXEgKikgKGRwa3QgKyAxKTsKKworCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiUGFuaWMgcmVxdWVzdCBmcm9tICIKKwkgICAgICAgIkxET00gbWFuYWdlciByZWNlaXZlZC5cbiIpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEudGFnLmxlbiA9IHNpemVvZihwa3QpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBkcC0+aGFuZGxlOworCXBrdC5yZXMucmVxX251bSA9IHJwLT5yZXFfbnVtOworCXBrdC5yZXMucmVzdWx0ID0gRFNfT0s7CisJcGt0LnJlcy5yZWFzb25bMF0gPSAwOworCisJZHNfc2VuZChscCwgJnBrdCwgc2l6ZW9mKHBrdCkpOworCisJcGFuaWMoIlBBTklDIHJlcXVlc3RlZCBieSBMRE9NIG1hbmFnZXIuIik7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0cnVjdCBkcl9jcHVfdGFnIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXR5cGU7CisjZGVmaW5lIERSX0NQVV9DT05GSUdVUkUJCTB4NDMKKyNkZWZpbmUgRFJfQ1BVX1VOQ09ORklHVVJFCQkweDU1CisjZGVmaW5lIERSX0NQVV9GT1JDRV9VTkNPTkZJR1VSRQkweDQ2CisjZGVmaW5lIERSX0NQVV9TVEFUVVMJCQkweDUzCisKKy8qIFJlc3BvbnNlcyAqLworI2RlZmluZSBEUl9DUFVfT0sJCQkweDZmCisjZGVmaW5lIERSX0NQVV9FUlJPUgkJCTB4NjUKKworCV9fdTMyCQkJCW51bV9yZWNvcmRzOworfTsKKworc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5IHsKKwlfX3UzMgkJCQljcHU7CisJX191MzIJCQkJcmVzdWx0OworI2RlZmluZSBEUl9DUFVfUkVTX09LCQkJMHgwMAorI2RlZmluZSBEUl9DUFVfUkVTX0ZBSUxVUkUJCTB4MDEKKyNkZWZpbmUgRFJfQ1BVX1JFU19CTE9DS0VECQkweDAyCisjZGVmaW5lIERSX0NQVV9SRVNfQ1BVX05PVF9SRVNQT05ESU5HCTB4MDMKKyNkZWZpbmUgRFJfQ1BVX1JFU19OT1RfSU5fTUQJCTB4MDQKKworCV9fdTMyCQkJCXN0YXQ7CisjZGVmaW5lIERSX0NQVV9TVEFUX05PVF9QUkVTRU5UCQkweDAwCisjZGVmaW5lIERSX0NQVV9TVEFUX1VOQ09ORklHVVJFRAkweDAxCisjZGVmaW5lIERSX0NQVV9TVEFUX0NPTkZJR1VSRUQJCTB4MDIKKworCV9fdTMyCQkJCXN0cl9vZmY7Cit9OworCitzdGF0aWMgdm9pZCBfX2RyX2NwdV9zZW5kX2Vycm9yKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCBzdHJ1Y3QgZHNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJfY3B1X3RhZyAqdGFnID0gKHN0cnVjdCBkcl9jcHVfdGFnICopIChkYXRhICsgMSk7CisJc3RydWN0IGRzX2luZm8gKmRwID0gZHNfaW5mbzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZHNfZGF0YQkJZGF0YTsKKwkJc3RydWN0IGRyX2NwdV90YWcJdGFnOworCX0gcGt0OworCWludCBtc2dfbGVuOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEuaGFuZGxlID0gY3AtPmhhbmRsZTsKKwlwa3QudGFnLnJlcV9udW0gPSB0YWctPnJlcV9udW07CisJcGt0LnRhZy50eXBlID0gRFJfQ1BVX0VSUk9SOworCXBrdC50YWcubnVtX3JlY29yZHMgPSAwOworCisJbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IGRzX2RhdGEpICsKKwkJICAgc2l6ZW9mKHN0cnVjdCBkcl9jcHVfdGFnKSk7CisKKwlwa3QuZGF0YS50YWcubGVuID0gbXNnX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisKKwlfX2RzX3NlbmQoZHAtPmxwLCAmcGt0LCBtc2dfbGVuKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X3NlbmRfZXJyb3Ioc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsIHN0cnVjdCBkc19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCV9fZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBDUFVfU0VOVElORUwJMHhmZmZmZmZmZgorCitzdGF0aWMgdm9pZCBwdXJnZV9kdXBzKHUzMiAqbGlzdCwgdTMyIG51bV9lbnRzKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbnRzOyBpKyspIHsKKwkJdTMyIGNwdSA9IGxpc3RbaV07CisJCXVuc2lnbmVkIGludCBqOworCisJCWlmIChjcHUgPT0gQ1BVX1NFTlRJTkVMKQorCQkJY29udGludWU7CisKKwkJZm9yIChqID0gaSArIDE7IGogPCBudW1fZW50czsgaisrKSB7CisJCQlpZiAobGlzdFtqXSA9PSBjcHUpCisJCQkJbGlzdFtqXSA9IENQVV9TRU5USU5FTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBkcl9jcHVfc2l6ZV9yZXNwb25zZShpbnQgbmNwdXMpCit7CisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGRzX2RhdGEpICsKKwkJc2l6ZW9mKHN0cnVjdCBkcl9jcHVfdGFnKSArCisJCShzaXplb2Yoc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5KSAqIG5jcHVzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRyX2NwdV9pbml0X3Jlc3BvbnNlKHN0cnVjdCBkc19kYXRhICpyZXNwLCB1NjQgcmVxX251bSwKKwkJCQkgdTY0IGhhbmRsZSwgaW50IHJlc3BfbGVuLCBpbnQgbmNwdXMsCisJCQkJIGNwdW1hc2tfdCAqbWFzaywgdTMyIGRlZmF1bHRfc3RhdCkKK3sKKwlzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgKmVudDsKKwlzdHJ1Y3QgZHJfY3B1X3RhZyAqdGFnOworCWludCBpLCBjcHU7CisKKwl0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKHJlc3AgKyAxKTsKKwllbnQgPSAoc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5ICopICh0YWcgKyAxKTsKKworCXJlc3AtPnRhZy50eXBlID0gRFNfREFUQTsKKwlyZXNwLT50YWcubGVuID0gcmVzcF9sZW4gLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXJlc3AtPmhhbmRsZSA9IGhhbmRsZTsKKwl0YWctPnJlcV9udW0gPSByZXFfbnVtOworCXRhZy0+dHlwZSA9IERSX0NQVV9PSzsKKwl0YWctPm51bV9yZWNvcmRzID0gbmNwdXM7CisKKwlpID0gMDsKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsICptYXNrKSB7CisJCWVudFtpXS5jcHUgPSBjcHU7CisJCWVudFtpXS5yZXN1bHQgPSBEUl9DUFVfUkVTX09LOworCQllbnRbaV0uc3RhdCA9IGRlZmF1bHRfc3RhdDsKKwkJaSsrOworCX0KKwlCVUdfT04oaSAhPSBuY3B1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGRyX2NwdV9tYXJrKHN0cnVjdCBkc19kYXRhICpyZXNwLCBpbnQgY3B1LCBpbnQgbmNwdXMsCisJCQl1MzIgcmVzLCB1MzIgc3RhdCkKK3sKKwlzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgKmVudDsKKwlzdHJ1Y3QgZHJfY3B1X3RhZyAqdGFnOworCWludCBpOworCisJdGFnID0gKHN0cnVjdCBkcl9jcHVfdGFnICopIChyZXNwICsgMSk7CisJZW50ID0gKHN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqKSAodGFnICsgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmNwdXM7IGkrKykgeworCQlpZiAoZW50W2ldLmNwdSAhPSBjcHUpCisJCQljb250aW51ZTsKKwkJZW50W2ldLnJlc3VsdCA9IHJlczsKKwkJZW50W2ldLnN0YXQgPSBzdGF0OworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHJfY3B1X2NvbmZpZ3VyZShzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwgdTY0IHJlcV9udW0sCisJCQkgICAgY3B1bWFza190ICptYXNrKQoreworCXN0cnVjdCBkc19kYXRhICpyZXNwOworCWludCByZXNwX2xlbiwgbmNwdXMsIGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmNwdXMgPSBjcHVzX3dlaWdodCgqbWFzayk7CisJcmVzcF9sZW4gPSBkcl9jcHVfc2l6ZV9yZXNwb25zZShuY3B1cyk7CisJcmVzcCA9IGt6YWxsb2MocmVzcF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcmVzcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcl9jcHVfaW5pdF9yZXNwb25zZShyZXNwLCByZXFfbnVtLCBjcC0+aGFuZGxlLAorCQkJICAgICByZXNwX2xlbiwgbmNwdXMsIG1hc2ssCisJCQkgICAgIERSX0NQVV9TVEFUX0NPTkZJR1VSRUQpOworCisJbWRlc2NfZmlsbF9pbl9jcHVfZGF0YSgqbWFzayk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsICptYXNrKSB7CisJCWludCBlcnI7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlN0YXJ0aW5nIGNwdSAlZC4uLlxuIiwgY3B1KTsKKwkJZXJyID0gY3B1X3VwKGNwdSk7CisJCWlmIChlcnIpIHsKKwkJCV9fdTMyIHJlcyA9IERSX0NQVV9SRVNfRkFJTFVSRTsKKwkJCV9fdTMyIHN0YXQgPSBEUl9DUFVfU1RBVF9VTkNPTkZJR1VSRUQ7CisKKwkJCWlmICghY3B1X3ByZXNlbnQoY3B1KSkgeworCQkJCS8qIENQVSBub3QgcHJlc2VudCBpbiBNRCAqLworCQkJCXJlcyA9IERSX0NQVV9SRVNfTk9UX0lOX01EOworCQkJCXN0YXQgPSBEUl9DUFVfU1RBVF9OT1RfUFJFU0VOVDsKKwkJCX0gZWxzZSBpZiAoZXJyID09IC1FTk9ERVYpIHsKKwkJCQkvKiBDUFUgZGlkIG5vdCBjYWxsIGluIHN1Y2Nlc3NmdWxseSAqLworCQkJCXJlcyA9IERSX0NQVV9SRVNfQ1BVX05PVF9SRVNQT05ESU5HOworCQkJfQorCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ1BVIHN0YXJ0dXAgZmFpbGVkIGVycj0lZFxuIiwKKwkJCSAgICAgICBlcnIpOworCQkJZHJfY3B1X21hcmsocmVzcCwgY3B1LCBuY3B1cywgcmVzLCBzdGF0KTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJX19kc19zZW5kKGRzX2luZm8tPmxwLCByZXNwLCByZXNwX2xlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJa2ZyZWUocmVzcCk7CisKKwkvKiBSZWRpc3RyaWJ1dGUgSVJRcywgdGFraW5nIGludG8gYWNjb3VudCB0aGUgbmV3IGNwdXMuICAqLworCWZpeHVwX2lycXMoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyX2NwdV91bmNvbmZpZ3VyZShzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwgdTY0IHJlcV9udW0sCisJCQkgICAgICBjcHVtYXNrX3QgKm1hc2spCit7CisJc3RydWN0IGRzX2RhdGEgKnJlc3A7CisJaW50IHJlc3BfbGVuLCBuY3B1cywgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluY3B1cyA9IGNwdXNfd2VpZ2h0KCptYXNrKTsKKwlyZXNwX2xlbiA9IGRyX2NwdV9zaXplX3Jlc3BvbnNlKG5jcHVzKTsKKwlyZXNwID0ga3phbGxvYyhyZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyX2NwdV9pbml0X3Jlc3BvbnNlKHJlc3AsIHJlcV9udW0sIGNwLT5oYW5kbGUsCisJCQkgICAgIHJlc3BfbGVuLCBuY3B1cywgbWFzaywKKwkJCSAgICAgRFJfQ1BVX1NUQVRfVU5DT05GSUdVUkVEKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJaW50IGVycjsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ1BVWyVkXTogU2h1dHRpbmcgZG93biBjcHUgJWQuLi5cbiIsCisJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIGNwdSk7CisJCWVyciA9IGNwdV9kb3duKGNwdSk7CisJCWlmIChlcnIpCisJCQlkcl9jcHVfbWFyayhyZXNwLCBjcHUsIG5jcHVzLAorCQkJCSAgICBEUl9DUFVfUkVTX0ZBSUxVUkUsCisJCQkJICAgIERSX0NQVV9TVEFUX0NPTkZJR1VSRUQpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJX19kc19zZW5kKGRzX2luZm8tPmxwLCByZXNwLCByZXNwX2xlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJa2ZyZWUocmVzcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBkc19kYXRhICpkYXRhID0gYnVmOworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKGRhdGEgKyAxKTsKKwl1MzIgKmNwdV9saXN0ID0gKHUzMiAqKSAodGFnICsgMSk7CisJdTY0IHJlcV9udW0gPSB0YWctPnJlcV9udW07CisJY3B1bWFza190IG1hc2s7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCXN3aXRjaCAodGFnLT50eXBlKSB7CisJY2FzZSBEUl9DUFVfQ09ORklHVVJFOgorCWNhc2UgRFJfQ1BVX1VOQ09ORklHVVJFOgorCWNhc2UgRFJfQ1BVX0ZPUkNFX1VOQ09ORklHVVJFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRyX2NwdV9zZW5kX2Vycm9yKGNwLCBkYXRhKTsKKwkJcmV0dXJuOworCX0KKworCXB1cmdlX2R1cHMoY3B1X2xpc3QsIHRhZy0+bnVtX3JlY29yZHMpOworCisJY3B1c19jbGVhcihtYXNrKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGFnLT5udW1fcmVjb3JkczsgaSsrKSB7CisJCWlmIChjcHVfbGlzdFtpXSA9PSBDUFVfU0VOVElORUwpCisJCQljb250aW51ZTsKKworCQlpZiAoY3B1X2xpc3RbaV0gPCBOUl9DUFVTKQorCQkJY3B1X3NldChjcHVfbGlzdFtpXSwgbWFzayk7CisJfQorCisJaWYgKHRhZy0+dHlwZSA9PSBEUl9DUFVfQ09ORklHVVJFKQorCQllcnIgPSBkcl9jcHVfY29uZmlndXJlKGNwLCByZXFfbnVtLCAmbWFzayk7CisJZWxzZQorCQllcnIgPSBkcl9jcHVfdW5jb25maWd1cmUoY3AsIHJlcV9udW0sICZtYXNrKTsKKworCWlmIChlcnIpCisJCWRyX2NwdV9zZW5kX2Vycm9yKGNwLCBkYXRhKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RydWN0IGRzX3ByaV9tc2cgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191NjQJCQkJdHlwZTsKKyNkZWZpbmUgRFNfUFJJX1JFUVVFU1QJCQkweDAwCisjZGVmaW5lIERTX1BSSV9EQVRBCQkJMHgwMQorI2RlZmluZSBEU19QUklfVVBEQVRFCQkJMHgwMgorfTsKKworc3RhdGljIHZvaWQgZHNfcHJpX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gYnVmOworCXN0cnVjdCBkc19wcmlfbXNnICpycDsKKworCXJwID0gKHN0cnVjdCBkc19wcmlfbXNnICopIChkcGt0ICsgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiUFJJIFJFUSBbJWx4OiVseF0sIGxlbj0lZFxuIiwKKwkgICAgICAgcnAtPnJlcV9udW0sIHJwLT50eXBlLCBsZW4pOworfQorCitzdHJ1Y3QgZHNfdmFyX2hkciB7CisJX191MzIJCQkJdHlwZTsKKyNkZWZpbmUgRFNfVkFSX1NFVF9SRVEJCQkweDAwCisjZGVmaW5lIERTX1ZBUl9ERUxFVEVfUkVRCQkweDAxCisjZGVmaW5lIERTX1ZBUl9TRVRfUkVTUAkJCTB4MDIKKyNkZWZpbmUgRFNfVkFSX0RFTEVURV9SRVNQCQkweDAzCit9OworCitzdHJ1Y3QgZHNfdmFyX3NldF9tc2cgeworCXN0cnVjdCBkc192YXJfaGRyCQloZHI7CisJY2hhcgkJCQluYW1lX2FuZF92YWx1ZVswXTsKK307CisKK3N0cnVjdCBkc192YXJfZGVsZXRlX21zZyB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwljaGFyCQkJCW5hbWVbMF07Cit9OworCitzdHJ1Y3QgZHNfdmFyX3Jlc3AgeworCXN0cnVjdCBkc192YXJfaGRyCQloZHI7CisJX191MzIJCQkJcmVzdWx0OworI2RlZmluZSBEU19WQVJfU1VDQ0VTUwkJCTB4MDAKKyNkZWZpbmUgRFNfVkFSX05PX1NQQUNFCQkJMHgwMQorI2RlZmluZSBEU19WQVJfSU5WQUxJRF9WQVIJCTB4MDIKKyNkZWZpbmUgRFNfVkFSX0lOVkFMSURfVkFMCQkweDAzCisjZGVmaW5lIERTX1ZBUl9OT1RfUFJFU0VOVAkJMHgwNAorfTsKKworc3RhdGljIERFRklORV9NVVRFWChkc192YXJfbXV0ZXgpOworc3RhdGljIGludCBkc192YXJfZG9vcmJlbGw7CitzdGF0aWMgaW50IGRzX3Zhcl9yZXNwb25zZTsKKworc3RhdGljIHZvaWQgZHNfdmFyX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gYnVmOworCXN0cnVjdCBkc192YXJfcmVzcCAqcnA7CisKKwlycCA9IChzdHJ1Y3QgZHNfdmFyX3Jlc3AgKikgKGRwa3QgKyAxKTsKKworCWlmIChycC0+aGRyLnR5cGUgIT0gRFNfVkFSX1NFVF9SRVNQICYmCisJICAgIHJwLT5oZHIudHlwZSAhPSBEU19WQVJfREVMRVRFX1JFU1ApCisJCXJldHVybjsKKworCWRzX3Zhcl9yZXNwb25zZSA9IHJwLT5yZXN1bHQ7CisJd21iKCk7CisJZHNfdmFyX2Rvb3JiZWxsID0gMTsKK30KKwordm9pZCBsZG9tX3NldF92YXIoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBkc19pbmZvOworCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwOworCisJY3AgPSBmaW5kX2NhcF9ieV9zdHJpbmcoInZhci1jb25maWciKTsKKwlpZiAoY3AtPnN0YXRlICE9IENBUF9TVEFURV9SRUdJU1RFUkVEKQorCQljcCA9IGZpbmRfY2FwX2J5X3N0cmluZygidmFyLWNvbmZpZy1iYWNrdXAiKTsKKworCWlmIChjcC0+c3RhdGUgPT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpIHsKKwkJdW5pb24geworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgZHNfZGF0YQkJZGF0YTsKKwkJCQlzdHJ1Y3QgZHNfdmFyX3NldF9tc2cJbXNnOworCQkJfSBoZWFkZXI7CisJCQljaGFyCQkJYWxsWzUxMl07CisJCX0gcGt0OworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQljaGFyICAqYmFzZSwgKnA7CisJCWludCBtc2dfbGVuLCBsb29wczsKKworCQltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCQlwa3QuaGVhZGVyLmRhdGEudGFnLnR5cGUgPSBEU19EQVRBOworCQlwa3QuaGVhZGVyLmRhdGEuaGFuZGxlID0gY3AtPmhhbmRsZTsKKwkJcGt0LmhlYWRlci5tc2cuaGRyLnR5cGUgPSBEU19WQVJfU0VUX1JFUTsKKwkJYmFzZSA9IHAgPSAmcGt0LmhlYWRlci5tc2cubmFtZV9hbmRfdmFsdWVbMF07CisJCXN0cmNweShwLCB2YXIpOworCQlwICs9IHN0cmxlbih2YXIpICsgMTsKKwkJc3RyY3B5KHAsIHZhbHVlKTsKKwkJcCArPSBzdHJsZW4odmFsdWUpICsgMTsKKworCQltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQkJICAgc2l6ZW9mKHN0cnVjdCBkc192YXJfc2V0X21zZykgKworCQkJICAgKHAgLSBiYXNlKSk7CisJCW1zZ19sZW4gPSAobXNnX2xlbiArIDMpICYgfjM7CisJCXBrdC5oZWFkZXIuZGF0YS50YWcubGVuID0gbXNnX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisKKwkJbXV0ZXhfbG9jaygmZHNfdmFyX211dGV4KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCQlkc192YXJfZG9vcmJlbGwgPSAwOworCQlkc192YXJfcmVzcG9uc2UgPSAtMTsKKworCQlfX2RzX3NlbmQoZHAtPmxwLCAmcGt0LCBtc2dfbGVuKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJCWxvb3BzID0gMTAwMDsKKwkJd2hpbGUgKGRzX3Zhcl9kb29yYmVsbCA9PSAwKSB7CisJCQlpZiAobG9vcHMtLSA8IDApCisJCQkJYnJlYWs7CisJCQliYXJyaWVyKCk7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfQorCisJCW11dGV4X3VubG9jaygmZHNfdmFyX211dGV4KTsKKworCQlpZiAoZHNfdmFyX2Rvb3JiZWxsID09IDAgfHwKKwkJICAgIGRzX3Zhcl9yZXNwb25zZSAhPSBEU19WQVJfU1VDQ0VTUykKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInZhci1jb25maWcgWyVzOiVzXSAiCisJCQkgICAgICAgImZhaWxlZCwgcmVzcG9uc2UoJWQpLlxuIiwKKwkJCSAgICAgICB2YXIsIHZhbHVlLAorCQkJICAgICAgIGRzX3Zhcl9yZXNwb25zZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmFyLWNvbmZpZyBub3QgcmVnaXN0ZXJlZCBzbyAiCisJCSAgICAgICAiY291bGQgbm90IHNldCAoJXMpIHZhcmlhYmxlIHRvICglcykuXG4iLAorCQkgICAgICAgdmFyLCB2YWx1ZSk7CisJfQorfQorCit2b2lkIGxkb21fcmVib290KGNvbnN0IGNoYXIgKmJvb3RfY29tbWFuZCkKK3sKKwkvKiBEb24ndCBib3RoZXIgd2l0aCBhbnkgb2YgdGhpcyBpZiB0aGUgYm9vdF9jb21tYW5kCisJICogaXMgZW1wdHkuCisJICovCisJaWYgKGJvb3RfY29tbWFuZCAmJiBzdHJsZW4oYm9vdF9jb21tYW5kKSkgeworCQljaGFyIGZ1bGxfYm9vdF9zdHJbMjU2XTsKKworCQlzdHJjcHkoZnVsbF9ib290X3N0ciwgImJvb3QgIik7CisJCXN0cmNweShmdWxsX2Jvb3Rfc3RyICsgc3RybGVuKCJib290ICIpLCBib290X2NvbW1hbmQpOworCisJCWxkb21fc2V0X3ZhcigicmVib290LWNvbW1hbmQiLCBmdWxsX2Jvb3Rfc3RyKTsKKwl9CisJc3VuNHZfbWFjaF9zaXIoKTsKK30KKwordm9pZCBsZG9tX3Bvd2VyX29mZih2b2lkKQoreworCXN1bjR2X21hY2hfZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQgZHNfY29ubl9yZXNldChzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZHNfY29ubl9yZXNldCgpIGZyb20gJXBcbiIsCisJICAgICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfc2VydmljZXMoc3RydWN0IGRzX2luZm8gKmRwKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHAgPSBkcC0+bHA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc19zdGF0ZXMpOyBpKyspIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBkc19yZWdfcmVxIHJlcTsKKwkJCXU4IGlkX2J1ZlsyNTZdOworCQl9IHBidWY7CisJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gJmRzX3N0YXRlc1tpXTsKKwkJaW50IGVyciwgbXNnX2xlbjsKKwkJdTY0IG5ld19jb3VudDsKKworCQlpZiAoY3AtPnN0YXRlID09IENBUF9TVEFURV9SRUdJU1RFUkVEKQorCQkJY29udGludWU7CisKKwkJbmV3X2NvdW50ID0gc2NoZWRfY2xvY2soKSAmIDB4ZmZmZmZmZmY7CisJCWNwLT5oYW5kbGUgPSAoKHU2NCkgaSA8PCAzMikgfCBuZXdfY291bnQ7CisKKwkJbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IGRzX3JlZ19yZXEpICsKKwkJCSAgIHN0cmxlbihjcC0+c2VydmljZV9pZCkpOworCisJCW1lbXNldCgmcGJ1ZiwgMCwgc2l6ZW9mKHBidWYpKTsKKwkJcGJ1Zi5yZXEudGFnLnR5cGUgPSBEU19SRUdfUkVROworCQlwYnVmLnJlcS50YWcubGVuID0gKG1zZ19sZW4gLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpKTsKKwkJcGJ1Zi5yZXEuaGFuZGxlID0gY3AtPmhhbmRsZTsKKwkJcGJ1Zi5yZXEubWFqb3IgPSAxOworCQlwYnVmLnJlcS5taW5vciA9IDA7CisJCXN0cmNweShwYnVmLnJlcS5zdmNfaWQsIGNwLT5zZXJ2aWNlX2lkKTsKKworCQllcnIgPSBfX2RzX3NlbmQobHAsICZwYnVmLCBtc2dfbGVuKTsKKwkJaWYgKGVyciA+IDApCisJCQljcC0+c3RhdGUgPSBDQVBfU1RBVEVfUkVHX1NFTlQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzX2hhbmRzaGFrZShzdHJ1Y3QgZHNfaW5mbyAqZHAsIHN0cnVjdCBkc19tc2dfdGFnICpwa3QpCit7CisKKwlpZiAoZHAtPmhzX3N0YXRlID09IERTX0hTX1NUQVJUKSB7CisJCWlmIChwa3QtPnR5cGUgIT0gRFNfSU5JVF9BQ0spCisJCQlnb3RvIGNvbm5fcmVzZXQ7CisKKwkJZHAtPmhzX3N0YXRlID0gRFNfSFNfRE9ORTsKKworCQlyZXR1cm4gcmVnaXN0ZXJfc2VydmljZXMoZHApOworCX0KKworCWlmIChkcC0+aHNfc3RhdGUgIT0gRFNfSFNfRE9ORSkKKwkJZ290byBjb25uX3Jlc2V0OworCisJaWYgKHBrdC0+dHlwZSA9PSBEU19SRUdfQUNLKSB7CisJCXN0cnVjdCBkc19yZWdfYWNrICphcCA9IChzdHJ1Y3QgZHNfcmVnX2FjayAqKSBwa3Q7CisJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoYXAtPmhhbmRsZSk7CisKKwkJaWYgKCFjcCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUkVHIEFDSyBmb3IgdW5rbm93biBoYW5kbGUgJWx4XG4iLAorCQkJICAgICAgIGFwLT5oYW5kbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlJlZ2lzdGVyZWQgJXMgc2VydmljZS5cbiIsCisJCSAgICAgICBjcC0+c2VydmljZV9pZCk7CisJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9SRUdJU1RFUkVEOworCX0gZWxzZSBpZiAocGt0LT50eXBlID09IERTX1JFR19OQUNLKSB7CisJCXN0cnVjdCBkc19yZWdfbmFjayAqbnAgPSAoc3RydWN0IGRzX3JlZ19uYWNrICopIHBrdDsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChucC0+aGFuZGxlKTsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSRUcgTkFDSyBmb3IgIgorCQkJICAgICAgICJ1bmtub3duIGhhbmRsZSAlbHhcbiIsCisJCQkgICAgICAgbnAtPmhhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyICVzIHNlcnZpY2VcbiIsCisJCSAgICAgICBjcC0+c2VydmljZV9pZCk7CisJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9VTktOT1dOOworCX0KKworCXJldHVybiAwOworCitjb25uX3Jlc2V0OgorCWRzX2Nvbm5fcmVzZXQoZHApOworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIHZvaWQgX19zZW5kX2RzX25hY2soc3RydWN0IGRzX2luZm8gKmRwLCB1NjQgaGFuZGxlKQoreworCXN0cnVjdCBkc19kYXRhX25hY2sgbmFjayA9IHsKKwkJLnRhZyA9IHsKKwkJCS50eXBlID0gRFNfTkFDSywKKwkJCS5sZW4gPSAoc2l6ZW9mKHN0cnVjdCBkc19kYXRhX25hY2spIC0KKwkJCQlzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpKSwKKwkJfSwKKwkJLmhhbmRsZSA9IGhhbmRsZSwKKwkJLnJlc3VsdCA9IERTX0lOVl9IREwsCisJfTsKKworCV9fZHNfc2VuZChkcC0+bHAsICZuYWNrLCBzaXplb2YobmFjaykpOworfQorCitzdGF0aWMgTElTVF9IRUFEKGRzX3dvcmtfbGlzdCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZHNfd2FpdCk7CisKK3N0cnVjdCBkc19xdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKwlpbnQJCQkJcmVxX2xlbjsKKwlpbnQJCQkJX19wYWQ7CisJdTY0CQkJCXJlcVswXTsKK307CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZHNfd29yayh2b2lkKQoreworCXN0cnVjdCBkc19xdWV1ZV9lbnRyeSAqcXAsICp0bXA7CisJc3RhdGljIHN0cnVjdCBkc19pbmZvICpkcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRCh0b2RvKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2UoJmRzX3dvcmtfbGlzdCwgJnRvZG8pOworCUlOSVRfTElTVF9IRUFEKCZkc193b3JrX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKworCWRwID0gZHNfaW5mbzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxcCwgdG1wLCAmdG9kbywgbGlzdCkgeworCQlzdHJ1Y3QgZHNfZGF0YSAqZHBrdCA9IChzdHJ1Y3QgZHNfZGF0YSAqKSBxcC0+cmVxOworCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKGRwa3QtPmhhbmRsZSk7CisJCWludCByZXFfbGVuID0gcXAtPnJlcV9sZW47CisKKwkJaWYgKCFjcCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRGF0YSBmb3IgdW5rbm93biBoYW5kbGUgJWx1XG4iLAorCQkJICAgICAgIGRwa3QtPmhhbmRsZSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJCQlfX3NlbmRfZHNfbmFjayhkcCwgZHBrdC0+aGFuZGxlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWNwLT5kYXRhKGRwLT5scCwgY3AsIGRwa3QsIHJlcV9sZW4pOworCQl9CisKKwkJbGlzdF9kZWwoJnFwLT5saXN0KTsKKwkJa2ZyZWUocXApOworCX0KK30KKworc3RhdGljIGludCBkc190aHJlYWQodm9pZCAqX191bnVzZWQpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwl3aGlsZSAoMSkgeworCQlwcmVwYXJlX3RvX3dhaXQoJmRzX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAobGlzdF9lbXB0eSgmZHNfd29ya19saXN0KSkKKwkJCXNjaGVkdWxlKCk7CisJCWZpbmlzaF93YWl0KCZkc193YWl0LCAmd2FpdCk7CisKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCisJCXByb2Nlc3NfZHNfd29yaygpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzX2RhdGEoc3RydWN0IGRzX2luZm8gKmRwLCBzdHJ1Y3QgZHNfbXNnX3RhZyAqcGt0LCBpbnQgbGVuKQoreworCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gKHN0cnVjdCBkc19kYXRhICopIHBrdDsKKwlzdHJ1Y3QgZHNfcXVldWVfZW50cnkgKnFwOworCisJcXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHNfcXVldWVfZW50cnkpICsgbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXFwKSB7CisJCV9fc2VuZF9kc19uYWNrKGRwLCBkcGt0LT5oYW5kbGUpOworCX0gZWxzZSB7CisJCW1lbWNweSgmcXAtPnJlcSwgcGt0LCBsZW4pOworCQlsaXN0X2FkZF90YWlsKCZxcC0+bGlzdCwgJmRzX3dvcmtfbGlzdCk7CisJCXdha2VfdXAoJmRzX3dhaXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNfdXAoc3RydWN0IGRzX2luZm8gKmRwKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHAgPSBkcC0+bHA7CisJc3RydWN0IGRzX3Zlcl9yZXEgcmVxOworCWludCBlcnI7CisKKwlyZXEudGFnLnR5cGUgPSBEU19JTklUX1JFUTsKKwlyZXEudGFnLmxlbiA9IHNpemVvZihyZXEpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlyZXEudmVyLm1ham9yID0gMTsKKwlyZXEudmVyLm1pbm9yID0gMDsKKworCWVyciA9IF9fZHNfc2VuZChscCwgJnJlcSwgc2l6ZW9mKHJlcSkpOworCWlmIChlcnIgPiAwKQorCQlkcC0+aHNfc3RhdGUgPSBEU19IU19TVEFSVDsKK30KKworc3RhdGljIHZvaWQgZHNfZXZlbnQodm9pZCAqYXJnLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGRzX2luZm8gKmRwID0gYXJnOworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHAgPSBkcC0+bHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKworCWlmIChldmVudCA9PSBMRENfRVZFTlRfVVApIHsKKwkJZHNfdXAoZHApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZXZlbnQgIT0gTERDX0VWRU5UX0RBVEFfUkVBRFkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGRzX21zZ190YWcgKnRhZzsKKworCQllcnIgPSBsZGNfcmVhZChscCwgZHAtPnJjdl9idWYsIHNpemVvZigqdGFnKSk7CisKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJCWRzX2Nvbm5fcmVzZXQoZHApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVyciA9PSAwKQorCQkJYnJlYWs7CisKKwkJdGFnID0gZHAtPnJjdl9idWY7CisJCWVyciA9IGxkY19yZWFkKGxwLCB0YWcgKyAxLCB0YWctPmxlbik7CisKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJCWRzX2Nvbm5fcmVzZXQoZHApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVyciA8IHRhZy0+bGVuKQorCQkJYnJlYWs7CisKKwkJaWYgKHRhZy0+dHlwZSA8IERTX0RBVEEpCisJCQllcnIgPSBkc19oYW5kc2hha2UoZHAsIGRwLT5yY3ZfYnVmKTsKKwkJZWxzZQorCQkJZXJyID0gZHNfZGF0YShkcCwgZHAtPnJjdl9idWYsCisJCQkJICAgICAgc2l6ZW9mKCp0YWcpICsgZXJyKTsKKwkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZHNfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RhdGljIGludCBkc192ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyBkc19jZmcgPSB7CisJCS5ldmVudAkJPSBkc19ldmVudCwKKwkJLm10dQkJPSA0MDk2LAorCQkubW9kZQkJPSBMRENfTU9ERV9TVFJFQU0sCisJfTsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCXN0cnVjdCBkc19pbmZvICpkcDsKKwlpbnQgZXJyOworCisJaWYgKGRzX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlkcCA9IGt6YWxsb2Moc2l6ZW9mKCpkcCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFkcCkKKwkJZ290byBvdXRfZXJyOworCisJZHAtPnJjdl9idWYgPSBremFsbG9jKDQwOTYsIEdGUF9LRVJORUwpOworCWlmICghZHAtPnJjdl9idWYpCisJCWdvdG8gb3V0X2ZyZWVfZHA7CisKKwlkcC0+cmN2X2J1Zl9sZW4gPSA0MDk2OworCisJZHNfY2ZnLnR4X2lycSA9IHZkZXYtPnR4X2lycTsKKwlkc19jZmcucnhfaXJxID0gdmRldi0+cnhfaXJxOworCisJbHAgPSBsZGNfYWxsb2ModmRldi0+Y2hhbm5lbF9pZCwgJmRzX2NmZywgZHApOworCWlmIChJU19FUlIobHApKSB7CisJCWVyciA9IFBUUl9FUlIobHApOworCQlnb3RvIG91dF9mcmVlX3Jjdl9idWY7CisJfQorCWRwLT5scCA9IGxwOworCisJZXJyID0gbGRjX2JpbmQobHAsICJEUyIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfbGRjOworCisJZHNfaW5mbyA9IGRwOworCisJc3RhcnRfcG93ZXJkKCk7CisKKwlyZXR1cm4gZXJyOworCitvdXRfZnJlZV9sZGM6CisJbGRjX2ZyZWUoZHAtPmxwKTsKKworb3V0X2ZyZWVfcmN2X2J1ZjoKKwlrZnJlZShkcC0+cmN2X2J1Zik7CisKK291dF9mcmVlX2RwOgorCWtmcmVlKGRwKTsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGRzX21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJkb21haW4tc2VydmljZXMtcG9ydCIsCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBkc19kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gZHNfbWF0Y2gsCisJLnByb2JlCQk9IGRzX3Byb2JlLAorCS5yZW1vdmUJCT0gZHNfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJkcyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzX3N0YXRlcyk7IGkrKykKKwkJZHNfc3RhdGVzW2ldLmhhbmRsZSA9ICgodTY0KWkgPDwgMzIpOworCisJa3RocmVhZF9ydW4oZHNfdGhyZWFkLCBOVUxMLCAia2xkb21kIik7CisKKwlyZXR1cm4gdmlvX3JlZ2lzdGVyX2RyaXZlcigmZHNfZHJpdmVyKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGRzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9odnRyYW1wLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmEwOTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9odnRyYW1wLlMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIGh2dHJhbXAuUzogSHlwZXJ2aXNvciBzdGFydC1jcHUgdHJhbXBvbGluZSBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisjaW5jbHVkZSA8YXNtL3NjcmF0Y2hwYWQuaD4KKyNpbmNsdWRlIDxhc20vc3BpdGZpcmUuaD4KKyNpbmNsdWRlIDxhc20vaHZ0cmFtcC5oPgorI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2FzaS5oPgorCisJLnRleHQKKwkuYWxpZ24JCTgKKwkuZ2xvYmwJCWh2X2NwdV9zdGFydHVwLCBodl9jcHVfc3RhcnR1cF9lbmQKKworCS8qIFRoaXMgY29kZSBleGVjdXRlcyBkaXJlY3RseSBvdXQgb2YgdGhlIGh5cGVydmlzb3IKKwkgKiB3aXRoIHBoeXNpY2FsIGFkZHJlc3NpbmcgKHZhPT1wYSkuICAlbzAgY29udGFpbnMKKwkgKiBvdXIgY2xpZW50IGFyZ3VtZW50IHdoaWNoIGZvciBMaW51eCBwb2ludHMgdG8KKwkgKiBhIGRlc2NyaXB0b3IgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggZGVmaW5lcyB0aGUKKwkgKiBNTVUgZW50cmllcyB3ZSBuZWVkIHRvIGxvYWQgdXAuCisJICoKKwkgKiBBZnRlciB3ZSBzZXQgdGhpbmdzIHVwIHdlIGVuYWJsZSB0aGUgTU1VIGFuZCBjYWxsCisJICogaW50byB0aGUga2VybmVsLgorCSAqCisJICogRmlyc3Qgc2V0dXAgYmFzaWMgcHJpdmlsZWdlZCBjcHUgc3RhdGUuCisJICovCitodl9jcHVfc3RhcnR1cDoKKwl3cnByCQklZzAsIDAsICVnbAorCXdycHIJCSVnMCwgMTUsICVwaWwKKwl3cnByCQklZzAsIDAsICVjYW5yZXN0b3JlCisJd3JwcgkJJWcwLCAwLCAlb3RoZXJ3aW4KKwl3cnByCQklZzAsIDYsICVjYW5zYXZlCisJd3JwcgkJJWcwLCA2LCAlY2xlYW53aW4KKwl3cnByCQklZzAsIDAsICVjd3AKKwl3cnByCQklZzAsIDAsICV3c3RhdGUKKwl3cnByCQklZzAsIDAsICV0bAorCisJc2V0aGkJCSVoaShzcGFyYzY0X3R0YWJsZV90bDApLCAlZzEKKwl3cnByCQklZzEsICV0YmEKKworCW1vdgkJJW8wLCAlbDAKKworCWxkdXcJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0NQVV0sICVnMQorCW1vdgkJU0NSQVRDSFBBRF9DUFVJRCwgJWcyCisJc3R4YQkJJWcxLCBbJWcyXSBBU0lfU0NSQVRDSFBBRAorCisJbGR4CQlbJWwwICsgSFZUUkFNUF9ERVNDUl9GQVVMVF9JTkZPX1ZBXSwgJWcyCisJc3R4YQkJJWcyLCBbJWcwXSBBU0lfU0NSQVRDSFBBRAorCisJbW92CQkwLCAlbDEKKwlsZHV3CQlbJWwwICsgSFZUUkFNUF9ERVNDUl9OVU1fTUFQUElOR1NdLCAlbDIKKwlhZGQJCSVsMCwgSFZUUkFNUF9ERVNDUl9NQVBTLCAlbDMKKworMToJbGR4CQlbJWwzICsgSFZUUkFNUF9NQVBQSU5HX1ZBRERSXSwgJW8wCisJY2xyCQklbzEKKwlsZHgJCVslbDMgKyBIVlRSQU1QX01BUFBJTkdfVFRFXSwgJW8yCisJbW92CQlIVl9NTVVfSU1NVSB8IEhWX01NVV9ETU1VLCAlbzMKKwltb3YJCUhWX0ZBU1RfTU1VX01BUF9QRVJNX0FERFIsICVvNQorCXRhCQlIVl9GQVNUX1RSQVAKKworCWJybnoscG4JCSVvMCwgODBmCisJIG5vcAorCisJYWRkCQklbDEsIDEsICVsMQorCWNtcAkJJWwxLCAlbDIKKwlibHQsYSxwdAkleGNjLCAxYgorCSBhZGQJCSVsMywgSFZUUkFNUF9NQVBQSU5HX1NJWkUsICVsMworCisJbGR4CQlbJWwwICsgSFZUUkFNUF9ERVNDUl9GQVVMVF9JTkZPX1BBXSwgJW8wCisJbW92CQlIVl9GQVNUX01NVV9GQVVMVF9BUkVBX0NPTkYsICVvNQorCXRhCQlIVl9GQVNUX1RSQVAKKworCWJybnoscG4JCSVvMCwgODBmCisJIG5vcAorCisJd3JwcgkJJWcwLCAoUFNUQVRFX1BSSVYgfCBQU1RBVEVfUEVGKSwgJXBzdGF0ZQorCisJbGR4CQlbJWwwICsgSFZUUkFNUF9ERVNDUl9USFJFQURfUkVHXSwgJWw2CisKKwltb3YJCTEsICVvMAorCXNldAkJMWYsICVvMQorCW1vdgkJSFZfRkFTVF9NTVVfRU5BQkxFLCAlbzUKKwl0YQkJSFZfRkFTVF9UUkFQCisKKwliYSxwdAkJJXhjYywgODBmCisJIG5vcAorCisxOgorCXdyCQklZzAsIDAsICVmcHJzCisJd3IJCSVnMCwgQVNJX1AsICVhc2kKKworCW1vdgkJUFJJTUFSWV9DT05URVhULCAlZzcKKwlzdHhhCQklZzAsIFslZzddIEFTSV9NTVUKKwltZW1iYXIJCSNTeW5jCisKKwltb3YJCVNFQ09OREFSWV9DT05URVhULCAlZzcKKwlzdHhhCQklZzAsIFslZzddIEFTSV9NTVUKKwltZW1iYXIJCSNTeW5jCisKKwltb3YJCSVsNiwgJWc2CisJbGR4CQlbJWc2ICsgVElfVEFTS10sICVnNAorCisJbW92CQkxLCAlZzUKKwlzbGx4CQklZzUsIFRIUkVBRF9TSElGVCwgJWc1CisJc3ViCQklZzUsIChTVEFDS0ZSQU1FX1NaICsgU1RBQ0tfQklBUyksICVnNQorCWFkZAkJJWc2LCAlZzUsICVzcAorCW1vdgkJMCwgJWZwCisKKwljYWxsCQlpbml0X2lycXdvcmtfY3VyY3B1CisJIG5vcAorCWNhbGwJCWhhcmRfc21wX3Byb2Nlc3Nvcl9pZAorCSBub3AKKworCW1vdgkJJW8wLCAlbzEKKwltb3YJCTAsICVvMAorCW1vdgkJMCwgJW8yCisJY2FsbAkJc3VuNHZfaW5pdF9tb25kb19xdWV1ZXMKKwkgbW92CQkxLCAlbzMKKworCWNhbGwJCWluaXRfY3VyX2NwdV90cmFwCisJIG1vdgkJJWc2LCAlbzAKKworCXdycHIJCSVnMCwgKFBTVEFURV9QUklWIHwgUFNUQVRFX1BFRiB8IFBTVEFURV9JRSksICVwc3RhdGUKKworCWNhbGwJCXNtcF9jYWxsaW4KKwkgbm9wCisJY2FsbAkJY3B1X2lkbGUKKwkgbW92CQkwLCAlbzAKKwljYWxsCQljcHVfcGFuaWMKKwkgbm9wCisKKzgwOgliYSxwdAkJJXhjYywgODBiCisJIG5vcAorCisJLmFsaWduCQk4Citodl9jcHVfc3RhcnR1cF9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYwppbmRleCA2YjYxNjVkMy4uOGNiMzM1OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCkBAIC0yOTMsNiArMjkzLDExIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzdW40dV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKKwlzdW40dV9pcnFfZW5hYmxlKHZpcnRfaXJxKTsKK30KKwogc3RhdGljIHZvaWQgc3VuNHVfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IHZpcnRfaXJxKQogewogCXN0cnVjdCBpcnFfaGFuZGxlcl9kYXRhICpkYXRhID0gZ2V0X2lycV9jaGlwX2RhdGEodmlydF9pcnEpOwpAQCAtMzA5LDYgKzMxNCwxMCBAQAogc3RhdGljIHZvaWQgc3VuNHVfaXJxX2VuZCh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlycV9oYW5kbGVyX2RhdGEgKmRhdGEgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJ0X2lycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyB2aXJ0X2lycTsKKworCWlmICh1bmxpa2VseShkZXNjLT5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCXJldHVybjsKIAogCWlmIChsaWtlbHkoZGF0YSkpCiAJCXVwYV93cml0ZXEoSUNMUl9JRExFLCBkYXRhLT5pY2xyKTsKQEAgLTM0MCw2ICszNDksMjQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR2X3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlydF9pcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSB2aXJ0X2lycV90b19idWNrZXQodmlydF9pcnEpOworCXVuc2lnbmVkIGludCBpbm8gPSBidWNrZXQgLSAmaXZlY3Rvcl90YWJsZVswXTsKKworCWlmIChsaWtlbHkoYnVja2V0KSkgeworCQl1bnNpZ25lZCBsb25nIGNwdWlkOworCQlpbnQgZXJyOworCisJCWNwdWlkID0gaXJxX2Nob29zZV9jcHUodmlydF9pcnEpOworCisJCWVyciA9IHN1bjR2X2ludHJfc2V0dGFyZ2V0KGlubywgY3B1aWQpOworCQlpZiAoZXJyICE9IEhWX0VPSykKKwkJCXByaW50aygic3VuNHZfaW50cl9zZXR0YXJnZXQoJXgsJWx1KTogZXJyKCVkKVxuIiwKKwkJCSAgICAgICBpbm8sIGNwdWlkLCBlcnIpOworCX0KK30KKwogc3RhdGljIHZvaWQgc3VuNHZfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IHZpcnRfaXJxKQogewogCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSB2aXJ0X2lycV90b19idWNrZXQodmlydF9pcnEpOwpAQCAtMzczLDYgKzQwMCwxMCBAQAogewogCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSB2aXJ0X2lycV90b19idWNrZXQodmlydF9pcnEpOwogCXVuc2lnbmVkIGludCBpbm8gPSBidWNrZXQgLSAmaXZlY3Rvcl90YWJsZVswXTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIHZpcnRfaXJxOworCisJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKKwkJcmV0dXJuOwogCiAJaWYgKGxpa2VseShidWNrZXQpKSB7CiAJCWludCBlcnI7CkBAIC00MTgsNiArNDQ5LDI4IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzdW40dl92aXJ0X3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlydF9pcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSB2aXJ0X2lycV90b19idWNrZXQodmlydF9pcnEpOworCXVuc2lnbmVkIGludCBpbm8gPSBidWNrZXQgLSAmaXZlY3Rvcl90YWJsZVswXTsKKworCWlmIChsaWtlbHkoYnVja2V0KSkgeworCQl1bnNpZ25lZCBsb25nIGNwdWlkLCBkZXZfaGFuZGxlLCBkZXZfaW5vOworCQlpbnQgZXJyOworCisJCWNwdWlkID0gaXJxX2Nob29zZV9jcHUodmlydF9pcnEpOworCisJCWRldl9oYW5kbGUgPSBpbm8gJiBJTUFQX0lHTjsKKwkJZGV2X2lubyA9IGlubyAmIElNQVBfSU5POworCisJCWVyciA9IHN1bjR2X3ZpbnRyX3NldF90YXJnZXQoZGV2X2hhbmRsZSwgZGV2X2lubywgY3B1aWQpOworCQlpZiAoZXJyICE9IEhWX0VPSykKKwkJCXByaW50aygic3VuNHZfdmludHJfc2V0X3RhcmdldCglbHgsJWx4LCVsdSk6ICIKKwkJCSAgICAgICAiZXJyKCVkKVxuIiwKKwkJCSAgICAgICBkZXZfaGFuZGxlLCBkZXZfaW5vLCBjcHVpZCwgZXJyKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHN1bjR2X3ZpcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CkBAIC00NDMsNiArNDk2LDEwIEBACiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CiAJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgdmlydF9pcnE7CisKKwlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQlyZXR1cm47CiAKIAlpZiAobGlrZWx5KGJ1Y2tldCkpIHsKIAkJdW5zaWduZWQgbG9uZyBkZXZfaGFuZGxlLCBkZXZfaW5vOwpAQCAtNDc3LDYgKzUzNCw3IEBACiAJLmVuYWJsZQkJPSBzdW40dV9pcnFfZW5hYmxlLAogCS5kaXNhYmxlCT0gc3VuNHVfaXJxX2Rpc2FibGUsCiAJLmVuZAkJPSBzdW40dV9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dV9zZXRfYWZmaW5pdHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjR1X2lycV9hY2sgPSB7CkBAIC00ODUsNiArNTQzLDcgQEAKIAkuZGlzYWJsZQk9IHN1bjR1X2lycV9kaXNhYmxlLAogCS5hY2sJCT0gcnVuX3ByZV9oYW5kbGVyLAogCS5lbmQJCT0gc3VuNHVfaXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHVfc2V0X2FmZmluaXR5LAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40dl9pcnEgPSB7CkBAIC00OTIsNiArNTUxLDcgQEAKIAkuZW5hYmxlCQk9IHN1bjR2X2lycV9lbmFibGUsCiAJLmRpc2FibGUJPSBzdW40dl9pcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHZfaXJxX2FjayA9IHsKQEAgLTUwMCw2ICs1NjAsNyBAQAogCS5kaXNhYmxlCT0gc3VuNHZfaXJxX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dl9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl9zZXRfYWZmaW5pdHksCiB9OwogCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKQEAgLTUxMSw2ICs1NzIsNyBAQAogCS5kaXNhYmxlCT0gc3VuNHZfbXNpX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dl9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl9zZXRfYWZmaW5pdHksCiB9OwogI2VuZGlmCiAKQEAgLTUxOSw2ICs1ODEsNyBAQAogCS5lbmFibGUJCT0gc3VuNHZfdmlycV9lbmFibGUsCiAJLmRpc2FibGUJPSBzdW40dl92aXJxX2Rpc2FibGUsCiAJLmVuZAkJPSBzdW40dl92aXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHZfdmlydF9zZXRfYWZmaW5pdHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjR2X3ZpcnFfYWNrID0gewpAQCAtNTI3LDYgKzU5MCw3IEBACiAJLmRpc2FibGUJPSBzdW40dl92aXJxX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dl92aXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHZfdmlydF9zZXRfYWZmaW5pdHksCiB9OwogCiB2b2lkIGlycV9pbnN0YWxsX3ByZV9oYW5kbGVyKGludCB2aXJ0X2lycSwKQEAgLTczOSw2ICs4MDMsMjYgQEAKIAlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCit2b2lkIGZpeHVwX2lycXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfZGVzY1tpcnFdLmxvY2ssIGZsYWdzKTsKKwkJaWYgKGlycV9kZXNjW2lycV0uYWN0aW9uICYmCisJCSAgICAhKGlycV9kZXNjW2lycV0uc3RhdHVzICYgSVJRX1BFUl9DUFUpKSB7CisJCQlpZiAoaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkpCisJCQkJaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLAorCQkJCQlpcnFfZGVzY1tpcnFdLmFmZmluaXR5KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfZGVzY1tpcnFdLmxvY2ssIGZsYWdzKTsKKwl9Cit9CisjZW5kaWYKKwogc3RydWN0IHN1bjVfdGltZXIgewogCXU2NAljb3VudDA7CiAJdTY0CWxpbWl0MDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2xkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTJiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2xkYy5jCkBAIC0wLDAgKzEsMjM3MyBAQAorLyogbGRjLmM6IExvZ2ljYWwgRG9tYWluIENoYW5uZWwgbGluay1sYXllciBwcm90b2NvbCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL21kZXNjLmg+CisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkibGRjIgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuZSAyNSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworI2RlZmluZSBMRENfUEFDS0VUX1NJWkUJCTY0CisKKy8qIFBhY2tldCBoZWFkZXIgbGF5b3V0IGZvciB1bnJlbGlhYmxlIGFuZCByZWxpYWJsZSBtb2RlIGZyYW1lcy4KKyAqIFdoZW4gaW4gUkFXIG1vZGUsIHBhY2tldHMgYXJlIHNpbXBseSBzdHJhaWdodCA2NC1ieXRlIHBheWxvYWRzCisgKiB3aXRoIG5vIGhlYWRlcnMuCisgKi8KK3N0cnVjdCBsZGNfcGFja2V0IHsKKwl1OAkJCXR5cGU7CisjZGVmaW5lIExEQ19DVFJMCQkweDAxCisjZGVmaW5lIExEQ19EQVRBCQkweDAyCisjZGVmaW5lIExEQ19FUlIJCQkweDEwCisKKwl1OAkJCXN0eXBlOworI2RlZmluZSBMRENfSU5GTwkJMHgwMQorI2RlZmluZSBMRENfQUNLCQkJMHgwMgorI2RlZmluZSBMRENfTkFDSwkJMHgwNAorCisJdTgJCQljdHJsOworI2RlZmluZSBMRENfVkVSUwkJMHgwMSAvKiBMaW5rIFZlcnNpb24JCSovCisjZGVmaW5lIExEQ19SVFMJCQkweDAyIC8qIFJlcXVlc3QgVG8gU2VuZAkJKi8KKyNkZWZpbmUgTERDX1JUUgkJCTB4MDMgLyogUmVhZHkgVG8gUmVjZWl2ZQkqLworI2RlZmluZSBMRENfUkRYCQkJMHgwNCAvKiBSZWFkeSBmb3IgRGF0YSBlWGNoYW5nZQkqLworI2RlZmluZSBMRENfQ1RSTF9NU0sJCTB4MGYKKworCXU4CQkJZW52OworI2RlZmluZSBMRENfTEVOCQkJMHgzZgorI2RlZmluZSBMRENfRlJBR19NQVNLCQkweGMwCisjZGVmaW5lIExEQ19TVEFSVAkJMHg0MAorI2RlZmluZSBMRENfU1RPUAkJMHg4MAorCisJdTMyCQkJc2VxaWQ7CisKKwl1bmlvbiB7CisJCXU4CQl1X2RhdGFbTERDX1BBQ0tFVF9TSVpFIC0gOF07CisJCXN0cnVjdCB7CisJCQl1MzIJcGFkOworCQkJdTMyCWFja2lkOworCQkJdTgJcl9kYXRhW0xEQ19QQUNLRVRfU0laRSAtIDggLSA4XTsKKwkJfSByOworCX0gdTsKK307CisKK3N0cnVjdCBsZGNfdmVyc2lvbiB7CisJdTE2IG1ham9yOworCXUxNiBtaW5vcjsKK307CisKKy8qIE9yZGVyZWQgZnJvbSBsYXJnZXN0IG1ham9yIHRvIGxvd2VzdC4gICovCitzdGF0aWMgc3RydWN0IGxkY192ZXJzaW9uIHZlcl9hcnJbXSA9IHsKKwl7IC5tYWpvciA9IDEsIC5taW5vciA9IDAgfSwKK307CisKKyNkZWZpbmUgTERDX0RFRkFVTFRfTVRVCQkJKDQgKiBMRENfUEFDS0VUX1NJWkUpCisjZGVmaW5lIExEQ19ERUZBVUxUX05VTV9FTlRSSUVTCQkoUEFHRV9TSVpFIC8gTERDX1BBQ0tFVF9TSVpFKQorCitzdHJ1Y3QgbGRjX2NoYW5uZWw7CisKK3N0cnVjdCBsZGNfbW9kZV9vcHMgeworCWludCAoKndyaXRlKShzdHJ1Y3QgbGRjX2NoYW5uZWwgKiwgY29uc3Qgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworCWludCAoKnJlYWQpKHN0cnVjdCBsZGNfY2hhbm5lbCAqLCB2b2lkICosIHVuc2lnbmVkIGludCk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyByYXdfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgbm9ucmF3X29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHN0cmVhbV9vcHM7CisKK2ludCBsZG9tX2RvbWFpbmluZ19lbmFibGVkOworCitzdHJ1Y3QgbGRjX2lvbW11IHsKKwkvKiBQcm90ZWN0cyBhcmVuYSBhbGxvYy9mcmVlLiAgKi8KKwlzcGlubG9ja190CQkJbG9jazsKKwlzdHJ1Y3QgaW9tbXVfYXJlbmEJCWFyZW5hOworCXN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5CQkqcGFnZV90YWJsZTsKK307CisKK3N0cnVjdCBsZGNfY2hhbm5lbCB7CisJLyogUHJvdGVjdHMgYWxsIG9wZXJhdGlvbnMgdGhhdCBkZXBlbmQgdXBvbiBjaGFubmVsIHN0YXRlLiAgKi8KKwlzcGlubG9ja190CQkJbG9jazsKKworCXVuc2lnbmVkIGxvbmcJCQlpZDsKKworCXU4CQkJCSptc3NidWY7CisJdTMyCQkJCW1zc2J1Zl9sZW47CisJdTMyCQkJCW1zc2J1Zl9vZmY7CisKKwlzdHJ1Y3QgbGRjX3BhY2tldAkJKnR4X2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJCXR4X2hlYWQ7CisJdW5zaWduZWQgbG9uZwkJCXR4X3RhaWw7CisJdW5zaWduZWQgbG9uZwkJCXR4X251bV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcJCQl0eF9yYTsKKworCXVuc2lnbmVkIGxvbmcJCQl0eF9hY2tlZDsKKworCXN0cnVjdCBsZGNfcGFja2V0CQkqcnhfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJcnhfaGVhZDsKKwl1bnNpZ25lZCBsb25nCQkJcnhfdGFpbDsKKwl1bnNpZ25lZCBsb25nCQkJcnhfbnVtX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCXJ4X3JhOworCisJdTMyCQkJCXJjdl9ueHQ7CisJdTMyCQkJCXNuZF9ueHQ7CisKKwl1bnNpZ25lZCBsb25nCQkJY2hhbl9zdGF0ZTsKKworCXN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcJY2ZnOworCXZvaWQJCQkJKmV2ZW50X2FyZzsKKworCWNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMJKm1vcHM7CisKKwlzdHJ1Y3QgbGRjX2lvbW11CQlpb21tdTsKKworCXN0cnVjdCBsZGNfdmVyc2lvbgkJdmVyOworCisJdTgJCQkJaHNfc3RhdGU7CisjZGVmaW5lIExEQ19IU19DTE9TRUQJCQkweDAwCisjZGVmaW5lIExEQ19IU19PUEVOCQkJMHgwMQorI2RlZmluZSBMRENfSFNfR09UVkVSUwkJCTB4MDIKKyNkZWZpbmUgTERDX0hTX1NFTlRSVFIJCQkweDAzCisjZGVmaW5lIExEQ19IU19HT1RSVFIJCQkweDA0CisjZGVmaW5lIExEQ19IU19DT01QTEVURQkJCTB4MTAKKworCXU4CQkJCWZsYWdzOworI2RlZmluZSBMRENfRkxBR19BTExPQ0VEX1FVRVVFUwkJMHgwMQorI2RlZmluZSBMRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUwkweDAyCisjZGVmaW5lIExEQ19GTEFHX1JFR0lTVEVSRURfSVJRUwkweDA0CisjZGVmaW5lIExEQ19GTEFHX1JFU0VUCQkJMHgxMAorCisJdTgJCQkJbXNzOworCXU4CQkJCXN0YXRlOworCisjZGVmaW5lIExEQ19JUlFfTkFNRV9NQVgJCTMyCisJY2hhcgkJCQlyeF9pcnFfbmFtZVtMRENfSVJRX05BTUVfTUFYXTsKKwljaGFyCQkJCXR4X2lycV9uYW1lW0xEQ19JUlFfTkFNRV9NQVhdOworCisJc3RydWN0IGhsaXN0X2hlYWQJCW1oX2xpc3Q7CisKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkJbGlzdDsKK307CisKKyNkZWZpbmUgbGRjZGJnKFRZUEUsIGYsIGEuLi4pIFwKK2RvIHsJaWYgKGxwLT5jZmcuZGVidWcgJiBMRENfREVCVUdfIyNUWVBFKSBcCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJJRFslbHVdICIgZiwgbHAtPmlkLCAjIyBhKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlX3RvX3N0cih1OCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBMRENfU1RBVEVfSU5WQUxJRDoKKwkJcmV0dXJuICJJTlZBTElEIjsKKwljYXNlIExEQ19TVEFURV9JTklUOgorCQlyZXR1cm4gIklOSVQiOworCWNhc2UgTERDX1NUQVRFX0JPVU5EOgorCQlyZXR1cm4gIkJPVU5EIjsKKwljYXNlIExEQ19TVEFURV9SRUFEWToKKwkJcmV0dXJuICJSRUFEWSI7CisJY2FzZSBMRENfU1RBVEVfQ09OTkVDVEVEOgorCQlyZXR1cm4gIkNPTk5FQ1RFRCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICI8VU5LTk9XTj4iOworCX0KK30KKworc3RhdGljIHZvaWQgbGRjX3NldF9zdGF0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1OCBzdGF0ZSkKK3sKKwlsZGNkYmcoU1RBVEUsICJTVEFURSAoJXMpIC0tPiAoJXMpXG4iLAorCSAgICAgICBzdGF0ZV90b19zdHIobHAtPnN0YXRlKSwKKwkgICAgICAgc3RhdGVfdG9fc3RyKHN0YXRlKSk7CisKKwlscC0+c3RhdGUgPSBzdGF0ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19hZHZhbmNlKHVuc2lnbmVkIGxvbmcgb2ZmLCB1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzKQoreworCW9mZiArPSBMRENfUEFDS0VUX1NJWkU7CisJaWYgKG9mZiA9PSAobnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkUpKQorCQlvZmYgPSAwOworCisJcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnhfYWR2YW5jZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlyZXR1cm4gX19hZHZhbmNlKG9mZiwgbHAtPnJ4X251bV9lbnRyaWVzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHhfYWR2YW5jZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlyZXR1cm4gX19hZHZhbmNlKG9mZiwgbHAtPnR4X251bV9lbnRyaWVzKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpoYW5kc2hha2VfZ2V0X3R4X3BhY2tldChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCQkJICB1bnNpZ25lZCBsb25nICpuZXdfdGFpbCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwl0ID0gdHhfYWR2YW5jZShscCwgbHAtPnR4X3RhaWwpOworCWlmICh0ID09IGxwLT50eF9oZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCSpuZXdfdGFpbCA9IHQ7CisKKwlwID0gbHAtPnR4X2Jhc2U7CisJcmV0dXJuIHAgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpOworfQorCisvKiBXaGVuIHdlIGFyZSBpbiByZWxpYWJsZSBvciBzdHJlYW0gbW9kZSwgaGF2ZSB0byB0cmFjayB0aGUgbmV4dCBwYWNrZXQKKyAqIHdlIGhhdmVuJ3QgZ290dGVuIGFuIEFDSyBmb3IgaW4gdGhlIFRYIHF1ZXVlIHVzaW5nIHR4X2Fja2VkLiAgV2UgaGF2ZQorICogdG8gYmUgY2FyZWZ1bCBub3QgdG8gc3RvbXAgb3ZlciB0aGUgcXVldWUgcGFzdCB0aGF0IHBvaW50LiAgRHVyaW5nCisgKiB0aGUgaGFuZHNoYWtlLCB3ZSBkb24ndCBoYXZlIFRYIGRhdGEgcGFja2V0cyBwZW5kaW5nIGluIHRoZSBxdWV1ZQorICogYW5kIHRoYXQncyB3aHkgaGFuZHNoYWtlX2dldF90eF9wYWNrZXQoKSBuZWVkIG5vdCBiZSBtaW5kZnVsIG9mCisgKiBscC0+dHhfYWNrZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhlYWRfZm9yX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlpZiAobHAtPmNmZy5tb2RlID09IExEQ19NT0RFX1NUUkVBTSkKKwkJcmV0dXJuIGxwLT50eF9hY2tlZDsKKwlyZXR1cm4gbHAtPnR4X2hlYWQ7Cit9CisKK3N0YXRpYyBpbnQgdHhfaGFzX3NwYWNlX2ZvcihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxpbWl0LCB0YWlsLCBuZXdfdGFpbCwgZGlmZjsKKwl1bnNpZ25lZCBpbnQgbXNzOworCisJbGltaXQgPSBoZWFkX2Zvcl9kYXRhKGxwKTsKKwl0YWlsID0gbHAtPnR4X3RhaWw7CisJbmV3X3RhaWwgPSB0eF9hZHZhbmNlKGxwLCB0YWlsKTsKKwlpZiAobmV3X3RhaWwgPT0gbGltaXQpCisJCXJldHVybiAwOworCisJaWYgKGxpbWl0ID4gbmV3X3RhaWwpCisJCWRpZmYgPSBsaW1pdCAtIG5ld190YWlsOworCWVsc2UKKwkJZGlmZiA9IChsaW1pdCArCisJCQkoKGxwLT50eF9udW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRSkgLSBuZXdfdGFpbCkpOworCWRpZmYgLz0gTERDX1BBQ0tFVF9TSVpFOworCW1zcyA9IGxwLT5tc3M7CisKKwlpZiAoZGlmZiAqIG1zcyA8IHNpemUpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX3BhY2tldCAqZGF0YV9nZXRfdHhfcGFja2V0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqbmV3X3RhaWwpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBoLCB0OworCisJaCA9IGhlYWRfZm9yX2RhdGEobHApOworCXQgPSB0eF9hZHZhbmNlKGxwLCBscC0+dHhfdGFpbCk7CisJaWYgKHQgPT0gaCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqbmV3X3RhaWwgPSB0OworCisJcCA9IGxwLT50eF9iYXNlOworCXJldHVybiBwICsgKGxwLT50eF90YWlsIC8gTERDX1BBQ0tFVF9TSVpFKTsKK30KKworc3RhdGljIGludCBzZXRfdHhfdGFpbChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIHRhaWwpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RhaWwgPSBscC0+dHhfdGFpbDsKKwlpbnQgbGltaXQgPSAxMDAwOworCisJbHAtPnR4X3RhaWwgPSB0YWlsOworCXdoaWxlIChsaW1pdC0tID4gMCkgeworCQl1bnNpZ25lZCBsb25nIGVycjsKKworCQllcnIgPSBzdW40dl9sZGNfdHhfc2V0X3F0YWlsKGxwLT5pZCwgdGFpbCk7CisJCWlmICghZXJyKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGVyciAhPSBIVl9FV09VTERCTE9DSykgeworCQkJbHAtPnR4X3RhaWwgPSBvcmlnX3RhaWw7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCisJbHAtPnR4X3RhaWwgPSBvcmlnX3RhaWw7CisJcmV0dXJuIC1FQlVTWTsKK30KKworLyogVGhpcyBqdXN0IHVwZGF0ZXMgdGhlIGhlYWQgdmFsdWUgaW4gdGhlIGh5cGVydmlzb3IgdXNpbmcKKyAqIGEgcG9sbGluZyBsb29wIHdpdGggYSB0aW1lb3V0LiAgVGhlIGNhbGxlciB0YWtlcyBjYXJlIG9mCisgKiB1cGF0aW5nIHNvZnR3YXJlIHN0YXRlIHJlcHJlc2VudGluZyB0aGUgaGVhZCBjaGFuZ2UsIGlmIGFueS4KKyAqLworc3RhdGljIGludCBfX3NldF9yeF9oZWFkKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlpbnQgbGltaXQgPSAxMDAwOworCisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZXJyOworCisJCWVyciA9IHN1bjR2X2xkY19yeF9zZXRfcWhlYWQobHAtPmlkLCBoZWFkKTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZXJyICE9IEhWX0VXT1VMREJMT0NLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF90eF9wYWNrZXQoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgc3RydWN0IGxkY19wYWNrZXQgKnAsCisJCQkgIHVuc2lnbmVkIGxvbmcgbmV3X3RhaWwpCit7CisJQlVHX09OKHAgIT0gKGxwLT50eF9iYXNlICsgKGxwLT50eF90YWlsIC8gTERDX1BBQ0tFVF9TSVpFKSkpOworCisJcmV0dXJuIHNldF90eF90YWlsKGxwLCBuZXdfdGFpbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX3BhY2tldCAqaGFuZHNoYWtlX2NvbXBvc2VfY3RybChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCQkJIHU4IHN0eXBlLCB1OCBjdHJsLAorCQkJCQkJIHZvaWQgKmRhdGEsIGludCBkbGVuLAorCQkJCQkJIHVuc2lnbmVkIGxvbmcgKm5ld190YWlsKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwID0gaGFuZHNoYWtlX2dldF90eF9wYWNrZXQobHAsIG5ld190YWlsKTsKKworCWlmIChwKSB7CisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJcC0+dHlwZSA9IExEQ19DVFJMOworCQlwLT5zdHlwZSA9IHN0eXBlOworCQlwLT5jdHJsID0gY3RybDsKKwkJaWYgKGRhdGEpCisJCQltZW1jcHkocC0+dS51X2RhdGEsIGRhdGEsIGRsZW4pOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBzdGFydF9oYW5kc2hha2Uoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZlcjsKKwl1bnNpZ25lZCBsb25nIG5ld190YWlsOworCisJdmVyID0gJnZlcl9hcnJbMF07CisKKwlsZGNkYmcoSFMsICJTRU5EIFZFUiBJTkZPIG1halsldV0gbWluWyV1XVxuIiwKKwkgICAgICAgdmVyLT5tYWpvciwgdmVyLT5taW5vcik7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAorCQkJCSAgIHZlciwgc2l6ZW9mKCp2ZXIpLCAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCWludCBlcnIgPSBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCQlpZiAoIWVycikKKwkJCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfUkVTRVQ7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICAgdTE2IG1ham9yLCB1MTYgbWlub3IpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJc3RydWN0IGxkY192ZXJzaW9uIHZlcjsKKwl1bnNpZ25lZCBsb25nIG5ld190YWlsOworCisJdmVyLm1ham9yID0gbWFqb3I7CisJdmVyLm1pbm9yID0gbWlub3I7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX05BQ0ssIExEQ19WRVJTLAorCQkJCSAgICZ2ZXIsIHNpemVvZih2ZXIpLCAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCWxkY2RiZyhIUywgIlNFTkQgVkVSIE5BQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgdmVyLm1ham9yLCB2ZXIubWlub3IpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfdmVyc2lvbl9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICBzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0FDSywgTERDX1ZFUlMsCisJCQkJICAgdnAsIHNpemVvZigqdnApLCAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCWxkY2RiZyhIUywgIlNFTkQgVkVSIEFDSyBtYWpbJXVdIG1pblsldV1cbiIsCisJCSAgICAgICB2cC0+bWFqb3IsIHZwLT5taW5vcik7CisKKwkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9ydHMoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIG5ld190YWlsOworCisJcCA9IGhhbmRzaGFrZV9jb21wb3NlX2N0cmwobHAsIExEQ19JTkZPLCBMRENfUlRTLCBOVUxMLCAwLAorCQkJCSAgICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJcC0+ZW52ID0gbHAtPmNmZy5tb2RlOworCQlwLT5zZXFpZCA9IDA7CisJCWxwLT5yY3Zfbnh0ID0gMDsKKworCQlsZGNkYmcoSFMsICJTRU5EIFJUUyBlbnZbMHgleF0gc2VxaWRbMHgleF1cbiIsCisJCSAgICAgICBwLT5lbnYsIHAtPnNlcWlkKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3J0cihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19SVFIsIE5VTEwsIDAsCisJCQkJICAgJm5ld190YWlsKTsKKwlpZiAocCkgeworCQlwLT5lbnYgPSBscC0+Y2ZnLm1vZGU7CisJCXAtPnNlcWlkID0gMDsKKworCQlsZGNkYmcoSFMsICJTRU5EIFJUUiBlbnZbMHgleF0gc2VxaWRbMHgleF1cbiIsCisJCSAgICAgICBwLT5lbnYsIHAtPnNlcWlkKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3JkeChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19SRFgsIE5VTEwsIDAsCisJCQkJICAgJm5ld190YWlsKTsKKwlpZiAocCkgeworCQlwLT5lbnYgPSAwOworCQlwLT5zZXFpZCA9ICsrbHAtPnNuZF9ueHQ7CisJCXAtPnUuci5hY2tpZCA9IGxwLT5yY3Zfbnh0OworCisJCWxkY2RiZyhIUywgIlNFTkQgUkRYIGVudlsweCV4XSBzZXFpZFsweCV4XSBhY2tpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQsIHAtPnUuci5hY2tpZCk7CisKKwkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9kYXRhX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY19wYWNrZXQgKmRhdGFfcGt0KQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisJaW50IGVycjsKKworCXAgPSBkYXRhX2dldF90eF9wYWNrZXQobHAsICZuZXdfdGFpbCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVCVVNZOworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlwLT50eXBlID0gZGF0YV9wa3QtPnR5cGU7CisJcC0+c3R5cGUgPSBMRENfTkFDSzsKKwlwLT5jdHJsID0gZGF0YV9wa3QtPmN0cmwgJiBMRENfQ1RSTF9NU0s7CisJcC0+c2VxaWQgPSBscC0+c25kX254dCArIDE7CisJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwlsZGNkYmcoSFMsICJTRU5EIERBVEEgTkFDSyB0eXBlWzB4JXhdIGN0bFsweCV4XSBzZXFbMHgleF0gYWNrWzB4JXhdXG4iLAorCSAgICAgICBwLT50eXBlLCBwLT5jdHJsLCBwLT5zZXFpZCwgcC0+dS5yLmFja2lkKTsKKworCWVyciA9IHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJaWYgKCFlcnIpCisJCWxwLT5zbmRfbnh0Kys7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxkY19hYm9ydChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCisJbGRjZGJnKFNUQVRFLCAiQUJPUlRcbiIpOworCisJLyogV2UgcmVwb3J0IGJ1dCBkbyBub3QgYWN0IHVwb24gdGhlIGh5cGVydmlzb3IgZXJyb3JzIGJlY2F1c2UKKwkgKiB0aGVyZSByZWFsbHkgaXNuJ3QgbXVjaCB3ZSBjYW4gZG8gaWYgdGhleSBmYWlsIGF0IHRoaXMgcG9pbnQuCisJICovCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgbHAtPnR4X3JhLCBscC0+dHhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY190eF9xY29uZiglbHgsJWx4LCVseCkgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcywgaHZfZXJyKTsKKworCWh2X2VyciA9IHN1bjR2X2xkY190eF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkmbHAtPnR4X2hlYWQsCisJCQkJCSZscC0+dHhfdGFpbCwKKwkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwlpZiAoaHZfZXJyKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfYWJvcnQ6ICIKKwkJICAgICAgICJzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKCVseCwuLi4pIGZhaWxlZCwgZXJyPSVsdVxuIiwKKwkJICAgICAgIGxwLT5pZCwgaHZfZXJyKTsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIGxwLT5yeF9yYSwgbHAtPnJ4X251bV9lbnRyaWVzKTsKKwlpZiAoaHZfZXJyKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfYWJvcnQ6ICIKKwkJICAgICAgICJzdW40dl9sZGNfcnhfcWNvbmYoJWx4LCVseCwlbHgpIGZhaWxlZCwgZXJyPSVsdVxuIiwKKwkJICAgICAgIGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMsIGh2X2Vycik7CisKKwkvKiBSZWZldGNoIHRoZSBSWCBxdWV1ZSBzdGF0ZSBhcyB3ZWxsLCBiZWNhdXNlIHdlIGNvdWxkIGJlIGludm9rZWQKKwkgKiBoZXJlIGluIHRoZSBxdWV1ZSBwcm9jZXNzaW5nIGNvbnRleHQuCisJICovCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+cnhfaGVhZCwKKwkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY19yeF9nZXRfc3RhdGUoJWx4LC4uLikgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBodl9lcnIpOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgc3RydWN0IGxkY192ZXJzaW9uICpmaW5kX2J5X21ham9yKHUxNiBtYWpvcikKK3sKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnJldCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2ZXJfYXJyKTsgaSsrKSB7CisJCXN0cnVjdCBsZGNfdmVyc2lvbiAqdiA9ICZ2ZXJfYXJyW2ldOworCQlpZiAodi0+bWFqb3IgPD0gbWFqb3IpIHsKKwkJCXJldCA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2luZm8oc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZhcDsKKwlpbnQgZXJyOworCisJbGRjZGJnKEhTLCAiR09UIFZFUlNJT04gSU5GTyBtYWpvclsleF0gbWlub3JbJXhdXG4iLAorCSAgICAgICB2cC0+bWFqb3IsIHZwLT5taW5vcik7CisKKwlpZiAobHAtPmhzX3N0YXRlID09IExEQ19IU19HT1RWRVJTKSB7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19PUEVOOworCQltZW1zZXQoJmxwLT52ZXIsIDAsIHNpemVvZihscC0+dmVyKSk7CisJfQorCisJdmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpOworCWlmICghdmFwKSB7CisJCWVyciA9IHNlbmRfdmVyc2lvbl9uYWNrKGxwLCAwLCAwKTsKKwl9IGVsc2UgaWYgKHZhcC0+bWFqb3IgIT0gdnAtPm1ham9yKSB7CisJCWVyciA9IHNlbmRfdmVyc2lvbl9uYWNrKGxwLCB2YXAtPm1ham9yLCB2YXAtPm1pbm9yKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyID0gKnZwOworCQlpZiAodmVyLm1pbm9yID4gdmFwLT5taW5vcikKKwkJCXZlci5taW5vciA9IHZhcC0+bWlub3I7CisJCWVyciA9IHNlbmRfdmVyc2lvbl9hY2sobHAsICZ2ZXIpOworCQlpZiAoIWVycikgeworCQkJbHAtPnZlciA9IHZlcjsKKwkJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19HT1RWRVJTOworCQl9CisJfQorCWlmIChlcnIpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc192ZXJfYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCit7CisJbGRjZGJnKEhTLCAiR09UIFZFUlNJT04gQUNLIG1ham9yWyV4XSBtaW5vclsleF1cbiIsCisJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCWlmIChscC0+aHNfc3RhdGUgPT0gTERDX0hTX0dPVFZFUlMpIHsKKwkJaWYgKGxwLT52ZXIubWFqb3IgIT0gdnAtPm1ham9yIHx8CisJCSAgICBscC0+dmVyLm1pbm9yICE9IHZwLT5taW5vcikKKwkJCXJldHVybiBsZGNfYWJvcnQobHApOworCX0gZWxzZSB7CisJCWxwLT52ZXIgPSAqdnA7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19HT1RWRVJTOworCX0KKwlpZiAoc2VuZF9ydHMobHApKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9uYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCit7CisJc3RydWN0IGxkY192ZXJzaW9uICp2YXA7CisKKwlpZiAoKHZwLT5tYWpvciA9PSAwICYmIHZwLT5taW5vciA9PSAwKSB8fAorCSAgICAhKHZhcCA9IGZpbmRfYnlfbWFqb3IodnAtPm1ham9yKSkpIHsKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwkJcCA9IGhhbmRzaGFrZV9jb21wb3NlX2N0cmwobHAsIExEQ19JTkZPLCBMRENfVkVSUywKKwkJCQkJICAgdmFwLCBzaXplb2YoKnZhcCksCisJCQkJCSAgICZuZXdfdGFpbCk7CisJCWlmIChwKQorCQkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJCWVsc2UKKwkJCXJldHVybiBsZGNfYWJvcnQobHApOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX3ZlcnNpb24oc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdnA7CisKKwl2cCA9IChzdHJ1Y3QgbGRjX3ZlcnNpb24gKikgcC0+dS51X2RhdGE7CisKKwlzd2l0Y2ggKHAtPnN0eXBlKSB7CisJY2FzZSBMRENfSU5GTzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2luZm8obHAsIHZwKTsKKworCWNhc2UgTERDX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2FjayhscCwgdnApOworCisJY2FzZSBMRENfTkFDSzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX25hY2sobHAsIHZwKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBsZGNfYWJvcnQobHApOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX3J0cyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJUUyBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF1cbiIsCisJICAgICAgIHAtPnN0eXBlLCBwLT5zZXFpZCwgcC0+ZW52KTsKKworCWlmIChwLT5zdHlwZSAgICAgIT0gTERDX0lORk8JICAgfHwKKwkgICAgbHAtPmhzX3N0YXRlICE9IExEQ19IU19HT1RWRVJTIHx8CisJICAgIHAtPmVudiAgICAgICAhPSBscC0+Y2ZnLm1vZGUpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnNuZF9ueHQgPSBwLT5zZXFpZDsKKwlscC0+cmN2X254dCA9IHAtPnNlcWlkOworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19TRU5UUlRSOworCWlmIChzZW5kX3J0cihscCkpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19ydHIoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCWxkY2RiZyhIUywgIkdPVCBSVFIgc3R5cGVbJXhdIHNlcWlkWyV4XSBlbnZbJXhdXG4iLAorCSAgICAgICBwLT5zdHlwZSwgcC0+c2VxaWQsIHAtPmVudik7CisKKwlpZiAocC0+c3R5cGUgICAgICE9IExEQ19JTkZPIHx8CisJICAgIHAtPmVudiAgICAgICAhPSBscC0+Y2ZnLm1vZGUpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnNuZF9ueHQgPSBwLT5zZXFpZDsKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfQ09NUExFVEU7CisJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0NPTk5FQ1RFRCk7CisJc2VuZF9yZHgobHApOworCisJcmV0dXJuIExEQ19FVkVOVF9VUDsKK30KKworc3RhdGljIGludCByeF9zZXFfb2soc3RydWN0IGxkY19jaGFubmVsICpscCwgdTMyIHNlcWlkKQoreworCXJldHVybiBscC0+cmN2X254dCArIDEgPT0gc2VxaWQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHgoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCWxkY2RiZyhIUywgIkdPVCBSRFggc3R5cGVbJXhdIHNlcWlkWyV4XSBlbnZbJXhdIGFja2lkWyV4XVxuIiwKKwkgICAgICAgcC0+c3R5cGUsIHAtPnNlcWlkLCBwLT5lbnYsIHAtPnUuci5hY2tpZCk7CisKKwlpZiAocC0+c3R5cGUgIT0gTERDX0lORk8gfHwKKwkgICAgIShyeF9zZXFfb2sobHAsIHAtPnNlcWlkKSkpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnJjdl9ueHQgPSBwLT5zZXFpZDsKKworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKworCXJldHVybiBMRENfRVZFTlRfVVA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb250cm9sX2ZyYW1lKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCXN3aXRjaCAocC0+Y3RybCkgeworCWNhc2UgTERDX1ZFUlM6CisJCXJldHVybiBwcm9jZXNzX3ZlcnNpb24obHAsIHApOworCisJY2FzZSBMRENfUlRTOgorCQlyZXR1cm4gcHJvY2Vzc19ydHMobHAsIHApOworCisJY2FzZSBMRENfUlRSOgorCQlyZXR1cm4gcHJvY2Vzc19ydHIobHAsIHApOworCisJY2FzZSBMRENfUkRYOgorCQlyZXR1cm4gcHJvY2Vzc19yZHgobHAsIHApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZXJyb3JfZnJhbWUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCkKK3sKKwlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RhdGFfYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICAgc3RydWN0IGxkY19wYWNrZXQgKmFjaykKK3sKKwl1bnNpZ25lZCBsb25nIGhlYWQgPSBscC0+dHhfYWNrZWQ7CisJdTMyIGFja2lkID0gYWNrLT51LnIuYWNraWQ7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcCA9IGxwLT50eF9iYXNlICsgKGhlYWQgLyBMRENfUEFDS0VUX1NJWkUpOworCisJCWhlYWQgPSB0eF9hZHZhbmNlKGxwLCBoZWFkKTsKKworCQlpZiAocC0+c2VxaWQgPT0gYWNraWQpIHsKKwkJCWxwLT50eF9hY2tlZCA9IGhlYWQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoaGVhZCA9PSBscC0+dHhfdGFpbCkKKwkJCXJldHVybiBsZGNfYWJvcnQobHApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2V2ZW50cyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBpbnQgZXZlbnRfbWFzaykKK3sKKwlpZiAoZXZlbnRfbWFzayAmIExEQ19FVkVOVF9SRVNFVCkKKwkJbHAtPmNmZy5ldmVudChscC0+ZXZlbnRfYXJnLCBMRENfRVZFTlRfUkVTRVQpOworCWlmIChldmVudF9tYXNrICYgTERDX0VWRU5UX1VQKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9VUCk7CisJaWYgKGV2ZW50X21hc2sgJiBMRENfRVZFTlRfREFUQV9SRUFEWSkKKwkJbHAtPmNmZy5ldmVudChscC0+ZXZlbnRfYXJnLCBMRENfRVZFTlRfREFUQV9SRUFEWSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsZGNfcngoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHAgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBvcmlnX3N0YXRlLCBodl9lcnIsIGZsYWdzOworCXVuc2lnbmVkIGludCBldmVudF9tYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlvcmlnX3N0YXRlID0gbHAtPmNoYW5fc3RhdGU7CisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+cnhfaGVhZCwKKwkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCisJbGRjZGJnKFJYLCAiUlggc3RhdGVbMHglMDJseDoweCUwMmx4XSBoZWFkWzB4JTA0bHhdIHRhaWxbMHglMDRseF1cbiIsCisJICAgICAgIG9yaWdfc3RhdGUsIGxwLT5jaGFuX3N0YXRlLCBscC0+cnhfaGVhZCwgbHAtPnJ4X3RhaWwpOworCisJZXZlbnRfbWFzayA9IDA7CisKKwlpZiAobHAtPmNmZy5tb2RlID09IExEQ19NT0RFX1JBVyAmJgorCSAgICBscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9VUCkgeworCQlscC0+aHNfc3RhdGUgPSBMRENfSFNfQ09NUExFVEU7CisJCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9DT05ORUNURUQpOworCisJCWV2ZW50X21hc2sgfD0gTERDX0VWRU5UX1VQOworCisJCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgaW4gcmVzZXQgc3RhdGUsIGZsdXNoIHRoZSBSWCBxdWV1ZSBhbmQgaWdub3JlCisJICogZXZlcnl0aGluZy4KKwkgKi8KKwlpZiAobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVTRVQpIHsKKwkJKHZvaWQpIF9fc2V0X3J4X2hlYWQobHAsIGxwLT5yeF90YWlsKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT25jZSB3ZSBmaW5pc2ggdGhlIGhhbmRzaGFrZSwgd2UgbGV0IHRoZSBsZGNfcmVhZCgpCisJICogcGF0aHMgZG8gYWxsIG9mIHRoZSBjb250cm9sIGZyYW1lIGFuZCBzdGF0ZSBtYW5hZ2VtZW50LgorCSAqIEp1c3QgdHJpZ2dlciB0aGUgY2FsbGJhY2suCisJICovCisJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfQ09NUExFVEUpIHsKK2hhbmRzaGFrZV9jb21wbGV0ZToKKwkJaWYgKGxwLT5jaGFuX3N0YXRlICE9IG9yaWdfc3RhdGUpIHsKKwkJCXVuc2lnbmVkIGludCBldmVudCA9IExEQ19FVkVOVF9SRVNFVDsKKworCQkJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1VQKQorCQkJCWV2ZW50ID0gTERDX0VWRU5UX1VQOworCisJCQlldmVudF9tYXNrIHw9IGV2ZW50OworCQl9CisJCWlmIChscC0+cnhfaGVhZCAhPSBscC0+cnhfdGFpbCkKKwkJCWV2ZW50X21hc2sgfD0gTERDX0VWRU5UX0RBVEFfUkVBRFk7CisKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxwLT5jaGFuX3N0YXRlICE9IG9yaWdfc3RhdGUpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGxwLT5yeF9oZWFkICE9IGxwLT5yeF90YWlsKSB7CisJCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCQl1bnNpZ25lZCBsb25nIG5ldzsKKwkJaW50IGVycjsKKworCQlwID0gbHAtPnJ4X2Jhc2UgKyAobHAtPnJ4X2hlYWQgLyBMRENfUEFDS0VUX1NJWkUpOworCisJCXN3aXRjaCAocC0+dHlwZSkgeworCQljYXNlIExEQ19DVFJMOgorCQkJZXJyID0gcHJvY2Vzc19jb250cm9sX2ZyYW1lKGxwLCBwKTsKKwkJCWlmIChlcnIgPiAwKQorCQkJCWV2ZW50X21hc2sgfD0gZXJyOworCQkJYnJlYWs7CisKKwkJY2FzZSBMRENfREFUQToKKwkJCWV2ZW50X21hc2sgfD0gTERDX0VWRU5UX0RBVEFfUkVBRFk7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBMRENfRVJSOgorCQkJZXJyID0gcHJvY2Vzc19lcnJvcl9mcmFtZShscCwgcCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gbGRjX2Fib3J0KGxwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKworCQluZXcgPSBscC0+cnhfaGVhZDsKKwkJbmV3ICs9IExEQ19QQUNLRVRfU0laRTsKKwkJaWYgKG5ldyA9PSAobHAtPnJ4X251bV9lbnRyaWVzICogTERDX1BBQ0tFVF9TSVpFKSkKKwkJCW5ldyA9IDA7CisJCWxwLT5yeF9oZWFkID0gbmV3OworCisJCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIG5ldyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQkodm9pZCkgbGRjX2Fib3J0KGxwKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChscC0+aHNfc3RhdGUgPT0gTERDX0hTX0NPTVBMRVRFKQorCQkJZ290byBoYW5kc2hha2VfY29tcGxldGU7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXNlbmRfZXZlbnRzKGxwLCBldmVudF9tYXNrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGxkY190eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBodl9lcnIsIG9yaWdfc3RhdGU7CisJdW5zaWduZWQgaW50IGV2ZW50X21hc2sgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlvcmlnX3N0YXRlID0gbHAtPmNoYW5fc3RhdGU7CisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+dHhfaGVhZCwKKwkJCQkJJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCisJbGRjZGJnKFRYLCAiIFRYIHN0YXRlWzB4JTAybHg6MHglMDJseF0gaGVhZFsweCUwNGx4XSB0YWlsWzB4JTA0bHhdXG4iLAorCSAgICAgICBvcmlnX3N0YXRlLCBscC0+Y2hhbl9zdGF0ZSwgbHAtPnR4X2hlYWQsIGxwLT50eF90YWlsKTsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXICYmCisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1VQKSB7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwkJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfVVA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXNlbmRfZXZlbnRzKGxwLCBldmVudF9tYXNrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogWFhYIGxkY19hbGxvYygpIGFuZCBsZGNfZnJlZSgpIG5lZWRzIHRvIHJ1biB1bmRlciBhIG11dGV4IHNvCisgKiBYWFggdGhhdCBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBmcm9tIHRoZSBsZGNfY2hhbm5lbF9saXN0IGhhcworICogWFhYIGF0b21pY2l0eSwgb3RoZXJ3aXNlIHRoZSBfX2xkY19jaGFubmVsX2V4aXN0cygpIGNoZWNrIGlzCisgKiBYWFggdG90YWxseSBwb2ludGxlc3MgYXMgYW5vdGhlciB0aHJlYWQgY2FuIHNsaXAgaW50byBsZGNfYWxsb2MoKQorICogWFhYIGFuZCBhZGQgYSBjaGFubmVsIHdpdGggdGhlIHNhbWUgSUQuICBUaGVyZSBhbHNvIG5lZWRzIHRvIGJlCisgKiBYWFggYSBzcGlubG9jayBmb3IgbGRjX2NoYW5uZWxfbGlzdC4KKyAqLworc3RhdGljIEhMSVNUX0hFQUQobGRjX2NoYW5uZWxfbGlzdCk7CisKK3N0YXRpYyBpbnQgX19sZGNfY2hhbm5lbF9leGlzdHModW5zaWduZWQgbG9uZyBpZCkKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkobHAsIG4sICZsZGNfY2hhbm5lbF9saXN0LCBsaXN0KSB7CisJCWlmIChscC0+aWQgPT0gaWQpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcXVldWUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW1fZW50cmllcywKKwkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICoqYmFzZSwgdW5zaWduZWQgbG9uZyAqcmEpCit7CisJdW5zaWduZWQgbG9uZyBzaXplLCBvcmRlcjsKKwl2b2lkICpxOworCisJc2l6ZSA9IG51bV9lbnRyaWVzICogTERDX1BBQ0tFVF9TSVpFOworCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCisJcSA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworCWlmICghcSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBbGxvYyBvZiAlcyBxdWV1ZSBmYWlsZWQgd2l0aCAiCisJCSAgICAgICAic2l6ZT0lbHUgb3JkZXI9JWx1XG4iLCBuYW1lLCBzaXplLCBvcmRlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChxLCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworCisJKmJhc2UgPSBxOworCSpyYSA9IF9fcGEocSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9xdWV1ZSh1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzLCBzdHJ1Y3QgbGRjX3BhY2tldCAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIG9yZGVyOworCisJaWYgKCFxKQorCQlyZXR1cm47CisKKwlzaXplID0gbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkU7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXEsIG9yZGVyKTsKK30KKworLyogWFhYIE1ha2UgdGhpcyBjb25maWd1cmFibGUuLi4gWFhYICovCisjZGVmaW5lIExEQ19JT1RBQkxFX1NJWkUJKDggKiAxMDI0KQorCitzdGF0aWMgaW50IGxkY19pb21tdV9pbml0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBzeiwgbnVtX3RzYl9lbnRyaWVzLCB0c2JzaXplLCBvcmRlcjsKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdSA9ICZscC0+aW9tbXU7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKnRhYmxlOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCWludCBlcnI7CisKKwludW1fdHNiX2VudHJpZXMgPSBMRENfSU9UQUJMRV9TSVpFOworCXRzYnNpemUgPSBudW1fdHNiX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGxkY19tdGFibGVfZW50cnkpOworCisJc3Bpbl9sb2NrX2luaXQoJmlvbW11LT5sb2NrKTsKKworCXN6ID0gbnVtX3RzYl9lbnRyaWVzIC8gODsKKwlzeiA9IChzeiArIDdVTCkgJiB+N1VMOworCWlvbW11LT5hcmVuYS5tYXAgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvbW11LT5hcmVuYS5tYXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQWxsb2Mgb2YgYXJlbmEgbWFwIGZhaWxlZCwgc3o9JWx1XG4iLCBzeik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlvbW11LT5hcmVuYS5saW1pdCA9IG51bV90c2JfZW50cmllczsKKworCW9yZGVyID0gZ2V0X29yZGVyKHRzYnNpemUpOworCisJdGFibGUgPSAoc3RydWN0IGxkY19tdGFibGVfZW50cnkgKikKKwkJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXRhYmxlKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFsbG9jIG9mIE1URSB0YWJsZSBmYWlsZWQsICIKKwkJICAgICAgICJzaXplPSVsdSBvcmRlcj0lbHVcbiIsIHRzYnNpemUsIG9yZGVyKTsKKwkJZ290byBvdXRfZnJlZV9tYXA7CisJfQorCisJbWVtc2V0KHRhYmxlLCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworCisJaW9tbXUtPnBhZ2VfdGFibGUgPSB0YWJsZTsKKworCWh2X2VyciA9IHN1bjR2X2xkY19zZXRfbWFwX3RhYmxlKGxwLT5pZCwgX19wYSh0YWJsZSksCisJCQkJCSBudW1fdHNiX2VudHJpZXMpOworCWVyciA9IC1FSU5WQUw7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZnJlZV90YWJsZTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV90YWJsZToKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB0YWJsZSwgb3JkZXIpOworCWlvbW11LT5wYWdlX3RhYmxlID0gTlVMTDsKKworb3V0X2ZyZWVfbWFwOgorCWtmcmVlKGlvbW11LT5hcmVuYS5tYXApOworCWlvbW11LT5hcmVuYS5tYXAgPSBOVUxMOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbGRjX2lvbW11X3JlbGVhc2Uoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdSA9ICZscC0+aW9tbXU7CisJdW5zaWduZWQgbG9uZyBudW1fdHNiX2VudHJpZXMsIHRzYnNpemUsIG9yZGVyOworCisJKHZvaWQpIHN1bjR2X2xkY19zZXRfbWFwX3RhYmxlKGxwLT5pZCwgMCwgMCk7CisKKwludW1fdHNiX2VudHJpZXMgPSBpb21tdS0+YXJlbmEubGltaXQ7CisJdHNic2l6ZSA9IG51bV90c2JfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSk7CisJb3JkZXIgPSBnZXRfb3JkZXIodHNic2l6ZSk7CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBpb21tdS0+cGFnZV90YWJsZSwgb3JkZXIpOworCWlvbW11LT5wYWdlX3RhYmxlID0gTlVMTDsKKworCWtmcmVlKGlvbW11LT5hcmVuYS5tYXApOworCWlvbW11LT5hcmVuYS5tYXAgPSBOVUxMOworfQorCitzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxkY19hbGxvYyh1bnNpZ25lZCBsb25nIGlkLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyAqY2ZncCwKKwkJCSAgICAgIHZvaWQgKmV2ZW50X2FyZykKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCWNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgKm1vcHM7CisJdW5zaWduZWQgbG9uZyBkdW1teTEsIGR1bW15MiwgaHZfZXJyOworCXU4IG1zcywgKm1zc2J1ZjsKKwlpbnQgZXJyOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWxkb21fZG9tYWluaW5nX2VuYWJsZWQpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFjZmdwKQorCQlnb3RvIG91dF9lcnI7CisKKwlzd2l0Y2ggKGNmZ3AtPm1vZGUpIHsKKwljYXNlIExEQ19NT0RFX1JBVzoKKwkJbW9wcyA9ICZyYXdfb3BzOworCQltc3MgPSBMRENfUEFDS0VUX1NJWkU7CisJCWJyZWFrOworCisJY2FzZSBMRENfTU9ERV9VTlJFTElBQkxFOgorCQltb3BzID0gJm5vbnJhd19vcHM7CisJCW1zcyA9IExEQ19QQUNLRVRfU0laRSAtIDg7CisJCWJyZWFrOworCisJY2FzZSBMRENfTU9ERV9TVFJFQU06CisJCW1vcHMgPSAmc3RyZWFtX29wczsKKwkJbXNzID0gTERDX1BBQ0tFVF9TSVpFIC0gOCAtIDg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmICghY2ZncC0+ZXZlbnQgfHwgIWV2ZW50X2FyZyB8fCAhY2ZncC0+cnhfaXJxIHx8ICFjZmdwLT50eF9pcnEpCisJCWdvdG8gb3V0X2VycjsKKworCWh2X2VyciA9IHN1bjR2X2xkY190eF9xaW5mbyhpZCwgJmR1bW15MSwgJmR1bW15Mik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoaHZfZXJyID09IEhWX0VDSEFOTkVMKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSAtRUVYSVNUOworCWlmIChfX2xkY19jaGFubmVsX2V4aXN0cyhpZCkpCisJCWdvdG8gb3V0X2VycjsKKworCW1zc2J1ZiA9IE5VTEw7CisKKwlscCA9IGt6YWxsb2Moc2l6ZW9mKCpscCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFscCkKKwkJZ290byBvdXRfZXJyOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCWxwLT5pZCA9IGlkOworCisJZXJyID0gbGRjX2lvbW11X2luaXQobHApOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfbGRjOworCisJbHAtPm1vcHMgPSBtb3BzOworCWxwLT5tc3MgPSBtc3M7CisKKwlscC0+Y2ZnID0gKmNmZ3A7CisJaWYgKCFscC0+Y2ZnLm10dSkKKwkJbHAtPmNmZy5tdHUgPSBMRENfREVGQVVMVF9NVFU7CisKKwlpZiAobHAtPmNmZy5tb2RlID09IExEQ19NT0RFX1NUUkVBTSkgeworCQltc3NidWYgPSBremFsbG9jKGxwLT5jZmcubXR1LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtc3NidWYpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlX2lvbW11OworCQl9CisJCWxwLT5tc3NidWYgPSBtc3NidWY7CisJfQorCisJbHAtPmV2ZW50X2FyZyA9IGV2ZW50X2FyZzsKKworCS8qIFhYWCBhbGxvdyBzZXR0aW5nIHZpYSBsZGNfY2hhbm5lbF9jb25maWcgdG8gb3ZlcnJpZGUgZGVmYXVsdHMKKwkgKiBYWFggb3IgdXNlIHNvbWUgZm9ybXVsYSBiYXNlZCB1cG9uIG10dQorCSAqLworCWxwLT50eF9udW1fZW50cmllcyA9IExEQ19ERUZBVUxUX05VTV9FTlRSSUVTOworCWxwLT5yeF9udW1fZW50cmllcyA9IExEQ19ERUZBVUxUX05VTV9FTlRSSUVTOworCisJZXJyID0gYWxsb2NfcXVldWUoIlRYIiwgbHAtPnR4X251bV9lbnRyaWVzLAorCQkJICAmbHAtPnR4X2Jhc2UsICZscC0+dHhfcmEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfbXNzYnVmOworCisJZXJyID0gYWxsb2NfcXVldWUoIlJYIiwgbHAtPnJ4X251bV9lbnRyaWVzLAorCQkJICAmbHAtPnJ4X2Jhc2UsICZscC0+cnhfcmEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhxOworCisJbHAtPmZsYWdzIHw9IExEQ19GTEFHX0FMTE9DRURfUVVFVUVTOworCisJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NMT1NFRDsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfSU5JVCk7CisKKwlJTklUX0hMSVNUX05PREUoJmxwLT5saXN0KTsKKwlobGlzdF9hZGRfaGVhZCgmbHAtPmxpc3QsICZsZGNfY2hhbm5lbF9saXN0KTsKKworCUlOSVRfSExJU1RfSEVBRCgmbHAtPm1oX2xpc3QpOworCisJcmV0dXJuIGxwOworCitvdXRfZnJlZV90eHE6CisJZnJlZV9xdWV1ZShscC0+dHhfbnVtX2VudHJpZXMsIGxwLT50eF9iYXNlKTsKKworb3V0X2ZyZWVfbXNzYnVmOgorCWlmIChtc3NidWYpCisJCWtmcmVlKG1zc2J1Zik7CisKK291dF9mcmVlX2lvbW11OgorCWxkY19pb21tdV9yZWxlYXNlKGxwKTsKKworb3V0X2ZyZWVfbGRjOgorCWtmcmVlKGxwKTsKKworb3V0X2VycjoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTChsZGNfYWxsb2MpOworCit2b2lkIGxkY19mcmVlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFR0lTVEVSRURfSVJRUykgeworCQlmcmVlX2lycShscC0+Y2ZnLnJ4X2lycSwgbHApOworCQlmcmVlX2lycShscC0+Y2ZnLnR4X2lycSwgbHApOworCX0KKworCWlmIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUykgeworCQlzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwkJc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVM7CisJfQorCWlmIChscC0+ZmxhZ3MgJiBMRENfRkxBR19BTExPQ0VEX1FVRVVFUykgeworCQlmcmVlX3F1ZXVlKGxwLT50eF9udW1fZW50cmllcywgbHAtPnR4X2Jhc2UpOworCQlmcmVlX3F1ZXVlKGxwLT5yeF9udW1fZW50cmllcywgbHAtPnJ4X2Jhc2UpOworCQlscC0+ZmxhZ3MgJj0gfkxEQ19GTEFHX0FMTE9DRURfUVVFVUVTOworCX0KKworCWhsaXN0X2RlbCgmbHAtPmxpc3QpOworCisJaWYgKGxwLT5tc3NidWYpCisJCWtmcmVlKGxwLT5tc3NidWYpOworCisJbGRjX2lvbW11X3JlbGVhc2UobHApOworCisJa2ZyZWUobHApOworfQorRVhQT1JUX1NZTUJPTChsZGNfZnJlZSk7CisKKy8qIEJpbmQgdGhlIGNoYW5uZWwuICBUaGlzIHJlZ2lzdGVycyB0aGUgTERDIHF1ZXVlcyB3aXRoCisgKiB0aGUgaHlwZXJ2aXNvciBhbmQgcHV0cyB0aGUgY2hhbm5lbCBpbnRvIGEgcHNldWRvLWxpc3RlbmluZworICogc3RhdGUuICBUaGlzIGRvZXMgbm90IGluaXRpYXRlIGEgaGFuZHNoYWtlLCBsZGNfY29ubmVjdCgpIGRvZXMKKyAqIHRoYXQuCisgKi8KK2ludCBsZGNfYmluZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBmbGFnczsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFuYW1lKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAobHAtPnN0YXRlICE9IExEQ19TVEFURV9JTklUKQorCQlnb3RvIG91dF9lcnI7CisKKwlzbnByaW50ZihscC0+cnhfaXJxX25hbWUsIExEQ19JUlFfTkFNRV9NQVgsICIlcyBSWCIsIG5hbWUpOworCXNucHJpbnRmKGxwLT50eF9pcnFfbmFtZSwgTERDX0lSUV9OQU1FX01BWCwgIiVzIFRYIiwgbmFtZSk7CisKKwllcnIgPSByZXF1ZXN0X2lycShscC0+Y2ZnLnJ4X2lycSwgbGRjX3J4LAorCQkJICBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCwKKwkJCSAgbHAtPnJ4X2lycV9uYW1lLCBscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gcmVxdWVzdF9pcnEobHAtPmNmZy50eF9pcnEsIGxkY190eCwKKwkJCSAgSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9TSEFSRUQsCisJCQkgIGxwLT50eF9pcnFfbmFtZSwgbHApOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfcnhfaXJxOworCisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTOworCisJZXJyID0gLUVOT0RFVjsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9mcmVlX3R4X2lycTsKKworCWh2X2VyciA9IHN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIGxwLT50eF9yYSwgbHAtPnR4X251bV9lbnRyaWVzKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9mcmVlX3R4X2lycTsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIDAsIDApOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X3VubWFwX3R4OworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X3VubWFwX3R4OworCisJbHAtPmZsYWdzIHw9IExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+dHhfaGVhZCwKKwkJCQkJJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWVyciA9IC1FQlVTWTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF91bm1hcF9yeDsKKworCWxwLT50eF9hY2tlZCA9IGxwLT50eF9oZWFkOworCisJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0JPVU5EKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworb3V0X3VubWFwX3J4OgorCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVM7CisJc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisKK291dF91bm1hcF90eDoKKwlzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKworb3V0X2ZyZWVfdHhfaXJxOgorCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTOworCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisKK291dF9mcmVlX3J4X2lycToKKwlmcmVlX2lycShscC0+Y2ZnLnJ4X2lycSwgbHApOworCitvdXRfZXJyOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfYmluZCk7CisKK2ludCBsZGNfY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCEobHAtPmZsYWdzICYgTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVMpIHx8CisJICAgICEobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpIHx8CisJICAgIGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfT1BFTikKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlCisJCWVyciA9IHN0YXJ0X2hhbmRzaGFrZShscCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX2Nvbm5lY3QpOworCitpbnQgbGRjX2Rpc2Nvbm5lY3Qoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwl1bnNpZ25lZCBsb25nIGh2X2VyciwgZmxhZ3M7CisJaW50IGVycjsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGxwLT5mbGFncyAmIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTKSB8fAorCSAgICAhKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWVyciA9IC1FTk9ERVY7CisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgbHAtPnR4X3JhLCBscC0+dHhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIDAsIDApOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIGxwLT5yeF9yYSwgbHAtPnJ4X251bV9lbnRyaWVzKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQk9VTkQpOworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19PUEVOOworCWxwLT5mbGFncyB8PSBMRENfRkxBR19SRVNFVDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlmcmVlX2lycShscC0+Y2ZnLnR4X2lycSwgbHApOworCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisJbHAtPmZsYWdzICY9IH4oTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTIHwKKwkJICAgICAgIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTKTsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfSU5JVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX2Rpc2Nvbm5lY3QpOworCitpbnQgbGRjX3N0YXRlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJcmV0dXJuIGxwLT5zdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3N0YXRlKTsKKworc3RhdGljIGludCB3cml0ZV9yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIG5ld190YWlsOworCWludCBlcnI7CisKKwlpZiAoc2l6ZSA+IExEQ19QQUNLRVRfU0laRSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXAgPSBkYXRhX2dldF90eF9wYWNrZXQobHAsICZuZXdfdGFpbCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCW1lbWNweShwLCBidWYsIHNpemUpOworCisJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwlpZiAoIWVycikKKwkJZXJyID0gc2l6ZTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIGh2X2VyciwgbmV3OworCWludCBlcnI7CisKKwlpZiAoc2l6ZSA8IExEQ19QQUNLRVRfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKGh2X2VycikKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlpZiAobHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfRE9XTiB8fAorCSAgICBscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9SRVNFVFRJTkcpCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCWlmIChscC0+cnhfaGVhZCA9PSBscC0+cnhfdGFpbCkKKwkJcmV0dXJuIDA7CisKKwlwID0gbHAtPnJ4X2Jhc2UgKyAobHAtPnJ4X2hlYWQgLyBMRENfUEFDS0VUX1NJWkUpOworCW1lbWNweShidWYsIHAsIExEQ19QQUNLRVRfU0laRSk7CisKKwluZXcgPSByeF9hZHZhbmNlKGxwLCBscC0+cnhfaGVhZCk7CisJbHAtPnJ4X2hlYWQgPSBuZXc7CisKKwllcnIgPSBfX3NldF9yeF9oZWFkKGxwLCBuZXcpOworCWlmIChlcnIgPCAwKQorCQllcnIgPSAtRUNPTk5SRVNFVDsKKwllbHNlCisJCWVyciA9IExEQ19QQUNLRVRfU0laRTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHJhd19vcHMgPSB7CisJLndyaXRlCQk9CXdyaXRlX3JhdywKKwkucmVhZAkJPQlyZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgd3JpdGVfbm9ucmF3KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCB0YWlsOworCXVuc2lnbmVkIGludCBjb3BpZWQ7CisJdTMyIHNlcTsKKwlpbnQgZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsICZscC0+dHhfaGVhZCwgJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmICh1bmxpa2VseShodl9lcnIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHVubGlrZWx5KGxwLT5jaGFuX3N0YXRlICE9IExEQ19DSEFOTkVMX1VQKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlpZiAoIXR4X2hhc19zcGFjZV9mb3IobHAsIHNpemUpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXNlcSA9IGxwLT5zbmRfbnh0OworCWNvcGllZCA9IDA7CisJdGFpbCA9IGxwLT50eF90YWlsOworCXdoaWxlIChjb3BpZWQgPCBzaXplKSB7CisJCXN0cnVjdCBsZGNfcGFja2V0ICpwID0gbHAtPnR4X2Jhc2UgKyAodGFpbCAvIExEQ19QQUNLRVRfU0laRSk7CisJCXU4ICpkYXRhID0gKChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfVU5SRUxJQUJMRSkgPworCQkJICAgIHAtPnUudV9kYXRhIDoKKwkJCSAgICBwLT51LnIucl9kYXRhKTsKKwkJaW50IGRhdGFfbGVuOworCisJCXAtPnR5cGUgPSBMRENfREFUQTsKKwkJcC0+c3R5cGUgPSBMRENfSU5GTzsKKwkJcC0+Y3RybCA9IDA7CisKKwkJZGF0YV9sZW4gPSBzaXplIC0gY29waWVkOworCQlpZiAoZGF0YV9sZW4gPiBscC0+bXNzKQorCQkJZGF0YV9sZW4gPSBscC0+bXNzOworCisJCUJVR19PTihkYXRhX2xlbiA+IExEQ19MRU4pOworCisJCXAtPmVudiA9IChkYXRhX2xlbiB8CisJCQkgIChjb3BpZWQgPT0gMCA/IExEQ19TVEFSVCA6IDApIHwKKwkJCSAgKGRhdGFfbGVuID09IHNpemUgLSBjb3BpZWQgPyBMRENfU1RPUCA6IDApKTsKKworCQlwLT5zZXFpZCA9ICsrc2VxOworCisJCWxkY2RiZyhEQVRBLCAiU0VOVCBEQVRBIFslMDJ4OiUwMng6JTAyeDolMDJ4OiUwOHhdXG4iLAorCQkgICAgICAgcC0+dHlwZSwKKwkJICAgICAgIHAtPnN0eXBlLAorCQkgICAgICAgcC0+Y3RybCwKKwkJICAgICAgIHAtPmVudiwKKwkJICAgICAgIHAtPnNlcWlkKTsKKworCQltZW1jcHkoZGF0YSwgYnVmLCBkYXRhX2xlbik7CisJCWJ1ZiArPSBkYXRhX2xlbjsKKwkJY29waWVkICs9IGRhdGFfbGVuOworCisJCXRhaWwgPSB0eF9hZHZhbmNlKGxwLCB0YWlsKTsKKwl9CisKKwllcnIgPSBzZXRfdHhfdGFpbChscCwgdGFpbCk7CisJaWYgKCFlcnIpIHsKKwkJbHAtPnNuZF9ueHQgPSBzZXE7CisJCWVyciA9IHNpemU7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByeF9iYWRfc2VxKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfcGFja2V0ICpwLAorCQkgICAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqZmlyc3RfZnJhZykKK3sKKwlpbnQgZXJyOworCisJaWYgKGZpcnN0X2ZyYWcpCisJCWxwLT5yY3Zfbnh0ID0gZmlyc3RfZnJhZy0+c2VxaWQgLSAxOworCisJZXJyID0gc2VuZF9kYXRhX25hY2sobHAsIHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBfX3NldF9yeF9oZWFkKGxwLCBscC0+cnhfdGFpbCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF0YV9hY2tfbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3BhY2tldCAqcCkKK3sKKwlpZiAocC0+c3R5cGUgJiBMRENfQUNLKSB7CisJCWludCBlcnIgPSBwcm9jZXNzX2RhdGFfYWNrKGxwLCBwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChwLT5zdHlwZSAmIExEQ19OQUNLKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ4X2RhdGFfd2FpdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIGN1cl9oZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJaW50IGxpbWl0ID0gMTAwMDsKKworCWxkY2RiZyhEQVRBLCAiREFUQSBXQUlUIGN1cl9oZWFkWyVseF0gcnhfaGVhZFslbHhdIHJ4X3RhaWxbJWx4XVxuIiwKKwkgICAgICAgY3VyX2hlYWQsIGxwLT5yeF9oZWFkLCBscC0+cnhfdGFpbCk7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCisJCWh2X2VyciA9IHN1bjR2X2xkY19yeF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkJJmR1bW15LAorCQkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwkJaWYgKGh2X2VycikKKwkJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJCWlmIChscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9ET1dOIHx8CisJCSAgICBscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9SRVNFVFRJTkcpCisJCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisKKwkJaWYgKGN1cl9oZWFkICE9IGxwLT5yeF90YWlsKSB7CisJCQlsZGNkYmcoREFUQSwgIkRBVEEgV0FJVCBET05FICIKKwkJCSAgICAgICAiaGVhZFslbHhdIHRhaWxbJWx4XSBjaGFuX3N0YXRlWyVseF1cbiIsCisJCQkgICAgICAgZHVtbXksIGxwLT5yeF90YWlsLCBscC0+Y2hhbl9zdGF0ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVkZWxheSgxKTsKKwl9CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgcnhfc2V0X2hlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWludCBlcnIgPSBfX3NldF9yeF9oZWFkKGxwLCBoZWFkKTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWxwLT5yeF9oZWFkID0gaGVhZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VuZF9kYXRhX2FjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisKKwlwID0gZGF0YV9nZXRfdHhfcGFja2V0KGxwLCAmbmV3X3RhaWwpOworCWlmIChsaWtlbHkocCkpIHsKKwkJaW50IGVycjsKKworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJCXAtPnR5cGUgPSBMRENfREFUQTsKKwkJcC0+c3R5cGUgPSBMRENfQUNLOworCQlwLT5jdHJsID0gMDsKKwkJcC0+c2VxaWQgPSBscC0+c25kX254dCArIDE7CisJCXAtPnUuci5hY2tpZCA9IGxwLT5yY3Zfbnh0OworCisJCWVyciA9IHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJCWlmICghZXJyKQorCQkJbHAtPnNuZF9ueHQrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9ub25yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqZmlyc3RfZnJhZzsKKwl1bnNpZ25lZCBsb25nIGh2X2VyciwgbmV3OworCWludCBlcnIsIGNvcGllZDsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkmbHAtPnJ4X2hlYWQsCisJCQkJCSZscC0+cnhfdGFpbCwKKwkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwlpZiAoaHZfZXJyKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmIChscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9ET1dOIHx8CisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCisJaWYgKGxwLT5yeF9oZWFkID09IGxwLT5yeF90YWlsKQorCQlyZXR1cm4gMDsKKworCWZpcnN0X2ZyYWcgPSBOVUxMOworCWNvcGllZCA9IGVyciA9IDA7CisJbmV3ID0gbHAtPnJ4X2hlYWQ7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJCWludCBwa3RfbGVuOworCisJCUJVR19PTihuZXcgPT0gbHAtPnJ4X3RhaWwpOworCQlwID0gbHAtPnJ4X2Jhc2UgKyAobmV3IC8gTERDX1BBQ0tFVF9TSVpFKTsKKworCQlsZGNkYmcoUlgsICJSWCByZWFkIHBrdFslMDJ4OiUwMng6JTAyeDolMDJ4OiUwOHg6JTA4eF0gIgorCQkgICAgICAgInJjdl9ueHRbJTA4eF1cbiIsCisJCSAgICAgICBwLT50eXBlLAorCQkgICAgICAgcC0+c3R5cGUsCisJCSAgICAgICBwLT5jdHJsLAorCQkgICAgICAgcC0+ZW52LAorCQkgICAgICAgcC0+c2VxaWQsCisJCSAgICAgICBwLT51LnIuYWNraWQsCisJCSAgICAgICBscC0+cmN2X254dCk7CisKKwkJaWYgKHVubGlrZWx5KCFyeF9zZXFfb2sobHAsIHAtPnNlcWlkKSkpIHsKKwkJCWVyciA9IHJ4X2JhZF9zZXEobHAsIHAsIGZpcnN0X2ZyYWcpOworCQkJY29waWVkID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHAtPnR5cGUgJiBMRENfQ1RSTCkgeworCQkJZXJyID0gcHJvY2Vzc19jb250cm9sX2ZyYW1lKGxwLCBwKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gMDsKKwkJfQorCisJCWxwLT5yY3Zfbnh0ID0gcC0+c2VxaWQ7CisKKwkJaWYgKCEocC0+dHlwZSAmIExEQ19EQVRBKSkgeworCQkJbmV3ID0gcnhfYWR2YW5jZShscCwgbmV3KTsKKwkJCWdvdG8gbm9fZGF0YTsKKwkJfQorCQlpZiAocC0+c3R5cGUgJiAoTERDX0FDSyB8IExEQ19OQUNLKSkgeworCQkJZXJyID0gZGF0YV9hY2tfbmFjayhscCwgcCk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghKHAtPnN0eXBlICYgTERDX0lORk8pKSB7CisJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCQkJZXJyID0gcnhfc2V0X2hlYWQobHAsIG5ldyk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJZ290byBub19kYXRhOworCQl9CisKKwkJcGt0X2xlbiA9IHAtPmVudiAmIExEQ19MRU47CisKKwkJLyogRXZlcnkgaW5pdGlhbCBwYWNrZXQgc3RhcnRzIHdpdGggdGhlIFNUQVJUIGJpdCBzZXQuCisJCSAqCisJCSAqIFNpbmdsZXRvbiBwYWNrZXRzIHdpbGwgaGF2ZSBib3RoIFNUQVJUK1NUT1Agc2V0LgorCQkgKgorCQkgKiBGcmFnbWVudHMgd2lsbCBoYXZlIFNUQVJUIHNldCBpbiB0aGUgZmlyc3QgZnJhbWUsIFNUT1AKKwkJICogc2V0IGluIHRoZSBsYXN0IGZyYW1lLCBhbmQgbmVpdGhlciBiaXQgc2V0IGluIG1pZGRsZQorCQkgKiBmcmFtZXMgb2YgdGhlIHBhY2tldC4KKwkJICoKKwkJICogVGhlcmVmb3JlIGlmIHdlIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGFja2V0IGFuZAorCQkgKiB3ZSBkb24ndCBzZWUgU1RBUlQsIG9yIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZnJhZ21lbnRlZAorCQkgKiBwYWNrZXQgYW5kIGRvIHNlZSBTVEFSVCwgd2UgYXJlIHVuc3luY2hyb25pemVkIGFuZCBzaG91bGQKKwkJICogZmx1c2ggdGhlIFJYIHF1ZXVlLgorCQkgKi8KKwkJaWYgKChmaXJzdF9mcmFnID09IE5VTEwgJiYgIShwLT5lbnYgJiBMRENfU1RBUlQpKSB8fAorCQkgICAgKGZpcnN0X2ZyYWcgIT0gTlVMTCAmJiAgKHAtPmVudiAmIExEQ19TVEFSVCkpKSB7CisJCQlpZiAoIWZpcnN0X2ZyYWcpCisJCQkJbmV3ID0gcnhfYWR2YW5jZShscCwgbmV3KTsKKworCQkJZXJyID0gcnhfc2V0X2hlYWQobHAsIG5ldyk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCisJCQlpZiAoIWZpcnN0X2ZyYWcpCisJCQkJZ290byBub19kYXRhOworCQl9CisJCWlmICghZmlyc3RfZnJhZykKKwkJCWZpcnN0X2ZyYWcgPSBwOworCisJCWlmIChwa3RfbGVuID4gc2l6ZSAtIGNvcGllZCkgeworCQkJLyogVXNlciBkaWRuJ3QgZ2l2ZSB1cyBhIGJpZyBlbm91Z2ggYnVmZmVyLAorCQkJICogd2hhdCB0byBkbz8gIFRoaXMgaXMgYSBwcmV0dHkgc2VyaW91cyBlcnJvci4KKwkJCSAqCisJCQkgKiBTaW5jZSB3ZSBoYXZlbid0IHVwZGF0ZWQgdGhlIFJYIHJpbmcgaGVhZCB0bworCQkJICogY29uc3VtZSBhbnkgb2YgdGhlIHBhY2tldHMsIHNpZ25hbCB0aGUgZXJyb3IKKwkJCSAqIHRvIHRoZSB1c2VyIGFuZCBqdXN0IGxlYXZlIHRoZSBSWCByaW5nIGFsb25lLgorCQkJICoKKwkJCSAqIFRoaXMgc2VlbXMgdGhlIGJlc3QgYmVoYXZpb3IgYmVjYXVzZSB0aGlzIGFsbG93cworCQkJICogYSB1c2VyIG9mIHRoZSBMREMgbGF5ZXIgdG8gc3RhcnQgd2l0aCBhIHNtYWxsCisJCQkgKiBSWCBidWZmZXIgZm9yIGxkY19yZWFkKCkgY2FsbHMgYW5kIHVzZSAtRU1TR1NJWkUKKwkJCSAqIGFzIGEgY3VlIHRvIGVubGFyZ2UgaXQncyByZWFkIGJ1ZmZlci4KKwkJCSAqLworCQkJZXJyID0gLUVNU0dTSVpFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBPaywgd2UgYXJlIGdvbm5hIGVhdCB0aGlzIG9uZS4gICovCisJCW5ldyA9IHJ4X2FkdmFuY2UobHAsIG5ldyk7CisKKwkJbWVtY3B5KGJ1ZiwKKwkJICAgICAgIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfVU5SRUxJQUJMRSA/CisJCQlwLT51LnVfZGF0YSA6IHAtPnUuci5yX2RhdGEpLCBwa3RfbGVuKTsKKwkJYnVmICs9IHBrdF9sZW47CisJCWNvcGllZCArPSBwa3RfbGVuOworCisJCWlmIChwLT5lbnYgJiBMRENfU1RPUCkKKwkJCWJyZWFrOworCitub19kYXRhOgorCQlpZiAobmV3ID09IGxwLT5yeF90YWlsKSB7CisJCQllcnIgPSByeF9kYXRhX3dhaXQobHAsIG5ldyk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFlcnIpCisJCWVyciA9IHJ4X3NldF9oZWFkKGxwLCBuZXcpOworCisJaWYgKGVyciAmJiBmaXJzdF9mcmFnKQorCQlscC0+cmN2X254dCA9IGZpcnN0X2ZyYWctPnNlcWlkIC0gMTsKKworCWlmICghZXJyKSB7CisJCWVyciA9IGNvcGllZDsKKwkJaWYgKGVyciA+IDAgJiYgbHAtPmNmZy5tb2RlICE9IExEQ19NT0RFX1VOUkVMSUFCTEUpCisJCQlzZW5kX2RhdGFfYWNrKGxwKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyBub25yYXdfb3BzID0geworCS53cml0ZQkJPQl3cml0ZV9ub25yYXcsCisJLnJlYWQJCT0JcmVhZF9ub25yYXcsCit9OworCitzdGF0aWMgaW50IHdyaXRlX3N0cmVhbShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsCisJCQl1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+IGxwLT5jZmcubXR1KQorCQlzaXplID0gbHAtPmNmZy5tdHU7CisJcmV0dXJuIHdyaXRlX25vbnJhdyhscCwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIGludCByZWFkX3N0cmVhbShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCWlmICghbHAtPm1zc2J1Zl9sZW4pIHsKKwkJaW50IGVyciA9IHJlYWRfbm9ucmF3KGxwLCBscC0+bXNzYnVmLCBscC0+Y2ZnLm10dSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlscC0+bXNzYnVmX2xlbiA9IGVycjsKKwkJbHAtPm1zc2J1Zl9vZmYgPSAwOworCX0KKworCWlmIChzaXplID4gbHAtPm1zc2J1Zl9sZW4pCisJCXNpemUgPSBscC0+bXNzYnVmX2xlbjsKKwltZW1jcHkoYnVmLCBscC0+bXNzYnVmICsgbHAtPm1zc2J1Zl9vZmYsIHNpemUpOworCisJbHAtPm1zc2J1Zl9vZmYgKz0gc2l6ZTsKKwlscC0+bXNzYnVmX2xlbiAtPSBzaXplOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHN0cmVhbV9vcHMgPSB7CisJLndyaXRlCQk9CXdyaXRlX3N0cmVhbSwKKwkucmVhZAkJPQlyZWFkX3N0cmVhbSwKK307CisKK2ludCBsZGNfd3JpdGUoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobHAtPmhzX3N0YXRlICE9IExEQ19IU19DT01QTEVURSkKKwkJZXJyID0gLUVOT1RDT05OOworCWVsc2UKKwkJZXJyID0gbHAtPm1vcHMtPndyaXRlKGxwLCBidWYsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY193cml0ZSk7CisKK2ludCBsZGNfcmVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFKQorCQllcnIgPSAtRU5PVENPTk47CisJZWxzZQorCQllcnIgPSBscC0+bW9wcy0+cmVhZChscCwgYnVmLCBzaXplKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfcmVhZCk7CisKK3N0YXRpYyBsb25nIGFyZW5hX2FsbG9jKHN0cnVjdCBsZGNfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3sKKwlzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hID0gJmlvbW11LT5hcmVuYTsKKwl1bnNpZ25lZCBsb25nIG4sIGksIHN0YXJ0LCBlbmQsIGxpbWl0OworCWludCBwYXNzOworCisJbGltaXQgPSBhcmVuYS0+bGltaXQ7CisJc3RhcnQgPSBhcmVuYS0+aGludDsKKwlwYXNzID0gMDsKKworYWdhaW46CisJbiA9IGZpbmRfbmV4dF96ZXJvX2JpdChhcmVuYS0+bWFwLCBsaW1pdCwgc3RhcnQpOworCWVuZCA9IG4gKyBucGFnZXM7CisJaWYgKHVubGlrZWx5KGVuZCA+PSBsaW1pdCkpIHsKKwkJaWYgKGxpa2VseShwYXNzIDwgMSkpIHsKKwkJCWxpbWl0ID0gc3RhcnQ7CisJCQlzdGFydCA9IDA7CisJCQlwYXNzKys7CisJCQlnb3RvIGFnYWluOworCQl9IGVsc2UgeworCQkJLyogU2Nhbm5lZCB0aGUgd2hvbGUgdGhpbmcsIGdpdmUgdXAuICovCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSBuOyBpIDwgZW5kOyBpKyspIHsKKwkJaWYgKHRlc3RfYml0KGksIGFyZW5hLT5tYXApKSB7CisJCQlzdGFydCA9IGkgKyAxOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCWZvciAoaSA9IG47IGkgPCBlbmQ7IGkrKykKKwkJX19zZXRfYml0KGksIGFyZW5hLT5tYXApOworCisJYXJlbmEtPmhpbnQgPSBlbmQ7CisKKwlyZXR1cm4gbjsKK30KKworI2RlZmluZSBDT09LSUVfUEdTWl9DT0RFCTB4ZjAwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBDT09LSUVfUEdTWl9DT0RFX1NISUZUCTYwVUxMCisKK3N0YXRpYyB1NjQgcGFnZXNpemVfY29kZSh2b2lkKQoreworCXN3aXRjaCAoUEFHRV9TSVpFKSB7CisJZGVmYXVsdDoKKwljYXNlICg4VUxMICogMTAyNFVMTCk6CisJCXJldHVybiAwOworCWNhc2UgKDY0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiAxOworCWNhc2UgKDUxMlVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gMjsKKwljYXNlICg0VUxMICogMTAyNFVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gMzsKKwljYXNlICgzMlVMTCAqIDEwMjRVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDQ7CisJY2FzZSAoMjU2VUxMICogMTAyNFVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gNTsKKwl9Cit9CisKK3N0YXRpYyB1NjQgbWFrZV9jb29raWUodTY0IGluZGV4LCB1NjQgcGdzel9jb2RlLCB1NjQgcGFnZV9vZmZzZXQpCit7CisJcmV0dXJuICgocGdzel9jb2RlIDw8IENPT0tJRV9QR1NaX0NPREVfU0hJRlQpIHwKKwkJKGluZGV4IDw8IFBBR0VfU0hJRlQpIHwKKwkJcGFnZV9vZmZzZXQpOworfQorCitzdGF0aWMgdTY0IGNvb2tpZV90b19pbmRleCh1NjQgY29va2llLCB1bnNpZ25lZCBsb25nICpzaGlmdCkKK3sKKwl1NjQgc3pjb2RlID0gY29va2llID4+IENPT0tJRV9QR1NaX0NPREVfU0hJRlQ7CisKKwljb29raWUgJj0gfkNPT0tJRV9QR1NaX0NPREU7CisKKwkqc2hpZnQgPSBzemNvZGUgKiAzOworCisJcmV0dXJuIChjb29raWUgPj4gKDEzVUxMICsgKHN6Y29kZSAqIDNVTEwpKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYWxsb2NfbnBhZ2VzKHN0cnVjdCBsZGNfaW9tbXUgKmlvbW11LAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQoreworCWxvbmcgZW50cnk7CisKKwllbnRyeSA9IGFyZW5hX2FsbG9jKGlvbW11LCBucGFnZXMpOworCWlmICh1bmxpa2VseShlbnRyeSA8IDApKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpb21tdS0+cGFnZV90YWJsZSArIGVudHJ5OworfQorCitzdGF0aWMgdTY0IHBlcm1fdG9fbXRlKHVuc2lnbmVkIGludCBtYXBfcGVybSkKK3sKKwl1NjQgbXRlX2Jhc2U7CisKKwltdGVfYmFzZSA9IHBhZ2VzaXplX2NvZGUoKTsKKworCWlmIChtYXBfcGVybSAmIExEQ19NQVBfU0hBRE9XKSB7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfUikKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfQ09QWV9SOworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1cpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0NPUFlfVzsKKwl9CisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9ESVJFQ1QpIHsKKwkJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQkJbXRlX2Jhc2UgfD0gTERDX01URV9SRUFEOworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1cpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX1dSSVRFOworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1gpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0VYRUM7CisJfQorCWlmIChtYXBfcGVybSAmIExEQ19NQVBfSU8pIHsKKwkJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQkJbXRlX2Jhc2UgfD0gTERDX01URV9JT01NVV9SOworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1cpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0lPTU1VX1c7CisJfQorCisJcmV0dXJuIG10ZV9iYXNlOworfQorCitzdGF0aWMgaW50IHBhZ2VzX2luX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGxvbmcgbGVuKQoreworCWludCBjb3VudCA9IDA7CisKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgbmV3ID0gKGJhc2UgKyBQQUdFX1NJWkUpICYgUEFHRV9NQVNLOworCisJCWxlbiAtPSAobmV3IC0gYmFzZSk7CisJCWJhc2UgPSBuZXc7CisJCWNvdW50Kys7CisJfSB3aGlsZSAobGVuID4gMCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0cnVjdCBjb29raWVfc3RhdGUgeworCXN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5CQkqcGFnZV90YWJsZTsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQkJKmNvb2tpZXM7CisJdTY0CQkJCW10ZV9iYXNlOworCXU2NAkJCQlwcmV2X2Nvb2tpZTsKKwl1MzIJCQkJcHRlX2lkeDsKKwl1MzIJCQkJbmM7Cit9OworCitzdGF0aWMgdm9pZCBmaWxsX2Nvb2tpZXMoc3RydWN0IGNvb2tpZV9zdGF0ZSAqc3AsIHVuc2lnbmVkIGxvbmcgcGEsCisJCQkgdW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyB0bGVuLCBuZXcgPSBwYSArIFBBR0VfU0laRTsKKwkJdTY0IHRoaXNfY29va2llOworCisJCXNwLT5wYWdlX3RhYmxlW3NwLT5wdGVfaWR4XS5tdGUgPSBzcC0+bXRlX2Jhc2UgfCBwYTsKKworCQl0bGVuID0gUEFHRV9TSVpFOworCQlpZiAob2ZmKQorCQkJdGxlbiA9IFBBR0VfU0laRSAtIG9mZjsKKwkJaWYgKHRsZW4gPiBsZW4pCisJCQl0bGVuID0gbGVuOworCisJCXRoaXNfY29va2llID0gbWFrZV9jb29raWUoc3AtPnB0ZV9pZHgsCisJCQkJCSAgcGFnZXNpemVfY29kZSgpLCBvZmYpOworCisJCW9mZiA9IDA7CisKKwkJaWYgKHRoaXNfY29va2llID09IHNwLT5wcmV2X2Nvb2tpZSkgeworCQkJc3AtPmNvb2tpZXNbc3AtPm5jIC0gMV0uY29va2llX3NpemUgKz0gdGxlbjsKKwkJfSBlbHNlIHsKKwkJCXNwLT5jb29raWVzW3NwLT5uY10uY29va2llX2FkZHIgPSB0aGlzX2Nvb2tpZTsKKwkJCXNwLT5jb29raWVzW3NwLT5uY10uY29va2llX3NpemUgPSB0bGVuOworCQkJc3AtPm5jKys7CisJCX0KKwkJc3AtPnByZXZfY29va2llID0gdGhpc19jb29raWUgKyB0bGVuOworCisJCXNwLT5wdGVfaWR4Kys7CisKKwkJbGVuIC09IHRsZW47CisJCXBhID0gbmV3OworCX0gd2hpbGUgKGxlbiA+IDApOworfQorCitzdGF0aWMgaW50IHNnX2NvdW50X29uZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IHBhZ2VfdG9fcGZuKHNnLT5wYWdlKSA8PCBQQUdFX1NISUZUOworCWxvbmcgbGVuID0gc2ctPmxlbmd0aDsKKworCWlmICgoc2ctPm9mZnNldCB8IGxlbikgJiAoOFVMIC0gMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHBhZ2VzX2luX3JlZ2lvbihiYXNlICsgc2ctPm9mZnNldCwgbGVuKTsKK30KKworc3RhdGljIGludCBzZ19jb3VudF9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbnVtX3NnKQoreworCWludCBjb3VudDsKKwlpbnQgaTsKKworCWNvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NnOyBpKyspIHsKKwkJaW50IGVyciA9IHNnX2NvdW50X29uZShzZyArIGkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWNvdW50ICs9IGVycjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBsZGNfbWFwX3NnKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2csCisJICAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMsCisJICAgICAgIHVuc2lnbmVkIGludCBtYXBfcGVybSkKK3sKKwl1bnNpZ25lZCBsb25nIGksIG5wYWdlcywgZmxhZ3M7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKmJhc2U7CisJc3RydWN0IGNvb2tpZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdTsKKwlpbnQgZXJyOworCisJaWYgKG1hcF9wZXJtICYgfkxEQ19NQVBfQUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHNnX2NvdW50X3BhZ2VzKHNnLCBudW1fc2cpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbnBhZ2VzID0gZXJyOworCWlmIChlcnIgPiBuY29va2llcykKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlvbW11ID0gJmxwLT5pb21tdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWJhc2UgPSBhbGxvY19ucGFnZXMoaW9tbXUsIG5wYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWlmICghYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0ZS5wYWdlX3RhYmxlID0gaW9tbXUtPnBhZ2VfdGFibGU7CisJc3RhdGUuY29va2llcyA9IGNvb2tpZXM7CisJc3RhdGUubXRlX2Jhc2UgPSBwZXJtX3RvX210ZShtYXBfcGVybSk7CisJc3RhdGUucHJldl9jb29raWUgPSB+KHU2NCkwOworCXN0YXRlLnB0ZV9pZHggPSAoYmFzZSAtIGlvbW11LT5wYWdlX3RhYmxlKTsKKwlzdGF0ZS5uYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NnOyBpKyspCisJCWZpbGxfY29va2llcygmc3RhdGUsIHBhZ2VfdG9fcGZuKHNnW2ldLnBhZ2UpIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgIHNnW2ldLm9mZnNldCwgc2dbaV0ubGVuZ3RoKTsKKworCXJldHVybiBzdGF0ZS5uYzsKK30KK0VYUE9SVF9TWU1CT0wobGRjX21hcF9zZyk7CisKK2ludCBsZGNfbWFwX3NpbmdsZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCSAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMsCisJCSAgIHVuc2lnbmVkIGludCBtYXBfcGVybSkKK3sKKwl1bnNpZ25lZCBsb25nIG5wYWdlcywgcGEsIGZsYWdzOworCXN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5ICpiYXNlOworCXN0cnVjdCBjb29raWVfc3RhdGUgc3RhdGU7CisJc3RydWN0IGxkY19pb21tdSAqaW9tbXU7CisKKwlpZiAoKG1hcF9wZXJtICYgfkxEQ19NQVBfQUxMKSB8fCAobmNvb2tpZXMgPCAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYSA9IF9fcGEoYnVmKTsKKwlpZiAoKHBhIHwgbGVuKSAmICg4VUwgLSAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlucGFnZXMgPSBwYWdlc19pbl9yZWdpb24ocGEsIGxlbik7CisKKwlpb21tdSA9ICZscC0+aW9tbXU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwliYXNlID0gYWxsb2NfbnBhZ2VzKGlvbW11LCBucGFnZXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWJhc2UpCisJCXJldHVybiAtRU5PTUVNOworCisJc3RhdGUucGFnZV90YWJsZSA9IGlvbW11LT5wYWdlX3RhYmxlOworCXN0YXRlLmNvb2tpZXMgPSBjb29raWVzOworCXN0YXRlLm10ZV9iYXNlID0gcGVybV90b19tdGUobWFwX3Blcm0pOworCXN0YXRlLnByZXZfY29va2llID0gfih1NjQpMDsKKwlzdGF0ZS5wdGVfaWR4ID0gKGJhc2UgLSBpb21tdS0+cGFnZV90YWJsZSk7CisJc3RhdGUubmMgPSAwOworCWZpbGxfY29va2llcygmc3RhdGUsIChwYSAmIFBBR0VfTUFTSyksIChwYSAmIH5QQUdFX01BU0spLCBsZW4pOworCUJVR19PTihzdGF0ZS5uYyAhPSAxKTsKKworCXJldHVybiBzdGF0ZS5uYzsKK30KK0VYUE9SVF9TWU1CT0wobGRjX21hcF9zaW5nbGUpOworCitzdGF0aWMgdm9pZCBmcmVlX25wYWdlcyh1bnNpZ25lZCBsb25nIGlkLCBzdHJ1Y3QgbGRjX2lvbW11ICppb21tdSwKKwkJCXU2NCBjb29raWUsIHU2NCBzaXplKQoreworCXN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEgPSAmaW9tbXUtPmFyZW5hOworCXVuc2lnbmVkIGxvbmcgaSwgc2hpZnQsIGluZGV4LCBucGFnZXM7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKmJhc2U7CisKKwlucGFnZXMgPSBQQUdFX0FMSUdOKCgoY29va2llICYgflBBR0VfTUFTSykgKyBzaXplKSkgPj4gUEFHRV9TSElGVDsKKwlpbmRleCA9IGNvb2tpZV90b19pbmRleChjb29raWUsICZzaGlmdCk7CisJYmFzZSA9IGlvbW11LT5wYWdlX3RhYmxlICsgaW5kZXg7CisKKwlCVUdfT04oaW5kZXggPiBhcmVuYS0+bGltaXQgfHwKKwkgICAgICAgKGluZGV4ICsgbnBhZ2VzKSA+IGFyZW5hLT5saW1pdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJaWYgKGJhc2UtPmNvb2tpZSkKKwkJCXN1bjR2X2xkY19yZXZva2UoaWQsIGNvb2tpZSArIChpIDw8IHNoaWZ0KSwKKwkJCQkJIGJhc2UtPmNvb2tpZSk7CisJCWJhc2UtPm10ZSA9IDA7CisJCV9fY2xlYXJfYml0KGluZGV4ICsgaSwgYXJlbmEtPm1hcCk7CisJfQorfQorCit2b2lkIGxkY191bm1hcChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywKKwkgICAgICAgaW50IG5jb29raWVzKQoreworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5jb29raWVzOyBpKyspIHsKKwkJdTY0IGFkZHIgPSBjb29raWVzW2ldLmNvb2tpZV9hZGRyOworCQl1NjQgc2l6ZSA9IGNvb2tpZXNbaV0uY29va2llX3NpemU7CisKKwkJZnJlZV9ucGFnZXMobHAtPmlkLCBpb21tdSwgYWRkciwgc2l6ZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGxkY191bm1hcCk7CisKK2ludCBsZGNfY29weShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBpbnQgY29weV9kaXIsCisJICAgICB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCSAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcykKK3sKKwl1bnNpZ25lZCBpbnQgb3JpZ19sZW47CisJdW5zaWduZWQgbG9uZyByYTsKKwlpbnQgaTsKKworCWlmIChjb3B5X2RpciAhPSBMRENfQ09QWV9JTiAmJiBjb3B5X2RpciAhPSBMRENfQ09QWV9PVVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2NvcHk6IElEWyVsdV0gQmFkIGNvcHlfZGlyWyVkXVxuIiwKKwkJICAgICAgIGxwLT5pZCwgY29weV9kaXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYSA9IF9fcGEoYnVmKTsKKwlpZiAoKHJhIHwgbGVuIHwgb2Zmc2V0KSAmICg4VUwgLSAxKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBVbmFsaWduZWQgYnVmZmVyICIKKwkJICAgICAgICJyYVslbHhdIGxlblsleF0gb2Zmc2V0WyVseF1cbiIsCisJCSAgICAgICBscC0+aWQsIHJhLCBsZW4sIG9mZnNldCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFIHx8CisJICAgIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRVNFVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2NvcHk6IElEWyVsdV0gTGluayBkb3duIGhzX3N0YXRlWyV4XSAiCisJCSAgICAgICAiZmxhZ3NbJXhdXG4iLCBscC0+aWQsIGxwLT5oc19zdGF0ZSwgbHAtPmZsYWdzKTsKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCX0KKworCW9yaWdfbGVuID0gbGVuOworCWZvciAoaSA9IDA7IGkgPCBuY29va2llczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgY29va2llX3JhZGRyID0gY29va2llc1tpXS5jb29raWVfYWRkcjsKKwkJdW5zaWduZWQgbG9uZyB0aGlzX2xlbiA9IGNvb2tpZXNbaV0uY29va2llX3NpemU7CisJCXVuc2lnbmVkIGxvbmcgYWN0dWFsX2xlbjsKKworCQlpZiAodW5saWtlbHkob2Zmc2V0KSkgeworCQkJdW5zaWduZWQgbG9uZyB0aGlzX29mZiA9IG9mZnNldDsKKworCQkJaWYgKHRoaXNfb2ZmID4gdGhpc19sZW4pCisJCQkJdGhpc19vZmYgPSB0aGlzX2xlbjsKKworCQkJb2Zmc2V0IC09IHRoaXNfb2ZmOworCQkJdGhpc19sZW4gLT0gdGhpc19vZmY7CisJCQlpZiAoIXRoaXNfbGVuKQorCQkJCWNvbnRpbnVlOworCQkJY29va2llX3JhZGRyICs9IHRoaXNfb2ZmOworCQl9CisKKwkJaWYgKHRoaXNfbGVuID4gbGVuKQorCQkJdGhpc19sZW4gPSBsZW47CisKKwkJd2hpbGUgKDEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCisJCQlodl9lcnIgPSBzdW40dl9sZGNfY29weShscC0+aWQsIGNvcHlfZGlyLAorCQkJCQkJY29va2llX3JhZGRyLCByYSwKKwkJCQkJCXRoaXNfbGVuLCAmYWN0dWFsX2xlbik7CisJCQlpZiAodW5saWtlbHkoaHZfZXJyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19jb3B5OiBJRFslbHVdICIKKwkJCQkgICAgICAgIkhWIGVycm9yICVsdVxuIiwKKwkJCQkgICAgICAgbHAtPmlkLCBodl9lcnIpOworCQkJCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFIHx8CisJCQkJICAgIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRVNFVCkpCisJCQkJCXJldHVybiAtRUNPTk5SRVNFVDsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQljb29raWVfcmFkZHIgKz0gYWN0dWFsX2xlbjsKKwkJCXJhICs9IGFjdHVhbF9sZW47CisJCQlsZW4gLT0gYWN0dWFsX2xlbjsKKwkJCWlmIChhY3R1YWxfbGVuID09IHRoaXNfbGVuKQorCQkJCWJyZWFrOworCisJCQl0aGlzX2xlbiAtPSBhY3R1YWxfbGVuOworCQl9CisKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwl9CisKKwkvKiBJdCBpcyBjYWxsZXIgcG9saWN5IHdoYXQgdG8gZG8gYWJvdXQgc2hvcnQgY29waWVzLgorCSAqIEZvciBleGFtcGxlLCBhIG5ldHdvcmtpbmcgZHJpdmVyIGNhbiBkZWNsYXJlIHRoZQorCSAqIHBhY2tldCBhIHJ1bnQgYW5kIGRyb3AgaXQuCisJICovCisKKwlyZXR1cm4gb3JpZ19sZW4gLSBsZW47Cit9CitFWFBPUlRfU1lNQk9MKGxkY19jb3B5KTsKKwordm9pZCAqbGRjX2FsbG9jX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50ICpuY29va2llcywKKwkJCSAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXZvaWQgKmJ1ZjsKKwlpbnQgZXJyOworCisJaWYgKGxlbiAmICg4VUwgLSAxKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gbGRjX21hcF9zaW5nbGUobHAsIGJ1ZiwgbGVuLCBjb29raWVzLCAqbmNvb2tpZXMsIG1hcF9wZXJtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKwkqbmNvb2tpZXMgPSBlcnI7CisKKwlyZXR1cm4gYnVmOworfQorRVhQT1JUX1NZTUJPTChsZGNfYWxsb2NfZXhwX2RyaW5nKTsKKwordm9pZCBsZGNfZnJlZV9leHBfZHJpbmcoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcykKK3sKKwlsZGNfdW5tYXAobHAsIGNvb2tpZXMsIG5jb29raWVzKTsKKwlrZnJlZShidWYpOworfQorRVhQT1JUX1NZTUJPTChsZGNfZnJlZV9leHBfZHJpbmcpOworCitzdGF0aWMgaW50IF9faW5pdCBsZGNfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWFqb3IsIG1pbm9yOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCWNvbnN0IHU2NCAqdjsKKwl1NjQgbXA7CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1wID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJwbGF0Zm9ybSIpOworCWlmIChtcCA9PSBNREVTQ19OT0RFX05VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJkb21haW5pbmctZW5hYmxlZCIsIE5VTEwpOworCWlmICghdikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYWpvciA9IDE7CisJbWlub3IgPSAwOworCWlmIChzdW40dl9odmFwaV9yZWdpc3RlcihIVl9HUlBfTERPTSwgbWFqb3IsICZtaW5vcikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNvdWxkIG5vdCByZWdpc3RlciBMRE9NIGh2YXBpLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlpZiAoISp2KSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJEb21haW5pbmcgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWxkb21fZG9tYWluaW5nX2VuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwobGRjX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9tZGVzYy5jCmluZGV4IGYwZTE2MDQ1Li5kZTUzMTBmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9tZGVzYy5jCkBAIC02LDYgKzYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgpAQCAtMjksNyArMzIsNyBAQAogCXUzMglub2RlX3N6OyAvKiBub2RlIGJsb2NrIHNpemUgKi8KIAl1MzIJbmFtZV9zejsgLyogbmFtZSBibG9jayBzaXplICovCiAJdTMyCWRhdGFfc3o7IC8qIGRhdGEgYmxvY2sgc2l6ZSAqLwotfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKIAogc3RydWN0IG1kZXNjX2VsZW0gewogCXU4CXRhZzsKQEAgLTUzLDMwNiArNTYsMzk2IEBACiAJfSBkOwogfTsKIAotc3RhdGljIHN0cnVjdCBtZGVzY19oZHIgKm1haW5fbWRlc2M7Ci1zdGF0aWMgc3RydWN0IG1kZXNjX25vZGUgKmFsbG5vZGVzOworc3RydWN0IG1kZXNjX21lbV9vcHMgeworCXN0cnVjdCBtZGVzY19oYW5kbGUgKigqYWxsb2MpKHVuc2lnbmVkIGludCBtZGVzY19zaXplKTsKKwl2b2lkICgqZnJlZSkoc3RydWN0IG1kZXNjX2hhbmRsZSAqaGFuZGxlKTsKK307CiAKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqYWxsbm9kZXNfdGFpbDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOworc3RydWN0IG1kZXNjX2hhbmRsZSB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBtZGVzY19tZW1fb3BzCSptb3BzOworCXZvaWQJCQkqc2VsZl9iYXNlOworCWF0b21pY190CQlyZWZjbnQ7CisJdW5zaWduZWQgaW50CQloYW5kbGVfc2l6ZTsKKwlzdHJ1Y3QgbWRlc2NfaGRyCW1kZXNjOworfTsKIAotc3RhdGljIHN0cnVjdCBtZGVzY19ub2RlICoqbWRlc2NfaGFzaDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWRlc2NfaGFzaF9zaXplOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub2RlX2hhc2hmbih1NjQgbm9kZSkKK3N0YXRpYyB2b2lkIG1kZXNjX2hhbmRsZV9pbml0KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkJICAgICAgdW5zaWduZWQgaW50IGhhbmRsZV9zaXplLAorCQkJICAgICAgdm9pZCAqYmFzZSkKIHsKLQlyZXR1cm4gKCh1bnNpZ25lZCBpbnQpIChub2RlIF4gKG5vZGUgPj4gOCkgXiAobm9kZSA+PiAxNikpKQotCQkmIChtZGVzY19oYXNoX3NpemUgLSAxKTsKKwlCVUdfT04oKCh1bnNpZ25lZCBsb25nKSZocC0+bWRlc2MpICYgKDE2VUwgLSAxKSk7CisKKwltZW1zZXQoaHAsIDAsIGhhbmRsZV9zaXplKTsKKwlJTklUX0xJU1RfSEVBRCgmaHAtPmxpc3QpOworCWhwLT5zZWxmX2Jhc2UgPSBiYXNlOworCWF0b21pY19zZXQoJmhwLT5yZWZjbnQsIDEpOworCWhwLT5oYW5kbGVfc2l6ZSA9IGhhbmRsZV9zaXplOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFzaF9ub2RlKHN0cnVjdCBtZGVzY19ub2RlICptcCkKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19ib290bWVtX2FsbG9jKHVuc2lnbmVkIGludCBtZGVzY19zaXplKQogewotCXN0cnVjdCBtZGVzY19ub2RlICoqaGVhZCA9ICZtZGVzY19oYXNoW25vZGVfaGFzaGZuKG1wLT5ub2RlKV07CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJdW5zaWduZWQgaW50IGhhbmRsZV9zaXplLCBhbGxvY19zaXplOwogCi0JbXAtPmhhc2hfbmV4dCA9ICpoZWFkOwotCSpoZWFkID0gbXA7CisJaGFuZGxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBtZGVzY19oYW5kbGUpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWRlc2NfaGRyKSArCisJCSAgICAgICBtZGVzY19zaXplKTsKKwlhbGxvY19zaXplID0gUEFHRV9BTElHTihoYW5kbGVfc2l6ZSk7CiAKLQlpZiAoYWxsbm9kZXNfdGFpbCkgewotCQlhbGxub2Rlc190YWlsLT5hbGxub2Rlc19uZXh0ID0gbXA7Ci0JCWFsbG5vZGVzX3RhaWwgPSBtcDsKLQl9IGVsc2UgewotCQlhbGxub2RlcyA9IGFsbG5vZGVzX3RhaWwgPSBtcDsKKwlocCA9IF9fYWxsb2NfYm9vdG1lbShhbGxvY19zaXplLCBQQUdFX1NJWkUsIDBVTCk7CisJaWYgKGhwKQorCQltZGVzY19oYW5kbGVfaW5pdChocCwgaGFuZGxlX3NpemUsIGhwKTsKKworCXJldHVybiBocDsKK30KKworc3RhdGljIHZvaWQgbWRlc2NfYm9vdG1lbV9mcmVlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCXVuc2lnbmVkIGludCBhbGxvY19zaXplLCBoYW5kbGVfc2l6ZSA9IGhwLT5oYW5kbGVfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJmhwLT5yZWZjbnQpICE9IDApOworCUJVR19PTighbGlzdF9lbXB0eSgmaHAtPmxpc3QpKTsKKworCWFsbG9jX3NpemUgPSBQQUdFX0FMSUdOKGhhbmRsZV9zaXplKTsKKworCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGhwOworCWVuZCA9IHN0YXJ0ICsgYWxsb2Nfc2l6ZTsKKworCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQlzdHJ1Y3QgcGFnZSAqcDsKKworCQlwID0gdmlydF90b19wYWdlKHN0YXJ0KTsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocCk7CisJCV9fZnJlZV9wYWdlKHApOworCQlzdGFydCArPSBQQUdFX1NJWkU7CiAJfQogfQogCi1zdGF0aWMgc3RydWN0IG1kZXNjX25vZGUgKmZpbmRfbm9kZSh1NjQgbm9kZSkKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfbWVtX29wcyBib290bWVtX21kZXNjX21lbW9wcyA9IHsKKwkuYWxsb2MgPSBtZGVzY19ib290bWVtX2FsbG9jLAorCS5mcmVlICA9IG1kZXNjX2Jvb3RtZW1fZnJlZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19rbWFsbG9jKHVuc2lnbmVkIGludCBtZGVzY19zaXplKQogewotCXN0cnVjdCBtZGVzY19ub2RlICptcCA9IG1kZXNjX2hhc2hbbm9kZV9oYXNoZm4obm9kZSldOworCXVuc2lnbmVkIGludCBoYW5kbGVfc2l6ZTsKKwl2b2lkICpiYXNlOwogCi0Jd2hpbGUgKG1wKSB7Ci0JCWlmIChtcC0+bm9kZSA9PSBub2RlKQotCQkJcmV0dXJuIG1wOworCWhhbmRsZV9zaXplID0gKHNpemVvZihzdHJ1Y3QgbWRlc2NfaGFuZGxlKSAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG1kZXNjX2hkcikgKworCQkgICAgICAgbWRlc2Nfc2l6ZSk7CiAKLQkJbXAgPSBtcC0+aGFzaF9uZXh0OworCWJhc2UgPSBrbWFsbG9jKGhhbmRsZV9zaXplICsgMTUsIEdGUF9LRVJORUwpOworCWlmIChiYXNlKSB7CisJCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWJhc2U7CisJCWFkZHIgPSAoYWRkciArIDE1VUwpICYgfjE1VUw7CisJCWhwID0gKHN0cnVjdCBtZGVzY19oYW5kbGUgKikgYWRkcjsKKworCQltZGVzY19oYW5kbGVfaW5pdChocCwgaGFuZGxlX3NpemUsIGJhc2UpOworCQlyZXR1cm4gaHA7CiAJfQorCiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBwcm9wZXJ0eSAqbWRfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsCi0JCQkJICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgaW50ICpsZW5wKQorc3RhdGljIHZvaWQgbWRlc2Nfa2ZyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcDsKKwlCVUdfT04oYXRvbWljX3JlYWQoJmhwLT5yZWZjbnQpICE9IDApOworCUJVR19PTighbGlzdF9lbXB0eSgmaHAtPmxpc3QpKTsKIAotCWZvciAocHAgPSBtcC0+cHJvcGVydGllczsgcHAgIT0gMDsgcHAgPSBwcC0+bmV4dCkgewotCQlpZiAoc3RyY2FzZWNtcChwcC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKGxlbnApCi0JCQkJKmxlbnAgPSBwcC0+bGVuZ3RoOwotCQkJYnJlYWs7Ci0JCX0KKwlrZnJlZShocC0+c2VsZl9iYXNlKTsKK30KKworc3RhdGljIHN0cnVjdCBtZGVzY19tZW1fb3BzIGttYWxsb2NfbWRlc2NfbWVtb3BzID0geworCS5hbGxvYyA9IG1kZXNjX2ttYWxsb2MsCisJLmZyZWUgID0gbWRlc2Nfa2ZyZWUsCit9OworCitzdGF0aWMgc3RydWN0IG1kZXNjX2hhbmRsZSAqbWRlc2NfYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUsCisJCQkJCXN0cnVjdCBtZGVzY19tZW1fb3BzICptb3BzKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwID0gbW9wcy0+YWxsb2MobWRlc2Nfc2l6ZSk7CisKKwlpZiAoaHApCisJCWhwLT5tb3BzID0gbW9wczsKKworCXJldHVybiBocDsKK30KKworc3RhdGljIHZvaWQgbWRlc2NfZnJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCkKK3sKKwlocC0+bW9wcy0+ZnJlZShocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICpjdXJfbWRlc2M7CitzdGF0aWMgTElTVF9IRUFEKG1kZXNjX3pvbWJpZV9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWRlc2NfbG9jayk7CisKK3N0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2dyYWIodm9pZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKKwlocCA9IGN1cl9tZGVzYzsKKwlpZiAoaHApCisJCWF0b21pY19pbmMoJmhwLT5yZWZjbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBocDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2NfZ3JhYik7CisKK3ZvaWQgbWRlc2NfcmVsZWFzZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaHAtPnJlZmNudCkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmaHAtPmxpc3QpOworCQlocC0+bW9wcy0+ZnJlZShocCk7CiAJfQotCXJldHVybiBwcDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGVzY19sb2NrLCBmbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKG1kX2ZpbmRfcHJvcGVydHkpOworRVhQT1JUX1NZTUJPTChtZGVzY19yZWxlYXNlKTsKIAotLyoKLSAqIEZpbmQgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBmb3IgYSBnaXZlbiBub2RlCi0gKiBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KLSAqLwotY29uc3Qgdm9pZCAqbWRfZ2V0X3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICBpbnQgKmxlbnApCit2b2lkIG1kZXNjX3VwZGF0ZSh2b2lkKQogewotCXN0cnVjdCBwcm9wZXJ0eSAqcHAgPSBtZF9maW5kX3Byb3BlcnR5KG1wLCBuYW1lLCBsZW5wKTsKLQlyZXR1cm4gcHAgPyBwcC0+dmFsdWUgOiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChtZF9nZXRfcHJvcGVydHkpOworCXVuc2lnbmVkIGxvbmcgbGVuLCByZWFsX2xlbiwgc3RhdHVzOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCAqb3JpZ19ocDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi1zdHJ1Y3QgbWRlc2Nfbm9kZSAqbWRfZmluZF9ub2RlX2J5X25hbWUoc3RydWN0IG1kZXNjX25vZGUgKmZyb20sCi0JCQkJCWNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOworCSh2b2lkKSBzdW40dl9tYWNoX2Rlc2MoMFVMLCAwVUwsICZsZW4pOwogCi0JbXAgPSBmcm9tID8gZnJvbS0+YWxsbm9kZXNfbmV4dCA6IGFsbG5vZGVzOwotCWZvciAoOyBtcCAhPSBOVUxMOyBtcCA9IG1wLT5hbGxub2Rlc19uZXh0KSB7Ci0JCWlmIChzdHJjbXAobXAtPm5hbWUsIG5hbWUpID09IDApCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIG1wOwotfQotRVhQT1JUX1NZTUJPTChtZF9maW5kX25vZGVfYnlfbmFtZSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWRlc2NfZWFybHlfYWxsb2NhdGVkOwotCi1zdGF0aWMgdm9pZCAqIF9faW5pdCBtZGVzY19lYXJseV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqcmV0OwotCi0JcmV0ID0gX19hbGxvY19ib290bWVtKHNpemUsIFNNUF9DQUNIRV9CWVRFUywgMFVMKTsKLQlpZiAocmV0ID09IE5VTEwpIHsKLQkJcHJvbV9wcmludGYoIk1ERVNDOiBhbGxvYyBvZiAlbHUgYnl0ZXMgZmFpbGVkLlxuIiwgc2l6ZSk7Ci0JCXByb21faGFsdCgpOworCWhwID0gbWRlc2NfYWxsb2MobGVuLCAma21hbGxvY19tZGVzY19tZW1vcHMpOworCWlmICghaHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNRDogbWRlc2MgYWxsb2MgZmFpbHNcbiIpOworCQlyZXR1cm47CiAJfQogCi0JbWVtc2V0KHJldCwgMCwgc2l6ZSk7Ci0KLQltZGVzY19lYXJseV9hbGxvY2F0ZWQgKz0gc2l6ZTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGNvdW50X2FyY3Moc3RydWN0IG1kZXNjX2VsZW0gKmVwKQotewotCXVuc2lnbmVkIGludCByZXQgPSAwOwotCi0JZXArKzsKLQl3aGlsZSAoZXAtPnRhZyAhPSBNRF9OT0RFX0VORCkgewotCQlpZiAoZXAtPnRhZyA9PSBNRF9QUk9QX0FSQykKLQkJCXJldCsrOwotCQllcCsrOworCXN0YXR1cyA9IHN1bjR2X21hY2hfZGVzYyhfX3BhKCZocC0+bWRlc2MpLCBsZW4sICZyZWFsX2xlbik7CisJaWYgKHN0YXR1cyAhPSBIVl9FT0sgfHwgcmVhbF9sZW4gPiBsZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNRDogbWRlc2MgcmVyZWFkIGZhaWxzIHdpdGggJWx1XG4iLAorCQkgICAgICAgc3RhdHVzKTsKKwkJYXRvbWljX2RlYygmaHAtPnJlZmNudCk7CisJCW1kZXNjX2ZyZWUoaHApOworCQlyZXR1cm47CiAJfQotCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCW9yaWdfaHAgPSBjdXJfbWRlc2M7CisJY3VyX21kZXNjID0gaHA7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmb3JpZ19ocC0+cmVmY250KSkKKwkJbWRlc2NfZnJlZShvcmlnX2hwKTsKKwllbHNlCisJCWxpc3RfYWRkKCZvcmlnX2hwLT5saXN0LCAmbWRlc2Nfem9tYmllX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1kZXNjX25vZGVfYWxsb2ModTY0IG5vZGUsIHN0cnVjdCBtZGVzY19lbGVtICplcCwgY29uc3QgY2hhciAqbmFtZXMpCi17Ci0JdW5zaWduZWQgaW50IG51bV9hcmNzID0gY291bnRfYXJjcyhlcCk7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwotCi0JbXAgPSBtZGVzY19lYXJseV9hbGxvYyhzaXplb2YoKm1wKSArCi0JCQkgICAgICAgKG51bV9hcmNzICogc2l6ZW9mKHN0cnVjdCBtZGVzY19hcmMpKSk7Ci0JbXAtPm5hbWUgPSBuYW1lcyArIGVwLT5uYW1lX29mZnNldDsKLQltcC0+bm9kZSA9IG5vZGU7Ci0JbXAtPnVuaXF1ZV9pZCA9IHVuaXF1ZV9pZCsrOwotCW1wLT5udW1fYXJjcyA9IG51bV9hcmNzOwotCi0JaGFzaF9ub2RlKG1wKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbWRlc2NfZWxlbSAqbm9kZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfZWxlbSAqbm9kZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKIHsKIAlyZXR1cm4gKHN0cnVjdCBtZGVzY19lbGVtICopIChtZGVzYyArIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKm5hbWVfYmxvY2soc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCitzdGF0aWMgdm9pZCAqbmFtZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKIHsKIAlyZXR1cm4gKCh2b2lkICopIG5vZGVfYmxvY2sobWRlc2MpKSArIG1kZXNjLT5ub2RlX3N6OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmRhdGFfYmxvY2soc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCitzdGF0aWMgdm9pZCAqZGF0YV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKIHsKIAlyZXR1cm4gKCh2b2lkICopIG5hbWVfYmxvY2sobWRlc2MpKSArIG1kZXNjLT5uYW1lX3N6OwogfQogCi0vKiBJbiBvcmRlciB0byBhdm9pZCByZWN1cnNpb24gKHRoZSBncmFwaCBjYW4gYmUgdmVyeSBkZWVwKSB3ZSB1c2UgYQotICogdHdvIHBhc3MgYWxnb3JpdGhtLiAgRmlyc3Qgd2UgYWxsb2NhdGUgYWxsIHRoZSBub2RlcyBhbmQgaGFzaCB0aGVtLgotICogVGhlbiB3ZSBpdGVyYXRlIG92ZXIgZWFjaCBub2RlLCBmaWxsaW5nIGluIHRoZSBhcmNzIGFuZCBwcm9wZXJ0aWVzLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgYnVpbGRfYWxsX25vZGVzKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQordTY0IG1kZXNjX25vZGVfYnlfbmFtZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwKKwkJICAgICAgIHU2NCBmcm9tX25vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKnN0YXJ0LCAqZXA7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwotCWNvbnN0IGNoYXIgKm5hbWVzOwotCXZvaWQgKmRhdGE7Ci0JdTY0IGxhc3Rfbm9kZTsKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAgPSBub2RlX2Jsb2NrKCZocC0+bWRlc2MpOworCWNvbnN0IGNoYXIgKm5hbWVzID0gbmFtZV9ibG9jaygmaHAtPm1kZXNjKTsKKwl1NjQgbGFzdF9ub2RlID0gaHAtPm1kZXNjLm5vZGVfc3ogLyAxNjsKKwl1NjQgcmV0OwogCi0Jc3RhcnQgPSBlcCA9IG5vZGVfYmxvY2sobWRlc2MpOwotCWxhc3Rfbm9kZSA9IG1kZXNjLT5ub2RlX3N6IC8gMTY7CisJaWYgKGZyb21fbm9kZSA9PSBNREVTQ19OT0RFX05VTEwpIHsKKwkJcmV0ID0gZnJvbV9ub2RlID0gMDsKKwl9IGVsc2UgaWYgKGZyb21fbm9kZSA+PSBsYXN0X25vZGUpIHsKKwkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKwl9IGVsc2UgeworCQlyZXQgPSBlcFtmcm9tX25vZGVdLmQudmFsOworCX0KIAotCW5hbWVzID0gbmFtZV9ibG9jayhtZGVzYyk7CisJd2hpbGUgKHJldCA8IGxhc3Rfbm9kZSkgeworCQlpZiAoZXBbcmV0XS50YWcgIT0gTURfTk9ERSkKKwkJCXJldHVybiBNREVTQ19OT0RFX05VTEw7CisJCWlmICghc3RyY21wKG5hbWVzICsgZXBbcmV0XS5uYW1lX29mZnNldCwgbmFtZSkpCisJCQlicmVhazsKKwkJcmV0ID0gZXBbcmV0XS5kLnZhbDsKKwl9CisJaWYgKHJldCA+PSBsYXN0X25vZGUpCisJCXJldCA9IE1ERVNDX05PREVfTlVMTDsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtZGVzY19ub2RlX2J5X25hbWUpOwogCi0Jd2hpbGUgKDEpIHsKLQkJdTY0IG5vZGUgPSBlcCAtIHN0YXJ0OworY29uc3Qgdm9pZCAqbWRlc2NfZ2V0X3Byb3BlcnR5KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgKmxlbnApCit7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OworCXZvaWQgKmRhdGEgPSBkYXRhX2Jsb2NrKCZocC0+bWRlc2MpOworCXN0cnVjdCBtZGVzY19lbGVtICplcDsKIAotCQlpZiAoZXAtPnRhZyA9PSBNRF9MSVNUX0VORCkKKwlpZiAobm9kZSA9PSBNREVTQ19OT0RFX05VTEwgfHwgbm9kZSA+PSBsYXN0X25vZGUpCisJCXJldHVybiBOVUxMOworCisJZXAgPSBub2RlX2Jsb2NrKCZocC0+bWRlc2MpICsgbm9kZTsKKwllcCsrOworCWZvciAoOyBlcC0+dGFnICE9IE1EX05PREVfRU5EOyBlcCsrKSB7CisJCXZvaWQgKnZhbCA9IE5VTEw7CisJCWludCBsZW4gPSAwOworCisJCXN3aXRjaCAoZXAtPnRhZykgeworCQljYXNlIE1EX1BST1BfVkFMOgorCQkJdmFsID0gJmVwLT5kLnZhbDsKKwkJCWxlbiA9IDg7CiAJCQlicmVhazsKIAotCQlpZiAoZXAtPnRhZyAhPSBNRF9OT0RFKSB7Ci0JCQlwcm9tX3ByaW50ZigiTURFU0M6IEluY29uc2lzdGVudCBlbGVtZW50IGxpc3QuXG4iKTsKLQkJCXByb21faGFsdCgpOwotCQl9CisJCWNhc2UgTURfUFJPUF9TVFI6CisJCWNhc2UgTURfUFJPUF9EQVRBOgorCQkJdmFsID0gZGF0YSArIGVwLT5kLmRhdGEuZGF0YV9vZmZzZXQ7CisJCQlsZW4gPSBlcC0+ZC5kYXRhLmRhdGFfbGVuOworCQkJYnJlYWs7CiAKLQkJbWRlc2Nfbm9kZV9hbGxvYyhub2RlLCBlcCwgbmFtZXMpOwotCi0JCWlmIChlcC0+ZC52YWwgPj0gbGFzdF9ub2RlKSB7Ci0JCQlwcmludGsoIk1ERVNDOiBXYXJuaW5nLCBlYXJseSBicmVhayBvdXQgb2Ygbm9kZSBzY2FuLlxuIik7Ci0JCQlwcmludGsoIk1ERVNDOiBOZXh0IG5vZGUgWyVsdV0gbGFzdF9ub2RlIFslbHVdLlxuIiwKLQkJCSAgICAgICBub2RlLCBsYXN0X25vZGUpOworCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KKwkJaWYgKCF2YWwpCisJCQljb250aW51ZTsKIAotCQllcCA9IHN0YXJ0ICsgZXAtPmQudmFsOwotCX0KLQotCWRhdGEgPSBkYXRhX2Jsb2NrKG1kZXNjKTsKLQlmb3IgKG1wID0gYWxsbm9kZXM7IG1wOyBtcCA9IG1wLT5hbGxub2Rlc19uZXh0KSB7Ci0JCXN0cnVjdCBtZGVzY19lbGVtICplcCA9IHN0YXJ0ICsgbXAtPm5vZGU7Ci0JCXN0cnVjdCBwcm9wZXJ0eSAqKmxpbmsgPSAmbXAtPnByb3BlcnRpZXM7Ci0JCXVuc2lnbmVkIGludCB0aGlzX2FyYyA9IDA7Ci0KLQkJZXArKzsKLQkJd2hpbGUgKGVwLT50YWcgIT0gTURfTk9ERV9FTkQpIHsKLQkJCXN3aXRjaCAoZXAtPnRhZykgewotCQkJY2FzZSBNRF9QUk9QX0FSQzogewotCQkJCXN0cnVjdCBtZGVzY19ub2RlICp0YXJnZXQ7Ci0KLQkJCQlpZiAodGhpc19hcmMgPj0gbXAtPm51bV9hcmNzKSB7Ci0JCQkJCXByb21fcHJpbnRmKCJNREVTQzogQVJDIG92ZXJydW4gWyV1OiV1XVxuIiwKLQkJCQkJCSAgICB0aGlzX2FyYywgbXAtPm51bV9hcmNzKTsKLQkJCQkJcHJvbV9oYWx0KCk7Ci0JCQkJfQotCQkJCXRhcmdldCA9IGZpbmRfbm9kZShlcC0+ZC52YWwpOwotCQkJCWlmICghdGFyZ2V0KSB7Ci0JCQkJCXByaW50aygiTURFU0M6IFdhcm5pbmcsIGFyYyBwb2ludHMgdG8gIgotCQkJCQkgICAgICAgIm1pc3Npbmcgbm9kZSwgaWdub3JpbmcuXG4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW1wLT5hcmNzW3RoaXNfYXJjXS5uYW1lID0KLQkJCQkJKG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0KTsKLQkJCQltcC0+YXJjc1t0aGlzX2FyY10uYXJjID0gdGFyZ2V0OwotCQkJCXRoaXNfYXJjKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UgTURfUFJPUF9WQUw6Ci0JCQljYXNlIE1EX1BST1BfU1RSOgotCQkJY2FzZSBNRF9QUk9QX0RBVEE6IHsKLQkJCQlzdHJ1Y3QgcHJvcGVydHkgKnAgPSBtZGVzY19lYXJseV9hbGxvYyhzaXplb2YoKnApKTsKLQotCQkJCXAtPnVuaXF1ZV9pZCA9IHVuaXF1ZV9pZCsrOwotCQkJCXAtPm5hbWUgPSAoY2hhciAqKSBuYW1lcyArIGVwLT5uYW1lX29mZnNldDsKLQkJCQlpZiAoZXAtPnRhZyA9PSBNRF9QUk9QX1ZBTCkgewotCQkJCQlwLT52YWx1ZSA9ICZlcC0+ZC52YWw7Ci0JCQkJCXAtPmxlbmd0aCA9IDg7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcC0+dmFsdWUgPSBkYXRhICsgZXAtPmQuZGF0YS5kYXRhX29mZnNldDsKLQkJCQkJcC0+bGVuZ3RoID0gZXAtPmQuZGF0YS5kYXRhX2xlbjsKLQkJCQl9Ci0JCQkJKmxpbmsgPSBwOwotCQkJCWxpbmsgPSAmcC0+bmV4dDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZSBNRF9OT09QOgotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXByaW50aygiTURFU0M6IFdhcm5pbmcsIGlnbm9yaW5nIHVua25vd24gdGFnIHR5cGUgJTAyeFxuIiwKLQkJCQkgICAgICAgZXAtPnRhZyk7Ci0JCQl9Ci0JCQllcCsrOworCQlpZiAoIXN0cmNtcChuYW1lcyArIGVwLT5uYW1lX29mZnNldCwgbmFtZSkpIHsKKwkJCWlmIChsZW5wKQorCQkJCSpsZW5wID0gbGVuOworCQkJcmV0dXJuIHZhbDsKIAkJfQogCX0KLX0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgY291bnRfbm9kZXMoc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG1kZXNjX2dldF9wcm9wZXJ0eSk7CisKK3U2NCBtZGVzY19uZXh0X2FyYyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IGZyb20sIGNvbnN0IGNoYXIgKmFyY190eXBlKQogewotCXN0cnVjdCBtZGVzY19lbGVtICplcCA9IG5vZGVfYmxvY2sobWRlc2MpOwotCXN0cnVjdCBtZGVzY19lbGVtICplbmQ7Ci0JdW5zaWduZWQgaW50IGNudCA9IDA7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwLCAqYmFzZSA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OwogCi0JZW5kID0gKCh2b2lkICopZXApICsgbWRlc2MtPm5vZGVfc3o7Ci0Jd2hpbGUgKGVwIDwgZW5kKSB7Ci0JCWlmIChlcC0+dGFnID09IE1EX05PREUpCi0JCQljbnQrKzsKLQkJZXArKzsKKwlpZiAoZnJvbSA9PSBNREVTQ19OT0RFX05VTEwgfHwgZnJvbSA+PSBsYXN0X25vZGUpCisJCXJldHVybiBNREVTQ19OT0RFX05VTEw7CisKKwllcCA9IGJhc2UgKyBmcm9tOworCisJZXArKzsKKwlmb3IgKDsgZXAtPnRhZyAhPSBNRF9OT0RFX0VORDsgZXArKykgeworCQlpZiAoZXAtPnRhZyAhPSBNRF9QUk9QX0FSQykKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJjbXAobmFtZXMgKyBlcC0+bmFtZV9vZmZzZXQsIGFyY190eXBlKSkKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiBlcCAtIGJhc2U7CiAJfQotCXJldHVybiBjbnQ7CisKKwlyZXR1cm4gTURFU0NfTk9ERV9OVUxMOwogfQorRVhQT1JUX1NZTUJPTChtZGVzY19uZXh0X2FyYyk7CisKK3U2NCBtZGVzY19hcmNfdGFyZ2V0KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgYXJjKQoreworCXN0cnVjdCBtZGVzY19lbGVtICplcCwgKmJhc2UgPSBub2RlX2Jsb2NrKCZocC0+bWRlc2MpOworCisJZXAgPSBiYXNlICsgYXJjOworCisJcmV0dXJuIGVwLT5kLnZhbDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2NfYXJjX3RhcmdldCk7CisKK2NvbnN0IGNoYXIgKm1kZXNjX25vZGVfbmFtZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG5vZGUpCit7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwLCAqYmFzZSA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OworCisJaWYgKG5vZGUgPT0gTURFU0NfTk9ERV9OVUxMIHx8IG5vZGUgPj0gbGFzdF9ub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWVwID0gYmFzZSArIG5vZGU7CisJaWYgKGVwLT50YWcgIT0gTURfTk9ERSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbmFtZXMgKyBlcC0+bmFtZV9vZmZzZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25vZGVfbmFtZSk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCByZXBvcnRfcGxhdGZvcm1fcHJvcGVydGllcyh2b2lkKQogewotCXN0cnVjdCBtZGVzY19ub2RlICpwbiA9IG1kX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJwbGF0Zm9ybSIpOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwID0gbWRlc2NfZ3JhYigpOworCXU2NCBwbiA9IG1kZXNjX25vZGVfYnlfbmFtZShocCwgTURFU0NfTk9ERV9OVUxMLCAicGxhdGZvcm0iKTsKIAljb25zdCBjaGFyICpzOwogCWNvbnN0IHU2NCAqdjsKIAotCWlmICghcG4pIHsKKwlpZiAocG4gPT0gTURFU0NfTk9ERV9OVUxMKSB7CiAJCXByb21fcHJpbnRmKCJObyBwbGF0Zm9ybSBub2RlIGluIG1hY2hpbmUtZGVzY3JpcHRpb24uXG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQogCi0JcyA9IG1kX2dldF9wcm9wZXJ0eShwbiwgImJhbm5lci1uYW1lIiwgTlVMTCk7CisJcyA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJiYW5uZXItbmFtZSIsIE5VTEwpOwogCXByaW50aygiUExBVEZPUk06IGJhbm5lci1uYW1lIFslc11cbiIsIHMpOwotCXMgPSBtZF9nZXRfcHJvcGVydHkocG4sICJuYW1lIiwgTlVMTCk7CisJcyA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJuYW1lIiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogbmFtZSBbJXNdXG4iLCBzKTsKIAotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJob3N0aWQiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgImhvc3RpZCIsIE5VTEwpOwogCWlmICh2KQogCQlwcmludGsoIlBMQVRGT1JNOiBob3N0aWQgWyUwOGx4XVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJzZXJpYWwjIiwgTlVMTCk7CisJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJzZXJpYWwjIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IHNlcmlhbCMgWyUwOGx4XVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJzdGljay1mcmVxdWVuY3kiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCXByaW50aygiUExBVEZPUk06IHN0aWNrLWZyZXF1ZW5jeSBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CisJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJtYWMtYWRkcmVzcyIsIE5VTEwpOwogCWlmICh2KQogCQlwcmludGsoIlBMQVRGT1JNOiBtYWMtYWRkcmVzcyBbJWx4XVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJ3YXRjaGRvZy1yZXNvbHV0aW9uIiwgTlVMTCk7CisJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJ3YXRjaGRvZy1yZXNvbHV0aW9uIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IHdhdGNoZG9nLXJlc29sdXRpb24gWyVsdSBtc11cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAid2F0Y2hkb2ctbWF4LXRpbWVvdXQiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLW1heC10aW1lb3V0IiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IHdhdGNoZG9nLW1heC10aW1lb3V0IFslbHUgbXNdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIm1heC1jcHVzIiwgTlVMTCk7CisJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJtYXgtY3B1cyIsIE5VTEwpOwogCWlmICh2KQogCQlwcmludGsoIlBMQVRGT1JNOiBtYXgtY3B1cyBbJWx1XVxuIiwgKnYpOworCisjaWZkZWYgQ09ORklHX1NNUAorCXsKKwkJaW50IG1heF9jcHUsIGk7CisKKwkJaWYgKHYpIHsKKwkJCW1heF9jcHUgPSAqdjsKKwkJCWlmIChtYXhfY3B1ID4gTlJfQ1BVUykKKwkJCQltYXhfY3B1ID0gTlJfQ1BVUzsKKwkJfSBlbHNlIHsKKwkJCW1heF9jcHUgPSBOUl9DUFVTOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1OyBpKyspCisJCQljcHVfc2V0KGksIGNwdV9wb3NzaWJsZV9tYXApOworCX0KKyNlbmRpZgorCisJbWRlc2NfcmVsZWFzZShocCk7CiB9CiAKIHN0YXRpYyBpbnQgaW5saW5lIGZpbmRfaW5fcHJvcGxpc3QoY29uc3QgY2hhciAqbGlzdCwgY29uc3QgY2hhciAqbWF0Y2gsIGludCBsZW4pCkBAIC0zNjksMTUgKzQ2MiwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZmlsbF9pbl9vbmVfY2FjaGUoY3B1aW5mb19zcGFyYyAqYywgc3RydWN0IG1kZXNjX25vZGUgKm1wKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGZpbGxfaW5fb25lX2NhY2hlKGNwdWluZm9fc3BhcmMgKmMsCisJCQkJCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkJCQl1NjQgbXApCiB7Ci0JY29uc3QgdTY0ICpsZXZlbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImxldmVsIiwgTlVMTCk7Ci0JY29uc3QgdTY0ICpzaXplID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAic2l6ZSIsIE5VTEwpOwotCWNvbnN0IHU2NCAqbGluZV9zaXplID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAibGluZS1zaXplIiwgTlVMTCk7CisJY29uc3QgdTY0ICpsZXZlbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJsZXZlbCIsIE5VTEwpOworCWNvbnN0IHU2NCAqc2l6ZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJzaXplIiwgTlVMTCk7CisJY29uc3QgdTY0ICpsaW5lX3NpemUgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAibGluZS1zaXplIiwgTlVMTCk7CiAJY29uc3QgY2hhciAqdHlwZTsKIAlpbnQgdHlwZV9sZW47CiAKLQl0eXBlID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAidHlwZSIsICZ0eXBlX2xlbik7CisJdHlwZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJ0eXBlIiwgJnR5cGVfbGVuKTsKIAogCXN3aXRjaCAoKmxldmVsKSB7CiAJY2FzZSAxOgpAQCAtNDAwLDQ4ICs0OTUsNDUgQEAKIAl9CiAKIAlpZiAoKmxldmVsID09IDEpIHsKLQkJdW5zaWduZWQgaW50IGk7CisJCXU2NCBhOwogCi0JCWZvciAoaSA9IDA7IGkgPCBtcC0+bnVtX2FyY3M7IGkrKykgewotCQkJc3RydWN0IG1kZXNjX25vZGUgKnQgPSBtcC0+YXJjc1tpXS5hcmM7CisJCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQkJdTY0IHRhcmdldCA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGEpOworCQkJY29uc3QgY2hhciAqbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgdGFyZ2V0KTsKIAotCQkJaWYgKHN0cmNtcChtcC0+YXJjc1tpXS5uYW1lLCAiZndkIikpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICghc3RyY21wKHQtPm5hbWUsICJjYWNoZSIpKQotCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIHQpOworCQkJaWYgKCFzdHJjbXAobmFtZSwgImNhY2hlIikpCisJCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgaHAsIHRhcmdldCk7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtYXJrX2NvcmVfaWRzKHN0cnVjdCBtZGVzY19ub2RlICptcCwgaW50IGNvcmVfaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbWFya19jb3JlX2lkcyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG1wLAorCQkJCSAgICBpbnQgY29yZV9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1NjQgYTsKIAotCWZvciAoaSA9IDA7IGkgPCBtcC0+bnVtX2FyY3M7IGkrKykgewotCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9CQUNLKSB7CisJCXU2NCB0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCWNvbnN0IGNoYXIgKm5hbWU7CiAJCWNvbnN0IHU2NCAqaWQ7CiAKLQkJaWYgKHN0cmNtcChtcC0+YXJjc1tpXS5uYW1lLCAiYmFjayIpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgImNwdSIpKSB7Ci0JCQlpZCA9IG1kX2dldF9wcm9wZXJ0eSh0LCAiaWQiLCBOVUxMKTsKKwkJbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgdCk7CisJCWlmICghc3RyY21wKG5hbWUsICJjcHUiKSkgeworCQkJaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHQsICJpZCIsIE5VTEwpOwogCQkJaWYgKCppZCA8IE5SX0NQVVMpCiAJCQkJY3B1X2RhdGEoKmlkKS5jb3JlX2lkID0gY29yZV9pZDsKIAkJfSBlbHNlIHsKLQkJCXVuc2lnbmVkIGludCBqOworCQkJdTY0IGo7CiAKLQkJCWZvciAoaiA9IDA7IGogPCB0LT5udW1fYXJjczsgaisrKSB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKm4gPSB0LT5hcmNzW2pdLmFyYzsKKwkJCW1kZXNjX2Zvcl9lYWNoX2FyYyhqLCBocCwgdCwgTURFU0NfQVJDX1RZUEVfQkFDSykgeworCQkJCXU2NCBuID0gbWRlc2NfYXJjX3RhcmdldChocCwgaik7CisJCQkJY29uc3QgY2hhciAqbl9uYW1lOwogCi0JCQkJaWYgKHN0cmNtcCh0LT5hcmNzW2pdLm5hbWUsICJiYWNrIikpCisJCQkJbl9uYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCBuKTsKKwkJCQlpZiAoc3RyY21wKG5fbmFtZSwgImNwdSIpKQogCQkJCQljb250aW51ZTsKIAotCQkJCWlmIChzdHJjbXAobi0+bmFtZSwgImNwdSIpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlkID0gbWRfZ2V0X3Byb3BlcnR5KG4sICJpZCIsIE5VTEwpOworCQkJCWlkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBuLCAiaWQiLCBOVUxMKTsKIAkJCQlpZiAoKmlkIDwgTlJfQ1BVUykKIAkJCQkJY3B1X2RhdGEoKmlkKS5jb3JlX2lkID0gY29yZV9pZDsKIAkJCX0KQEAgLTQ0OSw3OCArNTQxLDgxIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X2NvcmVfaWRzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2V0X2NvcmVfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQogewotCXN0cnVjdCBtZGVzY19ub2RlICptcDsKIAlpbnQgaWR4OworCXU2NCBtcDsKIAogCWlkeCA9IDE7Ci0JbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG1wLCAiY2FjaGUiKSB7Ci0JCWNvbnN0IHU2NCAqbGV2ZWwgPSBtZF9nZXRfcHJvcGVydHkobXAsICJsZXZlbCIsIE5VTEwpOworCW1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShocCwgbXAsICJjYWNoZSIpIHsKKwkJY29uc3QgdTY0ICpsZXZlbDsKIAkJY29uc3QgY2hhciAqdHlwZTsKIAkJaW50IGxlbjsKIAorCQlsZXZlbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJsZXZlbCIsIE5VTEwpOwogCQlpZiAoKmxldmVsICE9IDEpCiAJCQljb250aW51ZTsKIAotCQl0eXBlID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAidHlwZSIsICZsZW4pOworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmbGVuKTsKIAkJaWYgKCFmaW5kX2luX3Byb3BsaXN0KHR5cGUsICJpbnN0biIsIGxlbikpCiAJCQljb250aW51ZTsKIAotCQltYXJrX2NvcmVfaWRzKG1wLCBpZHgpOworCQltYXJrX2NvcmVfaWRzKGhwLCBtcCwgaWR4KTsKIAogCQlpZHgrKzsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtYXJrX3Byb2NfaWRzKHN0cnVjdCBtZGVzY19ub2RlICptcCwgaW50IHByb2NfaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbWFya19wcm9jX2lkcyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG1wLAorCQkJCSAgICBpbnQgcHJvY19pZCkKIHsKLQlpbnQgaTsKKwl1NjQgYTsKIAotCWZvciAoaSA9IDA7IGkgPCBtcC0+bnVtX2FyY3M7IGkrKykgewotCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9CQUNLKSB7CisJCXU2NCB0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCWNvbnN0IGNoYXIgKm5hbWU7CiAJCWNvbnN0IHU2NCAqaWQ7CiAKLQkJaWYgKHN0cmNtcChtcC0+YXJjc1tpXS5uYW1lLCAiYmFjayIpKQorCQluYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJaWYgKHN0cmNtcChuYW1lLCAiY3B1IikpCiAJCQljb250aW51ZTsKIAotCQlpZiAoc3RyY21wKHQtPm5hbWUsICJjcHUiKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlkID0gbWRfZ2V0X3Byb3BlcnR5KHQsICJpZCIsIE5VTEwpOworCQlpZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdCwgImlkIiwgTlVMTCk7CiAJCWlmICgqaWQgPCBOUl9DUFVTKQogCQkJY3B1X2RhdGEoKmlkKS5wcm9jX2lkID0gcHJvY19pZDsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBfX3NldF9wcm9jX2lkcyhjb25zdCBjaGFyICpleGVjX3VuaXRfbmFtZSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBfX3NldF9wcm9jX2lkcyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmV4ZWNfdW5pdF9uYW1lKQogewotCXN0cnVjdCBtZGVzY19ub2RlICptcDsKIAlpbnQgaWR4OworCXU2NCBtcDsKIAogCWlkeCA9IDA7Ci0JbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG1wLCBleGVjX3VuaXRfbmFtZSkgeworCW1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShocCwgbXAsIGV4ZWNfdW5pdF9uYW1lKSB7CiAJCWNvbnN0IGNoYXIgKnR5cGU7CiAJCWludCBsZW47CiAKLQkJdHlwZSA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInR5cGUiLCAmbGVuKTsKKwkJdHlwZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJ0eXBlIiwgJmxlbik7CiAJCWlmICghZmluZF9pbl9wcm9wbGlzdCh0eXBlLCAiaW50IiwgbGVuKSAmJgogCQkgICAgIWZpbmRfaW5fcHJvcGxpc3QodHlwZSwgImludGVnZXIiLCBsZW4pKQogCQkJY29udGludWU7CiAKLQkJbWFya19wcm9jX2lkcyhtcCwgaWR4KTsKKwkJbWFya19wcm9jX2lkcyhocCwgbXAsIGlkeCk7CiAKIAkJaWR4Kys7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X3Byb2NfaWRzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2V0X3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQogewotCV9fc2V0X3Byb2NfaWRzKCJleGVjX3VuaXQiKTsKLQlfX3NldF9wcm9jX2lkcygiZXhlYy11bml0Iik7CisJX19zZXRfcHJvY19pZHMoaHAsICJleGVjX3VuaXQiKTsKKwlfX3NldF9wcm9jX2lkcyhocCwgImV4ZWMtdW5pdCIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2V0X29uZV9tb25kb19iaXRzKGNvbnN0IHU2NCAqcCwgdW5zaWduZWQgaW50ICptYXNrLCB1bnNpZ25lZCBjaGFyIGRlZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfb25lX21vbmRvX2JpdHMoY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBpbnQgKm1hc2ssCisJCQkJCSB1bnNpZ25lZCBjaGFyIGRlZikKIHsKIAl1NjQgdmFsOwogCkBAIC01MzgsMzUgKzYzMywzNyBAQAogCSptYXNrID0gKCgxVSA8PCBkZWYpICogNjRVKSAtIDFVOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2V0X21vbmRvX2RhdGEoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfbW9uZG9fZGF0YShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG1wLAorCQkJCSAgICAgc3RydWN0IHRyYXBfcGVyX2NwdSAqdGIpCiB7CiAJY29uc3QgdTY0ICp2YWw7CiAKLQl2YWwgPSBtZF9nZXRfcHJvcGVydHkobXAsICJxLWNwdS1tb25kby0jYml0cyIsIE5VTEwpOworCXZhbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJxLWNwdS1tb25kby0jYml0cyIsIE5VTEwpOwogCWdldF9vbmVfbW9uZG9fYml0cyh2YWwsICZ0Yi0+Y3B1X21vbmRvX3FtYXNrLCA3KTsKIAotCXZhbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInEtZGV2LW1vbmRvLSNiaXRzIiwgTlVMTCk7CisJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInEtZGV2LW1vbmRvLSNiaXRzIiwgTlVMTCk7CiAJZ2V0X29uZV9tb25kb19iaXRzKHZhbCwgJnRiLT5kZXZfbW9uZG9fcW1hc2ssIDcpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPnJlc3VtX3FtYXNrLCA2KTsKIAotCXZhbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInEtbm9ucmVzdW1hYmxlLSNiaXRzIiwgTlVMTCk7CisJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInEtbm9ucmVzdW1hYmxlLSNiaXRzIiwgTlVMTCk7CiAJZ2V0X29uZV9tb25kb19iaXRzKHZhbCwgJnRiLT5ub25yZXN1bV9xbWFzaywgMik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtZGVzY19maWxsX2luX2NwdV9kYXRhKHZvaWQpCit2b2lkIF9fZGV2aW5pdCBtZGVzY19maWxsX2luX2NwdV9kYXRhKGNwdW1hc2tfdCBtYXNrKQogewotCXN0cnVjdCBtZGVzY19ub2RlICptcDsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCA9IG1kZXNjX2dyYWIoKTsKKwl1NjQgbXA7CiAKIAluY3B1c19wcm9iZWQgPSAwOwotCW1kX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShtcCwgImNwdSIpIHsKLQkJY29uc3QgdTY0ICppZCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImlkIiwgTlVMTCk7Ci0JCWNvbnN0IHU2NCAqY2ZyZXEgPSBtZF9nZXRfcHJvcGVydHkobXAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwltZGVzY19mb3JfZWFjaF9ub2RlX2J5X25hbWUoaHAsIG1wLCAiY3B1IikgeworCQljb25zdCB1NjQgKmlkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImlkIiwgTlVMTCk7CisJCWNvbnN0IHU2NCAqY2ZyZXEgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJCXN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiOwogCQljcHVpbmZvX3NwYXJjICpjOwotCQl1bnNpZ25lZCBpbnQgaTsKIAkJaW50IGNwdWlkOworCQl1NjQgYTsKIAogCQluY3B1c19wcm9iZWQrKzsKIApAQCAtNTc1LDYgKzY3Miw4IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCQlpZiAoY3B1aWQgPj0gTlJfQ1BVUykKIAkJCWNvbnRpbnVlOworCQlpZiAoIWNwdV9pc3NldChjcHVpZCwgbWFzaykpCisJCQljb250aW51ZTsKICNlbHNlCiAJCS8qIE9uIHVuaXByb2Nlc3NvciB3ZSBvbmx5IHdhbnQgdGhlIHZhbHVlcyBmb3IgdGhlCiAJCSAqIHJlYWwgcGh5c2ljYWwgY3B1IHRoZSBrZXJuZWwgYm9vdGVkIG9udG8sIGhvd2V2ZXIKQEAgLTU4OSwzNSArNjg4LDMwIEBACiAJCWMtPmNsb2NrX3RpY2sgPSAqY2ZyZXE7CiAKIAkJdGIgPSAmdHJhcF9ibG9ja1tjcHVpZF07Ci0JCWdldF9tb25kb19kYXRhKG1wLCB0Yik7CisJCWdldF9tb25kb19kYXRhKGhwLCBtcCwgdGIpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBtcC0+bnVtX2FyY3M7IGkrKykgewotCQkJc3RydWN0IG1kZXNjX25vZGUgKnQgPSBtcC0+YXJjc1tpXS5hcmM7Ci0JCQl1bnNpZ25lZCBpbnQgajsKKwkJbWRlc2NfZm9yX2VhY2hfYXJjKGEsIGhwLCBtcCwgTURFU0NfQVJDX1RZUEVfRldEKSB7CisJCQl1NjQgaiwgdCA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGEpOworCQkJY29uc3QgY2hhciAqdF9uYW1lOwogCi0JCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJmd2QiKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgImNhY2hlIikpIHsKLQkJCQlmaWxsX2luX29uZV9jYWNoZShjLCB0KTsKKwkJCXRfbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgdCk7CisJCQlpZiAoIXN0cmNtcCh0X25hbWUsICJjYWNoZSIpKSB7CisJCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgaHAsIHQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlmb3IgKGogPSAwOyBqIDwgdC0+bnVtX2FyY3M7IGorKykgewotCQkJCXN0cnVjdCBtZGVzY19ub2RlICpuOworCQkJbWRlc2NfZm9yX2VhY2hfYXJjKGosIGhwLCB0LCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJCQl1NjQgbiA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGopOworCQkJCWNvbnN0IGNoYXIgKm5fbmFtZTsKIAotCQkJCW4gPSB0LT5hcmNzW2pdLmFyYzsKLQkJCQlpZiAoc3RyY21wKHQtPmFyY3Nbal0ubmFtZSwgImZ3ZCIpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmICghc3RyY21wKG4tPm5hbWUsICJjYWNoZSIpKQotCQkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBuKTsKKwkJCQluX25hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIG4pOworCQkJCWlmICghc3RyY21wKG5fbmFtZSwgImNhY2hlIikpCisJCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIGhwLCBuKTsKIAkJCX0KIAkJfQogCiAjaWZkZWYgQ09ORklHX1NNUAogCQljcHVfc2V0KGNwdWlkLCBjcHVfcHJlc2VudF9tYXApOwotCQljcHVfc2V0KGNwdWlkLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CiAjZW5kaWYKIAogCQljLT5jb3JlX2lkID0gMDsKQEAgLTYyOCw0NSArNzIyLDQzIEBACiAJc3BhcmM2NF9tdWx0aV9jb3JlID0gMTsKICNlbmRpZgogCi0Jc2V0X2NvcmVfaWRzKCk7Ci0Jc2V0X3Byb2NfaWRzKCk7CisJc2V0X2NvcmVfaWRzKGhwKTsKKwlzZXRfcHJvY19pZHMoaHApOwogCiAJc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcygpOworCisJbWRlc2NfcmVsZWFzZShocCk7CiB9CiAKIHZvaWQgX19pbml0IHN1bjR2X21kZXNjX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKIAl1bnNpZ25lZCBsb25nIGxlbiwgcmVhbF9sZW4sIHN0YXR1czsKKwljcHVtYXNrX3QgbWFzazsKIAogCSh2b2lkKSBzdW40dl9tYWNoX2Rlc2MoMFVMLCAwVUwsICZsZW4pOwogCiAJcHJpbnRrKCJNREVTQzogU2l6ZSBpcyAlbHUgYnl0ZXMuXG4iLCBsZW4pOwogCi0JbWFpbl9tZGVzYyA9IG1kZXNjX2Vhcmx5X2FsbG9jKGxlbik7CisJaHAgPSBtZGVzY19hbGxvYyhsZW4sICZib290bWVtX21kZXNjX21lbW9wcyk7CisJaWYgKGhwID09IE5VTEwpIHsKKwkJcHJvbV9wcmludGYoIk1ERVNDOiBhbGxvYyBvZiAlbHUgYnl0ZXMgZmFpbGVkLlxuIiwgbGVuKTsKKwkJcHJvbV9oYWx0KCk7CisJfQogCi0Jc3RhdHVzID0gc3VuNHZfbWFjaF9kZXNjKF9fcGEobWFpbl9tZGVzYyksIGxlbiwgJnJlYWxfbGVuKTsKKwlzdGF0dXMgPSBzdW40dl9tYWNoX2Rlc2MoX19wYSgmaHAtPm1kZXNjKSwgbGVuLCAmcmVhbF9sZW4pOwogCWlmIChzdGF0dXMgIT0gSFZfRU9LIHx8IHJlYWxfbGVuID4gbGVuKSB7CiAJCXByb21fcHJpbnRmKCJzdW40dl9tYWNoX2Rlc2MgZmFpbHMsIGVyciglbHUpLCAiCiAJCQkgICAgImxlbiglbHUpLCByZWFsX2xlbiglbHUpXG4iLAogCQkJICAgIHN0YXR1cywgbGVuLCByZWFsX2xlbik7CisJCW1kZXNjX2ZyZWUoaHApOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlsZW4gPSBjb3VudF9ub2RlcyhtYWluX21kZXNjKTsKLQlwcmludGsoIk1ERVNDOiAlbHUgbm9kZXMuXG4iLCBsZW4pOwotCi0JbGVuID0gcm91bmR1cF9wb3dfb2ZfdHdvKGxlbik7Ci0KLQltZGVzY19oYXNoID0gbWRlc2NfZWFybHlfYWxsb2MobGVuICogc2l6ZW9mKHN0cnVjdCBtZGVzY19ub2RlICopKTsKLQltZGVzY19oYXNoX3NpemUgPSBsZW47Ci0KLQlwcmludGsoIk1ERVNDOiBIYXNoIHNpemUgJWx1IGVudHJpZXMuXG4iLCBsZW4pOwotCi0JYnVpbGRfYWxsX25vZGVzKG1haW5fbWRlc2MpOwotCi0JcHJpbnRrKCJNREVTQzogQnVpbHQgZ3JhcGggd2l0aCAldSBieXRlcyBvZiBtZW1vcnkuXG4iLAotCSAgICAgICBtZGVzY19lYXJseV9hbGxvY2F0ZWQpOworCWN1cl9tZGVzYyA9IGhwOwogCiAJcmVwb3J0X3BsYXRmb3JtX3Byb3BlcnRpZXMoKTsKLQltZGVzY19maWxsX2luX2NwdV9kYXRhKCk7CisKKwljcHVzX3NldGFsbChtYXNrKTsKKwltZGVzY19maWxsX2luX2NwdV9kYXRhKG1hc2spOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCmluZGV4IDVkNmFkZWEuLjhkZDQyOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IHBvd2VyLmMsdiAxLjEwIDIwMDEvMTIvMTEgMDE6NTc6MTYgZGF2ZW0gRXhwICQKLSAqIHBvd2VyLmM6IFBvd2VyIG1hbmFnZW1lbnQgZHJpdmVyLgorLyogcG93ZXIuYzogUG93ZXIgbWFuYWdlbWVudCBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTksNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wb3dlci5oPgogI2luY2x1ZGUgPGFzbS9zc3RhdGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgpAQCAtMjksMjQgKzI5LDI2IEBACiAgKi8KIGludCBzY29uc19wd3JvZmYgPSAxOyAKIAotI2lmZGVmIENPTkZJR19QQ0kKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIHN0YXRpYyB2b2lkIF9faW9tZW0gKnBvd2VyX3JlZzsKIAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHBvd2VyZF93YWl0KTsKIHN0YXRpYyBpbnQgYnV0dG9uX3ByZXNzZWQ7CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBwb3dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3ZvaWQgd2FrZV91cF9wb3dlcmQodm9pZCkKIHsKIAlpZiAoYnV0dG9uX3ByZXNzZWQgPT0gMCkgewogCQlidXR0b25fcHJlc3NlZCA9IDE7CiAJCXdha2VfdXAoJnBvd2VyZF93YWl0KTsKIAl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwb3dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl3YWtlX3VwX3Bvd2VyZCgpOwogCiAJLyogRklYTUU6IENoZWNrIHJlZ2lzdGVycyBmb3Igc3RhdHVzLi4uICovCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogZXh0ZXJuIHZvaWQgbWFjaGluZV9oYWx0KHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFjaGluZV9hbHRfcG93ZXJfb2ZmKHZvaWQpOwpAQCAtNTYsMTkgKzU4LDE4IEBACiB7CiAJc3N0YXRlX3Bvd2Vyb2ZmKCk7CiAJaWYgKCFzZXJpYWxfY29uc29sZSB8fCBzY29uc19wd3JvZmYpIHsKLSNpZmRlZiBDT05GSUdfUENJCiAJCWlmIChwb3dlcl9yZWcpIHsKIAkJCS8qIEJvdGggcmVnaXN0ZXIgYml0cyBzZWVtIHRvIGhhdmUgdGhlCiAJCQkgKiBzYW1lIGVmZmVjdCwgc28gdW50aWwgSSBmaWd1cmUgb3V0CiAJCQkgKiB3aGF0IHRoZSBkaWZmZXJlbmNlIGlzLi4uCiAJCQkgKi8KIAkJCXdyaXRlbChBVVhJT19QQ0lPX0NQV1JfT0ZGIHwgQVVYSU9fUENJT19TUFdSX09GRiwgcG93ZXJfcmVnKTsKLQkJfSBlbHNlCi0jZW5kaWYgLyogQ09ORklHX1BDSSAqLworCQl9IGVsc2UgewogCQkJaWYgKHBvd2Vyb2ZmX21ldGhvZCAhPSBOVUxMKSB7CiAJCQkJcG93ZXJvZmZfbWV0aG9kKCk7CiAJCQkJLyogbm90IHJlYWNoZWQgKi8KIAkJCX0KKwkJfQogCX0KIAltYWNoaW5lX2hhbHQoKTsKIH0KQEAgLTc2LDcgKzc3LDYgQEAKIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpID0gbWFjaGluZV9wb3dlcl9vZmY7CiBFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CiAKLSNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW50IHBvd2VyZCh2b2lkICpfX3VudXNlZCkKIHsKIAlzdGF0aWMgY2hhciAqZW52cFtdID0geyAiSE9NRT0vIiwgIlRFUk09bGludXgiLCAiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIsIE5VTEwgfTsKQEAgLTg2LDcgKzg2LDcgQEAKIAlkYWVtb25pemUoInBvd2VyZCIpOwogCiAJYWRkX3dhaXRfcXVldWUoJnBvd2VyZF93YWl0LCAmd2FpdCk7Ci1hZ2FpbjoKKwogCWZvciAoOzspIHsKIAkJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKGJ1dHRvbl9wcmVzc2VkKQpAQCAtMTAwLDE2ICsxMDAsMjggQEAKIAkvKiBPaywgZG93biB3ZSBnby4uLiAqLwogCWJ1dHRvbl9wcmVzc2VkID0gMDsKIAlpZiAoa2VybmVsX2V4ZWN2ZSgiL3NiaW4vc2h1dGRvd24iLCBhcmd2LCBlbnZwKSA8IDApIHsKLQkJcHJpbnRrKCJwb3dlcmQ6IHNodXRkb3duIGV4ZWN1dGlvbiBmYWlsZWRcbiIpOwotCQlhZGRfd2FpdF9xdWV1ZSgmcG93ZXJkX3dhaXQsICZ3YWl0KTsKLQkJZ290byBhZ2FpbjsKKwkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcmQ6IHNodXRkb3duIGV4ZWN1dGlvbiBmYWlsZWRcbiIpOworCQltYWNoaW5lX3Bvd2VyX29mZigpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAoraW50IHN0YXJ0X3Bvd2VyZCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBrZXJuZWxfdGhyZWFkKHBvd2VyZCwgTlVMTCwgQ0xPTkVfRlMpOworCWlmIChlcnIgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgInBvd2VyOiBGYWlsZWQgdG8gc3RhcnQgcG93ZXIgZGFlbW9uLlxuIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJwb3dlcjogcG93ZXJkIHJ1bm5pbmcuXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGhhc19idXR0b25faW50ZXJydXB0KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0JaWYgKGlycSA9PSBQQ0lfSVJRX05PTkUpCisJaWYgKGlycSA9PSAweGZmZmZmZmZmKQogCQlyZXR1cm4gMDsKIAlpZiAoIW9mX2ZpbmRfcHJvcGVydHkoZHAsICJidXR0b24iLCBOVUxMKSkKIAkJcmV0dXJuIDA7CkBAIC0xMzAsMTcgKzE0MiwxNCBAQAogCXBvd2Vyb2ZmX21ldGhvZCA9IG1hY2hpbmVfaGFsdDsgIC8qIGFibGUgdG8gdXNlIHRoZSBzdGFuZGFyZCBoYWx0ICovCiAKIAlpZiAoaGFzX2J1dHRvbl9pbnRlcnJ1cHQoaXJxLCBvcC0+bm9kZSkpIHsKLQkJaWYgKGtlcm5lbF90aHJlYWQocG93ZXJkLCBOVUxMLCBDTE9ORV9GUykgPCAwKSB7Ci0JCQlwcmludGsoIkZhaWxlZCB0byBzdGFydCBwb3dlciBkYWVtb24uXG4iKTsKKwkJaWYgKHN0YXJ0X3Bvd2VyZCgpIDwgMCkKIAkJCXJldHVybiAwOwotCQl9Ci0JCXByaW50aygicG93ZXJkIHJ1bm5pbmcuXG4iKTsKIAogCQlpZiAocmVxdWVzdF9pcnEoaXJxLAogCQkJCXBvd2VyX2hhbmRsZXIsIDAsICJwb3dlciIsIE5VTEwpIDwgMCkKLQkJCXByaW50aygicG93ZXI6IEVycm9yLCBjYW5ub3QgcmVnaXN0ZXIgSVJRIGhhbmRsZXIuXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAicG93ZXI6IENhbm5vdCBzZXR1cCBJUlEgaGFuZGxlci5cbiIpOwogCX0gZWxzZSB7Ci0JCXByaW50aygibm90IHVzaW5nIHBvd2VyZC5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJwb3dlcjogTm90IHVzaW5nIHBvd2VyZC5cbiIpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTY0LDQgKzE3MywzIEBACiAJb2ZfcmVnaXN0ZXJfZHJpdmVyKCZwb3dlcl9kcml2ZXIsICZvZl9idXNfdHlwZSk7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZjVmOTdlMi4uOTM1NTc1MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ5LDcgKzUwLDcgQEAKIAogLyogI2RlZmluZSBWRVJCT1NFX1NIT1dSRUdTICovCiAKLXN0YXRpYyB2b2lkIHNwYXJjNjRfeWllbGQodm9pZCkKK3N0YXRpYyB2b2lkIHNwYXJjNjRfeWllbGQoaW50IGNwdSkKIHsKIAlpZiAodGxiX3R5cGUgIT0gaHlwZXJ2aXNvcikKIAkJcmV0dXJuOwpAQCAtNTcsNyArNTgsNyBAQAogCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAotCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcHN0YXRlOwogCiAJCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KQEAgLTY4LDcgKzY5LDcgQEAKIAkJCTogIj0mciIgKHBzdGF0ZSkKIAkJCTogImkiIChQU1RBVEVfSUUpKTsKIAotCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQlpZiAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKQogCQkJc3VuNHZfY3B1X3lpZWxkKCk7CiAKIAkJLyogUmUtZW5hYmxlIGludGVycnVwdHMuICovCkBAIC04NiwxNSArODcsMjUgQEAKIC8qIFRoZSBpZGxlIGxvb3Agb24gc3BhcmM2NC4gKi8KIHZvaWQgY3B1X2lkbGUodm9pZCkKIHsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCiAJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAKIAl3aGlsZSgxKSB7CiAJCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soKTsKLQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJCXNwYXJjNjRfeWllbGQoKTsKKworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKQorCQkJc3BhcmM2NF95aWVsZChjcHUpOworCiAJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCisJCQljcHVfcGxheV9kZWFkKCk7CisjZW5kaWYKKwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jCmluZGV4IDYxMDM2YjMuLjVkMjIwMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jCkBAIC0xODA4LDcgKzE4MDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCQljcHVfc2V0KGNwdWlkLCBjcHVfcHJlc2VudF9tYXApOwotCQljcHVfc2V0KGNwdWlkLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJCWNwdV9zZXQoY3B1aWQsIGNwdV9wb3NzaWJsZV9tYXApOwogI2VuZGlmCiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKaW5kZXggNzQ5MGNjNi4uYWFmZGUzZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwpAQCAtNDQyLDcgKzQ0Miw2IEBACiAJCSAgICJEJCBwYXJpdHkgdGwxXHQ6ICV1XG4iCiAJCSAgICJJJCBwYXJpdHkgdGwxXHQ6ICV1XG4iCiAjaWZuZGVmIENPTkZJR19TTVAKLQkJICAgIkNwdTBCb2dvXHQ6ICVsdS4lMDJsdVxuIgogCQkgICAiQ3B1MENsa1Rja1x0OiAlMDE2bHhcbiIKICNlbmRpZgogCQkgICAsCkBAIC00NTcsOSArNDU2LDcgQEAKIAkJICAgZGNhY2hlX3Bhcml0eV90bDFfb2NjdXJyZWQsCiAJCSAgIGljYWNoZV9wYXJpdHlfdGwxX29jY3VycmVkCiAjaWZuZGVmIENPTkZJR19TTVAKLQkJICAgLCBjcHVfZGF0YSgwKS51ZGVsYXlfdmFsLyg1MDAwMDAvSFopLAotCQkgICAoY3B1X2RhdGEoMCkudWRlbGF5X3ZhbC8oNTAwMC9IWikpICUgMTAwLAotCQkgICBjcHVfZGF0YSgwKS5jbG9ja190aWNrCisJCSAgICwgY3B1X2RhdGEoMCkuY2xvY2tfdGljawogI2VuZGlmCiAJCSk7CiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKaW5kZXggNDBlNDBmOS4uYjQ0OGQzMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCkBAIC0xLDYgKzEsNiBAQAogLyogc21wLmM6IFNwYXJjNjQgU01QIHN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CisjaW5jbHVkZSA8YXNtL2h2dHJhbXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KQEAgLTQxLDIyICs0MywyNiBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAKIGV4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKTsKIAogaW50IHNwYXJjNjRfbXVsdGlfY29yZSBfX3JlYWRfbW9zdGx5OwogCi0vKiBQbGVhc2UgZG9uJ3QgbWFrZSB0aGlzIHN0dWZmIGluaXRkYXRhISEhICAtLURhdmVNICovCi11bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOwotCitjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKLWNwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKIGNwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9CiAJeyBbMCAuLi4gTlJfQ1BVUy0xXSA9IENQVV9NQVNLX05PTkUgfTsKIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9CiAJeyBbMCAuLi4gTlJfQ1BVUy0xXSA9IENQVV9NQVNLX05PTkUgfTsKKworRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKK0VYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfc2libGluZ19tYXApOworRVhQT1JUX1NZTUJPTChjcHVfY29yZV9tYXApOworCiBzdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzazsKLXN0YXRpYyBjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwOwogCiB2b2lkIHNtcF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKQEAgLTczLDE4ICs3OSwxNyBAQAogCQogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKIAkJc2VxX3ByaW50ZihtLAotCQkJICAgIkNwdSVkQm9nb1x0OiAlbHUuJTAybHVcbiIKIAkJCSAgICJDcHUlZENsa1Rja1x0OiAlMDE2bHhcbiIsCi0JCQkgICBpLCBjcHVfZGF0YShpKS51ZGVsYXlfdmFsIC8gKDUwMDAwMC9IWiksCi0JCQkgICAoY3B1X2RhdGEoaSkudWRlbGF5X3ZhbCAvICg1MDAwL0haKSkgJSAxMDAsCiAJCQkgICBpLCBjcHVfZGF0YShpKS5jbG9ja190aWNrKTsKIH0KIAorc3RhdGljIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TUElOTE9DSyhjYWxsX2xvY2spOworCiBleHRlcm4gdm9pZCBzZXR1cF9zcGFyYzY0X3RpbWVyKHZvaWQpOwogCiBzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjYWxsaW5fZmxhZyA9IDA7CiAKLXZvaWQgX19pbml0IHNtcF9jYWxsaW4odm9pZCkKK3ZvaWQgX19kZXZpbml0IHNtcF9jYWxsaW4odm9pZCkKIHsKIAlpbnQgY3B1aWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtMTAyLDggKzEwNyw2IEBACiAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQljYWxpYnJhdGVfZGVsYXkoKTsKLQljcHVfZGF0YShjcHVpZCkudWRlbGF5X3ZhbCA9IGxvb3BzX3Blcl9qaWZmeTsKIAljYWxsaW5fZmxhZyA9IDE7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1lbWJhciAjU3luY1xuXHQiCiAJCQkgICAgICJmbHVzaCAgJSVnNiIgOiA6IDogIm1lbW9yeSIpOwpAQCAtMTIwLDcgKzEyMyw5IEBACiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1aWQsIHNtcF9jb21tZW5jZWRfbWFzaykpCiAJCXJtYigpOwogCisJc3Bpbl9sb2NrKCZjYWxsX2xvY2spOwogCWNwdV9zZXQoY3B1aWQsIGNwdV9vbmxpbmVfbWFwKTsKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKIAogCS8qIGlkbGUgdGhyZWFkIGlzIGV4cGVjdGVkIHRvIGhhdmUgcHJlZW1wdCBkaXNhYmxlZCAqLwogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtMjY4LDYgKzI3Myw2NyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml0Y19zeW5jX2xvY2ssIGZsYWdzKTsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1NVTl9MRE9NUykgJiYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisvKiBYWFggUHV0IHRoaXMgaW4gc29tZSBjb21tb24gcGxhY2UuIFhYWCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcga2ltYWdlX2FkZHJfdG9fcmEodm9pZCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKSBwOworCisJcmV0dXJuIGtlcm5fYmFzZSArICh2YWwgLSBLRVJOQkFTRSk7Cit9CisKK3N0YXRpYyB2b2lkIGxkb21fc3RhcnRjcHVfY3B1aWQodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyB0aHJlYWRfcmVnKQoreworCWV4dGVybiB1bnNpZ25lZCBsb25nIHNwYXJjNjRfdHRhYmxlX3RsMDsKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBrZXJuX2xvY2tlZF90dGVfZGF0YTsKKwlleHRlcm4gaW50IGJpZ2tlcm5lbDsKKwlzdHJ1Y3QgaHZ0cmFtcF9kZXNjciAqaGRlc2M7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX3JhOworCXN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiOworCXU2NCB0dGVfdmFkZHIsIHR0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCisJaGRlc2MgPSBremFsbG9jKHNpemVvZigqaGRlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhkZXNjKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGRvbV9zdGFydGNwdV9jcHVpZDogQ2Fubm90IGFsbG9jYXRlICIKKwkJICAgICAgICJodnRyYW1wX2Rlc2NyLlxuIik7CisJCXJldHVybjsKKwl9CisKKwloZGVzYy0+Y3B1ID0gY3B1OworCWhkZXNjLT5udW1fbWFwcGluZ3MgPSAoYmlna2VybmVsID8gMiA6IDEpOworCisJdGIgPSAmdHJhcF9ibG9ja1tjcHVdOworCXRiLT5oZGVzYyA9IGhkZXNjOworCisJaGRlc2MtPmZhdWx0X2luZm9fdmEgPSAodW5zaWduZWQgbG9uZykgJnRiLT5mYXVsdF9pbmZvOworCWhkZXNjLT5mYXVsdF9pbmZvX3BhID0ga2ltYWdlX2FkZHJfdG9fcmEoJnRiLT5mYXVsdF9pbmZvKTsKKworCWhkZXNjLT50aHJlYWRfcmVnID0gdGhyZWFkX3JlZzsKKworCXR0ZV92YWRkciA9ICh1bnNpZ25lZCBsb25nKSBLRVJOQkFTRTsKKwl0dGVfZGF0YSA9IGtlcm5fbG9ja2VkX3R0ZV9kYXRhOworCisJaGRlc2MtPm1hcHNbMF0udmFkZHIgPSB0dGVfdmFkZHI7CisJaGRlc2MtPm1hcHNbMF0udHRlICAgPSB0dGVfZGF0YTsKKwlpZiAoYmlna2VybmVsKSB7CisJCXR0ZV92YWRkciArPSAweDQwMDAwMDsKKwkJdHRlX2RhdGEgICs9IDB4NDAwMDAwOworCQloZGVzYy0+bWFwc1sxXS52YWRkciA9IHR0ZV92YWRkcjsKKwkJaGRlc2MtPm1hcHNbMV0udHRlICAgPSB0dGVfZGF0YTsKKwl9CisKKwl0cmFtcG9saW5lX3JhID0ga2ltYWdlX2FkZHJfdG9fcmEoaHZfY3B1X3N0YXJ0dXApOworCisJaHZfZXJyID0gc3VuNHZfY3B1X3N0YXJ0KGNwdSwgdHJhbXBvbGluZV9yYSwKKwkJCQkga2ltYWdlX2FkZHJfdG9fcmEoJnNwYXJjNjRfdHRhYmxlX3RsMCksCisJCQkJIF9fcGEoaGRlc2MpKTsKKwlpZiAoaHZfZXJyKQorCQlwcmludGsoS0VSTl9FUlIgImxkb21fc3RhcnRjcHVfY3B1aWQ6IHN1bjR2X2NwdV9zdGFydCgpICIKKwkJICAgICAgICJnaXZlcyBlcnJvciAlbHVcbiIsIGh2X2Vycik7Cit9CisjZW5kaWYKKwogZXh0ZXJuIHZvaWQgc3VuNHZfaW5pdF9tb25kb19xdWV1ZXMoaW50IHVzZV9ib290bWVtLCBpbnQgY3B1LCBpbnQgYWxsb2MsIGludCBsb2FkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF9jcHVfc3RhcnR1cDsKQEAgLTI4MCw2ICszNDYsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbXBfYm9vdF9vbmVfY3B1KHVuc2lnbmVkIGludCBjcHUpCiB7CisJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGIgPSAmdHJhcF9ibG9ja1tjcHVdOwogCXVuc2lnbmVkIGxvbmcgZW50cnkgPQogCQkodW5zaWduZWQgbG9uZykoJnNwYXJjNjRfY3B1X3N0YXJ0dXApOwogCXVuc2lnbmVkIGxvbmcgY29va2llID0KQEAgLTI5MCwyMCArMzU3LDI1IEBACiAJcCA9IGZvcmtfaWRsZShjcHUpOwogCWNhbGxpbl9mbGFnID0gMDsKIAljcHVfbmV3X3RocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8ocCk7Ci0JY3B1X3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCk7CiAKIAlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgewogCQkvKiBBbGxvYyB0aGUgbW9uZG8gcXVldWVzLCBjcHUgd2lsbCBsb2FkIHRoZW0uICAqLwogCQlzdW40dl9pbml0X21vbmRvX3F1ZXVlcygwLCBjcHUsIDEsIDApOwogCi0JCXByb21fc3RhcnRjcHVfY3B1aWQoY3B1LCBlbnRyeSwgY29va2llKTsKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5fTERPTVMpICYmIGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKQorCQlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJCWxkb21fc3RhcnRjcHVfY3B1aWQoY3B1LAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNwdV9uZXdfdGhyZWFkKTsKKwkJZWxzZQorI2VuZGlmCisJCQlwcm9tX3N0YXJ0Y3B1X2NwdWlkKGNwdSwgZW50cnksIGNvb2tpZSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9mX2ZpbmRfbm9kZV9ieV9jcHVpZChjcHUpOwogCiAJCXByb21fc3RhcnRjcHUoZHAtPm5vZGUsIGVudHJ5LCBjb29raWUpOwogCX0KIAotCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDAwOyB0aW1lb3V0KyspIHsKKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgNTAwMDA7IHRpbWVvdXQrKykgewogCQlpZiAoY2FsbGluX2ZsYWcpCiAJCQlicmVhazsKIAkJdWRlbGF5KDEwMCk7CkBAIC0zMTMsMTEgKzM4NSwxNSBAQAogCQlyZXQgPSAwOwogCX0gZWxzZSB7CiAJCXByaW50aygiUHJvY2Vzc29yICVkIGlzIHN0dWNrLlxuIiwgY3B1KTsKLQkJY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAl9CiAJY3B1X25ld190aHJlYWQgPSBOVUxMOwogCisJaWYgKHRiLT5oZGVzYykgeworCQlrZnJlZSh0Yi0+aGRlc2MpOworCQl0Yi0+aGRlc2MgPSBOVUxMOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTcyMCw3ICs3OTYsNiBAQAogCWludCB3YWl0OwogfTsKIAotc3RhdGljIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TUElOTE9DSyhjYWxsX2xvY2spOwogc3RhdGljIHN0cnVjdCBjYWxsX2RhdGFfc3RydWN0ICpjYWxsX2RhdGE7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHhjYWxsX2NhbGxfZnVuY3Rpb247CkBAIC0xMTUyLDM0ICsxMjI3LDE0IEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAotdm9pZCBfX2luaXQgc21wX3RpY2tfaW5pdCh2b2lkKQotewotCWJvb3RfY3B1X2lkID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7Ci19Ci0KIC8qIC9wcm9jL3Byb2ZpbGUgd3JpdGVzIGNhbiBjYWxsIHRoaXMsIGRvbid0IF9faW5pdCBpdCBwbGVhc2UuICovCiBpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQogewogCXJldHVybiAtRUlOVkFMOwogfQogCi0vKiBDb25zdHJhaW4gdGhlIG51bWJlciBvZiBjcHVzIHRvIG1heF9jcHVzLiAgKi8KIHZvaWQgX19pbml0IHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQogewotCWludCBpOwotCi0JaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiBtYXhfY3B1cykgewotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQkJaWYgKGkgIT0gYm9vdF9jcHVfaWQpIHsKLQkJCQljcHVfY2xlYXIoaSwgcGh5c19jcHVfcHJlc2VudF9tYXApOwotCQkJCWNwdV9jbGVhcihpLCBjcHVfcHJlc2VudF9tYXApOwotCQkJCWlmIChudW1fcG9zc2libGVfY3B1cygpIDw9IG1heF9jcHVzKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWNwdV9kYXRhKGJvb3RfY3B1X2lkKS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogfQogCiB2b2lkIF9fZGV2aW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQpAQCAtMTE5MCwzMCArMTI0NSwzMiBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7CiAJCXVuc2lnbmVkIGludCBqOwogCisJCWNwdXNfY2xlYXIoY3B1X2NvcmVfbWFwW2ldKTsKIAkJaWYgKGNwdV9kYXRhKGkpLmNvcmVfaWQgPT0gMCkgewogCQkJY3B1X3NldChpLCBjcHVfY29yZV9tYXBbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShqKSB7CiAJCQlpZiAoY3B1X2RhdGEoaSkuY29yZV9pZCA9PQogCQkJICAgIGNwdV9kYXRhKGopLmNvcmVfaWQpCiAJCQkJY3B1X3NldChqLCBjcHVfY29yZV9tYXBbaV0pOwogCQl9CiAJfQogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7CiAJCXVuc2lnbmVkIGludCBqOwogCisJCWNwdXNfY2xlYXIoY3B1X3NpYmxpbmdfbWFwW2ldKTsKIAkJaWYgKGNwdV9kYXRhKGkpLnByb2NfaWQgPT0gLTEpIHsKIAkJCWNwdV9zZXQoaSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUoaikgewogCQkJaWYgKGNwdV9kYXRhKGkpLnByb2NfaWQgPT0KIAkJCSAgICBjcHVfZGF0YShqKS5wcm9jX2lkKQogCQkJCWNwdV9zZXQoaiwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKQEAgLTEyNDIsMTggKzEyOTksMTEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBfX2luaXQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCit2b2lkIGNwdV9wbGF5X2RlYWQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGJvZ29zdW0gPSAwOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBwc3RhdGU7CisKKwlpZGxlX3Rhc2tfZXhpdCgpOworCisJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKKwkJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGIgPSAmdHJhcF9ibG9ja1tjcHVdOworCisJCXN1bjR2X2NwdV9xY29uZihIVl9DUFVfUVVFVUVfQ1BVX01PTkRPLAorCQkJCXRiLT5jcHVfbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX0RFVklDRV9NT05ETywKKwkJCQl0Yi0+ZGV2X21vbmRvX3BhLCAwKTsKKwkJc3VuNHZfY3B1X3Fjb25mKEhWX0NQVV9RVUVVRV9SRVNfRVJST1IsCisJCQkJdGItPnJlc3VtX21vbmRvX3BhLCAwKTsKKwkJc3VuNHZfY3B1X3Fjb25mKEhWX0NQVV9RVUVVRV9OT05SRVNfRVJST1IsCisJCQkJdGItPm5vbnJlc3VtX21vbmRvX3BhLCAwKTsKKwl9CisKKwljcHVfY2xlYXIoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCW1lbWJhcl9zYWZlKCIjU3luYyIpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkicmRwcgklJXBzdGF0ZSwgJTBcblx0IgorCQkid3JwcgklMCwgJTEsICUlcHN0YXRlIgorCQk6ICI9ciIgKHBzdGF0ZSkKKwkJOiAiaSIgKFBTVEFURV9JRSkpOworCisJd2hpbGUgKDEpCisJCWJhcnJpZXIoKTsKK30KKworaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWNwdWluZm9fc3BhcmMgKmM7CiAJaW50IGk7CiAKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCi0JCWJvZ29zdW0gKz0gY3B1X2RhdGEoaSkudWRlbGF5X3ZhbDsKLQlwcmludGsoIlRvdGFsIG9mICVsZCBwcm9jZXNzb3JzIGFjdGl2YXRlZCAiCi0JICAgICAgICIoJWx1LiUwMmx1IEJvZ29NSVBTKS5cbiIsCi0JICAgICAgIChsb25nKSBudW1fb25saW5lX2NwdXMoKSwKLQkgICAgICAgYm9nb3N1bS8oNTAwMDAwL0haKSwKLQkgICAgICAgKGJvZ29zdW0vKDUwMDAvSFopKSUxMDApOworCWZvcl9lYWNoX2NwdV9tYXNrKGksIGNwdV9jb3JlX21hcFtjcHVdKQorCQljcHVfY2xlYXIoY3B1LCBjcHVfY29yZV9tYXBbaV0pOworCWNwdXNfY2xlYXIoY3B1X2NvcmVfbWFwW2NwdV0pOworCisJZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X3NpYmxpbmdfbWFwW2NwdV0pCisJCWNwdV9jbGVhcihjcHUsIGNwdV9zaWJsaW5nX21hcFtpXSk7CisJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbY3B1XSk7CisKKwljID0gJmNwdV9kYXRhKGNwdSk7CisKKwljLT5jb3JlX2lkID0gMDsKKwljLT5wcm9jX2lkID0gLTE7CisKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CisJY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOworCXNwaW5fdW5sb2NrKCZjYWxsX2xvY2spOworCisJc21wX3dtYigpOworCisJLyogTWFrZSBzdXJlIG5vIGludGVycnVwdHMgcG9pbnQgdG8gdGhpcyBjcHUuICAqLworCWZpeHVwX2lycXMoKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwltZGVsYXkoMSk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXNtcF9ybWIoKTsKKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMDApOworCX0KKwlpZiAoY3B1X2lzc2V0KGNwdSwgc21wX2NvbW1lbmNlZF9tYXNrKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNQVSAldSBkaWRuJ3QgZGllLi4uXG4iLCBjcHUpOworCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfU1VOX0xET01TKQorCQl1bnNpZ25lZCBsb25nIGh2X2VycjsKKwkJaW50IGxpbWl0ID0gMTAwOworCisJCWRvIHsKKwkJCWh2X2VyciA9IHN1bjR2X2NwdV9zdG9wKGNwdSk7CisJCQlpZiAoaHZfZXJyID09IEhWX0VPSykgeworCQkJCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKC0tbGltaXQgPiAwKTsKKwkJaWYgKGxpbWl0IDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic3VuNHZfY3B1X3N0b3AoKSBmYWlscyBlcnI9JWx1XG4iLAorCQkJICAgICAgIGh2X2Vycik7CisJCX0KKyNlbmRpZgorCX0KK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKIH0KIAogdm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCmluZGV4IDZmYTc2MTYuLjcxOWQ2NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBzcGFyYzY0X2tzeW1zLmMsdiAxLjEyMSAyMDAyLzAyLzA5IDE5OjQ5OjMxIGRhdmVtIEV4cCAkCi0gKiBhcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYzogU3BhcmM2NCBzcGVjaWZpYyBrc3ltcyBzdXBwb3J0LgorLyogYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmM6IFNwYXJjNjQgc3BlY2lmaWMga3N5bXMgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqIENvcHlyaWdodCAoQykgMTk5NiBFZGRpZSBDLiBEb3N0IChlY2RAc2t5bmV0LmJlKQogICogQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQogICovCkBAIC0yOCw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bmV0L2NvbXBhdC5oPgogCiAjaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xMjQsMTAgKzEyMiw2IEBACiBFWFBPUlRfU1lNQk9MKF9fd3JpdGVfdW5sb2NrKTsKIEVYUE9SVF9TWU1CT0woX193cml0ZV90cnlsb2NrKTsKIAotLyogQ1BVIG9ubGluZSBtYXAgYW5kIGFjdGl2ZSBjb3VudC4gICovCi1FWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKLUVYUE9SVF9TWU1CT0wocGh5c19jcHVfcHJlc2VudF9tYXApOwotCiBFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKQEAgLTMzMCwxMiArMzI0LDYgQEAKIEVYUE9SVF9TWU1CT0wobWVtbW92ZSk7CiBFWFBPUlRfU1lNQk9MKHN0cm5jbXApOwogCi0vKiBEZWxheSByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woX191ZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX25kZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKLUVYUE9SVF9TWU1CT0woX19kZWxheSk7Ci0KIHZvaWQgVklTZW50ZXIodm9pZCk7CiAvKiBSQUlEIGNvZGUgbmVlZHMgdGhpcyAqLwogRVhQT1JUX1NZTUJPTChWSVNlbnRlcik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2ZzLmMKaW5kZXggY2RiMTQ3Ny4uNTI4MTZjNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYwpAQCAtMTkzLDcgKzE5Myw2IEBACiB9CiAKIFNIT1dfQ1BVREFUQV9VTE9OR19OQU1FKGNsb2NrX3RpY2ssIGNsb2NrX3RpY2spOwotU0hPV19DUFVEQVRBX1VMT05HX05BTUUodWRlbGF5X3ZhbCwgdWRlbGF5X3ZhbCk7CiBTSE9XX0NQVURBVEFfVUlOVF9OQU1FKGwxX2RjYWNoZV9zaXplLCBkY2FjaGVfc2l6ZSk7CiBTSE9XX0NQVURBVEFfVUlOVF9OQU1FKGwxX2RjYWNoZV9saW5lX3NpemUsIGRjYWNoZV9saW5lX3NpemUpOwogU0hPV19DUFVEQVRBX1VJTlRfTkFNRShsMV9pY2FjaGVfc2l6ZSwgaWNhY2hlX3NpemUpOwpAQCAtMjAzLDcgKzIwMiw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSBjcHVfY29yZV9hdHRyc1tdID0gewogCV9TWVNERVZfQVRUUihjbG9ja190aWNrLCAgICAgICAgICAwNDQ0LCBzaG93X2Nsb2NrX3RpY2ssIE5VTEwpLAotCV9TWVNERVZfQVRUUih1ZGVsYXlfdmFsLCAgICAgICAgICAwNDQ0LCBzaG93X3VkZWxheV92YWwsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9kY2FjaGVfc2l6ZSwgICAgICAwNDQ0LCBzaG93X2wxX2RjYWNoZV9zaXplLCBOVUxMKSwKIAlfU1lTREVWX0FUVFIobDFfZGNhY2hlX2xpbmVfc2l6ZSwgMDQ0NCwgc2hvd19sMV9kY2FjaGVfbGluZV9zaXplLCBOVUxMKSwKIAlfU1lTREVWX0FUVFIobDFfaWNhY2hlX3NpemUsICAgICAgMDQ0NCwgc2hvd19sMV9pY2FjaGVfc2l6ZSwgTlVMTCksCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCmluZGV4IGEzMWEwNDMuLjYyZTMxNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCkBAIC04NDksOSArODQ5LDYgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCXVuc2lnbmVkIGxvbmcgY2xvY2s7Ci0jaWZkZWYgQ09ORklHX1NNUAotCWV4dGVybiB2b2lkIHNtcF90aWNrX2luaXQodm9pZCk7Ci0jZW5kaWYKIAogCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpZiAodGxiX3R5cGUgPT0gc3BpdGZpcmUpIHsKQEAgLTg3NCwxMCArODcxLDYgQEAKIAkJY2xvY2sgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJzdGljay1mcmVxdWVuY3kiLCAwKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfU01QCi0Jc21wX3RpY2tfaW5pdCgpOwotI2VuZGlmCi0KIAlyZXR1cm4gY2xvY2s7CiB9CiAKQEAgLTEwMzgsMTAgKzEwMzEsMzEgQEAKIAlzcGFyYzY0X2Nsb2NrZXZlbnQubXVsdCA9IG11bHQ7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRiX3RpY2tzX3Blcl91c2VjIF9fcmVhZF9tb3N0bHk7CisKK3ZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCXVuc2lnbmVkIGxvbmcgYmNsb2NrLCBub3c7CisKKwliY2xvY2sgPSB0aWNrX29wcy0+Z2V0X3RpY2soKTsKKwlkbyB7CisJCW5vdyA9IHRpY2tfb3BzLT5nZXRfdGljaygpOworCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKK30KK0VYUE9SVF9TWU1CT0woX19kZWxheSk7CisKK3ZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJX19kZWxheSh0Yl90aWNrc19wZXJfdXNlYyAqIHVzZWNzKTsKK30KK0VYUE9SVF9TWU1CT0wodWRlbGF5KTsKKwogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjbG9jayA9IHNwYXJjNjRfaW5pdF90aW1lcnMoKTsKIAorCXRiX3RpY2tzX3Blcl91c2VjID0gY2xvY2sgLyBVU0VDX1BFUl9TRUM7CisKIAl0aW1lcl90aWNrc19wZXJfbnNlY19xdW90aWVudCA9CiAJCWNsb2Nrc291cmNlX2h6Mm11bHQoY2xvY2ssIFNQQVJDNjRfTlNFQ19QRVJfQ1lDX1NISUZUKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDAwYTllMzIuLjZlZjJkMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKQEAgLTIyMjUsNiArMjIyNSw3IEBACiAJbm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCAwLCAyNTUsIFNJR1NFR1YpOwogCV9fYXNtX18gX192b2xhdGlsZV9fKCJmbHVzaHciKTsKIAlfX3Nob3dfcmVncyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlpZiAocmVncy0+dHN0YXRlICYgVFNUQVRFX1BSSVYpIHsKIAkJc3RydWN0IHJlZ193aW5kb3cgKnJ3ID0gKHN0cnVjdCByZWdfd2luZG93ICopCiAJCQkocmVncy0+dV9yZWdzW1VSRUdfRlBdICsgU1RBQ0tfQklBUyk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU2OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW8uYwpAQCAtMCwwICsxLDM5NSBAQAorLyogdmlvLmM6IFZpcnR1YWwgSS9PIGNoYW5uZWwgZGV2aWNlcyBwcm9iaW5nIGluZnJhc3RydWN0dXJlLgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IElCTSBDb3JwLgorICogICAgIERhdmUgRW5nZWJyZXRzZW4gZW5nZWJyZXRAdXMuaWJtLmNvbQorICogICAgIFNhbnRpYWdvIExlb24gc2FudGlsQHVzLmlibS5jb20KKyAqICAgICBIb2xsaXMgQmxhbmNoYXJkIDxob2xsaXNiQHVzLmlibS5jb20+CisgKiAgICAgU3RlcGhlbiBSb3Rod2VsbAorICoKKyAqIEFkYXB0ZWQgdG8gc3BhcmM2NCBieSBEYXZpZCBTLiBNaWxsZXIgZGF2ZW1AZGF2ZW1sb2Z0Lm5ldAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfaW5fcHJvcGxpc3QoY29uc3QgY2hhciAqbGlzdCwgY29uc3QgY2hhciAqbWF0Y2gsCisJCQkJICAgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuID4gMCkgeworCQlpbnQgbDsKKworCQlpZiAoIXN0cmNtcChsaXN0LCBtYXRjaCkpCisJCQlyZXR1cm4gMTsKKwkJbCA9IHN0cmxlbihsaXN0KSArIDE7CisJCWxpc3QgKz0gbDsKKwkJbGVuIC09IGw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKnZpb19tYXRjaF9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKm1hdGNoZXMsCisJY29uc3Qgc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwljb25zdCBjaGFyICp0eXBlLCAqY29tcGF0OworCWludCBsZW47CisKKwl0eXBlID0gZGV2LT50eXBlOworCWNvbXBhdCA9IGRldi0+Y29tcGF0OworCWxlbiA9IGRldi0+Y29tcGF0X2xlbjsKKworCXdoaWxlIChtYXRjaGVzLT50eXBlWzBdIHx8IG1hdGNoZXMtPmNvbXBhdFswXSkgeworCQlpbnQgbWF0Y2ggPSAxOworCQlpZiAobWF0Y2hlcy0+dHlwZVswXSkKKwkJCW1hdGNoICY9ICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgdHlwZSk7CisKKwkJaWYgKG1hdGNoZXMtPmNvbXBhdFswXSkgeworCQkJbWF0Y2ggJj0gbGVuICYmCisJCQkJZmluZF9pbl9wcm9wbGlzdChjb21wYXQsIG1hdGNoZXMtPmNvbXBhdCwgbGVuKTsKKwkJfQorCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbWF0Y2hlczsKKwkJbWF0Y2hlcysrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB2aW9fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmlvX2RldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvX2RydiA9IHRvX3Zpb19kcml2ZXIoZHJ2KTsKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqbWF0Y2hlcyA9IHZpb19kcnYtPmlkX3RhYmxlOworCisJaWYgKCFtYXRjaGVzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB2aW9fbWF0Y2hfZGV2aWNlKG1hdGNoZXMsIHZpb19kZXYpICE9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdmlvX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IHZpb19kcml2ZXIgKmRydiA9IHRvX3Zpb19kcml2ZXIoZGV2LT5kcml2ZXIpOworCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZDsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCisJaWYgKGRydi0+cHJvYmUpIHsKKwkJaWQgPSB2aW9fbWF0Y2hfZGV2aWNlKGRydi0+aWRfdGFibGUsIHZkZXYpOworCQlpZiAoaWQpCisJCQllcnJvciA9IGRydi0+cHJvYmUodmRldiwgaWQpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCB2aW9fZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IHZpb19kcml2ZXIgKmRydiA9IHRvX3Zpb19kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRydi0+cmVtb3ZlKQorCQlyZXR1cm4gZHJ2LT5yZW1vdmUodmRldik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNzaXplX3QgZGV2c3BlY19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwljb25zdCBjaGFyICpzdHIgPSAibm9uZSI7CisKKwlpZiAoIXN0cmNtcCh2ZGV2LT50eXBlLCAibmV0d29yayIpKQorCQlzdHIgPSAidm5ldCI7CisJZWxzZSBpZiAoIXN0cmNtcCh2ZGV2LT50eXBlLCAiYmxvY2siKSkKKwkJc3RyID0gInZkaXNrIjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzdHIpOworfQorCitzdGF0aWMgc3NpemVfdCB0eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2RldihkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB2ZGV2LT50eXBlKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHZpb19kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8oZGV2c3BlYyksCisJX19BVFRSX1JPKHR5cGUpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHZpb19idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAidmlvIiwKKwkuZGV2X2F0dHJzCT0gdmlvX2Rldl9hdHRycywKKwkubWF0Y2gJCT0gdmlvX2J1c19tYXRjaCwKKwkucHJvYmUJCT0gdmlvX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlCQk9IHZpb19kZXZpY2VfcmVtb3ZlLAorfTsKKworaW50IHZpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpb19kcml2ZXIgKnZpb2RydikKK3sKKwl2aW9kcnYtPmRyaXZlci5idXMgPSAmdmlvX2J1c190eXBlOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmdmlvZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTCh2aW9fcmVnaXN0ZXJfZHJpdmVyKTsKKwordm9pZCB2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpb19kcml2ZXIgKnZpb2RydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmdmlvZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTCh2aW9fdW5yZWdpc3Rlcl9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmlvX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlrZnJlZSh0b192aW9fZGV2KGRldikpOworfQorCitzdGF0aWMgc3NpemVfdAorc2hvd19wY2lvYnBwYXRoX2F0dHIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKworCXZkZXYgPSB0b192aW9fZGV2KGRldik7CisJZHAgPSB2ZGV2LT5kcDsKKworCXJldHVybiBzbnByaW50ZiAoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZHAtPmZ1bGxfbmFtZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihvYnBwYXRoLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCSAgIHNob3dfcGNpb2JwcGF0aF9hdHRyLCBOVUxMKTsKKworc3RydWN0IGRldmljZV9ub2RlICpjZGV2X25vZGU7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqcm9vdF92ZGV2Oworc3RhdGljIHU2NCBjZGV2X2NmZ19oYW5kbGU7CisKK3N0YXRpYyB2b2lkIHZpb19maWxsX2NoYW5uZWxfaW5mbyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG1wLAorCQkJCSAgc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJdTY0IGE7CisKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJY29uc3QgdTY0ICpjaGFuX2lkOworCQljb25zdCB1NjQgKmlycTsKKwkJdTY0IHRhcmdldDsKKworCQl0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKworCQlpcnEgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHRhcmdldCwgInR4LWlubyIsIE5VTEwpOworCQlpZiAoaXJxKQorCQkJdmRldi0+dHhfaXJxID0gc3VuNHZfYnVpbGRfdmlycShjZGV2X2NmZ19oYW5kbGUsICppcnEpOworCisJCWlycSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdGFyZ2V0LCAicngtaW5vIiwgTlVMTCk7CisJCWlmIChpcnEpCisJCQl2ZGV2LT5yeF9pcnEgPSBzdW40dl9idWlsZF92aXJxKGNkZXZfY2ZnX2hhbmRsZSwgKmlycSk7CisKKwkJY2hhbl9pZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdGFyZ2V0LCAiaWQiLCBOVUxMKTsKKwkJaWYgKGNoYW5faWQpCisJCQl2ZGV2LT5jaGFubmVsX2lkID0gKmNoYW5faWQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXYgKnZpb19jcmVhdGVfb25lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCWNvbnN0IGNoYXIgKnR5cGUsICpjb21wYXQ7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwlpbnQgZXJyLCB0bGVuLCBjbGVuOworCisJdHlwZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJkZXZpY2UtdHlwZSIsICZ0bGVuKTsKKwlpZiAoIXR5cGUpIHsKKwkJdHlwZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJuYW1lIiwgJnRsZW4pOworCQlpZiAoIXR5cGUpIHsKKwkJCXR5cGUgPSBtZGVzY19ub2RlX25hbWUoaHAsIG1wKTsKKwkJCXRsZW4gPSBzdHJsZW4odHlwZSkgKyAxOworCQl9CisJfQorCWlmICh0bGVuID4gVklPX01BWF9UWVBFX0xFTikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogVHlwZSBzdHJpbmcgWyVzXSBpcyB0b28gbG9uZy5cbiIsCisJCSAgICAgICB0eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29tcGF0ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRldmljZS10eXBlIiwgJmNsZW4pOworCWlmICghY29tcGF0KSB7CisJCWNsZW4gPSAwOworCX0gZWxzZSBpZiAoY2xlbiA+IFZJT19NQVhfQ09NUEFUX0xFTikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ29tcGF0IGxlbiAlZCBmb3IgWyVzXSBpcyB0b28gbG9uZy5cbiIsCisJCSAgICAgICBjbGVuLCB0eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmRldiA9IGt6YWxsb2Moc2l6ZW9mKCp2ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb3VsZCBub3QgYWxsb2NhdGUgdmlvX2RldlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXZkZXYtPm1wID0gbXA7CisJbWVtY3B5KHZkZXYtPnR5cGUsIHR5cGUsIHRsZW4pOworCWlmIChjb21wYXQpCisJCW1lbWNweSh2ZGV2LT5jb21wYXQsIGNvbXBhdCwgY2xlbik7CisJZWxzZQorCQltZW1zZXQodmRldi0+Y29tcGF0LCAwLCBzaXplb2YodmRldi0+Y29tcGF0KSk7CisJdmRldi0+Y29tcGF0X2xlbiA9IGNsZW47CisKKwl2ZGV2LT5jaGFubmVsX2lkID0gfjBVTDsKKwl2ZGV2LT50eF9pcnEgPSB+MDsKKwl2ZGV2LT5yeF9pcnEgPSB+MDsKKworCXZpb19maWxsX2NoYW5uZWxfaW5mbyhocCwgbXAsIHZkZXYpOworCisJc25wcmludGYodmRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlbHgiLCBtcCk7CisJdmRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwl2ZGV2LT5kZXYuYnVzID0gJnZpb19idXNfdHlwZTsKKwl2ZGV2LT5kZXYucmVsZWFzZSA9IHZpb19kZXZfcmVsZWFzZTsKKworCWlmIChwYXJlbnQgPT0gTlVMTCkgeworCQlkcCA9IGNkZXZfbm9kZTsKKwl9IGVsc2UgaWYgKHRvX3Zpb19kZXYocGFyZW50KSA9PSByb290X3ZkZXYpIHsKKwkJZHAgPSBvZl9nZXRfbmV4dF9jaGlsZChjZGV2X25vZGUsIE5VTEwpOworCQl3aGlsZSAoZHApIHsKKwkJCWlmICghc3RyY21wKGRwLT50eXBlLCB0eXBlKSkKKwkJCQlicmVhazsKKworCQkJZHAgPSBvZl9nZXRfbmV4dF9jaGlsZChjZGV2X25vZGUsIGRwKTsKKwkJfQorCX0gZWxzZSB7CisJCWRwID0gdG9fdmlvX2RldihwYXJlbnQpLT5kcDsKKwl9CisJdmRldi0+ZHAgPSBkcDsKKworCWVyciA9IGRldmljZV9yZWdpc3RlcigmdmRldi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlICVzLCBlcnI9JWRcbiIsCisJCSAgICAgICB2ZGV2LT5kZXYuYnVzX2lkLCBlcnIpOworCQlrZnJlZSh2ZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICh2ZGV2LT5kcCkKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnZkZXYtPmRldi5rb2JqLAorCQkJCQkmZGV2X2F0dHJfb2JwcGF0aC5hdHRyKTsKKworCXJldHVybiB2ZGV2OworfQorCitzdGF0aWMgdm9pZCB3YWxrX3RyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBuLCBzdHJ1Y3QgdmlvX2RldiAqcGFyZW50KQoreworCXU2NCBhOworCisJbWRlc2NfZm9yX2VhY2hfYXJjKGEsIGhwLCBuLCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJc3RydWN0IHZpb19kZXYgKnZkZXY7CisJCXU2NCB0YXJnZXQ7CisKKwkJdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCXZkZXYgPSB2aW9fY3JlYXRlX29uZShocCwgdGFyZ2V0LCAmcGFyZW50LT5kZXYpOworCQlpZiAodmRldikKKwkJCXdhbGtfdHJlZShocCwgdGFyZ2V0LCB2ZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZXZpY2VzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgcm9vdCkKK3sKKwl1NjQgbXA7CisKKwlyb290X3ZkZXYgPSB2aW9fY3JlYXRlX29uZShocCwgcm9vdCwgTlVMTCk7CisJaWYgKCFyb290X3ZkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWx0IG5vdCBjcmVhdGUgcm9vdCBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXdhbGtfdHJlZShocCwgcm9vdCwgcm9vdF92ZGV2KTsKKworCS8qIERvbWFpbiBzZXJ2aWNlcyBpcyBvZGQgYXMgaXQgZG9lc24ndCBzaXQgdW5kZXJuZWF0aCB0aGUKKwkgKiBjaGFubmVsLWRldmljZXMgbm9kZSwgc28gd2UgcGx1ZyBpdCBpbiBtYW51YWxseS4KKwkgKi8KKwltcCA9IG1kZXNjX25vZGVfYnlfbmFtZShocCwgTURFU0NfTk9ERV9OVUxMLCAiZG9tYWluLXNlcnZpY2VzIik7CisJaWYgKG1wICE9IE1ERVNDX05PREVfTlVMTCkgeworCQlzdHJ1Y3QgdmlvX2RldiAqcGFyZW50ID0gdmlvX2NyZWF0ZV9vbmUoaHAsIG1wLAorCQkJCQkJCSZyb290X3ZkZXYtPmRldik7CisKKwkJaWYgKHBhcmVudCkKKwkJCXdhbGtfdHJlZShocCwgbXAsIHBhcmVudCk7CisJfQorfQorCitjb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfbm9kZSA9ICJjaGFubmVsLWRldmljZXMiOworY29uc3QgY2hhciAqY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCA9ICJTVU5XLHN1bjR2LWNoYW5uZWwtZGV2aWNlcyI7Citjb25zdCBjaGFyICpjZmdfaGFuZGxlX3Byb3AgPSAiY2ZnLWhhbmRsZSI7CisKK3N0YXRpYyBpbnQgX19pbml0IHZpb19pbml0KHZvaWQpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJY29uc3QgY2hhciAqY29tcGF0OworCWNvbnN0IHU2NCAqY2ZnX2hhbmRsZTsKKwlpbnQgZXJyLCBsZW47CisJdTY0IHJvb3Q7CisKKwllcnIgPSBidXNfcmVnaXN0ZXIoJnZpb19idXNfdHlwZSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ291bGQgbm90IHJlZ2lzdGVyIGJ1cyB0eXBlIGVycj0lZFxuIiwKKwkJICAgICAgIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJaHAgPSBtZGVzY19ncmFiKCk7CisJaWYgKCFocCkKKwkJcmV0dXJuIDA7CisKKwlyb290ID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsIGNoYW5uZWxfZGV2aWNlc19ub2RlKTsKKwlpZiAocm9vdCA9PSBNREVTQ19OT0RFX05VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVklPOiBObyBjaGFubmVsLWRldmljZXMgTURFU0Mgbm9kZS5cbiIpOworCQltZGVzY19yZWxlYXNlKGhwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2Rldl9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNoYW5uZWwtZGV2aWNlcyIpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFjZGV2X25vZGUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVklPOiBObyBjaGFubmVsLWRldmljZXMgT0JQIG5vZGUuXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwljb21wYXQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHJvb3QsICJjb21wYXRpYmxlIiwgJmxlbik7CisJaWYgKCFjb21wYXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENoYW5uZWwgZGV2aWNlcyBsYWNrcyBjb21wYXRpYmxlICIKKwkJICAgICAgICJwcm9wZXJ0eVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCWlmICghZmluZF9pbl9wcm9wbGlzdChjb21wYXQsIGNoYW5uZWxfZGV2aWNlc19jb21wYXQsIGxlbikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENoYW5uZWwgZGV2aWNlcyBub2RlIGxhY2tzICglcykgIgorCQkgICAgICAgImNvbXBhdCBlbnRyeS5cbiIsIGNoYW5uZWxfZGV2aWNlc19jb21wYXQpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWNmZ19oYW5kbGUgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHJvb3QsIGNmZ19oYW5kbGVfcHJvcCwgTlVMTCk7CisJaWYgKCFjZmdfaGFuZGxlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDaGFubmVsIGRldmljZXMgbGFja3MgJXMgcHJvcGVydHlcbiIsCisJCSAgICAgICBjZmdfaGFuZGxlX3Byb3ApOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWNkZXZfY2ZnX2hhbmRsZSA9ICpjZmdfaGFuZGxlOworCisJY3JlYXRlX2RldmljZXMoaHAsIHJvb3QpOworCisJbWRlc2NfcmVsZWFzZShocCk7CisKKwlyZXR1cm4gMDsKKworb3V0X3JlbGVhc2U6CisJbWRlc2NfcmVsZWFzZShocCk7CisJcmV0dXJuIGVycjsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwodmlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW9ocy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW9ocy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjEzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKQEAgLTAsMCArMSw3OTIgQEAKKy8qIHZpb2hzLmM6IExET00gVmlydHVhbCBJL08gaGFuZHNoYWtlIGhlbHBlciBsYXllci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2xkYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKworaW50IHZpb19sZGNfc2VuZChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWludCBlcnIsIGxpbWl0ID0gMTAwMDsKKworCWVyciA9IC1FSU5WQUw7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCWVyciA9IGxkY193cml0ZSh2aW8tPmxwLCBkYXRhLCBsZW4pOworCQlpZiAoIWVyciB8fCAoZXJyICE9IC1FQUdBSU4pKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh2aW9fbGRjX3NlbmQpOworCitzdGF0aWMgaW50IHNlbmRfY3RybChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkgICAgIHN0cnVjdCB2aW9fbXNnX3RhZyAqdGFnLCBpbnQgbGVuKQoreworCXRhZy0+c2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisJcmV0dXJuIHZpb19sZGNfc2VuZCh2aW8sIHRhZywgbGVuKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF90YWcoc3RydWN0IHZpb19tc2dfdGFnICp0YWcsIHU4IHR5cGUsIHU4IHN0eXBlLCB1MTYgc3R5cGVfZW52KQoreworCXRhZy0+dHlwZSA9IHR5cGU7CisJdGFnLT5zdHlwZSA9IHN0eXBlOworCXRhZy0+c3R5cGVfZW52ID0gc3R5cGVfZW52OworfQorCitzdGF0aWMgaW50IHNlbmRfdmVyc2lvbihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB1MTYgbWFqb3IsIHUxNiBtaW5vcikKK3sKKwlzdHJ1Y3QgdmlvX3Zlcl9pbmZvIHBrdDsKKworCXZpby0+X2xvY2FsX3NpZCA9ICh1MzIpIHNjaGVkX2Nsb2NrKCk7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCWluaXRfdGFnKCZwa3QudGFnLCBWSU9fVFlQRV9DVFJMLCBWSU9fU1VCVFlQRV9JTkZPLCBWSU9fVkVSX0lORk8pOworCXBrdC5tYWpvciA9IG1ham9yOworCXBrdC5taW5vciA9IG1pbm9yOworCXBrdC5kZXZfY2xhc3MgPSB2aW8tPmRldl9jbGFzczsKKworCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBJTkZPIG1halsldV0gbWluWyV1XSBkZXZjbGFzc1sldV1cbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgdmlvLT5kZXZfY2xhc3MpOworCisJcmV0dXJuIHNlbmRfY3RybCh2aW8sICZwa3QudGFnLCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfaGFuZHNoYWtlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJaW50IGVycjsKKworCXZpb2RiZyhIUywgIlNUQVJUIEhBTkRTSEFLRVxuIik7CisKKwl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisKKwllcnIgPSBzZW5kX3ZlcnNpb24odmlvLAorCQkJICAgdmlvLT52ZXJfdGFibGVbMF0ubWFqb3IsCisJCQkgICB2aW8tPnZlcl90YWJsZVswXS5taW5vcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2aW9fbGlua19zdGF0ZV9jaGFuZ2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgaW50IGV2ZW50KQoreworCWlmIChldmVudCA9PSBMRENfRVZFTlRfVVApIHsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19JTlZBTElEOworCisJCXN3aXRjaCAodmlvLT5kZXZfY2xhc3MpIHsKKwkJY2FzZSBWREVWX05FVFdPUks6CisJCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwkJCXZpby0+ZHJfc3RhdGUgPSAoVklPX0RSX1NUQVRFX1RYUkVRIHwKKwkJCQkJIFZJT19EUl9TVEFURV9SWFJFUSk7CisJCQlicmVhazsKKworCQljYXNlIFZERVZfRElTSzoKKwkJCXZpby0+ZHJfc3RhdGUgPSBWSU9fRFJfU1RBVEVfVFhSRVE7CisJCQlicmVhazsKKwkJY2FzZSBWREVWX0RJU0tfU0VSVkVSOgorCQkJdmlvLT5kcl9zdGF0ZSA9IFZJT19EUl9TVEFURV9SWFJFUTsKKwkJCWJyZWFrOworCQl9CisJCXN0YXJ0X2hhbmRzaGFrZSh2aW8pOworCX0KK30KK0VYUE9SVF9TWU1CT0wodmlvX2xpbmtfc3RhdGVfY2hhbmdlKTsKKworc3RhdGljIGludCBoYW5kc2hha2VfZmFpbHVyZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJLyogWFhYIFB1dCBwb2xpY3kgaGVyZS4uLiAgUGVyaGFwcyBzdGFydCBhIHRpbWVyIHRvIGZpcmUKKwkgKiBYWFggaW4gMTAwIG1zLCB3aGljaCB3aWxsIGJyaW5nIHRoZSBsaW5rIHVwIGFuZCByZXRyeQorCSAqIFhYWCB0aGUgaGFuZHNoYWtlLgorCSAqLworCisJdmlvZGJnKEhTLCAiSEFORFNIQUtFIEZBSUxVUkVcbiIpOworCisJdmlvLT5kcl9zdGF0ZSAmPSB+KFZJT19EUl9TVEFURV9UWFJFRyB8CisJCQkgICBWSU9fRFJfU1RBVEVfUlhSRUcpOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKwltZW1zZXQoZHIsIDAsIHNpemVvZigqZHIpKTsKKworCWtmcmVlKHZpby0+ZGVzY19idWYpOworCXZpby0+ZGVzY19idWYgPSBOVUxMOworCXZpby0+ZGVzY19idWZfbGVuID0gMDsKKworCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfSU5WQUxJRDsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Vua25vd24oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aW9fbXNnX3RhZyAqcGt0ID0gYXJnOworCisJdmlvZGJnKEhTLCAiVU5LTk9XTiBDT05UUk9MIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkgICAgICAgcGt0LT50eXBlLCBwa3QtPnN0eXBlLCBwa3QtPnN0eXBlX2VudiwgcGt0LT5zaWQpOworCisJcHJpbnRrKEtFUk5fRVJSICJ2aW86IElEWyVsdV0gUmVzZXR0aW5nIGNvbm5lY3Rpb24uXG4iLAorCSAgICAgICB2aW8tPnZkZXYtPmNoYW5uZWxfaWQpOworCisJbGRjX2Rpc2Nvbm5lY3QodmlvLT5scCk7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9kcmVnKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgcGt0OworCQljaGFyIGFsbFtzaXplb2Yoc3RydWN0IHZpb19kcmluZ19yZWdpc3RlcikgKworCQkJIChzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpICoKKwkJCSAgZHItPm5jb29raWVzKV07CisJfSB1OworCWludCBpOworCisJbWVtc2V0KCZ1LCAwLCBzaXplb2YodSkpOworCWluaXRfdGFnKCZ1LnBrdC50YWcsIFZJT19UWVBFX0NUUkwsIFZJT19TVUJUWVBFX0lORk8sIFZJT19EUklOR19SRUcpOworCXUucGt0LmRyaW5nX2lkZW50ID0gMDsKKwl1LnBrdC5udW1fZGVzY3IgPSBkci0+bnVtX2VudHJpZXM7CisJdS5wa3QuZGVzY3Jfc2l6ZSA9IGRyLT5lbnRyeV9zaXplOworCXUucGt0Lm9wdGlvbnMgPSBWSU9fVFhfRFJJTkc7CisJdS5wa3QubnVtX2Nvb2tpZXMgPSBkci0+bmNvb2tpZXM7CisKKwl2aW9kYmcoSFMsICJTRU5EIERSSU5HX1JFRyBJTkZPIG5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSAiCisJICAgICAgICJuY29va2llc1sldV1cbiIsCisJICAgICAgIHUucGt0Lm51bV9kZXNjciwgdS5wa3QuZGVzY3Jfc2l6ZSwgdS5wa3Qub3B0aW9ucywKKwkgICAgICAgdS5wa3QubnVtX2Nvb2tpZXMpOworCisJZm9yIChpID0gMDsgaSA8IGRyLT5uY29va2llczsgaSsrKSB7CisJCXUucGt0LmNvb2tpZXNbaV0gPSBkci0+Y29va2llc1tpXTsKKworCQl2aW9kYmcoSFMsICJEUklORyBDT09LSUUoJWQpIFslMDE2bGx4OiUwMTZsbHhdXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHUucGt0LmNvb2tpZXNbaV0uY29va2llX2FkZHIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB1LnBrdC5jb29raWVzW2ldLmNvb2tpZV9zaXplKTsKKwl9CisKKwlyZXR1cm4gc2VuZF9jdHJsKHZpbywgJnUucGt0LnRhZywgc2l6ZW9mKHUpKTsKK30KKworc3RhdGljIGludCBzZW5kX3JkeChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXN0cnVjdCB2aW9fcmR4IHBrdDsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisKKwlpbml0X3RhZygmcGt0LnRhZywgVklPX1RZUEVfQ1RSTCwgVklPX1NVQlRZUEVfSU5GTywgVklPX1JEWCk7CisKKwl2aW9kYmcoSFMsICJTRU5EIFJEWCBJTkZPXG4iKTsKKworCXJldHVybiBzZW5kX2N0cmwodmlvLCAmcGt0LnRhZywgc2l6ZW9mKHBrdCkpOworfQorCitzdGF0aWMgaW50IHNlbmRfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXJldHVybiB2aW8tPm9wcy0+c2VuZF9hdHRyKHZpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX3ZlcnNpb24gKmZpbmRfYnlfbWFqb3Ioc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCQkJIHUxNiBtYWpvcikKK3sKKwlzdHJ1Y3QgdmlvX3ZlcnNpb24gKnJldCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmlvLT52ZXJfdGFibGVfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCB2aW9fdmVyc2lvbiAqdiA9ICZ2aW8tPnZlcl90YWJsZVtpXTsKKwkJaWYgKHYtPm1ham9yIDw9IG1ham9yKSB7CisJCQlyZXQgPSB2OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9pbmZvKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb192ZXJfaW5mbyAqcGt0KQoreworCXN0cnVjdCB2aW9fdmVyc2lvbiAqdmFwOworCWludCBlcnI7CisKKwl2aW9kYmcoSFMsICJHT1QgVkVSU0lPTiBJTkZPIG1halsldV0gbWluWyV1XSBkZXZjbGFzc1sldV1cbiIsCisJICAgICAgIHBrdC0+bWFqb3IsIHBrdC0+bWlub3IsIHBrdC0+ZGV2X2NsYXNzKTsKKworCWlmICh2aW8tPmhzX3N0YXRlICE9IFZJT19IU19JTlZBTElEKSB7CisJCS8qIFhYWCBQZXJoYXBzIGludm9rZSBzdGFydF9oYW5kc2hha2U/IFhYWCAqLworCQltZW1zZXQoJnZpby0+dmVyLCAwLCBzaXplb2YodmlvLT52ZXIpKTsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19JTlZBTElEOworCX0KKworCXZhcCA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKTsKKworCXZpby0+X3BlZXJfc2lkID0gcGt0LT50YWcuc2lkOworCisJaWYgKCF2YXApIHsKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCQlwa3QtPm1ham9yID0gMDsKKwkJcGt0LT5taW5vciA9IDA7CisJCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBOQUNLIG1halswXSBtaW5bMF1cbiIpOworCQllcnIgPSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisJfSBlbHNlIGlmICh2YXAtPm1ham9yICE9IHBrdC0+bWFqb3IpIHsKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCQlwa3QtPm1ham9yID0gdmFwLT5tYWpvcjsKKwkJcGt0LT5taW5vciA9IHZhcC0+bWlub3I7CisJCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBOQUNLIG1halsldV0gbWluWyV1XVxuIiwKKwkJICAgICAgIHBrdC0+bWFqb3IsIHBrdC0+bWlub3IpOworCQllcnIgPSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHZpb192ZXJzaW9uIHZlciA9IHsKKwkJCS5tYWpvciA9IHBrdC0+bWFqb3IsCisJCQkubWlub3IgPSBwa3QtPm1pbm9yLAorCQl9OworCQlpZiAodmVyLm1pbm9yID4gdmFwLT5taW5vcikKKwkJCXZlci5taW5vciA9IHZhcC0+bWlub3I7CisJCXBrdC0+bWlub3IgPSB2ZXIubWlub3I7CisJCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCQl2aW9kYmcoSFMsICJTRU5EIFZFUlNJT04gQUNLIG1halsldV0gbWluWyV1XVxuIiwKKwkJICAgICAgIHBrdC0+bWFqb3IsIHBrdC0+bWlub3IpOworCQllcnIgPSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisJCWlmIChlcnIgPiAwKSB7CisJCQl2aW8tPnZlciA9IHZlcjsKKwkJCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfR09UVkVSUzsKKwkJfQorCX0KKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgIHN0cnVjdCB2aW9fdmVyX2luZm8gKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgVkVSU0lPTiBBQ0sgbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vciwgcGt0LT5kZXZfY2xhc3MpOworCisJaWYgKHZpby0+aHNfc3RhdGUgJiBWSU9fSFNfR09UVkVSUykgeworCQlpZiAodmlvLT52ZXIubWFqb3IgIT0gcGt0LT5tYWpvciB8fAorCQkgICAgdmlvLT52ZXIubWlub3IgIT0gcGt0LT5taW5vcikgeworCQkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCQkJKHZvaWQpIHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQl9CisJfSBlbHNlIHsKKwkJdmlvLT52ZXIubWFqb3IgPSBwa3QtPm1ham9yOworCQl2aW8tPnZlci5taW5vciA9IHBrdC0+bWlub3I7CisJCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfR09UVkVSUzsKKwl9CisKKwlzd2l0Y2ggKHZpby0+ZGV2X2NsYXNzKSB7CisJY2FzZSBWREVWX05FVFdPUks6CisJY2FzZSBWREVWX0RJU0s6CisJCWlmIChzZW5kX2F0dHIodmlvKSA8IDApCisJCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9uYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb192ZXJfaW5mbyAqcGt0KQoreworCXN0cnVjdCB2aW9fdmVyc2lvbiAqbnZlcjsKKworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIE5BQ0sgbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vciwgcGt0LT5kZXZfY2xhc3MpOworCisJaWYgKChwa3QtPm1ham9yID09IDAgJiYgcGt0LT5taW5vciA9PSAwKSB8fAorCSAgICAhKG52ZXIgPSBmaW5kX2J5X21ham9yKHZpbywgcGt0LT5tYWpvcikpKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCWlmIChzZW5kX3ZlcnNpb24odmlvLCBudmVyLT5tYWpvciwgbnZlci0+bWlub3IpIDwgMCkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3ZlcihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3dpdGNoIChwa3QtPnRhZy5zdHlwZSkgeworCWNhc2UgVklPX1NVQlRZUEVfSU5GTzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2luZm8odmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9BQ0s6CisJCXJldHVybiBwcm9jZXNzX3Zlcl9hY2sodmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfbmFjayh2aW8sIHBrdCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKwl9OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpwa3QpCit7CisJaW50IGVycjsKKworCWlmICghKHZpby0+aHNfc3RhdGUgJiBWSU9fSFNfR09UVkVSUykpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJZXJyID0gdmlvLT5vcHMtPmhhbmRsZV9hdHRyKHZpbywgcGt0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKwl9IGVsc2UgeworCQl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19HT1RfQVRUUjsKKworCQlpZiAoKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfVFhSRVEpICYmCisJCSAgICAhKHZpby0+aHNfc3RhdGUgJiBWSU9fSFNfU0VOVF9EUkVHKSkgeworCQkJaWYgKHNlbmRfZHJlZyh2aW8pIDwgMCkKKwkJCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCQkJdmlvLT5oc19zdGF0ZSB8PSBWSU9fSFNfU0VOVF9EUkVHOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsbF9kcmluZ3NfcmVnaXN0ZXJlZChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCWludCBuZWVkX3J4LCBuZWVkX3R4OworCisJbmVlZF9yeCA9ICh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVRKTsKKwluZWVkX3R4ID0gKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfVFhSRVEpOworCisJaWYgKG5lZWRfcnggJiYKKwkgICAgISh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVHKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmVlZF90eCAmJgorCSAgICAhKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfVFhSRUcpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZHJlZ19pbmZvKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgIHN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgKnBrdCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwlpbnQgaSwgbGVuOworCisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBJTkZPIGlkZW50WyVsbHhdICIKKwkgICAgICAgIm5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSBuY29va2llc1sldV1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQsCisJICAgICAgIHBrdC0+bnVtX2Rlc2NyLCBwa3QtPmRlc2NyX3NpemUsIHBrdC0+b3B0aW9ucywKKwkgICAgICAgcGt0LT5udW1fY29va2llcyk7CisKKwlpZiAoISh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVRKSkKKwkJZ290byBzZW5kX25hY2s7CisKKwlpZiAodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9SWFJFRykKKwkJZ290byBzZW5kX25hY2s7CisKKwl2aW8tPmRlc2NfYnVmID0ga3phbGxvYyhwa3QtPmRlc2NyX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghdmlvLT5kZXNjX2J1ZikKKwkJZ290byBzZW5kX25hY2s7CisKKwl2aW8tPmRlc2NfYnVmX2xlbiA9IHBrdC0+ZGVzY3Jfc2l6ZTsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisKKwlkci0+bnVtX2VudHJpZXMgPSBwa3QtPm51bV9kZXNjcjsKKwlkci0+ZW50cnlfc2l6ZSA9IHBrdC0+ZGVzY3Jfc2l6ZTsKKwlkci0+bmNvb2tpZXMgPSBwa3QtPm51bV9jb29raWVzOworCWZvciAoaSA9IDA7IGkgPCBkci0+bmNvb2tpZXM7IGkrKykgeworCQlkci0+Y29va2llc1tpXSA9IHBrdC0+Y29va2llc1tpXTsKKworCQl2aW9kYmcoSFMsICJEUklORyBDT09LSUUoJWQpIFslMDE2bGx4OiUwMTZsbHhdXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBwa3QtPmNvb2tpZXNbaV0uY29va2llX2FkZHIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkgICAgICAgcGt0LT5jb29raWVzW2ldLmNvb2tpZV9zaXplKTsKKwl9CisKKwlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0FDSzsKKwlwa3QtPmRyaW5nX2lkZW50ID0gKytkci0+aWRlbnQ7CisKKwl2aW9kYmcoSFMsICJTRU5EIERSSU5HX1JFRyBBQ0sgaWRlbnRbJWxseF1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQpOworCisJbGVuID0gKHNpemVvZigqcGt0KSArCisJICAgICAgIChkci0+bmNvb2tpZXMgKiBzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpKSk7CisJaWYgKHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgbGVuKSA8IDApCisJCWdvdG8gc2VuZF9uYWNrOworCisJdmlvLT5kcl9zdGF0ZSB8PSBWSU9fRFJfU1RBVEVfUlhSRUc7CisKKwlyZXR1cm4gMDsKKworc2VuZF9uYWNrOgorCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfTkFDSzsKKwl2aW9kYmcoSFMsICJTRU5EIERSSU5HX1JFRyBOQUNLXG4iKTsKKwkodm9pZCkgc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBzaXplb2YoKnBrdCkpOworCisJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnX2FjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgKnBrdCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKworCXZpb2RiZyhIUywgIkdPVCBEUklOR19SRUcgQUNLIGlkZW50WyVsbHhdICIKKwkgICAgICAgIm5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSBuY29va2llc1sldV1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQsCisJICAgICAgIHBrdC0+bnVtX2Rlc2NyLCBwa3QtPmRlc2NyX3NpemUsIHBrdC0+b3B0aW9ucywKKwkgICAgICAgcGt0LT5udW1fY29va2llcyk7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCisJaWYgKCEodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSkpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJZHItPmlkZW50ID0gcGt0LT5kcmluZ19pZGVudDsKKwl2aW8tPmRyX3N0YXRlIHw9IFZJT19EUl9TVEFURV9UWFJFRzsKKworCWlmIChhbGxfZHJpbmdzX3JlZ2lzdGVyZWQodmlvKSkgeworCQlpZiAoc2VuZF9yZHgodmlvKSA8IDApCisJCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19TRU5UX1JEWDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBEUklOR19SRUcgTkFDSyBpZGVudFslbGx4XSAiCisJICAgICAgICJuZGVzY1sldV0gZHN6WyV1XSBvcHRbMHgleF0gbmNvb2tpZXNbJXVdXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QtPmRyaW5nX2lkZW50LAorCSAgICAgICBwa3QtPm51bV9kZXNjciwgcGt0LT5kZXNjcl9zaXplLCBwa3QtPm9wdGlvbnMsCisJICAgICAgIHBrdC0+bnVtX2Nvb2tpZXMpOworCisJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQlzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyICpwa3QpCit7CisJaWYgKCEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc19kcmVnX2luZm8odmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9BQ0s6CisJCXJldHVybiBwcm9jZXNzX2RyZWdfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIHByb2Nlc3NfZHJlZ19uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX2R1bnJlZyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICBzdHJ1Y3QgdmlvX2RyaW5nX3VucmVnaXN0ZXIgKnBrdCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1VOUkVHXG4iKTsKKworCWlmIChwa3QtPmRyaW5nX2lkZW50ICE9IGRyLT5pZGVudCkKKwkJcmV0dXJuIDA7CisKKwl2aW8tPmRyX3N0YXRlICY9IH5WSU9fRFJfU1RBVEVfUlhSRUc7CisKKwltZW1zZXQoZHIsIDAsIHNpemVvZigqZHIpKTsKKworCWtmcmVlKHZpby0+ZGVzY19idWYpOworCXZpby0+ZGVzY19idWYgPSBOVUxMOworCXZpby0+ZGVzY19idWZfbGVuID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmR4X2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19yZHggKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgUkRYIElORk9cbiIpOworCisJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisJdmlvZGJnKEhTLCAiU0VORCBSRFggQUNLXG4iKTsKKwlpZiAoc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBzaXplb2YoKnBrdCkpIDwgMCkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19TRU5UX1JEWF9BQ0s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHhfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIFJEWCBBQ0tcbiIpOworCisJaWYgKCEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19TRU5UX1JEWCkpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJdmlvLT5oc19zdGF0ZSB8PSBWSU9fSFNfR09UX1JEWF9BQ0s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHhfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3JkeCAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBSRFggTkFDS1xuIik7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3JkeCAqcGt0KQoreworCWlmICghYWxsX2RyaW5nc19yZWdpc3RlcmVkKHZpbykpCisJCWhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc19yZHhfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfcmR4X2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBwcm9jZXNzX3JkeF9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX0KK30KKworaW50IHZpb19jb250cm9sX3BrdF9lbmdpbmUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqcGt0KQoreworCXN0cnVjdCB2aW9fbXNnX3RhZyAqdGFnID0gcGt0OworCXU4IHByZXZfc3RhdGUgPSB2aW8tPmhzX3N0YXRlOworCWludCBlcnI7CisKKwlzd2l0Y2ggKHRhZy0+c3R5cGVfZW52KSB7CisJY2FzZSBWSU9fVkVSX0lORk86CisJCWVyciA9IHByb2Nlc3NfdmVyKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19BVFRSX0lORk86CisJCWVyciA9IHByb2Nlc3NfYXR0cih2aW8sIHBrdCk7CisJCWJyZWFrOworCisJY2FzZSBWSU9fRFJJTkdfUkVHOgorCQllcnIgPSBwcm9jZXNzX2RyZWcodmlvLCBwa3QpOworCQlicmVhazsKKworCWNhc2UgVklPX0RSSU5HX1VOUkVHOgorCQllcnIgPSBwcm9jZXNzX2R1bnJlZyh2aW8sIHBrdCk7CisJCWJyZWFrOworCisJY2FzZSBWSU9fUkRYOgorCQllcnIgPSBwcm9jZXNzX3JkeCh2aW8sIHBrdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gcHJvY2Vzc191bmtub3duKHZpbywgcGt0KTsKKwkJYnJlYWs7CisJfQorCWlmICghZXJyICYmCisJICAgIHZpby0+aHNfc3RhdGUgIT0gcHJldl9zdGF0ZSAmJgorCSAgICAodmlvLT5oc19zdGF0ZSAmIFZJT19IU19DT01QTEVURSkpCisJCXZpby0+b3BzLT5oYW5kc2hha2VfY29tcGxldGUodmlvKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19jb250cm9sX3BrdF9lbmdpbmUpOworCit2b2lkIHZpb19jb25uX3Jlc2V0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19jb25uX3Jlc2V0KTsKKworLyogVGhlIGlzc3VlIGlzIHRoYXQgdGhlIFNvbGFyaXMgdmlydHVhbCBkaXNrIHNlcnZlciBqdXN0IG1pcnJvcnMgdGhlCisgKiBTSUQgdmFsdWVzIGl0IGdldHMgZnJvbSB0aGUgY2xpZW50IHBlZXIuICBTbyB3ZSB3b3JrIGFyb3VuZCB0aGF0CisgKiBoZXJlIGluIHZpb197dmFsaWRhdGUsc2VuZH1fc2lkKCkgc28gdGhhdCB0aGUgZHJpdmVycyBkb24ndCBuZWVkCisgKiB0byBiZSBhd2FyZSBvZiB0aGlzIGNyYXAuCisgKi8KK2ludCB2aW9fdmFsaWRhdGVfc2lkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fbXNnX3RhZyAqdHApCit7CisJdTMyIHNpZDsKKworCS8qIEFsd2F5cyBsZXQgVkVSU0lPTitJTkZPIHBhY2tldHMgdGhyb3VnaCB1bmNoZWNrZWQsIHRoZXkKKwkgKiBkZWZpbmUgdGhlIG5ldyBTSUQuCisJICovCisJaWYgKHRwLT50eXBlID09IFZJT19UWVBFX0NUUkwgJiYKKwkgICAgdHAtPnN0eXBlID09IFZJT19TVUJUWVBFX0lORk8gJiYKKwkgICAgdHAtPnN0eXBlX2VudiA9PSBWSU9fVkVSX0lORk8pCisJCXJldHVybiAwOworCisJLyogT2ssIG5vdyBmaWd1cmUgb3V0IHdoaWNoIFNJRCB0byB1c2UuICAqLworCXN3aXRjaCAodmlvLT5kZXZfY2xhc3MpIHsKKwljYXNlIFZERVZfTkVUV09SSzoKKwljYXNlIFZERVZfTkVUV09SS19TV0lUQ0g6CisJY2FzZSBWREVWX0RJU0tfU0VSVkVSOgorCWRlZmF1bHQ6CisJCXNpZCA9IHZpby0+X3BlZXJfc2lkOworCQlicmVhazsKKworCWNhc2UgVkRFVl9ESVNLOgorCQlzaWQgPSB2aW8tPl9sb2NhbF9zaWQ7CisJCWJyZWFrOworCX0KKworCWlmIChzaWQgPT0gdHAtPnNpZCkKKwkJcmV0dXJuIDA7CisJdmlvZGJnKERBVEEsICJCQUQgU0lEIHRhZy0+c2lkWyUwOHhdIHBlZXJfc2lkWyUwOHhdIGxvY2FsX3NpZFslMDh4XVxuIiwKKwkgICAgICAgdHAtPnNpZCwgdmlvLT5fcGVlcl9zaWQsIHZpby0+X2xvY2FsX3NpZCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKHZpb192YWxpZGF0ZV9zaWQpOworCit1MzIgdmlvX3NlbmRfc2lkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTSzoKKwlkZWZhdWx0OgorCQlyZXR1cm4gdmlvLT5fbG9jYWxfc2lkOworCisJY2FzZSBWREVWX0RJU0tfU0VSVkVSOgorCQlyZXR1cm4gdmlvLT5fcGVlcl9zaWQ7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2aW9fc2VuZF9zaWQpOworCitleHRlcm4gaW50IHZpb19sZGNfYWxsb2Moc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpiYXNlX2NmZywKKwkJCSB2b2lkICpldmVudF9hcmcpCit7CisJc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyBjZmcgPSAqYmFzZV9jZmc7CisJc3RydWN0IGxkY19jaGFubmVsICpscDsKKworCWNmZy50eF9pcnEgPSB2aW8tPnZkZXYtPnR4X2lycTsKKwljZmcucnhfaXJxID0gdmlvLT52ZGV2LT5yeF9pcnE7CisKKwlscCA9IGxkY19hbGxvYyh2aW8tPnZkZXYtPmNoYW5uZWxfaWQsICZjZmcsIGV2ZW50X2FyZyk7CisJaWYgKElTX0VSUihscCkpCisJCXJldHVybiBQVFJfRVJSKGxwKTsKKworCXZpby0+bHAgPSBscDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2aW9fbGRjX2FsbG9jKTsKKwordm9pZCB2aW9fbGRjX2ZyZWUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlsZGNfZnJlZSh2aW8tPmxwKTsKKwl2aW8tPmxwID0gTlVMTDsKKworCWtmcmVlKHZpby0+ZGVzY19idWYpOworCXZpby0+ZGVzY19idWYgPSBOVUxMOworCXZpby0+ZGVzY19idWZfbGVuID0gMDsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2xkY19mcmVlKTsKKwordm9pZCB2aW9fcG9ydF91cChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciwgc3RhdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlvLT5sb2NrLCBmbGFncyk7CisKKwlzdGF0ZSA9IGxkY19zdGF0ZSh2aW8tPmxwKTsKKworCWVyciA9IDA7CisJaWYgKHN0YXRlID09IExEQ19TVEFURV9JTklUKSB7CisJCWVyciA9IGxkY19iaW5kKHZpby0+bHAsIHZpby0+bmFtZSk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9ydCAlbHUgYmluZCBmYWlsZWQsICIKKwkJCSAgICAgICAiZXJyPSVkXG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgdmlvLT52ZGV2LT5jaGFubmVsX2lkLCBlcnIpOworCX0KKworCWlmICghZXJyKSB7CisJCWVyciA9IGxkY19jb25uZWN0KHZpby0+bHApOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBvcnQgJWx1IGNvbm5lY3QgZmFpbGVkLCAiCisJCQkgICAgICAgImVycj0lZFxuIiwKKwkJCSAgICAgICB2aW8tPm5hbWUsIHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgZXJyKTsKKwl9CisJaWYgKGVycikgeworCQl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisKKwkJZXhwaXJlcyA9IHJvdW5kX2ppZmZpZXMoZXhwaXJlcyk7CisJCW1vZF90aW1lcigmdmlvLT50aW1lciwgZXhwaXJlcyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19wb3J0X3VwKTsKKworc3RhdGljIHZvaWQgdmlvX3BvcnRfdGltZXIodW5zaWduZWQgbG9uZyBfYXJnKQoreworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKikgX2FyZzsKKworCXZpb19wb3J0X3VwKHZpbyk7Cit9CisKK2ludCB2aW9fZHJpdmVyX2luaXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCSAgICB1OCBkZXZfY2xhc3MsIHN0cnVjdCB2aW9fdmVyc2lvbiAqdmVyX3RhYmxlLAorCQkgICAgaW50IHZlcl90YWJsZV9zaXplLCBzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgKm9wcywKKwkJICAgIGNoYXIgKm5hbWUpCit7CisJc3dpdGNoIChkZXZfY2xhc3MpIHsKKwljYXNlIFZERVZfTkVUV09SSzoKKwljYXNlIFZERVZfTkVUV09SS19TV0lUQ0g6CisJY2FzZSBWREVWX0RJU0s6CisJY2FzZSBWREVWX0RJU0tfU0VSVkVSOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghb3BzLT5zZW5kX2F0dHIgfHwKKwkgICAgIW9wcy0+aGFuZGxlX2F0dHIgfHwKKwkgICAgIW9wcy0+aGFuZHNoYWtlX2NvbXBsZXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdmVyX3RhYmxlIHx8IHZlcl90YWJsZV9zaXplIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2luaXQoJnZpby0+bG9jayk7CisKKwl2aW8tPm5hbWUgPSBuYW1lOworCisJdmlvLT5kZXZfY2xhc3MgPSBkZXZfY2xhc3M7CisJdmlvLT52ZGV2ID0gdmRldjsKKworCXZpby0+dmVyX3RhYmxlID0gdmVyX3RhYmxlOworCXZpby0+dmVyX3RhYmxlX2VudHJpZXMgPSB2ZXJfdGFibGVfc2l6ZTsKKworCXZpby0+b3BzID0gb3BzOworCisJc2V0dXBfdGltZXIoJnZpby0+dGltZXIsIHZpb19wb3J0X3RpbWVyLCAodW5zaWduZWQgbG9uZykgdmlvKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2aW9fZHJpdmVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKaW5kZXggNGE3MjVkOC4uYzRhNmQ2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw2IEBACiAJIE5HbWVtY3B5Lm8gTkdjb3B5X2Zyb21fdXNlci5vIE5HY29weV90b191c2VyLm8gTkdwYXRjaC5vIFwKIAkgTkdwYWdlLm8gTkdiemVyby5vIFwKIAkgY29weV9pbl91c2VyLm8gdXNlcl9maXh1cC5vIG1lbW1vdmUubyBcCi0JIG1jb3VudC5vIGlwY3N1bS5vIHJ3c2VtLm8geG9yLm8gZGVsYXkubworCSBtY291bnQubyBpcGNzdW0ubyByd3NlbS5vIHhvci5vCiAKIG9iai15ICs9IGlvbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvZGVsYXkuYyBiL2FyY2gvc3BhcmM2NC9saWIvZGVsYXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyN2U1NC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2RlbGF5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBkZWxheS5jOiBEZWxheSBsb29wcyBmb3Igc3BhcmM2NAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNiBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+Ci0gKgotICogQmFzZWQgaGVhdmlseSB1cG9uIHg4NiB2YXJpYW50IHdoaWNoIGlzOgotICoJQ29weXJpZ2h0IChDKSAxOTkzIExpbnVzIFRvcnZhbGRzCi0gKglDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0KLXZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQotewotCXVuc2lnbmVkIGxvbmcgYmNsb2NrLCBub3c7Ci0JCi0JYmNsb2NrID0gdGlja19vcHMtPmdldF90aWNrKCk7Ci0JZG8gewotCQlub3cgPSB0aWNrX29wcy0+Z2V0X3RpY2soKTsKLQl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Ci19Ci0KLS8qIFdlIHVzZWQgdG8gbXVsdGlwbHkgYnkgSFogYWZ0ZXIgc2hpZnRpbmcgZG93biBieSAzMiBiaXRzCi0gKiBidXQgdGhhdCBydW5zIGludG8gcHJvYmxlbXMgZm9yIGhpZ2hlciB2YWx1ZXMgb2YgSFogYW5kCi0gKiBzbG93IGNwdXMuCi0gKi8KLXZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyBuKQotewotCW4gKj0gNDsKLQotCW4gKj0gKGNwdV9kYXRhKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpLnVkZWxheV92YWwgKiAoSFovNCkpOwotCW4gPj49IDMyOwotCi0JX19kZWxheShuICsgMSk7Ci19Ci0KLXZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyBuKQotewotCV9fY29uc3RfdWRlbGF5KG4gKiAweDEwYzdVTCk7Ci19Ci0KLQotdm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JX19jb25zdF91ZGVsYXkobiAqIDB4NVVMKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYyBiL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYwppbmRleCBmM2UwYzE0Li4zM2M1YjdkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9taXNjLmMKKysrIGIvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogaW50IHByb21fc2VydmljZV9leGlzdHMoY29uc3QgY2hhciAqc2VydmljZV9uYW1lKQogewpAQCAtMzcsNiArMzgsMTAgQEAKIC8qIFJlc2V0IGFuZCByZWJvb3QgdGhlIG1hY2hpbmUgd2l0aCB0aGUgY29tbWFuZCAnYmNvbW1hbmQnLiAqLwogdm9pZCBwcm9tX3JlYm9vdChjb25zdCBjaGFyICpiY29tbWFuZCkKIHsKKyNpZmRlZiBDT05GSUdfU1VOX0xET01TCisJaWYgKGxkb21fZG9tYWluaW5nX2VuYWJsZWQpCisJCWxkb21fcmVib290KGJjb21tYW5kKTsKKyNlbmRpZgogCXAxMjc1X2NtZCgiYm9vdCIsIFAxMjc1X0FSRygwLCBQMTI3NV9BUkdfSU5fU1RSSU5HKSB8CiAJCSAgUDEyNzVfSU5PVVQoMSwgMCksIGJjb21tYW5kKTsKIH0KQEAgLTkxLDYgKzk2LDEwIEBACiAgKi8KIHZvaWQgcHJvbV9oYWx0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQlsZG9tX3Bvd2VyX29mZigpOworI2VuZGlmCiBhZ2FpbjoKIAlwMTI3NV9jbWQoImV4aXQiLCBQMTI3NV9JTk9VVCgwLCAwKSk7CiAJZ290byBhZ2FpbjsgLyogUFJPTSBpcyBvdXQgdG8gZ2V0IG1lIC1EYXZlTSAqLwpAQCAtOTgsNiArMTA3LDEwIEBACiAKIHZvaWQgcHJvbV9oYWx0X3Bvd2VyX29mZih2b2lkKQogeworI2lmZGVmIENPTkZJR19TVU5fTERPTVMKKwlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJbGRvbV9wb3dlcl9vZmYoKTsKKyNlbmRpZgogCXAxMjc1X2NtZCgiU1VOVyxwb3dlci1vZmYiLCBQMTI3NV9JTk9VVCgwLCAwKSk7CiAKIAkvKiBpZiBub3RoaW5nIGVsc2UgaGVscHMsIHdlIGp1c3QgaGFsdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYyBiL2FyY2gvc3BhcmM2NC9wcm9tL3AxMjc1LmMKaW5kZXggMmIzMmM0OC4uN2ZjY2NjMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgogI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CiAKIHN0cnVjdCB7CiAJbG9uZyBwcm9tX2NhbGxiYWNrOwkJCS8qIDB4MDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9wcm9tL3RyZWUuYyBiL2FyY2gvc3BhcmM2NC9wcm9tL3RyZWUuYwppbmRleCA1MDBmMDVlLi4xN2I3ZWNmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS90cmVlLmMKKysrIGIvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CiAKIC8qIFJldHVybiB0aGUgY2hpbGQgb2Ygbm9kZSAnbm9kZScgb3IgemVybyBpZiBubyB0aGlzIG5vZGUgaGFzIG5vCiAgKiBkaXJlY3QgZGVzY2VuZGVudC4KQEAgLTI2MSw5ICsyNjIsMTcgQEAKIGludAogcHJvbV9zZXRwcm9wKGludCBub2RlLCBjb25zdCBjaGFyICpwbmFtZSwgY2hhciAqdmFsdWUsIGludCBzaXplKQogewotCWlmKHNpemUgPT0gMCkgcmV0dXJuIDA7Ci0JaWYoKHBuYW1lID09IDApIHx8ICh2YWx1ZSA9PSAwKSkgcmV0dXJuIDA7CisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChwbmFtZSA9PSAwKSB8fCAodmFsdWUgPT0gMCkpCisJCXJldHVybiAwOwogCQorI2lmZGVmIENPTkZJR19TVU5fTERPTVMKKwlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkgeworCQlsZG9tX3NldF92YXIocG5hbWUsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCiAJcmV0dXJuIHAxMjc1X2NtZCAoInNldHByb3AiLCBQMTI3NV9BUkcoMSxQMTI3NV9BUkdfSU5fU1RSSU5HKXwKIAkJCQkJICBQMTI3NV9BUkcoMixQMTI3NV9BUkdfSU5fQlVGKXwKIAkJCQkJICBQMTI3NV9JTk9VVCg0LCAxKSwgCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcuZGVidWcgYi9hcmNoL3VtL0tjb25maWcuZGVidWcKaW5kZXggMDljMWFjYS4uYzg2ZjVlYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwpAQCAtNDcsNCArNDcsMTMgQEAKICAgICAgICAgSWYgeW91J3JlIGludm9sdmVkIGluIFVNTCBrZXJuZWwgZGV2ZWxvcG1lbnQgYW5kIHdhbnQgdG8gdXNlIGdjb3YsCiAgICAgICAgIHNheSBZLiAgSWYgeW91J3JlIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBERUJVR19TVEFDS19VU0FHRQorCWJvb2wgIlN0YWNrIHV0aWxpemF0aW9uIGluc3RydW1lbnRhdGlvbiIKKwlkZWZhdWx0IE4KKwloZWxwCisJICBUcmFjayB0aGUgbWF4aW11bSBrZXJuZWwgc3RhY2sgdXNhZ2UgLSB0aGlzIHdpbGwgbG9vayBhdCBlYWNoCisJICBrZXJuZWwgc3RhY2sgYXQgcHJvY2VzcyBleGl0IGFuZCBsb2cgaXQgaWYgaXQncyB0aGUgZGVlcGVzdAorCSAgc3RhY2sgc2VlbiBzbyBmYXIuCisKKwkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIHNvbWV3aGF0LgogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9jb25maWcucmVsZWFzZSBiL2FyY2gvdW0vY29uZmlnLnJlbGVhc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjhiY2IuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9jb25maWcucmVsZWFzZQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfVVNFUk1PREU9eQotIyBDT05GSUdfSVNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NCVVMgaXMgbm90IHNldAotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLUNPTkZJR19VSUQxNj15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci0KLSMKLSMgR2VuZXJhbCBTZXR1cAotIwotQ09ORklHX1NURElPX0NPTlNPTEU9eQotQ09ORklHX05FVD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19CSU5GTVRfQU9VVD15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX01JU0M9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19VTklYOThfUFRZX0NPVU5UPTI1NgotQ09ORklHX1NTTD15Ci1DT05GSUdfSE9TVEZTPXkKLUNPTkZJR19NQ09OU09MRT15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotIyBDT05GSUdfSE9TVF8yR18yRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTUxfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ09OX1pFUk9fQ0hBTj0iZmQ6MCxmZDoxIgotQ09ORklHX0NPTl9DSEFOPSJ4dGVybSIKLUNPTkZJR19TU0xfQ0hBTj0icHR5IgotQ09ORklHX05FU1RfTEVWRUw9MAotQ09ORklHX0tFUk5FTF9IQUxGX0dJR1M9MQotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfS01PRD15Ci0KLSMKLSMgRGV2aWNlcwotIwotQ09ORklHX0JMS19ERVZfVUJEPXkKLSMgQ09ORklHX0JMS19ERVZfVUJEX1NZTkMgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci1DT05GSUdfQkxLX0RFVl9OQkQ9eQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19NTUFQUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTUxfU09VTkQ9eQotQ09ORklHX1NPVU5EPXkKLUNPTkZJR19IT1NUQVVESU89eQotIyBDT05GSUdfVU1MX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RUWV9MT0cgaXMgbm90IHNldAotQ09ORklHX0ZEX0NIQU49eQotIyBDT05GSUdfTlVMTF9DSEFOIGlzIG5vdCBzZXQKLUNPTkZJR19QT1JUX0NIQU49eQotQ09ORklHX1BUWV9DSEFOPXkKLUNPTkZJR19UVFlfQ0hBTj15Ci1DT05GSUdfWFRFUk1fQ0hBTj15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19QQUNLRVRfTU1BUD15Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfS0hUVFBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLQotIwotIyAgCi0jCi0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSFdfRkxPV0NPTlRST0wgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfVU1MX05FVD15Ci1DT05GSUdfVU1MX05FVF9FVEhFUlRBUD15Ci1DT05GSUdfVU1MX05FVF9UVU5UQVA9eQotQ09ORklHX1VNTF9ORVRfU0xJUD15Ci1DT05GSUdfVU1MX05FVF9EQUVNT049eQotQ09ORklHX1VNTF9ORVRfTUNBU1Q9eQotQ09ORklHX05FVERFVklDRVM9eQotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZPXkKLUNPTkZJR19CT05ESU5HPW0KLUNPTkZJR19FUVVBTElaRVI9bQotQ09ORklHX1RVTj15Ci0jIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi0jIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NWVJJX1NCVVMgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotQ09ORklHX1BMSVA9bQotQ09ORklHX1BQUD1tCi1DT05GSUdfUFBQX01VTFRJTElOSz15Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9BU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfUFBQX1NZTkNfVFRZPW0KLUNPTkZJR19QUFBfREVGTEFURT1tCi1DT05GSUdfUFBQX0JTRENPTVA9bQotQ09ORklHX1BQUE9FPW0KLUNPTkZJR19TTElQPW0KLUNPTkZJR19TTElQX0NPTVBSRVNTRUQ9eQotQ09ORklHX1NMSVBfU01BUlQ9eQotIyBDT05GSUdfU0xJUF9NT0RFX1NMSVA2IGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAotIyBDT05GSUdfUkNQQ0kgaXMgbm90IHNldAotQ09ORklHX1NIQVBFUj1tCi0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfUVVPVEE9eQotQ09ORklHX0FVVE9GU19GUz1tCi1DT05GSUdfQVVUT0ZTNF9GUz1tCi1DT05GSUdfUkVJU0VSRlNfRlM9bQotIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKLUNPTkZJR19BREZTX0ZTPW0KLSMgQ09ORklHX0FERlNfRlNfUlcgaXMgbm90IHNldAotQ09ORklHX0FGRlNfRlM9bQotQ09ORklHX0hGU19GUz1tCi1DT05GSUdfQkZTX0ZTPW0KLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19KQkQ9eQotIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19VTVNET1NfRlM9eQotQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX0VGU19GUz1tCi0jIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19DUkFNRlM9bQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19SQU1GUz1tCi1DT05GSUdfSVNPOTY2MF9GUz15Ci0jIENPTkZJR19KT0xJRVQgaXMgbm90IHNldAotIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19NSU5JWF9GUz1tCi1DT05GSUdfVlhGU19GUz1tCi0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAotQ09ORklHX0hQRlNfRlM9bQotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX0RFVkZTX0ZTPXkKLUNPTkZJR19ERVZGU19NT1VOVD15Ci0jIENPTkZJR19ERVZGU19ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTPXkKLUNPTkZJR19RTlg0RlNfRlM9bQotIyBDT05GSUdfUU5YNEZTX1JXIGlzIG5vdCBzZXQKLUNPTkZJR19ST01GU19GUz1tCi1DT05GSUdfRVhUMl9GUz15Ci1DT05GSUdfU1lTVl9GUz1tCi1DT05GSUdfVURGX0ZTPW0KLUNPTkZJR19VRlNfRlM9bQotIyBDT05GSUdfVUZTX0ZTX1dSSVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ST09UX05GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD15Ci1DT05GSUdfTkZTRF9WMz15Ci1DT05GSUdfU1VOUlBDPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfTE9DS0RfVjQ9eQotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19QQUNLRVRfU0lHTklORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1NUUk9ORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19ORlNfTlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfT1MyX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1NNQUxMRE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19FWFRSQVMgaXMgbm90IHNldAotIyBDT05GSUdfWklTT0ZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0ZTX0lORkxBVEU9bQotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotIyBDT05GSUdfU01CX05MUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCi0jIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9MSU5FQVIgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDAgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDEgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDUgaXMgbm90IHNldAotIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTFZNIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfUFRfUFJPWFkgaXMgbm90IHNldAotIyBDT05GSUdfR1BST0YgaXMgbm90IHNldAotIyBDT05GSUdfR0NPViBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RlZmNvbmZpZyBiL2FyY2gvdW0vZGVmY29uZmlnCmluZGV4IGE1NGQwZWYuLmEyNWNkMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZGVmY29uZmlnCisrKyBiL2FyY2gvdW0vZGVmY29uZmlnCkBAIC0xODksNyArMTg5LDcgQEAKICMgQ09ORklHX05PQ09ORklHX0NIQU4gaXMgbm90IHNldAogQ09ORklHX0NPTl9aRVJPX0NIQU49ImZkOjAsZmQ6MSIKIENPTkZJR19DT05fQ0hBTj0ieHRlcm0iCi1DT05GSUdfU1NMX0NIQU49InB0eSIKK0NPTkZJR19TU0xfQ0hBTj0icHRzIgogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTUyNywzICs1MjcsNCBAQAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19HUFJPRiBpcyBub3Qgc2V0CiAjIENPTkZJR19HQ09WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwppbmRleCAzYWEzNTE2Li4zNjhkM2U5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCkBAIC0yMDMsMjIgKzIwMywzNyBAQAogCX0KIH0KIAotdm9pZCBlbmFibGVfY2hhbihzdHJ1Y3QgbGluZSAqbGluZSkKK2ludCBlbmFibGVfY2hhbihzdHJ1Y3QgbGluZSAqbGluZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbGU7CiAJc3RydWN0IGNoYW4gKmNoYW47CisJaW50IGVycjsKIAogCWxpc3RfZm9yX2VhY2goZWxlLCAmbGluZS0+Y2hhbl9saXN0KXsKIAkJY2hhbiA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3QgY2hhbiwgbGlzdCk7Ci0JCWlmKG9wZW5fb25lX2NoYW4oY2hhbikpCisJCWVyciA9IG9wZW5fb25lX2NoYW4oY2hhbik7CisJCWlmIChlcnIpIHsKKwkJCWlmIChjaGFuLT5wcmltYXJ5KQorCQkJCWdvdG8gb3V0X2Nsb3NlOworCiAJCQljb250aW51ZTsKKwkJfQogCiAJCWlmKGNoYW4tPmVuYWJsZWQpCiAJCQljb250aW51ZTsKLQkJbGluZV9zZXR1cF9pcnEoY2hhbi0+ZmQsIGNoYW4tPmlucHV0LCBjaGFuLT5vdXRwdXQsIGxpbmUsCi0JCQkgICAgICAgY2hhbik7CisJCWVyciA9IGxpbmVfc2V0dXBfaXJxKGNoYW4tPmZkLCBjaGFuLT5pbnB1dCwgY2hhbi0+b3V0cHV0LCBsaW5lLAorCQkJCSAgICAgY2hhbik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbG9zZTsKKwogCQljaGFuLT5lbmFibGVkID0gMTsKIAl9CisKKwlyZXR1cm4gMDsKKworIG91dF9jbG9zZToKKwljbG9zZV9jaGFuKCZsaW5lLT5jaGFuX2xpc3QsIDApOworCXJldHVybiBlcnI7CiB9CiAKIC8qIEl0ZW1zIGFyZSBhZGRlZCBpbiBJUlEgY29udGV4dCwgd2hlbiBmcmVlX2lycSBjYW4ndCBiZSBjYWxsZWQsIGFuZApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCmluZGV4IDEzZjBiZjguLjRkNDM4ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKQEAgLTUxLDE5ICs1MSwyMSBAQAogLyoKICAqIFVNTCBTSUdXSU5DSCBoYW5kbGluZwogICoKLSAqIFRoZSBwb2ludCBvZiB0aGlzIGlzIHRvIGhhbmRsZSBTSUdXSU5DSCBvbiBjb25zb2xlcyB3aGljaCBoYXZlIGhvc3QgdHR5cyBhbmQKLSAqIHJlbGF5IHRoZW0gaW5zaWRlIFVNTCB0byB3aGF0ZXZlciBtaWdodCBiZSBydW5uaW5nIG9uIHRoZSBjb25zb2xlIGFuZCBjYXJlcwotICogYWJvdXQgdGhlIHdpbmRvdyBzaXplIChzaW5jZSBTSUdXSU5DSCBub3RpZmllcyBhYm91dCB0ZXJtaW5hbCBzaXplIGNoYW5nZXMpLgorICogVGhlIHBvaW50IG9mIHRoaXMgaXMgdG8gaGFuZGxlIFNJR1dJTkNIIG9uIGNvbnNvbGVzIHdoaWNoIGhhdmUgaG9zdAorICogdHR5cyBhbmQgcmVsYXkgdGhlbSBpbnNpZGUgVU1MIHRvIHdoYXRldmVyIG1pZ2h0IGJlIHJ1bm5pbmcgb24gdGhlCisgKiBjb25zb2xlIGFuZCBjYXJlcyBhYm91dCB0aGUgd2luZG93IHNpemUgKHNpbmNlIFNJR1dJTkNIIG5vdGlmaWVzCisgKiBhYm91dCB0ZXJtaW5hbCBzaXplIGNoYW5nZXMpLgogICoKLSAqIFNvLCB3ZSBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIGZvciBlYWNoIGhvc3QgdHR5IGF0dGFjaGVkIHRvIGEgVU1MIGRldmljZQotICogKHNpZGUtaXNzdWUgLSBJJ20gYW5ub3llZCB0aGF0IG9uZSB0aHJlYWQgY2FuJ3QgaGF2ZSBtdWx0aXBsZSBjb250cm9sbGluZwotICogdHR5cyBmb3IgcHVycG9zZWQgb2YgaGFuZGxpbmcgU0lHV0lOQ0gsIGJ1dCBJIGltYWdpbmUgdGhlcmUgYXJlIG90aGVyIHJlYXNvbnMKLSAqIHRoYXQgZG9lc24ndCBtYWtlIGFueSBzZW5zZSkuCisgKiBTbywgd2UgaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCBmb3IgZWFjaCBob3N0IHR0eSBhdHRhY2hlZCB0byBhIFVNTAorICogZGV2aWNlIChzaWRlLWlzc3VlIC0gSSdtIGFubm95ZWQgdGhhdCBvbmUgdGhyZWFkIGNhbid0IGhhdmUKKyAqIG11bHRpcGxlIGNvbnRyb2xsaW5nIHR0eXMgZm9yIHRoZSBwdXJwb3NlIG9mIGhhbmRsaW5nIFNJR1dJTkNILCBidXQKKyAqIEkgaW1hZ2luZSB0aGVyZSBhcmUgb3RoZXIgcmVhc29ucyB0aGF0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UpLgogICoKLSAqIFNJR1dJTkNIIGNhbid0IGJlIHJlY2VpdmVkIHN5bmNocm9ub3VzbHksIHNvIHlvdSBoYXZlIHRvIHNldCB1cCB0byByZWNlaXZlIGl0Ci0gKiBhcyBhIHNpZ25hbC4gIFRoYXQgYmVpbmcgdGhlIGNhc2UsIGlmIHlvdSBhcmUgZ29pbmcgdG8gd2FpdCBmb3IgaXQsIGl0IGlzCi0gKiBjb252ZW5pZW50IHRvIHNpdCBpbiBzaWdzdXNwZW5kKCkgYW5kIHdhaXQgZm9yIHRoZSBzaWduYWwgdG8gYm91bmNlIHlvdSBvdXQgb2YKLSAqIGl0IChzZWUgYmVsb3cgZm9yIGhvdyB3ZSBtYWtlIHN1cmUgdG8gZXhpdCBvbmx5IG9uIFNJR1dJTkNIKS4KKyAqIFNJR1dJTkNIIGNhbid0IGJlIHJlY2VpdmVkIHN5bmNocm9ub3VzbHksIHNvIHlvdSBoYXZlIHRvIHNldCB1cCB0bworICogcmVjZWl2ZSBpdCBhcyBhIHNpZ25hbC4gIFRoYXQgYmVpbmcgdGhlIGNhc2UsIGlmIHlvdSBhcmUgZ29pbmcgdG8KKyAqIHdhaXQgZm9yIGl0LCBpdCBpcyBjb252ZW5pZW50IHRvIHNpdCBpbiBzaWdzdXNwZW5kKCkgYW5kIHdhaXQgZm9yCisgKiB0aGUgc2lnbmFsIHRvIGJvdW5jZSB5b3Ugb3V0IG9mIGl0IChzZWUgYmVsb3cgZm9yIGhvdyB3ZSBtYWtlIHN1cmUKKyAqIHRvIGV4aXQgb25seSBvbiBTSUdXSU5DSCkuCiAgKi8KIAogc3RhdGljIHZvaWQgd2luY2hfaGFuZGxlcihpbnQgc2lnKQpAQCAtMTEyLDcgKzExNCw4IEBACiAKIAllcnIgPSBvc19uZXdfdHR5X3BncnAocHR5X2ZkLCBvc19nZXRwaWQoKSk7CiAJaWYoZXJyIDwgMCl7Ci0JCXByaW50aygid2luY2hfdGhyZWFkIDogbmV3X3R0eV9wZ3JwIGZhaWxlZCwgZXJyID0gJWRcbiIsIC1lcnIpOworCQlwcmludGsoIndpbmNoX3RocmVhZCA6IG5ld190dHlfcGdycCBmYWlsZWQgb24gZmQgJWQsICIKKwkJICAgICAgICJlcnIgPSAlZFxuIiwgcHR5X2ZkLCAtZXJyKTsKIAkJZXhpdCgxKTsKIAl9CiAKQEAgLTEyNiw4ICsxMjksOSBAQAogCQkgICAgICAgImVyciA9ICVkXG4iLCAtY291bnQpOwogCiAJd2hpbGUoMSl7Ci0JCS8qIFRoaXMgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSBTSUdXSU5DSCBvbmx5LCBzaW5jZSBvdGhlciBzaWduYWxzCi0JCSAqIGFyZSBibG9ja2VkLiovCisJCS8qIFRoaXMgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSBTSUdXSU5DSCBvbmx5LCBzaW5jZQorCQkgKiBvdGhlciBzaWduYWxzIGFyZSBibG9ja2VkLgorCQkgKi8KIAkJc2lnc3VzcGVuZCgmc2lncyk7CiAKIAkJY291bnQgPSBvc193cml0ZV9maWxlKHBpcGVfZmQsICZjLCBzaXplb2YoYykpOwpAQCAtMTM3LDEwICsxNDEsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgd2luY2hfdHJhbXAoaW50IGZkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgKmZkX291dCkKK3N0YXRpYyBpbnQgd2luY2hfdHJhbXAoaW50IGZkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgKmZkX291dCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCkKIHsKIAlzdHJ1Y3Qgd2luY2hfZGF0YSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGZkc1syXSwgbiwgZXJyOwogCWNoYXIgYzsKIApAQCAtMTUzLDkgKzE1NywxMSBAQAogCWRhdGEgPSAoKHN0cnVjdCB3aW5jaF9kYXRhKSB7IC5wdHlfZmQgCQk9IGZkLAogCQkJCSAgICAgIC5waXBlX2ZkIAkJPSBmZHNbMV0gfSApOwogCS8qIENMT05FX0ZJTEVTIHNvIHRoaXMgdGhyZWFkIGRvZXNuJ3QgaG9sZCBvcGVuIGZpbGVzIHdoaWNoIGFyZSBvcGVuCi0JICogbm93LCBidXQgbGF0ZXIgY2xvc2VkLiAgVGhpcyBpcyBhIHByb2JsZW0gd2l0aCAvZGV2L25ldC90dW4uCisJICogbm93LCBidXQgbGF0ZXIgY2xvc2VkIGluIGEgZGlmZmVyZW50IHRocmVhZC4gIFRoaXMgaXMgYQorCSAqIHByb2JsZW0gd2l0aCAvZGV2L25ldC90dW4sIHdoaWNoIGlmIGhlbGQgb3BlbiBieSB0aGlzCisJICogdGhyZWFkLCBwcmV2ZW50cyB0aGUgVFVOL1RBUCBkZXZpY2UgZnJvbSBiZWluZyByZXVzZWQuCiAJICovCi0JZXJyID0gcnVuX2hlbHBlcl90aHJlYWQod2luY2hfdGhyZWFkLCAmZGF0YSwgQ0xPTkVfRklMRVMsICZzdGFjaywgMCk7CisJZXJyID0gcnVuX2hlbHBlcl90aHJlYWQod2luY2hfdGhyZWFkLCAmZGF0YSwgQ0xPTkVfRklMRVMsIHN0YWNrX291dCk7CiAJaWYoZXJyIDwgMCl7CiAJCXByaW50aygiZm9yayBvZiB3aW5jaF90aHJlYWQgZmFpbGVkIC0gZXJybm8gPSAlZFxuIiwgLWVycik7CiAJCWdvdG8gb3V0X2Nsb3NlOwpAQCAtMTcwLDcgKzE3NiwxMyBAQAogICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2Nsb3NlOwogCX0KLQlyZXR1cm4gZXJyIDsKKworCWlmIChvc19zZXRfZmRfYmxvY2soKmZkX291dCwgMCkpIHsKKwkJcHJpbnRrKCJ3aW5jaF90cmFtcDogZmFpbGVkIHRvIHNldCB0aHJlYWRfZmQgbm9uLWJsb2NraW5nLlxuIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCXJldHVybiBlcnI7CiAKICBvdXRfY2xvc2U6CiAJb3NfY2xvc2VfZmlsZShmZHNbMV0pOwpAQCAtMTgxLDI1ICsxOTMsMjUgQEAKIAogdm9pZCByZWdpc3Rlcl93aW5jaChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JaW50IHBpZCwgdGhyZWFkLCB0aHJlYWRfZmQgPSAtMTsKLQlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKKwlpbnQgcGlkLCB0aHJlYWQsIGNvdW50LCB0aHJlYWRfZmQgPSAtMTsKIAljaGFyIGMgPSAxOwogCiAJaWYoIWlzYXR0eShmZCkpCiAJCXJldHVybjsKIAogCXBpZCA9IHRjZ2V0cGdycChmZCk7Ci0JaWYoIUNIT09TRV9NT0RFX1BST0MoaXNfdHJhY2VyX3dpbmNoLCBpc19za2FzX3dpbmNoLCBwaWQsIGZkLAotCQkJICAgICB0dHkpICYmIChwaWQgPT0gLTEpKXsKLQkJdGhyZWFkID0gd2luY2hfdHJhbXAoZmQsIHR0eSwgJnRocmVhZF9mZCk7Ci0JCWlmKHRocmVhZCA+IDApewotCQkJcmVnaXN0ZXJfd2luY2hfaXJxKHRocmVhZF9mZCwgZmQsIHRocmVhZCwgdHR5KTsKKwlpZiAoIUNIT09TRV9NT0RFX1BST0MoaXNfdHJhY2VyX3dpbmNoLCBpc19za2FzX3dpbmNoLCBwaWQsIGZkLCB0dHkpICYmCisJICAgIChwaWQgPT0gLTEpKSB7CisJCXRocmVhZCA9IHdpbmNoX3RyYW1wKGZkLCB0dHksICZ0aHJlYWRfZmQsICZzdGFjayk7CisJCWlmICh0aHJlYWQgPCAwKQorCQkJcmV0dXJuOwogCi0JCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUodGhyZWFkX2ZkLCAmYywgc2l6ZW9mKGMpKTsKLQkJCWlmKGNvdW50ICE9IHNpemVvZihjKSkKLQkJCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoIDogZmFpbGVkIHRvIHdyaXRlICIKLQkJCQkgICAgICAgInN5bmNocm9uaXphdGlvbiBieXRlLCBlcnIgPSAlZFxuIiwKLQkJCQkJLWNvdW50KTsKLQkJfQorCQlyZWdpc3Rlcl93aW5jaF9pcnEodGhyZWFkX2ZkLCBmZCwgdGhyZWFkLCB0dHksIHN0YWNrKTsKKworCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUodGhyZWFkX2ZkLCAmYywgc2l6ZW9mKGMpKTsKKwkJaWYoY291bnQgIT0gc2l6ZW9mKGMpKQorCQkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaCA6IGZhaWxlZCB0byB3cml0ZSAiCisJCQkgICAgICAgInN5bmNocm9uaXphdGlvbiBieXRlLCBlcnIgPSAlZFxuIiwgLWNvdW50KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaAppbmRleCAxNTQ1Mzg0Li5jYThjOWUxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKQEAgLTgsNyArOCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY293X21hbGxvYyhpbnQgc2l6ZSkKIHsKLQlyZXR1cm4gdW1fa21hbGxvYyhzaXplKTsKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBVTV9HRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvd19mcmVlKHZvaWQgKnB0cikKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggYjg2OWUzOC4uOGQyMDA4ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bjsKIAotCXN1biA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpOworCXN1biA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91biksIFVNX0dGUF9LRVJORUwpOwogCWlmKHN1biA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZXdfYWRkcjogYWxsb2NhdGlvbiBvZiBzb2NrYWRkcl91biBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTgzLDcgKzgzLDcgQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCi0Jc3VuID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisJc3VuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoc3VuID09IE5VTEwpewogCQlwcmludGsoIm5ld19hZGRyOiBhbGxvY2F0aW9uIG9mIHNvY2thZGRyX3VuIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZmQuYyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCmluZGV4IDdmMDgzZWMuLjM5YzAxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9mZC5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCkBAIC0zNyw3ICszNyw3IEBACiAJCXByaW50aygiZmRfaW5pdCA6IGNvdWxkbid0IHBhcnNlIGZpbGUgZGVzY3JpcHRvciAnJXMnXG4iLCBzdHIpOwogCQlyZXR1cm4oTlVMTCk7CiAJfQotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOwogCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogCSpkYXRhID0gKChzdHJ1Y3QgZmRfY2hhbikgeyAuZmQgIAk9IG4sCiAJCQkJICAgIC5yYXcgIAk9IG9wdHMtPnJhdyB9KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYwppbmRleCA1ZWVlY2Y4OS4uMTE3MTc5MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYwpAQCAtNjgsNyArNjgsNyBAQAogCQlhcmdzID0gcGlkX2FyZ3M7CiAJfQogCi0JcGlkID0gcnVuX2hlbHBlcihwcmVfZXhlYywgJmRhdGEsIGFyZ3MsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIocHJlX2V4ZWMsICZkYXRhLCBhcmdzKTsKIAogCW9zX2Nsb3NlX2ZpbGUob3V0X2Zkc1swXSk7CiAJb3NfY2xvc2VfZmlsZShpbl9mZHNbMV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2xpbmUuYyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKaW5kZXggNGJkNDBiYi4uM2UwYjY4ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2xpbmUuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCkBAIC00NTQsNyArNDU0LDEwIEBACiAJdHR5LT5kcml2ZXJfZGF0YSA9IGxpbmU7CiAJbGluZS0+dHR5ID0gdHR5OwogCi0JZW5hYmxlX2NoYW4obGluZSk7CisJZXJyID0gZW5hYmxlX2NoYW4obGluZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCUlOSVRfREVMQVlFRF9XT1JLKCZsaW5lLT50YXNrLCBsaW5lX3RpbWVyX2NiKTsKIAogCWlmKCFsaW5lLT5zaWdpbyl7CkBAIC03NDYsOCArNzQ5LDI0IEBACiAJaW50IHR0eV9mZDsKIAlpbnQgcGlkOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKIH07CiAKK3N0YXRpYyB2b2lkIGZyZWVfd2luY2goc3RydWN0IHdpbmNoICp3aW5jaCwgaW50IGZyZWVfaXJxX29rKQoreworCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CisKKwlpZiAod2luY2gtPnBpZCAhPSAtMSkKKwkJb3Nfa2lsbF9wcm9jZXNzKHdpbmNoLT5waWQsIDEpOworCWlmICh3aW5jaC0+ZmQgIT0gLTEpCisJCW9zX2Nsb3NlX2ZpbGUod2luY2gtPmZkKTsKKwlpZiAod2luY2gtPnN0YWNrICE9IDApCisJCWZyZWVfc3RhY2sod2luY2gtPnN0YWNrLCAwKTsKKwlpZiAoZnJlZV9pcnFfb2spCisJCWZyZWVfaXJxKFdJTkNIX0lSUSwgd2luY2gpOworCWtmcmVlKHdpbmNoKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IHdpbmNoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3aW5jaCAqd2luY2ggPSBkYXRhOwpAQCAtNzY0LDEyICs3ODMsMTMgQEAKIAkJCQkgICAgICAgImVycm5vID0gJWRcbiIsIC1lcnIpOwogCQkJCXByaW50aygiZmQgJWQgaXMgbG9zaW5nIFNJR1dJTkNIIHN1cHBvcnRcbiIsCiAJCQkJICAgICAgIHdpbmNoLT50dHlfZmQpOworCQkJCWZyZWVfd2luY2god2luY2gsIDApOwogCQkJCXJldHVybiBJUlFfSEFORExFRDsKIAkJCX0KIAkJCWdvdG8gb3V0OwogCQl9CiAJfQotCXR0eSAgPSB3aW5jaC0+dHR5OworCXR0eSA9IHdpbmNoLT50dHk7CiAJaWYgKHR0eSAhPSBOVUxMKSB7CiAJCWxpbmUgPSB0dHktPmRyaXZlcl9kYXRhOwogCQljaGFuX3dpbmRvd19zaXplKCZsaW5lLT5jaGFuX2xpc3QsICZ0dHktPndpbnNpemUud3Nfcm93LApAQCAtNzgyLDQzICs4MDIsNDQgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3ZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCXVuc2lnbmVkIGxvbmcgc3RhY2spCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaDsKIAogCXdpbmNoID0ga21hbGxvYyhzaXplb2YoKndpbmNoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHdpbmNoID09IE5VTEwpIHsKIAkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBrbWFsbG9jIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCSp3aW5jaCA9ICgoc3RydWN0IHdpbmNoKSB7IC5saXN0ICAJPSBMSVNUX0hFQURfSU5JVCh3aW5jaC0+bGlzdCksCiAJCQkJICAgLmZkICAJPSBmZCwKIAkJCQkgICAudHR5X2ZkIAk9IHR0eV9mZCwKIAkJCQkgICAucGlkICAJPSBwaWQsCi0JCQkJICAgLnR0eSAJPSB0dHkgfSk7CisJCQkJICAgLnR0eSAJPSB0dHksCisJCQkJICAgLnN0YWNrCT0gc3RhY2sgfSk7CisKKwlpZiAodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKKwkJCSAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwKKwkJCSAgICJ3aW5jaCIsIHdpbmNoKSA8IDApIHsKKwkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CiAKIAlzcGluX2xvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAJbGlzdF9hZGQoJndpbmNoLT5saXN0LCAmd2luY2hfaGFuZGxlcnMpOwogCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCi0JaWYodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAotCQkJICAid2luY2giLCB3aW5jaCkgPCAwKQotCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOwotfQorCXJldHVybjsKIAotc3RhdGljIHZvaWQgZnJlZV93aW5jaChzdHJ1Y3Qgd2luY2ggKndpbmNoKQotewotCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7Ci0KLQlpZih3aW5jaC0+cGlkICE9IC0xKQotCQlvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7Ci0JaWYod2luY2gtPmZkICE9IC0xKQotCQlvc19jbG9zZV9maWxlKHdpbmNoLT5mZCk7Ci0KLQlmcmVlX2lycShXSU5DSF9JUlEsIHdpbmNoKTsKKyBvdXRfZnJlZToKIAlrZnJlZSh3aW5jaCk7CisgY2xlYW51cDoKKwlvc19raWxsX3Byb2Nlc3MocGlkLCAxKTsKKwlvc19jbG9zZV9maWxlKGZkKTsKKwlpZiAoc3RhY2sgIT0gMCkKKwkJZnJlZV9zdGFjayhzdGFjaywgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfd2luY2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTgzMSw3ICs4NTIsNyBAQAogCWxpc3RfZm9yX2VhY2goZWxlLCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwogICAgICAgICAgICAgICAgIGlmKHdpbmNoLT50dHkgPT0gdHR5KXsKLQkJCWZyZWVfd2luY2god2luY2gpOworCQkJZnJlZV93aW5jaCh3aW5jaCwgMSk7CiAJCQlicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg0Nyw3ICs4NjgsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgJndpbmNoX2hhbmRsZXJzKXsKIAkJd2luY2ggPSBsaXN0X2VudHJ5KGVsZSwgc3RydWN0IHdpbmNoLCBsaXN0KTsKLQkJZnJlZV93aW5jaCh3aW5jaCk7CisJCWZyZWVfd2luY2god2luY2gsIDEpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKaW5kZXggZDMxOWRiMS4uMjM2YTNkZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCkBAIC0zMCw3ICszMCw3IEBACiB7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW47CiAKLQlzaW4gPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwlzaW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihzaW4gPT0gTlVMTCl7CiAJCXByaW50aygibmV3X2FkZHI6IGFsbG9jYXRpb24gb2Ygc29ja2FkZHJfaW4gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwppbmRleCA2MmU1YWQ2Li5mMzFlNzE1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKQEAgLTg2LDggKzg2LDkgQEAKIAlpbnQgbGVuOwogCiAJcmVxLT5vcmlnaW5sZW4gPSBzaXplb2YocmVxLT5vcmlnaW4pOwotCXJlcS0+bGVuID0gcmVjdmZyb20oZmQsICZyZXEtPnJlcXVlc3QsIHNpemVvZihyZXEtPnJlcXVlc3QpLCAwLAotCQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgcmVxLT5vcmlnaW4sICZyZXEtPm9yaWdpbmxlbik7CisJcmVxLT5sZW4gPSByZWN2ZnJvbShmZCwgJnJlcS0+cmVxdWVzdCwgc2l6ZW9mKHJlcS0+cmVxdWVzdCksCisJCQkgICAgTVNHX0RPTlRXQUlULCAoc3RydWN0IHNvY2thZGRyICopIHJlcS0+b3JpZ2luLAorCQkJICAgICZyZXEtPm9yaWdpbmxlbik7CiAJaWYgKHJlcS0+bGVuIDwgMCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKaW5kZXggMzUwM2NmZi4uZGE5NDZlMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCX0KIAlwZV9kYXRhLmNsb3NlX21lID0gZmRzWzBdOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmRzWzFdOwotCXBpZCA9IHJ1bl9oZWxwZXIoY2hhbmdlX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihjaGFuZ2VfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2KTsKIAogCWlmIChwaWQgPiAwKQkvKiBBdm9pZCBoYW5nIGFzIHdlIHdvbid0IGdldCBkYXRhIGluIGZhaWx1cmUgY2FzZS4gKi8KIAkJcmVhZF9vdXRwdXQoZmRzWzBdLCBvdXRwdXQsIG91dHB1dF9sZW4pOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCW5ldG1hc2tbMl0sIG5ldG1hc2tbM10pOwogCiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCkKIAkJcHJpbnRrKCJjaGFuZ2UgOiBmYWlsZWQgdG8gYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlclxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYwppbmRleCA0ODNhYTE1Li4xMzE2NDU2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCkBAIC01Myw3ICs1Myw3IEBACiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCi0JCXByaS0+Y29tcGlsZWQgPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3Byb2dyYW0pKTsKKwkJcHJpLT5jb21waWxlZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ3JhbSksIFVNX0dGUF9LRVJORUwpOwogCQlpZihwcmktPmNvbXBpbGVkID09IE5VTEwpewogCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJwY2FwX29wZW4gOiBrbWFsbG9jIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYwppbmRleCAzZjYzNTdkLi5jNzk5YjAwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCkBAIC01MCw3ICs1MCw3IEBACiAJaWYoa2Vybl9kYXRhID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKQogCQlnb3RvIGVycjsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAJCXsgLnNvY2tfZmQgIAkJPSBuZXcsCiAJCSAgLnBpcGVfZmQgCQk9IHNvY2tldFsxXSB9KTsKIAotCWVyciA9IHJ1bl9oZWxwZXIocG9ydF9wcmVfZXhlYywgJmRhdGEsIGFyZ3YsIE5VTEwpOworCWVyciA9IHJ1bl9oZWxwZXIocG9ydF9wcmVfZXhlYywgJmRhdGEsIGFyZ3YpOwogCWlmKGVyciA8IDApCiAJCWdvdG8gb3V0X3NodXRkb3duOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKaW5kZXggZGY0OTc2Yy4uMWUzZmQ2MSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3B0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKQEAgLTcsMTIgKzcsMTQgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAidXNlci5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBwdHlfY2hhbiB7CkBAIC0yNywxMiArMjksMTQgQEAKIHsKIAlzdHJ1Y3QgcHR5X2NoYW4gKmRhdGE7CiAKLQlkYXRhID0gdW1fa21hbGxvYyhzaXplb2YoKmRhdGEpKTsKLQlpZihkYXRhID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBVTV9HRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwogCSpkYXRhID0gKChzdHJ1Y3QgcHR5X2NoYW4pIHsgLmFubm91bmNlICAJPSBvcHRzLT5hbm5vdW5jZSwgCiAJCQkJICAgICAuZGV2ICAJCT0gZGV2aWNlLAogCQkJCSAgICAgLnJhdyAgCQk9IG9wdHMtPnJhdyB9KTsKLQlyZXR1cm4oZGF0YSk7CisJcmV0dXJuIGRhdGE7CiB9CiAKIHN0YXRpYyBpbnQgcHRzX29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKQEAgLTQzLDMxICs0NywzNSBAQAogCWludCBmZCwgZXJyOwogCiAJZmQgPSBnZXRfcHR5KCk7Ci0JaWYoZmQgPCAwKXsKKwlpZiAoZmQgPCAwKSB7CiAJCWVyciA9IC1lcnJubzsKLQkJcHJpbnRrKCJvcGVuX3B0cyA6IEZhaWxlZCB0byBvcGVuIHB0c1xuIik7CisJCXByaW50ayhVTV9LRVJOX0VSUiAib3Blbl9wdHMgOiBGYWlsZWQgdG8gb3BlbiBwdHNcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlpZihkYXRhLT5yYXcpeworCisJaWYgKGRhdGEtPnJhdykgewogCQlDQVRDSF9FSU5UUihlcnIgPSB0Y2dldGF0dHIoZmQsICZkYXRhLT50dCkpOwotCQlpZihlcnIpCi0JCQlyZXR1cm4oZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJZXJyID0gcmF3KGZkKTsKLQkJaWYoZXJyKQotCQkJcmV0dXJuKGVycik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCWRldiA9IHB0c25hbWUoZmQpOwogCXNwcmludGYoZGF0YS0+ZGV2X25hbWUsICIlcyIsIGRldik7CiAJKmRldl9vdXQgPSBkYXRhLT5kZXZfbmFtZTsKKwogCWlmIChkYXRhLT5hbm5vdW5jZSkKIAkJKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOwotCXJldHVybihmZCk7CisKKwlyZXR1cm4gZmQ7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0bWFzdGVyKGNoYXIgKmxpbmUpCiB7CisJc3RydWN0IHN0YXQgYnVmOwogCWNoYXIgKnB0eSwgKmJhbmssICpjcDsKIAlpbnQgbWFzdGVyLCBlcnI7CiAKQEAgLTc1LDI0ICs4MywyOSBAQAogCWZvciAoYmFuayA9ICJwcXJzIjsgKmJhbms7IGJhbmsrKykgewogCQlsaW5lW3N0cmxlbigiL2Rldi9wdHkiKV0gPSAqYmFuazsKIAkJKnB0eSA9ICcwJzsKLQkJaWYgKG9zX3N0YXRfZmlsZShsaW5lLCBOVUxMKSA8IDApCisJCS8qIERpZCB3ZSBoaXQgdGhlIGVuZCA/ICovCisJCWlmICgoc3RhdChsaW5lLCAmYnVmKSA8IDApICYmIChlcnJubyA9PSBFTk9FTlQpKQogCQkJYnJlYWs7CisKIAkJZm9yIChjcCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsgKmNwOyBjcCsrKSB7CiAJCQkqcHR5ID0gKmNwOwotCQkJbWFzdGVyID0gb3Nfb3Blbl9maWxlKGxpbmUsIG9mX3Jkd3IoT1BFTkZMQUdTKCkpLCAwKTsKKwkJCW1hc3RlciA9IG9wZW4obGluZSwgT19SRFdSKTsKIAkJCWlmIChtYXN0ZXIgPj0gMCkgewogCQkJCWNoYXIgKnRwID0gJmxpbmVbc3RybGVuKCIvZGV2LyIpXTsKIAogCQkJCS8qIHZlcmlmeSBzbGF2ZSBzaWRlIGlzIHVzYWJsZSAqLwogCQkJCSp0cCA9ICd0JzsKLQkJCQllcnIgPSBvc19hY2Nlc3MobGluZSwgT1NfQUNDX1JXX09LKTsKKwkJCQllcnIgPSBhY2Nlc3MobGluZSwgUl9PSyB8IFdfT0spOwogCQkJCSp0cCA9ICdwJzsKLQkJCQlpZihlcnIgPT0gMCkgcmV0dXJuKG1hc3Rlcik7Ci0JCQkJKHZvaWQpIG9zX2Nsb3NlX2ZpbGUobWFzdGVyKTsKKwkJCQlpZighZXJyKQorCQkJCQlyZXR1cm4gbWFzdGVyOworCQkJCWNsb3NlKG1hc3Rlcik7CiAJCQl9CiAJCX0KIAl9Ci0JcmV0dXJuKC0xKTsKKworCXByaW50ayhVTV9LRVJOX0VSUiAiZ2V0bWFzdGVyIC0gbm8gdXNhYmxlIGhvc3QgcHR5IGRldmljZXNcbiIpOworCXJldHVybiAtRU5PRU5UOwogfQogCiBzdGF0aWMgaW50IHB0eV9vcGVuKGludCBpbnB1dCwgaW50IG91dHB1dCwgaW50IHByaW1hcnksIHZvaWQgKmQsCkBAIC0xMDMsMjAgKzExNiwyMiBAQAogCWNoYXIgZGV2W3NpemVvZigiL2Rldi9wdHl4eFwwIildID0gIi9kZXYvcHR5eHgiOwogCiAJZmQgPSBnZXRtYXN0ZXIoZGV2KTsKLQlpZihmZCA8IDApCi0JCXJldHVybigtZXJybm8pOworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKIAogCWlmKGRhdGEtPnJhdyl7CiAJCWVyciA9IHJhdyhmZCk7Ci0JCWlmKGVycikKLQkJCXJldHVybihlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAJCi0JaWYoZGF0YS0+YW5ub3VuY2UpICgqZGF0YS0+YW5ub3VuY2UpKGRldiwgZGF0YS0+ZGV2KTsKKwlpZiAoZGF0YS0+YW5ub3VuY2UpCisJCSgqZGF0YS0+YW5ub3VuY2UpKGRldiwgZGF0YS0+ZGV2KTsKIAogCXNwcmludGYoZGF0YS0+ZGV2X25hbWUsICIlcyIsIGRldik7CiAJKmRldl9vdXQgPSBkYXRhLT5kZXZfbmFtZTsKLQlyZXR1cm4oZmQpOworCisJcmV0dXJuIGZkOwogfQogCiBjb25zdCBzdHJ1Y3QgY2hhbl9vcHMgcHR5X29wcyA9IHsKQEAgLTE0NCwxNCArMTU5LDMgQEAKIAkuZnJlZQkJPSBnZW5lcmljX2ZyZWUsCiAJLndpbmNoCQk9IDAsCiB9OwotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCmluZGV4IDc4ZjBlNTEuLmMwYjczYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKQEAgLTg1LDEzICs4NSwxMyBAQAogCXBlX2RhdGEuc3RkaW4gPSBmZDsKIAlwZV9kYXRhLnN0ZG91dCA9IGZkc1sxXTsKIAlwZV9kYXRhLmNsb3NlX21lID0gZmRzWzBdOwotCWVyciA9IHJ1bl9oZWxwZXIoc2xpcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YsIE5VTEwpOworCWVyciA9IHJ1bl9oZWxwZXIoc2xpcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YpOwogCWlmKGVyciA8IDApCiAJCWdvdG8gb3V0X2Nsb3NlOwogCXBpZCA9IGVycjsKIAogCW91dHB1dF9sZW4gPSBVTV9LRVJOX1BBR0VfU0laRTsKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKG91dHB1dF9sZW4pOworCW91dHB1dCA9IGttYWxsb2Mob3V0cHV0X2xlbiwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYob3V0cHV0ID09IE5VTEwpewogCQlwcmludGsoInNsaXBfdHJhbXAgOiBmYWlsZWQgdG8gYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlclxuIik7CiAJCW9zX2tpbGxfcHJvY2VzcyhwaWQsIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKaW5kZXggMzlmODg5Zi4uMGU0NjJmNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCkBAIC00Miw3ICs0Miw3IEBACiAKIAlwZV9kYXRhLnN0ZGluID0gZmQ7CiAJcGVfZGF0YS5zdGRvdXQgPSBmZDsKLQlwaWQgPSBydW5faGVscGVyKHNsaXJwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihzbGlycF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YpOwogCiAJcmV0dXJuKHBpZCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc3NsLmMgYi9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKaW5kZXggZmQwOWFkOS4uODc1ZDYwZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NzbC5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zc2wuYwpAQCAtNDIsOCArNDIsNiBAQAogCS5hbm5vdW5jZSAJPSBzc2xfYW5ub3VuY2UsCiAJLnh0ZXJtX3RpdGxlCT0gIlNlcmlhbCBMaW5lICMlZCIsCiAJLnJhdwkJPSAxLAotCS50cmFtcF9zdGFjayAJPSAwLAotCS5pbl9rZXJuZWwgCT0gMSwKIH07CiAKIHN0YXRpYyBpbnQgc3NsX2NvbmZpZyhjaGFyICpzdHIsIGNoYXIgKiplcnJvcl9vdXQpOwpAQCAtOTksNyArOTcsMTMgQEAKIAogc3RhdGljIGludCBzc2xfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlyZXR1cm4gbGluZV9vcGVuKHNlcmlhbF9saW5lcywgdHR5KTsKKwlpbnQgZXJyID0gbGluZV9vcGVuKHNlcmlhbF9saW5lcywgdHR5KTsKKworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG9wZW4gc2VyaWFsIGxpbmUgJWQsIGVyciA9ICVkXG4iLAorCQkgICAgICAgdHR5LT5pbmRleCwgZXJyKTsKKworCXJldHVybiBlcnI7CiB9CiAKICNpZiAwCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwppbmRleCAyYmI0MTkzLi42NTYwMzZlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKQEAgLTQ2LDggKzQ2LDYgQEAKIAkuYW5ub3VuY2UgCT0gc3RkaW9fYW5ub3VuY2UsCiAJLnh0ZXJtX3RpdGxlCT0gIlZpcnR1YWwgQ29uc29sZSAjJWQiLAogCS5yYXcJCT0gMSwKLQkudHJhbXBfc3RhY2sgCT0gMCwKLQkuaW5fa2VybmVsIAk9IDEsCiB9OwogCiBzdGF0aWMgaW50IGNvbl9jb25maWcoY2hhciAqc3RyLCBjaGFyICoqZXJyb3Jfb3V0KTsKQEAgLTEwMSw3ICs5OSwxMiBAQAogCiBzdGF0aWMgaW50IGNvbl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXJldHVybiBsaW5lX29wZW4odnRzLCB0dHkpOworCWludCBlcnIgPSBsaW5lX29wZW4odnRzLCB0dHkpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG9wZW4gY29uc29sZSAlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICB0dHktPmluZGV4LCBlcnIpOworCisJcmV0dXJuIGVycjsKIH0KIAogLyogU2V0IGluIGFuIGluaXRjYWxsLCBjaGVja2VkIGluIGFuIGV4aXRjYWxsICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKaW5kZXggYzA3ZDBkNS4uYTlmODdlMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwpAQCAtMjksNyArMjksNyBAQAogCX0KIAlzdHIrKzsKIAotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOwogCWlmKGRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJKmRhdGEgPSAoKHN0cnVjdCB0dHlfY2hhbikgeyAuZGV2IAk9IHN0ciwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKaW5kZXggMmUwOWYxNi4uZmMyN2Y2YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKQEAgLTcxMiw2ICs3MTIsOCBAQAogCXViZF9kZXYtPnF1ZXVlLT5xdWV1ZWRhdGEgPSB1YmRfZGV2OwogCiAJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyh1YmRfZGV2LT5xdWV1ZSwgTUFYX1NHKTsKKwlpZih1YmRfZGV2LT5jb3cuZmlsZSAhPSBOVUxMKQorCQlibGtfcXVldWVfbWF4X3NlY3RvcnModWJkX2Rldi0+cXVldWUsIDggKiBzaXplb2YobG9uZykpOwogCWVyciA9IHViZF9kaXNrX3JlZ2lzdGVyKE1BSk9SX05SLCB1YmRfZGV2LT5zaXplLCBuLCAmdWJkX2dlbmRpc2tbbl0pOwogCWlmKGVycil7CiAJCSplcnJvcl9vdXQgPSAiRmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSI7CkBAIC0xMDgzLDcgKzEwODUsNyBAQAogewogCXN0cnVjdCBpb190aHJlYWRfcmVxICppb19yZXE7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKLQlpbnQgbjsKKwlpbnQgbiwgbGFzdF9zZWN0b3JzOwogCiAJd2hpbGUoMSl7CiAJCXN0cnVjdCB1YmQgKmRldiA9IHEtPnF1ZXVlZGF0YTsKQEAgLTEwOTksOSArMTEwMSwxMSBAQAogCQl9CiAKIAkJcmVxID0gZGV2LT5yZXF1ZXN0OworCQlsYXN0X3NlY3RvcnMgPSAwOwogCQl3aGlsZShkZXYtPnN0YXJ0X3NnIDwgZGV2LT5lbmRfc2cpewogCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZkZXYtPnNnW2Rldi0+c3RhcnRfc2ddOwogCisJCQlyZXEtPnNlY3RvciArPSBsYXN0X3NlY3RvcnM7CiAJCQlpb19yZXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9fdGhyZWFkX3JlcSksCiAJCQkJCSBHRlBfQVRPTUlDKTsKIAkJCWlmKGlvX3JlcSA9PSBOVUxMKXsKQEAgLTExMTMsNiArMTExNyw3IEBACiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcS0+c2VjdG9yIDw8IDksCiAJCQkJCXNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsIHNnLT5wYWdlKTsKIAorCQkJbGFzdF9zZWN0b3JzID0gc2ctPmxlbmd0aCA+PiA5OwogCQkJbiA9IG9zX3dyaXRlX2ZpbGUodGhyZWFkX2ZkLCAmaW9fcmVxLAogCQkJCQkgIHNpemVvZihzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqKSk7CiAJCQlpZihuICE9IHNpemVvZihzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqKSl7CkBAIC0xMTI0LDcgKzExMjksNiBAQAogCQkJCXJldHVybjsKIAkJCX0KIAotCQkJcmVxLT5zZWN0b3IgKz0gc2ctPmxlbmd0aCA+PiA5OwogCQkJZGV2LT5zdGFydF9zZysrOwogCQl9CiAJCWRldi0+ZW5kX3NnID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKaW5kZXggNDcwN2IzZi4uNDFkMjU0YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKQEAgLTQzLDYgKzQzLDEyIEBACiAJa2VybmVsX2ZkID0gZmRzWzBdOwogCSpmZF9vdXQgPSBmZHNbMV07CiAKKwllcnIgPSBvc19zZXRfZmRfYmxvY2soKmZkX291dCwgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoInN0YXJ0X2lvX3RocmVhZCAtIGZhaWxlZCB0byBzZXQgbm9uYmxvY2tpbmcgSS9PLlxuIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKwogCXBpZCA9IGNsb25lKGlvX3RocmVhZCwgKHZvaWQgKikgc3AsIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0gfCBTSUdDSExELAogCQkgICAgTlVMTCk7CiAJaWYocGlkIDwgMCl7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYyBiL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCmluZGV4IDU3MWMyYjMuLmZkODE3ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCkBAIC0xLDIyICsxLDIwIEBACiAvKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgImluaXQuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAieHRlcm0uaCIKKyNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogCiBzdHJ1Y3QgeHRlcm1fY2hhbiB7CiAJaW50IHBpZDsKQEAgLTI1LDI1ICsyMywyMSBAQAogCWludCBkZXZpY2U7CiAJaW50IHJhdzsKIAlzdHJ1Y3QgdGVybWlvcyB0dDsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwotCWludCBkaXJlY3RfcmN2OwogfTsKIAotLyogTm90IHN0YXRpYyBiZWNhdXNlIGl0J3MgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB0dCBtb2RlIGdkYiBjb2RlICovCi12b2lkICp4dGVybV9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKK3N0YXRpYyB2b2lkICp4dGVybV9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKIHsKIAlzdHJ1Y3QgeHRlcm1fY2hhbiAqZGF0YTsKIAogCWRhdGEgPSBtYWxsb2Moc2l6ZW9mKCpkYXRhKSk7Ci0JaWYoZGF0YSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7Ci0JKmRhdGEgPSAoKHN0cnVjdCB4dGVybV9jaGFuKSB7IC5waWQgCQk9IC0xLCAKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX2NoYW4pIHsgLnBpZCAJCT0gLTEsCiAJCQkJICAgICAgIC5oZWxwZXJfcGlkIAk9IC0xLAotCQkJCSAgICAgICAuZGV2aWNlIAkJPSBkZXZpY2UsIAorCQkJCSAgICAgICAuZGV2aWNlIAkJPSBkZXZpY2UsCiAJCQkJICAgICAgIC50aXRsZSAJCT0gb3B0cy0+eHRlcm1fdGl0bGUsCi0JCQkJICAgICAgIC5yYXcgIAkJPSBvcHRzLT5yYXcsCi0JCQkJICAgICAgIC5zdGFjayAJCT0gb3B0cy0+dHJhbXBfc3RhY2ssCi0JCQkJICAgICAgIC5kaXJlY3RfcmN2IAk9ICFvcHRzLT5pbl9rZXJuZWwgfSApOwotCXJldHVybihkYXRhKTsKKwkJCQkgICAgICAgLnJhdyAgCQk9IG9wdHMtPnJhdyB9ICk7CisJcmV0dXJuIGRhdGE7CiB9CiAKIC8qIE9ubHkgY2hhbmdlZCBieSB4dGVybV9zZXR1cCwgd2hpY2ggaXMgYSBzZXR1cCAqLwpAQCAtNTcsMTYgKzUxLDIyIEBACiAJdGVybWluYWxfZW11bGF0b3IgPSBsaW5lOwogCiAJbGluZSA9IHN0cmNocihsaW5lLCAnLCcpOwotCWlmKGxpbmUgPT0gTlVMTCkgcmV0dXJuKDApOworCWlmIChsaW5lID09IE5VTEwpCisJCXJldHVybiAwOworCiAJKmxpbmUrKyA9ICdcMCc7Ci0JaWYoKmxpbmUpIHRpdGxlX3N3aXRjaCA9IGxpbmU7CisJaWYgKCpsaW5lKQorCQl0aXRsZV9zd2l0Y2ggPSBsaW5lOwogCiAJbGluZSA9IHN0cmNocihsaW5lLCAnLCcpOwotCWlmKGxpbmUgPT0gTlVMTCkgcmV0dXJuKDApOwotCSpsaW5lKysgPSAnXDAnOwotCWlmKCpsaW5lKSBleGVjX3N3aXRjaCA9IGxpbmU7CisJaWYgKGxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAKLQlyZXR1cm4oMCk7CisJKmxpbmUrKyA9ICdcMCc7CisJaWYgKCpsaW5lKQorCQlleGVjX3N3aXRjaCA9IGxpbmU7CisKKwlyZXR1cm4gMDsKIH0KIAogX191bWxfc2V0dXAoInh0ZXJtPSIsIHh0ZXJtX3NldHVwLApAQCAtODIsMTA3ICs4MiwxMjggQEAKICIgICAgYXJlICd4dGVybT1nbm9tZS10ZXJtaW5hbCwtdCwteCcuXG5cbiIKICk7CiAKLS8qIFhYWCBUaGlzIGJhZGx5IG5lZWRzIHNvbWUgY2xlYW5pbmcgdXAgaW4gdGhlIGVycm9yIHBhdGhzCi0gKiBOb3Qgc3RhdGljIGJlY2F1c2UgaXQncyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHR0IG1vZGUgZ2RiIGNvZGUKLSAqLwotaW50IHh0ZXJtX29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKK3N0YXRpYyBpbnQgeHRlcm1fb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLAogCQkgICAgICBjaGFyICoqZGV2X291dCkKIHsKIAlzdHJ1Y3QgeHRlcm1fY2hhbiAqZGF0YSA9IGQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgcGlkLCBmZCwgbmV3LCBlcnI7CiAJY2hhciB0aXRsZVsyNTZdLCBmaWxlW10gPSAiL3RtcC94dGVybS1waXBlWFhYWFhYIjsKLQljaGFyICphcmd2W10gPSB7IHRlcm1pbmFsX2VtdWxhdG9yLCB0aXRsZV9zd2l0Y2gsIHRpdGxlLCBleGVjX3N3aXRjaCwgCisJY2hhciAqYXJndltdID0geyB0ZXJtaW5hbF9lbXVsYXRvciwgdGl0bGVfc3dpdGNoLCB0aXRsZSwgZXhlY19zd2l0Y2gsCiAJCQkgIi91c3IvbGliL3VtbC9wb3J0LWhlbHBlciIsICItdW1sLXNvY2tldCIsCiAJCQkgZmlsZSwgTlVMTCB9OwogCi0JaWYob3NfYWNjZXNzKGFyZ3ZbNF0sIE9TX0FDQ19YX09LKSA8IDApCisJaWYgKGFjY2Vzcyhhcmd2WzRdLCBYX09LKSA8IDApCiAJCWFyZ3ZbNF0gPSAicG9ydC1oZWxwZXIiOwogCiAJLyogQ2hlY2sgdGhhdCBESVNQTEFZIGlzIHNldCwgdGhpcyBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgeHRlcm0KIAkgKiB3aWxsIHdvcmsgYnV0IHcvbyBpdCB3ZSBjYW4gYmUgcHJldHR5IHN1cmUgaXQgd29uJ3QuICovCi0JaWYgKCFnZXRlbnYoIkRJU1BMQVkiKSkgewotCQlwcmludGsoInh0ZXJtX29wZW46ICRESVNQTEFZIG5vdCBzZXQuXG4iKTsKKwlpZiAoZ2V0ZW52KCJESVNQTEFZIikgPT0gTlVMTCkgeworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW46ICRESVNQTEFZIG5vdCBzZXQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJLyoKKwkgKiBUaGlzIGJ1c2luZXNzIG9mIGdldHRpbmcgYSBkZXNjcmlwdG9yIHRvIGEgdGVtcCBmaWxlLAorCSAqIGRlbGV0aW5nIHRoZSBmaWxlIGFuZCBjbG9zaW5nIHRoZSBkZXNjcmlwdG9yIGlzIGp1c3QgdG8gZ2V0CisJICogYSBrbm93bi11bnVzZWQgbmFtZSBmb3IgdGhlIFVuaXggc29ja2V0IHRoYXQgd2UgcmVhbGx5CisJICogd2FudC4KKwkgKi8KIAlmZCA9IG1rc3RlbXAoZmlsZSk7Ci0JaWYoZmQgPCAwKXsKKwlpZiAoZmQgPCAwKSB7CiAJCWVyciA9IC1lcnJubzsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogbWtzdGVtcCBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogbWtzdGVtcCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgICBlcnJubyk7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYodW5saW5rKGZpbGUpKXsKKwlpZiAodW5saW5rKGZpbGUpKSB7CiAJCWVyciA9IC1lcnJubzsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogdW5saW5rIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiB1bmxpbmsgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkgICAgICAgZXJybm8pOwogCQlyZXR1cm4gZXJyOwogCX0KLQlvc19jbG9zZV9maWxlKGZkKTsKKwljbG9zZShmZCk7CiAKIAlmZCA9IG9zX2NyZWF0ZV91bml4X3NvY2tldChmaWxlLCBzaXplb2YoZmlsZSksIDEpOwotCWlmKGZkIDwgMCl7Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IGNyZWF0ZV91bml4X3NvY2tldCBmYWlsZWQsIGVycm5vID0gJWRcbiIsIAotCQkgICAgICAgLWZkKTsKLQkJcmV0dXJuKGZkKTsKKwlpZiAoZmQgPCAwKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IGNyZWF0ZV91bml4X3NvY2tldCBmYWlsZWQsICIKKwkJICAgICAgICJlcnJubyA9ICVkXG4iLCAtZmQpOworCQlyZXR1cm4gZmQ7CiAJfQogCiAJc3ByaW50Zih0aXRsZSwgZGF0YS0+dGl0bGUsIGRhdGEtPmRldmljZSk7Ci0Jc3RhY2sgPSBkYXRhLT5zdGFjazsKLQlwaWQgPSBydW5faGVscGVyKE5VTEwsIE5VTEwsIGFyZ3YsICZzdGFjayk7Ci0JaWYocGlkIDwgMCl7Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IHJ1bl9oZWxwZXIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCAtcGlkKTsKLQkJcmV0dXJuKHBpZCk7CisJcGlkID0gcnVuX2hlbHBlcihOVUxMLCBOVUxMLCBhcmd2KTsKKwlpZiAocGlkIDwgMCkgeworCQllcnIgPSBwaWQ7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IHJ1bl9oZWxwZXIgZmFpbGVkLCAiCisJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgLWVycik7CisJCWdvdG8gb3V0X2Nsb3NlMTsKIAl9CiAKLQlpZiAoZGF0YS0+ZGlyZWN0X3JjdikgewotCQluZXcgPSBvc19yY3ZfZmQoZmQsICZkYXRhLT5oZWxwZXJfcGlkKTsKLQl9IGVsc2UgewotCQllcnIgPSBvc19zZXRfZmRfYmxvY2soZmQsIDApOwotCQlpZihlcnIgPCAwKXsKLQkJCXByaW50aygieHRlcm1fb3BlbiA6IGZhaWxlZCB0byBzZXQgZGVzY3JpcHRvciAiCi0JCQkgICAgICAgIm5vbi1ibG9ja2luZywgZXJyID0gJWRcbiIsIC1lcnIpOwotCQkJcmV0dXJuKGVycik7Ci0JCX0KLQkJbmV3ID0geHRlcm1fZmQoZmQsICZkYXRhLT5oZWxwZXJfcGlkKTsKKwllcnIgPSBvc19zZXRfZmRfYmxvY2soZmQsIDApOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IGZhaWxlZCB0byBzZXQgZGVzY3JpcHRvciAiCisJCSAgICAgICAibm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCWdvdG8gb3V0X2tpbGw7CiAJfQotCWlmKG5ldyA8IDApewotCQlwcmludGsoInh0ZXJtX29wZW4gOiBvc19yY3ZfZmQgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLW5ldyk7Ci0JCWdvdG8gb3V0OworCisJbmV3ID0geHRlcm1fZmQoZmQsICZkYXRhLT5oZWxwZXJfcGlkKTsKKwlpZiAobmV3IDwgMCkgeworCQllcnIgPSBuZXc7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IG9zX3Jjdl9mZCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkgICAgICAgLWVycik7CisJCWdvdG8gb3V0X2tpbGw7CisJfQorCisJZXJyID0gb3Nfc2V0X2ZkX2Jsb2NrKG5ldywgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBmYWlsZWQgdG8gc2V0IHh0ZXJtICIKKwkJICAgICAgICJkZXNjcmlwdG9yIG5vbi1ibG9ja2luZywgZXJyID0gJWRcbiIsIC1lcnIpOworCQlnb3RvIG91dF9jbG9zZTI7CiAJfQogCiAJQ0FUQ0hfRUlOVFIoZXJyID0gdGNnZXRhdHRyKG5ldywgJmRhdGEtPnR0KSk7Ci0JaWYoZXJyKXsKKwlpZiAoZXJyKSB7CiAJCW5ldyA9IGVycjsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2Nsb3NlMjsKIAl9CiAKLQlpZihkYXRhLT5yYXcpeworCWlmIChkYXRhLT5yYXcpIHsKIAkJZXJyID0gcmF3KG5ldyk7Ci0JCWlmKGVycil7CisJCWlmIChlcnIpIHsKIAkJCW5ldyA9IGVycjsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfY2xvc2UyOwogCQl9CiAJfQogCisJdW5saW5rKGZpbGUpOwogCWRhdGEtPnBpZCA9IHBpZDsKIAkqZGV2X291dCA9IE5VTEw7Ci0gb3V0OgotCXVubGluayhmaWxlKTsKLQlyZXR1cm4obmV3KTsKKworCXJldHVybiBuZXc7CisKKyBvdXRfY2xvc2UyOgorCWNsb3NlKG5ldyk7Cisgb3V0X2tpbGw6CisJb3Nfa2lsbF9wcm9jZXNzKHBpZCwgMSk7Cisgb3V0X2Nsb3NlMToKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gZXJyOwogfQogCi0vKiBOb3Qgc3RhdGljIGJlY2F1c2UgaXQncyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHR0IG1vZGUgZ2RiIGNvZGUgKi8KLXZvaWQgeHRlcm1fY2xvc2UoaW50IGZkLCB2b2lkICpkKQorc3RhdGljIHZvaWQgeHRlcm1fY2xvc2UoaW50IGZkLCB2b2lkICpkKQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhID0gZDsKIAkKLQlpZihkYXRhLT5waWQgIT0gLTEpIAorCWlmIChkYXRhLT5waWQgIT0gLTEpCiAJCW9zX2tpbGxfcHJvY2VzcyhkYXRhLT5waWQsIDEpOwogCWRhdGEtPnBpZCA9IC0xOwotCWlmKGRhdGEtPmhlbHBlcl9waWQgIT0gLTEpIAorCisJaWYgKGRhdGEtPmhlbHBlcl9waWQgIT0gLTEpCiAJCW9zX2tpbGxfcHJvY2VzcyhkYXRhLT5oZWxwZXJfcGlkLCAwKTsKIAlkYXRhLT5oZWxwZXJfcGlkID0gLTE7CisKIAlvc19jbG9zZV9maWxlKGZkKTsKIH0KIApAQCAtMjAzLDE0ICsyMjQsMyBAQAogCS5mcmVlCQk9IHh0ZXJtX2ZyZWUsCiAJLndpbmNoCQk9IDEsCiB9OwotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy94dGVybV9rZXJuLmMKaW5kZXggYTRjZTcwNS4uYjY0NmJjYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jCkBAIC0xLDE4ICsxLDE0IEBACiAvKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSAibGludXgvZXJybm8uaCIKLSNpbmNsdWRlICJsaW51eC9zbGFiLmgiCi0jaW5jbHVkZSAibGludXgvc2lnbmFsLmgiCi0jaW5jbHVkZSAibGludXgvaW50ZXJydXB0LmgiCi0jaW5jbHVkZSAiYXNtL2lycS5oIgotI2luY2x1ZGUgImlycV91c2VyLmgiCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSAiaXJxX2tlcm4uaCIKLSNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInh0ZXJtLmgiCiAKIHN0cnVjdCB4dGVybV93YWl0IHsKIAlzdHJ1Y3QgY29tcGxldGlvbiByZWFkeTsKQEAgLTI3LDEyICsyMywxMyBAQAogCWludCBmZDsKIAogCWZkID0gb3NfcmN2X2ZkKHh0ZXJtLT5mZCwgJnh0ZXJtLT5waWQpOwotCWlmKGZkID09IC1FQUdBSU4pCi0JCXJldHVybihJUlFfTk9ORSk7CisJaWYgKGZkID09IC1FQUdBSU4pCisJCXJldHVybiBJUlFfTk9ORTsKIAogCXh0ZXJtLT5uZXdfZmQgPSBmZDsKIAljb21wbGV0ZSgmeHRlcm0tPnJlYWR5KTsKLQlyZXR1cm4oSVJRX0hBTkRMRUQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBpbnQgeHRlcm1fZmQoaW50IHNvY2tldCwgaW50ICpwaWRfb3V0KQpAQCAtNDEsMjIgKzM4LDIxIEBACiAJaW50IGVyciwgcmV0OwogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYoZGF0YSA9PSBOVUxMKXsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieHRlcm1fZmQgOiBmYWlsZWQgdG8gYWxsb2NhdGUgeHRlcm1fd2FpdFxuIik7Ci0JCXJldHVybigtRU5PTUVNKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJLyogVGhpcyBpcyBhIGxvY2tlZCBzZW1hcGhvcmUuLi4gKi8KLQkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX3dhaXQpIAotCQl7IC5mZCAJCT0gc29ja2V0LAotCQkgIC5waWQgCQk9IC0xLAotCQkgIC5uZXdfZmQgCT0gLTEgfSk7CisJKmRhdGEgPSAoKHN0cnVjdCB4dGVybV93YWl0KSB7IC5mZCAJCT0gc29ja2V0LAorCQkJCSAgICAgICAucGlkIAkJPSAtMSwKKwkJCQkgICAgICAgLm5ld19mZAkgCT0gLTEgfSk7CiAJaW5pdF9jb21wbGV0aW9uKCZkYXRhLT5yZWFkeSk7CiAKLQllcnIgPSB1bV9yZXF1ZXN0X2lycShYVEVSTV9JUlEsIHNvY2tldCwgSVJRX1JFQUQsIHh0ZXJtX2ludGVycnVwdCwgCisJZXJyID0gdW1fcmVxdWVzdF9pcnEoWFRFUk1fSVJRLCBzb2NrZXQsIElSUV9SRUFELCB4dGVybV9pbnRlcnJ1cHQsCiAJCQkgICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwKIAkJCSAgICAgInh0ZXJtIiwgZGF0YSk7Ci0JaWYgKGVycil7CisJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgInh0ZXJtX2ZkIDogZmFpbGVkIHRvIGdldCBJUlEgZm9yIHh0ZXJtLCAiCiAJCSAgICAgICAiZXJyID0gJWRcbiIsICBlcnIpOwogCQlyZXQgPSBlcnI7CkBAIC03NiwxNiArNzIsNSBAQAogIG91dDoKIAlrZnJlZShkYXRhKTsKIAotCXJldHVybihyZXQpOworCXJldHVybiByZXQ7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmggYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKaW5kZXggYzRiNDFiYi4uNjI0YjUxMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaApAQCAtNDAsNyArNDAsNyBAQAogZXh0ZXJuIHZvaWQgZGVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIHJlYWN0aXZhdGVfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGlycSk7CiBleHRlcm4gdm9pZCBjaGFuX2VuYWJsZV93aW5jaChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1leHRlcm4gdm9pZCBlbmFibGVfY2hhbihzdHJ1Y3QgbGluZSAqbGluZSk7CitleHRlcm4gaW50IGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKTsKIGV4dGVybiB2b2lkIGNsb3NlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBkZWxheV9mcmVlX2lycSk7CiBleHRlcm4gaW50IGNoYW5fd2luZG93X3NpemUoc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIAogCQkJICAgICB1bnNpZ25lZCBzaG9ydCAqcm93c19vdXQsIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oCmluZGV4IDM4ZjE2ZDguLjVhMjI2M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmgKQEAgLTEyLDggKzEyLDYgQEAKIAl2b2lkICgqY29uc3QgYW5ub3VuY2UpKGNoYXIgKmRldl9uYW1lLCBpbnQgZGV2KTsKIAljaGFyICp4dGVybV90aXRsZTsKIAljb25zdCBpbnQgcmF3OwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgdHJhbXBfc3RhY2s7Ci0JY29uc3QgaW50IGluX2tlcm5lbDsKIH07CiAKIGVudW0gY2hhbl9pbml0X3ByaSB7IElOSVRfU1RBVElDLCBJTklUX0FMTCwgSU5JVF9PTkUgfTsKQEAgLTQ0LDcgKzQyLDggQEAKIAogc3RydWN0IHR0eV9zdHJ1Y3Q7CiBleHRlcm4gdm9pZCByZWdpc3Rlcl93aW5jaChpbnQgZmQsICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiB2b2lkIHJlZ2lzdGVyX3dpbmNoX2lycShpbnQgZmQsIGludCB0dHlfZmQsIGludCBwaWQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwKKwkJCSAgICAgICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBsb25nIHN0YWNrKTsKIAogI2RlZmluZSBfX2NoYW5uZWxfaGVscChmbiwgcHJlZml4KSBcCiBfX3VtbF9oZWxwKGZuLCBwcmVmaXggIlswLTldKj08Y2hhbm5lbCBkZXNjcmlwdGlvbj5cbiIgXApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmggYi9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaAppbmRleCA3Mzc2ZWU0Li42ZWVlMzQzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaApAQCAtMjcsNiArMjcsOSBAQAogCiBERUZJTkUoVU1fTlJfQ1BVUywgTlJfQ1BVUyk7CiAKK0RFRklORShVTV9HRlBfS0VSTkVMLCBHRlBfS0VSTkVMKTsKK0RFRklORShVTV9HRlBfQVRPTUlDLCBHRlBfQVRPTUlDKTsKKwogLyogRm9yIGNyeXB0byBhc3NlbWJsZXIgY29kZS4gKi8KIERFRklORShjcnlwdG9fdGZtX2N0eF9vZmZzZXQsIG9mZnNldG9mKHN0cnVjdCBjcnlwdG9fdGZtLCBfX2NydF9jdHgpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL29zLmggYi9hcmNoL3VtL2luY2x1ZGUvb3MuaAppbmRleCA0ZDlmYjI2My4uOTMwYjI2MSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL29zLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKQEAgLTIzOSwxMSArMjM5LDkgQEAKIC8qIGV4ZWN2cC5jICovCiBleHRlcm4gaW50IGV4ZWN2cF9ub2FsbG9jKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZmlsZSwgY2hhciAqY29uc3QgYXJndltdKTsKIC8qIGhlbHBlci5jICovCi1leHRlcm4gaW50IHJ1bl9oZWxwZXIodm9pZCAoKnByZV9leGVjKSh2b2lkICopLCB2b2lkICpwcmVfZGF0YSwgY2hhciAqKmFyZ3YsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCk7CitleHRlcm4gaW50IHJ1bl9oZWxwZXIodm9pZCAoKnByZV9leGVjKSh2b2lkICopLCB2b2lkICpwcmVfZGF0YSwgY2hhciAqKmFyZ3YpOwogZXh0ZXJuIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsCi0JCQkgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0LAotCQkJICAgICBpbnQgc3RhY2tfb3JkZXIpOworCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCk7CiBleHRlcm4gaW50IGhlbHBlcl93YWl0KGludCBwaWQpOwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS91bV9tYWxsb2MuaCBiL2FyY2gvdW0vaW5jbHVkZS91bV9tYWxsb2MuaAppbmRleCBlNmQ3YzVhLi4wYWQxN2NiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCkBAIC02LDExICs2LDE3IEBACiAjaWZuZGVmIF9fVU1fTUFMTE9DX0hfXwogI2RlZmluZSBfX1VNX01BTExPQ19IX18KIAotZXh0ZXJuIHZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKTsKKyNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorCitleHRlcm4gdm9pZCAqX19rbWFsbG9jKGludCBzaXplLCBpbnQgZmxhZ3MpOworc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7Cit9CisKIGV4dGVybiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKnB0cik7CiAKLWV4dGVybiB2b2lkICp1bV92bWFsbG9jKGludCBzaXplKTsKK2V4dGVybiB2b2lkICp2bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCB2ZnJlZSh2b2lkICpwdHIpOwogCiAjZW5kaWYgLyogX19VTV9NQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnEuYyBiL2FyY2gvdW0va2VybmVsL2lycS5jCmluZGV4IGRiYTA0ZDguLjk4NzBmZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycS5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSAiaXJxX2tlcm4uaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInNpZ2lvLmgiCi0jaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAjaW5jbHVkZSAibWlzY19jb25zdGFudHMuaCIKICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDhkMmM1NDkuLmJmYTUyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlICJtb2RlLmgiCiAjaW5jbHVkZSAibW9kZV9rZXJuLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKLSNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogLyogVGhpcyBpcyBhIHBlci1jcHUgYXJyYXkuICBBIHByb2Nlc3NvciBvbmx5IG1vZGlmaWVzIGl0cyBlbnRyeSBhbmQgaXQgb25seQogICogY2FyZXMgYWJvdXQgaXRzIGVudHJ5LCBzbyBpdCdzIE9LIGlmIGFub3RoZXIgcHJvY2Vzc29yIGlzIG1vZGlmeWluZyBpdHMKQEAgLTI2MiwyMSArMjYxLDYgQEAKIHsKIH0KIAotdm9pZCAqdW1fa21hbGxvYyhpbnQgc2l6ZSkKLXsKLQlyZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLX0KLQotdm9pZCAqdW1fa21hbGxvY19hdG9taWMoaW50IHNpemUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci19Ci0KLXZvaWQgKnVtX3ZtYWxsb2MoaW50IHNpemUpCi17Ci0JcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Ci19Ci0KIGludCBfX2NhbnRfc2xlZXAodm9pZCkgewogCXJldHVybiBpbl9hdG9taWMoKSB8fCBpcnFzX2Rpc2FibGVkKCkgfHwgaW5faW50ZXJydXB0KCk7CiAJLyogSXMgaW5faW50ZXJydXB0KCkgcmVhbGx5IG5lZWRlZD8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jIGIvYXJjaC91bS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNjI3NzQyZC4uNjkxNmM4OCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcHRyYWNlLmMKQEAgLTUyLDE3ICs1Miw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovIAotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCXJldCA9IC1FSU87Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCBwKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KICAgICAgICAgY2FzZSBQVFJBQ0VfUEVFS1VTUjoKQEAgLTcyLDExICs2NCw3IEBACiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgCi0JCQkJICAgICAgMSkgIT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IDA7CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCmluZGV4IDliZjk0NGYuLmIxMjZkZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiBzdGF0aWMgaW50IGFpb19yZXFfZmRfciA9IC0xOwogc3RhdGljIGludCBhaW9fcmVxX2ZkX3cgPSAtMTsKIHN0YXRpYyBpbnQgYWlvX3BpZCA9IC0xOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWlvX3N0YWNrOwogCiBzdGF0aWMgaW50IG5vdF9haW9fdGhyZWFkKHZvaWQgKmFyZykKIHsKQEAgLTIxMiw3ICsyMTMsNiBAQAogCiBzdGF0aWMgaW50IGluaXRfYWlvXzI0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgZmRzWzJdLCBlcnI7CiAKIAllcnIgPSBvc19waXBlKGZkcywgMSwgMSk7CkBAIC0yMjcsNyArMjI3LDcgQEAKIAkJZ290byBvdXRfY2xvc2VfcGlwZTsKIAogCWVyciA9IHJ1bl9oZWxwZXJfdGhyZWFkKG5vdF9haW9fdGhyZWFkLCBOVUxMLAotCQkJCUNMT05FX0ZJTEVTIHwgQ0xPTkVfVk0gfCBTSUdDSExELCAmc3RhY2ssIDApOworCQkJCUNMT05FX0ZJTEVTIHwgQ0xPTkVfVk0gfCBTSUdDSExELCAmYWlvX3N0YWNrKTsKIAlpZihlcnIgPCAwKQogCQlnb3RvIG91dF9jbG9zZV9waXBlOwogCkBAIC0yNTIsNyArMjUyLDYgQEAKICNkZWZpbmUgREVGQVVMVF8yNF9BSU8gMAogc3RhdGljIGludCBpbml0X2Fpb18yNih2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGVycjsKIAogCWlmKGlvX3NldHVwKDI1NiwgJmN0eCkpewpAQCAtMjYzLDcgKzI2Miw3IEBACiAJfQogCiAJZXJyID0gcnVuX2hlbHBlcl90aHJlYWQoYWlvX3RocmVhZCwgTlVMTCwKLQkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJnN0YWNrLCAwKTsKKwkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJmFpb19zdGFjayk7CiAJaWYoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzY1LDggKzM2NCwxMCBAQAogCiBzdGF0aWMgdm9pZCBleGl0X2Fpbyh2b2lkKQogewotCWlmKGFpb19waWQgIT0gLTEpCisJaWYgKGFpb19waWQgIT0gLTEpIHsKIAkJb3Nfa2lsbF9wcm9jZXNzKGFpb19waWQsIDEpOworCQlmcmVlX3N0YWNrKGFpb19zdGFjaywgMCk7CisJfQogfQogCiBfX3VtbF9leGl0Y2FsbChleGl0X2Fpbyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYwppbmRleCBhY2JhMzAxLi42MWQzOTUzIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCW91dHB1dCA9IHVtX2ttYWxsb2MoVU1fS0VSTl9QQUdFX1NJWkUpOworCW91dHB1dCA9IGttYWxsb2MoVU1fS0VSTl9QQUdFX1NJWkUsIFVNX0dGUF9LRVJORUwpOwogCWlmKG91dHB1dCA9PSBOVUxMKQogCQlwcmludGsoImV0YXBfY2hhbmdlIDogRmFpbGVkIHRvIGFsbG9jYXRlIG91dHB1dCBidWZmZXJcbiIpOwogCXJlYWRfb3V0cHV0KGZkLCBvdXRwdXQsIFVNX0tFUk5fUEFHRV9TSVpFKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogCXBlX2RhdGEuY29udHJvbF9yZW1vdGUgPSBjb250cm9sX3JlbW90ZTsKIAlwZV9kYXRhLmNvbnRyb2xfbWUgPSBjb250cm9sX21lOwogCXBlX2RhdGEuZGF0YV9tZSA9IGRhdGFfbWU7Ci0JcGlkID0gcnVuX2hlbHBlcihldGFwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJncywgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihldGFwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJncyk7CiAKIAlpZihwaWQgPCAwKQogCQllcnIgPSBwaWQ7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAllcnIgPSBldGFwX3RyYW1wKHByaS0+ZGV2X25hbWUsIHByaS0+Z2F0ZV9hZGRyLCBjb250cm9sX2Zkc1swXSwgCiAJCQkgY29udHJvbF9mZHNbMV0sIGRhdGFfZmRzWzBdLCBkYXRhX2Zkc1sxXSk7CiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlyZWFkX291dHB1dChjb250cm9sX2Zkc1swXSwgb3V0cHV0LCBvdXRwdXRfbGVuKTsKIAogCWlmKG91dHB1dCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX3VzZXIuYwppbmRleCAxMWE5Nzc5Li5mODQ4YjRlIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX3VzZXIuYwpAQCAtODMsNyArODMsNyBAQAogCWRhdGEuc3Rkb3V0ID0gcmVtb3RlOwogCWRhdGEuY2xvc2VfbWUgPSBtZTsKIAotCXBpZCA9IHJ1bl9oZWxwZXIodHVudGFwX3ByZV9leGVjLCAmZGF0YSwgYXJndiwgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcih0dW50YXBfcHJlX2V4ZWMsICZkYXRhLCBhcmd2KTsKIAogCWlmKHBpZCA8IDApCiAJCXJldHVybiAtcGlkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKaW5kZXggOTdiZWQxNi4uZDgxYWY3YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCkBAIC00NCwxNyArNDQsMTMgQEAKIC8qIFJldHVybnMgZWl0aGVyIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHByb2Nlc3Mgd2UgcnVuIG9yIC1FKiBvbiBmYWlsdXJlLgogICogWFhYIFRoZSBhbGxvY19zdGFjayBoZXJlIGJyZWFrcyBpZiB0aGlzIGlzIGNhbGxlZCBpbiB0aGUgdHJhY2luZyB0aHJlYWQsIHNvCiAgKiB3ZSBuZWVkIHRvIHJlY2VpdmUgYSBwcmVhbGxvY2F0ZWQgc3RhY2sgKGEgbG9jYWwgYnVmZmVyIGlzIG9rKS4gKi8KLWludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2LAotCSAgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpCitpbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndikKIHsKIAlzdHJ1Y3QgaGVscGVyX2RhdGEgZGF0YTsKIAl1bnNpZ25lZCBsb25nIHN0YWNrLCBzcDsKIAlpbnQgcGlkLCBmZHNbMl0sIHJldCwgbjsKIAotCWlmICgoc3RhY2tfb3V0ICE9IE5VTEwpICYmICgqc3RhY2tfb3V0ICE9IDApKQotCQlzdGFjayA9ICpzdGFja19vdXQ7Ci0JZWxzZQotCQlzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKKwlzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKIAlpZiAoc3RhY2sgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTc2LDggKzcyLDggQEAKIAlkYXRhLnByZV9kYXRhID0gcHJlX2RhdGE7CiAJZGF0YS5hcmd2ID0gYXJndjsKIAlkYXRhLmZkID0gZmRzWzFdOwotCWRhdGEuYnVmID0gX19jYW50X3NsZWVwKCkgPyB1bV9rbWFsbG9jX2F0b21pYyhQQVRIX01BWCkgOgotCQkJCQl1bV9rbWFsbG9jKFBBVEhfTUFYKTsKKwlkYXRhLmJ1ZiA9IF9fY2FudF9zbGVlcCgpID8ga21hbGxvYyhQQVRIX01BWCwgVU1fR0ZQX0FUT01JQykgOgorCQkJCQlrbWFsbG9jKFBBVEhfTUFYLCBVTV9HRlBfS0VSTkVMKTsKIAlwaWQgPSBjbG9uZShoZWxwZXJfY2hpbGQsICh2b2lkICopIHNwLCBDTE9ORV9WTSB8IFNJR0NITEQsICZkYXRhKTsKIAlpZiAocGlkIDwgMCkgewogCQlyZXQgPSAtZXJybm87CkBAIC0xMTMsMjIgKzEwOSwyMSBAQAogCQljbG9zZShmZHNbMV0pOwogCWNsb3NlKGZkc1swXSk7CiBvdXRfZnJlZToKLQlpZiAoKHN0YWNrX291dCA9PSBOVUxMKSB8fCAoKnN0YWNrX291dCA9PSAwKSkKLQkJZnJlZV9zdGFjayhzdGFjaywgMCk7CisJZnJlZV9zdGFjayhzdGFjaywgMCk7CiAJcmV0dXJuIHJldDsKIH0KIAogaW50IHJ1bl9oZWxwZXJfdGhyZWFkKGludCAoKnByb2MpKHZvaWQgKiksIHZvaWQgKmFyZywgdW5zaWduZWQgaW50IGZsYWdzLAotCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQsIGludCBzdGFja19vcmRlcikKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQogewogCXVuc2lnbmVkIGxvbmcgc3RhY2ssIHNwOwogCWludCBwaWQsIHN0YXR1cywgZXJyOwogCi0Jc3RhY2sgPSBhbGxvY19zdGFjayhzdGFja19vcmRlciwgX19jYW50X3NsZWVwKCkpOworCXN0YWNrID0gYWxsb2Nfc3RhY2soMCwgX19jYW50X3NsZWVwKCkpOwogCWlmIChzdGFjayA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwID0gc3RhY2sgKyAoVU1fS0VSTl9QQUdFX1NJWkUgPDwgc3RhY2tfb3JkZXIpIC0gc2l6ZW9mKHZvaWQgKik7CisJc3AgPSBzdGFjayArIFVNX0tFUk5fUEFHRV9TSVpFIC0gc2l6ZW9mKHZvaWQgKik7CiAJcGlkID0gY2xvbmUocHJvYywgKHZvaWQgKikgc3AsIGZsYWdzIHwgU0lHQ0hMRCwgYXJnKTsKIAlpZiAocGlkIDwgMCkgewogCQllcnIgPSAtZXJybm87CkBAIC0xNDcsNyArMTQyLDcgQEAKIAkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSkKIAkJCXByaW50aygicnVuX2hlbHBlcl90aHJlYWQgLSB0aHJlYWQgcmV0dXJuZWQgc3RhdHVzICIKIAkJCSAgICAgICAiMHgleFxuIiwgc3RhdHVzKTsKLQkJZnJlZV9zdGFjayhzdGFjaywgc3RhY2tfb3JkZXIpOworCQlmcmVlX3N0YWNrKHN0YWNrLCAwKTsKIAl9IGVsc2UKIAkJKnN0YWNrX291dCA9IHN0YWNrOwogCXJldHVybiBwaWQ7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCmluZGV4IGZiNTEwZDQuLmU4NWY0OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCkBAIC0yMzUsOCArMjM1LDggQEAKIAkJcmV0dXJuIF9fcmVhbF9tYWxsb2Moc2l6ZSk7CiAJZWxzZSBpZihzaXplIDw9IFVNX0tFUk5fUEFHRV9TSVpFKQogCQkvKiBmaW5kaW5nIGNvbnRpZ3VvdXMgcGFnZXMgY2FuIGJlIGhhcmQqLwotCQlyZXQgPSB1bV9rbWFsbG9jKHNpemUpOwotCWVsc2UgcmV0ID0gdW1fdm1hbGxvYyhzaXplKTsKKwkJcmV0ID0ga21hbGxvYyhzaXplLCBVTV9HRlBfS0VSTkVMKTsKKwllbHNlIHJldCA9IHZtYWxsb2Moc2l6ZSk7CiAKIAkvKiBnbGliYyBwZW9wbGUgaW5zaXN0IHRoYXQgaWYgbWFsbG9jIGZhaWxzLCBlcnJubyBzaG91bGQgYmUKIAkgKiBzZXQgYnkgbWFsbG9jIGFzIHdlbGwuIFNvIHdlIGRvLgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCmluZGV4IDhkNGUwYzYuLmRjMDNlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKQEAgLTI2LDYgKzI2LDcgQEAKICAqIGV4aXRjYWxsLgogICovCiBzdGF0aWMgaW50IHdyaXRlX3NpZ2lvX3BpZCA9IC0xOworc3RhdGljIHVuc2lnbmVkIGxvbmcgd3JpdGVfc2lnaW9fc3RhY2s7CiAKIC8qIFRoZXNlIGFycmF5cyBhcmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBzaWdpbyB0aHJlYWQgaXMgc3RhcnRlZCwgYW5kCiAgKiB0aGUgZGVzY3JpcHRvcnMgY2xvc2VkIGFmdGVyIGl0IGlzIGtpbGxlZC4gIFNvLCBpdCBjYW4ndCBzZWUgdGhlbSBjaGFuZ2UuCkBAIC0xMDQsNyArMTA1LDcgQEAKIAlpZihuIDw9IHBvbGxzLT5zaXplKQogCQlyZXR1cm4gMDsKIAotCW5ldyA9IHVtX2ttYWxsb2NfYXRvbWljKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCW5ldyA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSwgVU1fR0ZQX0FUT01JQyk7CiAJaWYobmV3ID09IE5VTEwpewogCQlwcmludGsoIm5lZWRfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcG9sbGZkc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTQ0LDggKzE0NSwxMCBAQAogCXJldHVybjsKICBmYWlsOgogCS8qIENyaXRpY2FsIHNlY3Rpb24gc3RhcnQgKi8KLQlpZih3cml0ZV9zaWdpb19waWQgIT0gLTEpCisJaWYgKHdyaXRlX3NpZ2lvX3BpZCAhPSAtMSkgewogCQlvc19raWxsX3Byb2Nlc3Mod3JpdGVfc2lnaW9fcGlkLCAxKTsKKwkJZnJlZV9zdGFjayh3cml0ZV9zaWdpb19zdGFjaywgMCk7CisJfQogCXdyaXRlX3NpZ2lvX3BpZCA9IC0xOwogCWNsb3NlKHNpZ2lvX3ByaXZhdGVbMF0pOwogCWNsb3NlKHNpZ2lvX3ByaXZhdGVbMV0pOwpAQCAtMjMwLDcgKzIzMyw3IEBACiB7CiAJc3RydWN0IHBvbGxmZCAqcDsKIAotCXAgPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb2xsZmQpLCBVTV9HRlBfS0VSTkVMKTsKIAlpZiAocCA9PSBOVUxMKSB7CiAJCXByaW50aygic2V0dXBfaW5pdGlhbF9wb2xsIDogZmFpbGVkIHRvIGFsbG9jYXRlIHBvbGxcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTI0Myw3ICsyNDYsNiBAQAogCiBzdGF0aWMgdm9pZCB3cml0ZV9zaWdpb193b3JrYXJvdW5kKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKIAlzdHJ1Y3QgcG9sbGZkICpwOwogCWludCBlcnI7CiAJaW50IGxfd3JpdGVfc2lnaW9fZmRzWzJdOwpAQCAtMjkzLDcgKzI5NSw4IEBACiAJbWVtY3B5KHNpZ2lvX3ByaXZhdGUsIGxfc2lnaW9fcHJpdmF0ZSwgc2l6ZW9mKGxfc2lnaW9fcHJpdmF0ZSkpOwogCiAJd3JpdGVfc2lnaW9fcGlkID0gcnVuX2hlbHBlcl90aHJlYWQod3JpdGVfc2lnaW9fdGhyZWFkLCBOVUxMLAotCQkJCQkgICAgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSwgJnN0YWNrLCAwKTsKKwkJCQkJICAgIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0sCisJCQkJCSAgICAmd3JpdGVfc2lnaW9fc3RhY2spOwogCiAJaWYgKHdyaXRlX3NpZ2lvX3BpZCA8IDApCiAJCWdvdG8gb3V0X2NsZWFyOwpAQCAtMzU2LDEwICszNTksMTIgQEAKIAogc3RhdGljIHZvaWQgc2lnaW9fY2xlYW51cCh2b2lkKQogewotCWlmKHdyaXRlX3NpZ2lvX3BpZCAhPSAtMSl7Ci0JCW9zX2tpbGxfcHJvY2Vzcyh3cml0ZV9zaWdpb19waWQsIDEpOwotCQl3cml0ZV9zaWdpb19waWQgPSAtMTsKLQl9CisJaWYgKHdyaXRlX3NpZ2lvX3BpZCA9PSAtMSkKKwkJcmV0dXJuOworCisJb3Nfa2lsbF9wcm9jZXNzKHdyaXRlX3NpZ2lvX3BpZCwgMSk7CisJZnJlZV9zdGFjayh3cml0ZV9zaWdpb19zdGFjaywgMCk7CisJd3JpdGVfc2lnaW9fcGlkID0gLTE7CiB9CiAKIF9fdW1sX2V4aXRjYWxsKHNpZ2lvX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKaW5kZXggNDZjMDBjYy4uYmE5YWY4ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCkBAIC00MSw3ICs0MSw3IEBACiAJaWYocGlkICE9IG9zX2dldHBncnAoKSkKIAkJcmV0dXJuKDApOwogCi0JcmVnaXN0ZXJfd2luY2hfaXJxKC0xLCBmZCwgLTEsIGRhdGEpOworCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhLCAwKTsKIAlyZXR1cm4oMSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMgYi9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCmluZGV4IDNmMzMxNjUuLjQxOWIyZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwpAQCAtNSw3ICs1LDggQEAKICAqIHNvIEkgKm11c3QqIGRlY2xhcmUgZ29vZCBwcm90b3R5cGVzIGZvciB0aGVtIGFuZCB0aGVuIEVYUE9SVCB0aGVtLgogICogVGhlIGtlcm5lbCBjb2RlIHVzZXMgdGhlIG1hY3JvIGRlZmluZWQgYnkgaW5jbHVkZS9saW51eC9zdHJpbmcuaCwKICAqIHNvIEkgdW5kZWYgbWFjcm9zOyB0aGUgdXNlcnNwYWNlIGNvZGUgZG9lcyBub3QgaW5jbHVkZSB0aGF0IGFuZCBJCi0gKiBhZGQgYW4gRVhQT1JUIGZvciB0aGUgZ2xpYmMgb25lLiovCisgKiBhZGQgYW4gRVhQT1JUIGZvciB0aGUgZ2xpYmMgb25lLgorICovCiAKICN1bmRlZiBzdHJsZW4KICN1bmRlZiBzdHJzdHIKQEAgLTYxLDEyICs2MiwxOCBAQAogRVhQT1JUX1NZTUJPTF9QUk9UTyhfX3hzdGF0KTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX19seHN0YXQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhfX2x4c3RhdDY0KTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oX19meHN0YXQ2NCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGxzZWVrKTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8obHNlZWs2NCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGNob3duKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZmNob3duKTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8odHJ1bmNhdGUpOworRVhQT1JUX1NZTUJPTF9QUk9UTyhmdHJ1bmNhdGU2NCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHV0aW1lKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8odXRpbWVzKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZnV0aW1lcyk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGNobW9kKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZmNobW9kKTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8ocmVuYW1lKTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX194bWtub2QpOwogCkBAIC0xMDIsMTQgKzEwOSwzIEBACiAKIGV4dGVybiBsb25nIF9fZ3VhcmQgX19hdHRyaWJ1dGVfXygod2VhaykpOwogRVhQT1JUX1NZTUJPTChfX2d1YXJkKTsKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCmluZGV4IGE5YjA5MzQuLmE0NThhYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTE3LDI0ICsxMTcsMTYgQEAKIAlpbnQgcnZhbDsKIAogCXN3aXRjaCAocmVxdWVzdCkgewotCQl1bnNpZ25lZCBsb25nIHZhbCwgY29waWVkOworCQl1bnNpZ25lZCBsb25nIHZhbDsKIAogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ2YWwsIHNpemVvZih2YWwpLCAwKTsKLQkJcnZhbCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHZhbCkpCi0JCQlicmVhazsKLQkJcnZhbCA9IHB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgKilkYXRhKTsKKwkJcnZhbCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7CiAKIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcnZhbCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkKLQkJICAgID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlydmFsID0gLUVJTzsKKwkJcnZhbCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7CiAKIAkvKiBSZWFkL3dyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIEFERFIgaW4gdGhlIHJlZ2lzdGVycy4gICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9LY29uZmlnIGIvYXJjaC94ODZfNjQvS2NvbmZpZwppbmRleCA4YmRkMjVhLi4xNGJmOGNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L0tjb25maWcKQEAgLTc3NCw4ICs3NzQsOCBAQAogc291cmNlICJhcmNoL3g4Nl82NC9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCA0NzU2NWMzLi43ODJkZWE4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTUyNiw3ICs1MjYsNyBAQAogCS5xdWFkIHN5c19pbml0X21vZHVsZQogCS5xdWFkIHN5c19kZWxldGVfbW9kdWxlCiAJLnF1YWQgcXVpZXRfbmlfc3lzY2FsbAkJLyogMTMwICBnZXRfa2VybmVsX3N5bXMgKi8KLQkucXVhZCBzeXNfcXVvdGFjdGwKKwkucXVhZCBzeXMzMl9xdW90YWN0bAogCS5xdWFkIHN5c19nZXRwZ2lkCiAJLnF1YWQgc3lzX2ZjaGRpcgogCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJLyogYmRmbHVzaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKaW5kZXggMWZhYjQ4Ny4uOTQxYzg0YmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwpAQCAtNzMsNyArNzMsMTEgQEAKIAlhZGRxCSVyYnAsIGluaXRfbGV2ZWw0X3BndCArICg1MTEqOCkoJXJpcCkKIAogCWFkZHEJJXJicCwgbGV2ZWwzX2lkZW50X3BndCArIDAoJXJpcCkKKwogCWFkZHEJJXJicCwgbGV2ZWwzX2tlcm5lbF9wZ3QgKyAoNTEwKjgpKCVyaXApCisJYWRkcQklcmJwLCBsZXZlbDNfa2VybmVsX3BndCArICg1MTEqOCkoJXJpcCkKKworCWFkZHEJJXJicCwgbGV2ZWwyX2ZpeG1hcF9wZ3QgKyAoNTA2KjgpKCVyaXApCiAKIAkvKiBBZGQgYW4gSWRlbnRpdHkgbWFwcGluZyBpZiBJIGFtIGFib3ZlIDFHICovCiAJbGVhcQlfdGV4dCglcmlwKSwgJXJkaQpAQCAtMzE0LDcgKzMxOCwxNiBAQAogCS5maWxsCTUxMCw4LDAKIAkvKiAoMl40OC0oMioxMDI0KjEwMjQqMTAyNCktKCgyXjM5KSo1MTEpKS8oMl4zMCkgPSA1MTAgKi8KIAkucXVhZAlsZXZlbDJfa2VybmVsX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9LRVJOUEdfVEFCTEUKLQkuZmlsbAkxLDgsMAorCS5xdWFkCWxldmVsMl9maXhtYXBfcGd0IC0gX19TVEFSVF9LRVJORUxfbWFwICsgX1BBR0VfVEFCTEUKKworTkVYVF9QQUdFKGxldmVsMl9maXhtYXBfcGd0KQorCS5maWxsCTUwNiw4LDAKKwkucXVhZAlsZXZlbDFfZml4bWFwX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9QQUdFX1RBQkxFCisJLyogOE1CIHJlc2VydmVkIGZvciB2c3lzY2FsbHMgKyBhIDJNQiBob2xlID0gNCArIDEgZW50cmllcyAqLworCS5maWxsCTUsOCwwCisKK05FWFRfUEFHRShsZXZlbDFfZml4bWFwX3BndCkKKwkuZmlsbAk1MTIsOCwwCiAKIE5FWFRfUEFHRShsZXZlbDJfaWRlbnRfcGd0KQogCS8qIFNpbmNlIEkgZWFzaWx5IGNhbiwgbWFwIHRoZSBmaXJzdCAxRy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCA5MzFjNjRiLi5lZGJiYzU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShsb2NhbF90LCBhbGVydF9jb3VudGVyKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIG5taV90b3VjaCk7CiAKLXZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQordm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX3dhdGNoZG9nID4gMCkgewogCQl1bnNpZ25lZCBjcHU7CkBAIC0zMDYsOCArMzA2LDEwIEBACiAJCSAqIGRvIGl0IG91cnNlbHZlcyBiZWNhdXNlIHRoZSBhbGVydCBjb3VudCBpbmNyZWFzZSBpcyBub3QKIAkJICogYXRvbWljLgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCXBlcl9jcHUobm1pX3RvdWNoLCBjcHUpID0gMTsKKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCQlpZiAocGVyX2NwdShubWlfdG91Y2gsIGNwdSkgIT0gMSkKKwkJCQlwZXJfY3B1KG5taV90b3VjaCwgY3B1KSA9IDE7CisJCX0KIAl9CiAKICAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDk0MDkxMTcuLmZhNjc3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTMxMywxNyArMzEzLDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzY3LDEwICszNTksNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGFhYzFjMGIuLjc0Y2JlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMzAsNiArMzMwLDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJcHJpbnRrX2FkZHJlc3MoYWRkcik7CiB9CiAKQEAgLTUxOCw2ICs1MTksNyBAQAogCXByaW50aygiXG4iKTsKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIGVyciwgY3VycmVudC0+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+bm9kZSk7CiAJaWYgKCFjZnFkKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChjZnFkLCAwLCBzaXplb2YoKmNmcWQpKTsKLQogCWNmcWQtPnNlcnZpY2VfdHJlZSA9IENGUV9SQl9ST09UOwogCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5jaWNfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwppbmRleCA2ZDY3M2U5Li44N2NhMDJhIDEwMDY0NAotLS0gYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKKysrIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCkBAIC0zNjAsMTAgKzM2MCw5IEBACiB7CiAJc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkOwogCi0JZGQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpkZCksIEdGUF9LRVJORUwsIHEtPm5vZGUpOworCWRkID0ga21hbGxvY19ub2RlKHNpemVvZigqZGQpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKCFkZCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KGRkLCAwLCBzaXplb2YoKmRkKSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGQtPmZpZm9fbGlzdFtSRUFEXSk7CiAJSU5JVF9MSVNUX0hFQUQoJmRkLT5maWZvX2xpc3RbV1JJVEVdKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IDQ3NjlhMjUuLmQyNjU5NjMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvYmxvY2svZWxldmF0b3IuYwpAQCAtMTc3LDExICsxNzcsMTAgQEAKIAllbGV2YXRvcl90ICplcTsKIAlpbnQgaTsKIAotCWVxID0ga21hbGxvY19ub2RlKHNpemVvZihlbGV2YXRvcl90KSwgR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CisJZXEgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKGVsZXZhdG9yX3QpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKHVubGlrZWx5KCFlcSkpCiAJCWdvdG8gZXJyOwogCi0JbWVtc2V0KGVxLCAwLCBzaXplb2YoKmVxKSk7CiAJZXEtPm9wcyA9ICZlLT5vcHM7CiAJZXEtPmVsZXZhdG9yX3R5cGUgPSBlOwogCWtvYmplY3RfaW5pdCgmZXEtPmtvYmopOwpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggODYzYThjMC4uM2FmMWU3YSAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xMDgsMjggKzEwOCwyNCBAQAogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2Jsa2Rldik7CiAKLS8qIHRvZG86IG1ha2Ugdm9pZCAtIGVycm9yIHByaW50ayBoZXJlICovCi1pbnQgdW5yZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lKQordm9pZCB1bnJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQgbWFqb3IsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGJsa19tYWpvcl9uYW1lICoqbjsKIAlzdHJ1Y3QgYmxrX21ham9yX25hbWUgKnAgPSBOVUxMOwogCWludCBpbmRleCA9IG1ham9yX3RvX2luZGV4KG1ham9yKTsKLQlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJmJsb2NrX3N1YnN5c19sb2NrKTsKIAlmb3IgKG4gPSAmbWFqb3JfbmFtZXNbaW5kZXhdOyAqbjsgbiA9ICYoKm4pLT5uZXh0KQogCQlpZiAoKCpuKS0+bWFqb3IgPT0gbWFqb3IpCiAJCQlicmVhazsKLQlpZiAoISpuIHx8IHN0cmNtcCgoKm4pLT5uYW1lLCBuYW1lKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIHsKKwlpZiAoISpuIHx8IHN0cmNtcCgoKm4pLT5uYW1lLCBuYW1lKSkgeworCQlXQVJOX09OKDEpOworCX0gZWxzZSB7CiAJCXAgPSAqbjsKIAkJKm4gPSBwLT5uZXh0OwogCX0KIAltdXRleF91bmxvY2soJmJsb2NrX3N1YnN5c19sb2NrKTsKIAlrZnJlZShwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9ibGtkZXYpOwpAQCAtNzI2LDIxICs3MjIsMjEgQEAKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIAotCWRpc2sgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBnZW5kaXNrKSwgR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CisJZGlzayA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGdlbmRpc2spLAorCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBub2RlX2lkKTsKIAlpZiAoZGlzaykgewotCQltZW1zZXQoZGlzaywgMCwgc2l6ZW9mKHN0cnVjdCBnZW5kaXNrKSk7CiAJCWlmICghaW5pdF9kaXNrX3N0YXRzKGRpc2spKSB7CiAJCQlrZnJlZShkaXNrKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWlmIChtaW5vcnMgPiAxKSB7CiAJCQlpbnQgc2l6ZSA9IChtaW5vcnMgLSAxKSAqIHNpemVvZihzdHJ1Y3QgaGRfc3RydWN0ICopOwotCQkJZGlzay0+cGFydCA9IGttYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMLCBub2RlX2lkKTsKKwkJCWRpc2stPnBhcnQgPSBrbWFsbG9jX25vZGUoc2l6ZSwKKwkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbm9kZV9pZCk7CiAJCQlpZiAoIWRpc2stPnBhcnQpIHsKIAkJCQlrZnJlZShkaXNrKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KLQkJCW1lbXNldChkaXNrLT5wYXJ0LCAwLCBzaXplKTsKIAkJfQogCQlkaXNrLT5taW5vcnMgPSBtaW5vcnM7CiAJCWtvYmpfc2V0X2tzZXRfcyhkaXNrLGJsb2NrX3N1YnN5cyk7CmRpZmYgLS1naXQgYS9ibG9jay9sbF9yd19ibGsuYyBiL2Jsb2NrL2xsX3J3X2Jsay5jCmluZGV4IGVmNDJiYjIuLmQ3Y2FkZjMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2xsX3J3X2Jsay5jCisrKyBiL2Jsb2NrL2xsX3J3X2Jsay5jCkBAIC0yNTYsNiArMjU2LDcgQEAKIAlycS0+ZW5kX2lvID0gTlVMTDsKIAlycS0+ZW5kX2lvX2RhdGEgPSBOVUxMOwogCXJxLT5jb21wbGV0aW9uX2RhdGEgPSBOVUxMOworCXJxLT5uZXh0X3JxID0gTlVMTDsKIH0KIAogLyoqCkBAIC0xODI4LDExICsxODI5LDExIEBACiB7CiAJcmVxdWVzdF9xdWV1ZV90ICpxOwogCi0JcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShyZXF1ZXN0cV9jYWNoZXAsIGdmcF9tYXNrLCBub2RlX2lkKTsKKwlxID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKHJlcXVlc3RxX2NhY2hlcCwKKwkJCQlnZnBfbWFzayB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwogCWlmICghcSkKIAkJcmV0dXJuIE5VTEw7CiAKLQltZW1zZXQocSwgMCwgc2l6ZW9mKCpxKSk7CiAJaW5pdF90aW1lcigmcS0+dW5wbHVnX3RpbWVyKTsKIAogCXNucHJpbnRmKHEtPmtvYmoubmFtZSwgS09CSl9OQU1FX0xFTiwgIiVzIiwgInF1ZXVlIik7CmRpZmYgLS1naXQgYS9ibG9jay9zY3NpX2lvY3RsLmMgYi9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggZTgzZjFkYi4uYTI2YmEwNyAxMDA2NDQKLS0tIGEvYmxvY2svc2NzaV9pb2N0bC5jCisrKyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtNDEsOCArNDEsNiBAQAogCiBFWFBPUlRfU1lNQk9MKHNjc2lfY29tbWFuZF9zaXplKTsKIAotI2RlZmluZSBCTEtfREVGQVVMVF9USU1FT1VUCSg2MCAqIEhaKQotCiAjaW5jbHVkZSA8c2NzaS9zZy5oPgogCiBzdGF0aWMgaW50IHNnX2dldF92ZXJzaW9uKGludCBfX3VzZXIgKnApCkBAIC0xMTQsNyArMTEyLDcgQEAKICNkZWZpbmUgc2FmZV9mb3JfcmVhZChjbWQpCVtjbWRdID0gQ01EX1JFQURfU0FGRQogI2RlZmluZSBzYWZlX2Zvcl93cml0ZShjbWQpCVtjbWRdID0gQ01EX1dSSVRFX1NBRkUKIAotc3RhdGljIGludCB2ZXJpZnlfY29tbWFuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY2hhciAqY21kKQoraW50IGJsa192ZXJpZnlfY29tbWFuZCh1bnNpZ25lZCBjaGFyICpjbWQsIGludCBoYXNfd3JpdGVfcGVybSkKIHsKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBjbWRfdHlwZVsyNTZdID0gewogCkBAIC0xOTMsMTggKzE5MSwxMSBAQAogCQlzYWZlX2Zvcl93cml0ZShHUENNRF9TRVRfU1RSRUFNSU5HKSwKIAl9OwogCXVuc2lnbmVkIGNoYXIgdHlwZSA9IGNtZF90eXBlW2NtZFswXV07Ci0JaW50IGhhc193cml0ZV9wZXJtID0gMDsKIAogCS8qIEFueWJvZHkgd2hvIGNhbiBvcGVuIHRoZSBkZXZpY2UgY2FuIGRvIGEgcmVhZC1zYWZlIGNvbW1hbmQgKi8KIAlpZiAodHlwZSAmIENNRF9SRUFEX1NBRkUpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBmaWxlIGNhbiBiZSBOVUxMIGZyb20gaW9jdGxfYnlfYmRldigpLi4uCi0JICovCi0JaWYgKGZpbGUpCi0JCWhhc193cml0ZV9wZXJtID0gZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEU7Ci0KIAkvKiBXcml0ZS1zYWZlIGNvbW1hbmRzIGp1c3QgcmVxdWlyZSBhIHdyaXRhYmxlIG9wZW4uLiAqLwogCWlmICgodHlwZSAmIENNRF9XUklURV9TQUZFKSAmJiBoYXNfd3JpdGVfcGVybSkKIAkJcmV0dXJuIDA7CkBAIC0yMjEsMjUgKzIxMiw5NiBAQAogCS8qIE90aGVyd2lzZSBmYWlsIGl0IHdpdGggYW4gIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIiAqLwogCXJldHVybiAtRVBFUk07CiB9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfdmVyaWZ5X2NvbW1hbmQpOworCitpbnQgYmxrX2ZpbGxfc2doZHJfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCSAgICAgIHN0cnVjdCBzZ19pb19oZHIgKmhkciwgaW50IGhhc193cml0ZV9wZXJtKQoreworCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIocnEtPmNtZCwgaGRyLT5jbWRwLCBoZHItPmNtZF9sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoYmxrX3ZlcmlmeV9jb21tYW5kKHJxLT5jbWQsIGhhc193cml0ZV9wZXJtKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOworCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOworCisJcnEtPnRpbWVvdXQgPSAoaGRyLT50aW1lb3V0ICogSFopIC8gMTAwMDsKKwlpZiAoIXJxLT50aW1lb3V0KQorCQlycS0+dGltZW91dCA9IHEtPnNnX3RpbWVvdXQ7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9TR19USU1FT1VUOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfZmlsbF9zZ2hkcl9ycSk7CisKKy8qCisgKiB1bm1hcCBhIHJlcXVlc3QgdGhhdCB3YXMgcHJldmlvdXNseSBtYXBwZWQgdG8gdGhpcyBzZ19pb19oZHIuIGhhbmRsZXMKKyAqIGJvdGggc2cgYW5kIG5vbi1zZyBzZ19pb19oZHIuCisgKi8KK2ludCBibGtfdW5tYXBfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIpCit7CisJYmxrX3JxX3VubWFwX3VzZXIocnEtPmJpbyk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa191bm1hcF9zZ2hkcl9ycSk7CisKK2ludCBibGtfY29tcGxldGVfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIsCisJCQkgIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgciwgcmV0ID0gMDsKKworCS8qCisJICogZmlsbCBpbiBhbGwgdGhlIG91dHB1dCBtZW1iZXJzCisJICovCisJaGRyLT5zdGF0dXMgPSBycS0+ZXJyb3JzICYgMHhmZjsKKwloZHItPm1hc2tlZF9zdGF0dXMgPSBzdGF0dXNfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPm1zZ19zdGF0dXMgPSBtc2dfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmhvc3Rfc3RhdHVzID0gaG9zdF9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+ZHJpdmVyX3N0YXR1cyA9IGRyaXZlcl9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+aW5mbyA9IDA7CisJaWYgKGhkci0+bWFza2VkX3N0YXR1cyB8fCBoZHItPmhvc3Rfc3RhdHVzIHx8IGhkci0+ZHJpdmVyX3N0YXR1cykKKwkJaGRyLT5pbmZvIHw9IFNHX0lORk9fQ0hFQ0s7CisJaGRyLT5yZXNpZCA9IHJxLT5kYXRhX2xlbjsKKwloZHItPnNiX2xlbl93ciA9IDA7CisKKwlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnNicCkgeworCQlpbnQgbGVuID0gbWluKCh1bnNpZ25lZCBpbnQpIGhkci0+bXhfc2JfbGVuLCBycS0+c2Vuc2VfbGVuKTsKKworCQlpZiAoIWNvcHlfdG9fdXNlcihoZHItPnNicCwgcnEtPnNlbnNlLCBsZW4pKQorCQkJaGRyLT5zYl9sZW5fd3IgPSBsZW47CisJCWVsc2UKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJcnEtPmJpbyA9IGJpbzsKKwlyID0gYmxrX3VubWFwX3NnaGRyX3JxKHJxLCBoZHIpOworCWlmIChyZXQpCisJCXIgPSByZXQ7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa19jb21wbGV0ZV9zZ2hkcl9ycSk7CiAKIHN0YXRpYyBpbnQgc2dfaW8oc3RydWN0IGZpbGUgKmZpbGUsIHJlcXVlc3RfcXVldWVfdCAqcSwKIAkJc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIHN0cnVjdCBzZ19pb19oZHIgKmhkcikKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUsIHRpbWVvdXQ7Ci0JaW50IHdyaXRpbmcgPSAwLCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwlpbnQgd3JpdGluZyA9IDAsIHJldCA9IDAsIGhhc193cml0ZV9wZXJtID0gMDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJY2hhciBzZW5zZVtTQ1NJX1NFTlNFX0JVRkZFUlNJWkVdOwotCXVuc2lnbmVkIGNoYXIgY21kW0JMS19NQVhfQ0RCXTsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKIAlpZiAoaGRyLT5pbnRlcmZhY2VfaWQgIT0gJ1MnKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaGRyLT5jbWRfbGVuID4gQkxLX01BWF9DREIpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGhkci0+Y21kcCwgaGRyLT5jbWRfbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHZlcmlmeV9jb21tYW5kKGZpbGUsIGNtZCkpCi0JCXJldHVybiAtRVBFUk07CiAKIAlpZiAoaGRyLT5keGZlcl9sZW4gPiAocS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkpCiAJCXJldHVybiAtRUlPOwpAQCAtMjYwLDI1ICszMjIsMTMgQEAKIAlpZiAoIXJxKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qCi0JICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQotCSAqLwotCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOwotCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCi0JbWVtY3B5KHJxLT5jbWQsIGNtZCwgaGRyLT5jbWRfbGVuKTsKKwlpZiAoZmlsZSkKKwkJaGFzX3dyaXRlX3Blcm0gPSBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURTsKIAotCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7Ci0JcnEtPnNlbnNlID0gc2Vuc2U7Ci0JcnEtPnNlbnNlX2xlbiA9IDA7Ci0KLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKLQotCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGhkci0+dGltZW91dCk7Ci0JcnEtPnRpbWVvdXQgPSAodGltZW91dCA8IElOVF9NQVgpID8gdGltZW91dCA6IElOVF9NQVg7Ci0JaWYgKCFycS0+dGltZW91dCkKLQkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OwotCWlmICghcnEtPnRpbWVvdXQpCi0JCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwlpZiAoYmxrX2ZpbGxfc2doZHJfcnEocSwgcnEsIGhkciwgaGFzX3dyaXRlX3Blcm0pKSB7CisJCWJsa19wdXRfcmVxdWVzdChycSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAogCWlmIChoZHItPmlvdmVjX2NvdW50KSB7CiAJCWNvbnN0IGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzZ19pb3ZlYykgKiBoZHItPmlvdmVjX2NvdW50OwpAQCAtMzA2LDYgKzM1Niw5IEBACiAJCWdvdG8gb3V0OwogCiAJYmlvID0gcnEtPmJpbzsKKwltZW1zZXQoc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOworCXJxLT5zZW5zZSA9IHNlbnNlOworCXJxLT5zZW5zZV9sZW4gPSAwOwogCXJxLT5yZXRyaWVzID0gMDsKIAogCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwpAQCAtMzE2LDMxICszNjksOSBAQAogCSAqLwogCWJsa19leGVjdXRlX3JxKHEsIGJkX2Rpc2ssIHJxLCAwKTsKIAotCS8qIHdyaXRlIHRvIGFsbCBvdXRwdXQgbWVtYmVycyAqLwotCWhkci0+c3RhdHVzID0gMHhmZiAmIHJxLT5lcnJvcnM7Ci0JaGRyLT5tYXNrZWRfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5tc2dfc3RhdHVzID0gbXNnX2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5ob3N0X3N0YXR1cyA9IGhvc3RfYnl0ZShycS0+ZXJyb3JzKTsKLQloZHItPmRyaXZlcl9zdGF0dXMgPSBkcml2ZXJfYnl0ZShycS0+ZXJyb3JzKTsKLQloZHItPmluZm8gPSAwOwotCWlmIChoZHItPm1hc2tlZF9zdGF0dXMgfHwgaGRyLT5ob3N0X3N0YXR1cyB8fCBoZHItPmRyaXZlcl9zdGF0dXMpCi0JCWhkci0+aW5mbyB8PSBTR19JTkZPX0NIRUNLOwotCWhkci0+cmVzaWQgPSBycS0+ZGF0YV9sZW47CiAJaGRyLT5kdXJhdGlvbiA9ICgoamlmZmllcyAtIHN0YXJ0X3RpbWUpICogMTAwMCkgLyBIWjsKLQloZHItPnNiX2xlbl93ciA9IDA7CiAKLQlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnNicCkgewotCQlpbnQgbGVuID0gbWluKCh1bnNpZ25lZCBpbnQpIGhkci0+bXhfc2JfbGVuLCBycS0+c2Vuc2VfbGVuKTsKLQotCQlpZiAoIWNvcHlfdG9fdXNlcihoZHItPnNicCwgcnEtPnNlbnNlLCBsZW4pKQotCQkJaGRyLT5zYl9sZW5fd3IgPSBsZW47Ci0JfQotCi0JaWYgKGJsa19ycV91bm1hcF91c2VyKGJpbykpCi0JCXJldCA9IC1FRkFVTFQ7Ci0KLQkvKiBtYXkgbm90IGhhdmUgc3VjY2VlZGVkLCBidXQgb3V0cHV0IHZhbHVlcyB3cml0dGVuIHRvIGNvbnRyb2wKLQkgKiBzdHJ1Y3R1cmUgKHN0cnVjdCBzZ19pb19oZHIpLiAgKi8KKwlyZXR1cm4gYmxrX2NvbXBsZXRlX3NnaGRyX3JxKHJxLCBoZHIsIGJpbyk7CiBvdXQ6CiAJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDI3LDcgKzQ1OCw3IEBACiAJaWYgKGluX2xlbiAmJiBjb3B5X2Zyb21fdXNlcihidWZmZXIsIHNpYy0+ZGF0YSArIGNtZGxlbiwgaW5fbGVuKSkKIAkJZ290byBlcnJvcjsKIAotCWVyciA9IHZlcmlmeV9jb21tYW5kKGZpbGUsIHJxLT5jbWQpOworCWVyciA9IGJsa192ZXJpZnlfY29tbWFuZChycS0+Y21kLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJvcjsKIApAQCAtNDU0LDcgKzQ4NSw3IEBACiAJCXJxLT5yZXRyaWVzID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9USU1FT1VUOworCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1NHX1RJTUVPVVQ7CiAJCWJyZWFrOwogCX0KIApAQCAtNTAxLDcgKzUzMiw3IEBACiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CiAJcnEtPmRhdGEgPSBOVUxMOwogCXJxLT5kYXRhX2xlbiA9IDA7Ci0JcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9USU1FT1VUOworCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKIAltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKIAlycS0+Y21kWzBdID0gY21kOwogCXJxLT5jbWRbNF0gPSBkYXRhOwpAQCAtNTE3LDE2ICs1NDgsMTIgQEAKIAlyZXR1cm4gX19ibGtfc2VuZF9nZW5lcmljKHEsIGJkX2Rpc2ssIEdQQ01EX1NUQVJUX1NUT1BfVU5JVCwgZGF0YSk7CiB9CiAKLWludCBzY3NpX2NtZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCitpbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkgICBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CiAJaW50IGVycjsKIAotCXEgPSBiZF9kaXNrLT5xdWV1ZTsKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoYmxrX2dldF9xdWV1ZShxKSkKKwlpZiAoIXEgfHwgYmxrX2dldF9xdWV1ZShxKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXN3aXRjaCAoY21kKSB7CmRpZmYgLS1naXQgYS9jcnlwdG8vcHJvYy5jIGIvY3J5cHRvL3Byb2MuYwppbmRleCAxMDJjNzUxLi4zZDczMzIzIDEwMDY0NAotLS0gYS9jcnlwdG8vcHJvYy5jCisrKyBiL2NyeXB0by9wcm9jLmMKQEAgLTIzLDI0ICsyMywxMyBAQAogCiBzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnY7Ci0JbG9mZl90IG4gPSAqcG9zOwotCiAJZG93bl9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaCh2LCAmY3J5cHRvX2FsZ19saXN0KQotCQlpZiAoIW4tLSkKLQkJCXJldHVybiBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZjcnlwdG9fYWxnX2xpc3QsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdiA9IHA7Ci0JCi0JKCpwb3MpKys7Ci0JdiA9IHYtPm5leHQ7Ci0JcmV0dXJuICh2ID09ICZjcnlwdG9fYWxnX2xpc3QpID8KLQkJTlVMTCA6IGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dChwLCAmY3J5cHRvX2FsZ19saXN0LCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQpAQCAtNTAsNyArMzksNyBAQAogCiBzdGF0aWMgaW50IGNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IChzdHJ1Y3QgY3J5cHRvX2FsZyAqKXA7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKIAkKIAlzZXFfcHJpbnRmKG0sICJuYW1lICAgICAgICAgOiAlc1xuIiwgYWxnLT5jcmFfbmFtZSk7CiAJc2VxX3ByaW50ZihtLCAiZHJpdmVyICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX2RyaXZlcl9uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL0tjb25maWcgYi9kcml2ZXJzL2F0bS9LY29uZmlnCmluZGV4IDViNGZhYjIuLmJiNGFlNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL0tjb25maWcKKysrIGIvZHJpdmVycy9hdG0vS2NvbmZpZwpAQCAtMTQyLDcgKzE0Miw3IEBACiAKIGNvbmZpZyBBVE1fRklSRVNUUkVBTQogCXRyaXN0YXRlICJGdWppdHN1IEZpcmVTdHJlYW0gKEZTNTAvRlMxNTUpICIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgRHJpdmVyIGZvciB0aGUgRnVqaXRzdSBGaXJlU3RyZWFtIDE1NSAoTUI4NjY5NykgYW5kCiAJICBGaXJlU3RyZWFtIDUwIChNQjg2Njk1KSBBVE0gUENJIGNoaXBzLgpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIGNvbmZpZyBBVE1fWkFUTQogCXRyaXN0YXRlICJaZWl0TmV0IFpOMTIyMS9aTjEyMjUiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIFplaXROZXQgWk4xMjIxIChNTUYpIGFuZCBaTjEyMjUgKFVUUC01KSAxNTUgTWJwcyBBVE0KIAkgIGFkYXB0ZXJzLgpAQCAtMjQwLDcgKzI0MCw3IEBACiAKIGNvbmZpZyBBVE1fQU1CQVNTQURPUgogCXRyaXN0YXRlICJNYWRnZSBBbWJhc3NhZG9yIChDb2xsYWdlIFBDSSAxNTUgU2VydmVyKSIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJc2VsZWN0IEJJVFJFVkVSU0UKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBBVE1pemVyIGJhc2VkIEFUTSBjYXJkIHByb2R1Y2VkIGJ5IE1hZGdlCkBAIC0yNjUsNyArMjY1LDcgQEAKIAogY29uZmlnIEFUTV9IT1JJWk9OCiAJdHJpc3RhdGUgIk1hZGdlIEhvcml6b24gW1VsdHJhXSAoQ29sbGFnZSBQQ0kgMjUgYW5kIENvbGxhZ2UgUENJIDE1NSBDbGllbnQpIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgSG9yaXpvbiBjaGlwc2V0IEFUTSBhZGFwdGVyIGNhcmRzIG9uY2UKIAkgIHByb2R1Y2VkIGJ5IE1hZGdlIE5ldHdvcmtzIEx0ZC4gU2F5IFkgKG9yIE0gdG8gY29tcGlsZSBhcyBhIG1vZHVsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWcgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZwppbmRleCBlYTRmZTNlLi5kZTJmY2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZworKysgYi9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZwpAQCAtNSw4ICs1LDExIEBACiAjIEF1eGlsaWFyeSBkaXNwbGF5IGRyaXZlcnMgY29uZmlndXJhdGlvbi4KICMKIAotbWVudSAiQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydCIKK21lbnVjb25maWcgQVVYRElTUExBWQogCWRlcGVuZHMgb24gUEFSUE9SVAorCWJvb2wgIkF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQiCisKK2lmIEFVWERJU1BMQVkgJiYgUEFSUE9SVAogCiBjb25maWcgS1MwMTA4CiAJdHJpc3RhdGUgIktTMDEwOCBMQ0QgQ29udHJvbGxlciIKQEAgLTExMSw0ICsxMTQsNSBAQAogCiAJICBJZiB5b3UgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCB5b3UgY2FuIHN0aWxsIG92ZXJyaWRlIHRoaXMKIAkgIHZhbHVlIHVzaW5nIHRoZSBtb2R1bGUgcGFyYW1ldGVycy4KLWVuZG1lbnUKKworZW5kaWYgIyBBVVhESVNQTEFZCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jIGIvZHJpdmVycy9iYXNlL2RtYXBvb2wuYwppbmRleCA5MTk3MGU5Li43NjQ3YWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCX0gZWxzZSBpZiAoYWxsb2NhdGlvbiA8IHNpemUpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKCEocmV0dmFsID0ga21hbGxvYyAoc2l6ZW9mICpyZXR2YWwsIEdGUF9LRVJORUwpKSkKKwlpZiAoIShyZXR2YWwgPSBrbWFsbG9jX25vZGUgKHNpemVvZiAqcmV0dmFsLCBHRlBfS0VSTkVMLCBkZXZfdG9fbm9kZShkZXYpKSkpCiAJCXJldHVybiByZXR2YWw7CiAKIAlzdHJsY3B5IChyZXR2YWwtPm5hbWUsIG5hbWUsIHNpemVvZiByZXR2YWwtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9LY29uZmlnIGIvZHJpdmVycy9ibG9jay9LY29uZmlnCmluZGV4IDZlMjNhZjEuLjhmNjViODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svS2NvbmZpZworKysgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKQEAgLTU5LDE3ICs1OSw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB6MnJhbS4KIAotY29uZmlnIEFUQVJJX1NMTQotCXRyaXN0YXRlICJBdGFyaSBTTE0gbGFzZXIgcHJpbnRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVRBUkkKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBBdGFyaSBTTE0gbGFzZXIgcHJpbnRlciwgc2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvcgotCSAgaXQgaW4gdGhlIGtlcm5lbC4gT3RoZXJ3aXNlLCBzYXkgTi4gVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMKLQkgIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZSBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZQotCSAgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLiBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCi0JICBhY3NpX3NsbS4gQmUgd2FybmVkOiB0aGUgZHJpdmVyIG5lZWRzIG11Y2ggU1QtUkFNIGFuZCBjYW4gY2F1c2UKLQkgIHByb2JsZW1zIGR1ZSB0byB0aGF0IGZhY3QhCi0KIGNvbmZpZyBCTEtfREVWX1hECiAJdHJpc3RhdGUgIlhUIGhhcmQgZGlzayBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBICYmIElTQV9ETUFfQVBJCkBAIC0xMTMsNyArMTAyLDcgQEAKIAogY29uZmlnIEJMS19DUFFfREEKIAl0cmlzdGF0ZSAiQ29tcGFxIFNNQVJUMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIENvbXBhcSBTbWFydCBBcnJheSBjb250cm9sbGVycy4gIEV2ZXJ5b25lCiAJICB1c2luZyB0aGVzZSBib2FyZHMgc2hvdWxkIHNheSBZIGhlcmUuICBTZWUgdGhlIGZpbGUKQEAgLTQyMyw2ICs0MTIsMTkgQEAKIAlUaGlzIGRyaXZlciBwcm92aWRlcyBTdXBwb3J0IGZvciBBVEEgb3ZlciBFdGhlcm5ldCBibG9jawogCWRldmljZXMgbGlrZSB0aGUgQ29yYWlkIEV0aGVyRHJpdmUgKFIpIFN0b3JhZ2UgQmxhZGUuCiAKK2NvbmZpZyBTVU5WREMKKwl0cmlzdGF0ZSAiU3VuIFZpcnR1YWwgRGlzayBDbGllbnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNVTl9MRE9NUworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHZpcnR1YWwgZGlzayBkZXZpY2VzIGFzIGEgY2xpZW50IHVuZGVyIFN1bgorCSAgTG9naWNhbCBEb21haW5zLgorCiBzb3VyY2UgImRyaXZlcnMvczM5MC9ibG9jay9LY29uZmlnIgogCitjb25maWcgWElMSU5YX1NZU0FDRQorCXRyaXN0YXRlICJYaWxpbnggU3lzdGVtQUNFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiA0eHgKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBYaWxpbnggU3lzdGVtQUNFIENvbXBhY3RGbGFzaCBpbnRlcmZhY2UKKwogZW5kaWYgIyBCTEtfREVWCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQppbmRleCBlNWY5OGFjLi45ZWUwOGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKQEAgLTksNyArOSw2IEBACiBvYmotJChDT05GSUdfQkxLX0RFVl9GRCkJKz0gZmxvcHB5Lm8KIG9iai0kKENPTkZJR19BTUlHQV9GTE9QUFkpCSs9IGFtaWZsb3Aubwogb2JqLSQoQ09ORklHX0FUQVJJX0ZMT1BQWSkJKz0gYXRhZmxvcC5vCi1vYmotJChDT05GSUdfQVRBUklfU0xNKQkJKz0gYWNzaV9zbG0ubwogb2JqLSQoQ09ORklHX0FNSUdBX1oyUkFNKQkrPSB6MnJhbS5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9SQU0pCSs9IHJkLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0xPT1ApCSs9IGxvb3AubwpAQCAtMTgsNyArMTcsOSBAQAogb2JqLSQoQ09ORklHX0JMS19DUFFfREEpCSs9IGNwcWFycmF5Lm8KIG9iai0kKENPTkZJR19CTEtfQ1BRX0NJU1NfREEpICArPSBjY2lzcy5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9EQUM5NjApCSs9IERBQzk2MC5vCitvYmotJChDT05GSUdfWElMSU5YX1NZU0FDRSkJKz0geHN5c2FjZS5vCiBvYmotJChDT05GSUdfQ0RST01fUEtUQ0RWRCkJKz0gcGt0Y2R2ZC5vCitvYmotJChDT05GSUdfU1VOVkRDKQkJKz0gc3VudmRjLm8KIAogb2JqLSQoQ09ORklHX0JMS19ERVZfVU1FTSkJKz0gdW1lbS5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9OQkQpCSs9IG5iZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMgYi9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWQ5YjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKgotICogYWNzaV9zbG0uYyAtLSBEZXZpY2UgZHJpdmVyIGZvciB0aGUgQXRhcmkgU0xNIGxhc2VyIHByaW50ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMTk5NSBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICogCi0gKi8KLQotLyoKLQotTm90ZXM6Ci0KLVRoZSBtYWpvciBudW1iZXIgZm9yIFNMTSBwcmludGVycyBpcyAyOCAobGlrZSBBQ1NJKSwgYnV0IGFzIGEgY2hhcmFjdGVyCi1kZXZpY2UsIG5vdCBibG9jayBkZXZpY2UuIFRoZSBtaW5vciBudW1iZXIgaXMgdGhlIG51bWJlciBvZiB0aGUgcHJpbnRlciAoaWYKLXlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgU0xNOyBjdXJyZW50bHkgbWF4LiAyICgjZGVmaW5lLWNvbnN0YW50KSBTTE1zIGFyZQotc3VwcG9ydGVkKS4gVGhlIGRldmljZSBjYW4gYmUgb3BlbmVkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiBJZiByZWFkaW5nIGl0LAoteW91IGdldCBzb21lIHN0YXR1cyBpbmZvcyAoTU9ERSBTRU5TRSBkYXRhKS4gV3JpdGluZyBtb2RlIGlzIHVzZWQgZm9yIHRoZSBkYXRhCi10byBiZSBwcmludGVkLiBTb21lIGlvY3RscyBhbGxvdyB0byBnZXQgdGhlIHByaW50ZXIgc3RhdHVzIGFuZCB0byB0dW5lIHByaW50ZXIKLW1vZGVzIGFuZCBzb21lIGludGVybmFsIHZhcmlhYmxlcy4KLQotQSBzcGVjaWFsIHByb2JsZW0gb2YgdGhlIFNMTSBkcml2ZXIgaXMgdGhlIHRpbWluZyBhbmQgdGh1cyB0aGUgYnVmZmVyaW5nIG9mCi10aGUgcHJpbnQgZGF0YS4gVGhlIHByb2JsZW0gaXMgdGhhdCBhbGwgdGhlIGRhdGEgZm9yIG9uZSBwYWdlIG11c3QgYmUgcHJlc2VudAotaW4gbWVtb3J5IHdoZW4gcHJpbnRpbmcgc3RhcnRzLCBlbHNlIC0td2hlbiBzd2FwcGluZyBvY2N1cnMtLSB0aGUgdGltaW5nIGNvdWxkCi1ub3QgYmUgZ3VhcmFudGVlZC4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBhc3N1cmUgdGhpczoKLQotIDEpIFJlc2VydmUgYSBidWZmZXIgb2YgMTE5NmsgKG1heGltdW0gcGFnZSBzaXplKSBzdGF0aWNhbGx5IGJ5Ci0gICAgYXRhcmlfc3RyYW1fYWxsb2MoKS4gVGhlIGRhdGEgYXJlIGNvbGxlY3RlZCB0aGVyZSB1bnRpbCB0aGV5J3JlIGNvbXBsZXRlLAotCWFuZCB0aGVuIHByaW50aW5nIHN0YXJ0cy4gU2luY2UgdGhlIGJ1ZmZlciBpcyByZXNlcnZlZCwgbm8gZnVydGhlcgotCWNvbnNpZGVyYXRpb25zIGFib3V0IG1lbW9yeSBhbmQgc3dhcHBpbmcgYXJlIG5lZWRlZC4gU28gdGhpcyBpcyB0aGUKLQlzaW1wbGVzdCBtZXRob2QsIGJ1dCBpdCBuZWVkcyBhIGxvdCBvZiBtZW1vcnkgZm9yIGp1c3QgdGhlIFNMTS4KLQotICAgIEFuIHN0cmlraW5nIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyAoc3VwcG9zZWQgdGhlIFNMTV9DT05UX0NOVF9SRVBST0cKLQltZXRob2Qgd29ya3MsIHNlZSB0aGVyZSksIHRoYXQgdGhlcmUgYXJlIG5vIHRpbWluZyBwcm9ibGVtcyB3aXRoIHRoZSBETUEKLQlhbnltb3JlLgotCQotIDIpIFRoZSBvdGhlciBtZXRob2Qgd291bGQgYmUgdG8gcmVzZXJ2ZSB0aGUgYnVmZmVyIGR5bmFtaWNhbGx5IGVhY2ggdGltZQotICAgIHByaW50aW5nIGlzIHJlcXVpcmVkLiBJIGNvdWxkIHRoaW5rIG9mIGxvb2tpbmcgYXQgbWVtX21hcCB3aGVyZSB0aGUKLQlsYXJnZXN0IHVuYWxsb2N0ZWQgU1QtUkFNIGFyZWEgaXMsIHRha2luZyB0aGUgYXJlYSwgYW5kIHRoZW4gZXh0ZW5kaW5nIGl0Ci0JYnkgc3dhcHBpbmcgb3V0IHRoZSBuZWlnaGJvcmVkIHBhZ2VzLCB1bnRpbCB0aGUgbmVlZGVkIHNpemUgaXMgcmVhY2hlZC4KLQlUaGlzIHJlcXVpcmVzIHNvbWUgbW0gaGFja2luZywgYnV0IHNlZW1zIHBvc3NpYmxlLiBUaGUgb25seSBvYnN0YWNsZSBjb3VsZAotCWJlIHBhZ2VzIHRoYXQgY2Fubm90IGJlIHN3YXBwZWQgb3V0IChyZXNlcnZlZCBwYWdlcykuLi4KLQotIDMpIEFub3RoZXIgcG9zc2liaWxpdHkgd291bGQgYmUgdG8gbGVhdmUgdGhlIHJlYWwgZGF0YSBpbiB1c2VyIHNwYWNlIGFuZCB0bwotICAgIHdvcmsgd2l0aCB0d28gZHJpYmJsZSBidWZmZXJzIG9mIGFib3V0IDMyayBpbiB0aGUgZHJpdmVyOiBXaGlsZSB0aGUgb25lCi0JYnVmZmVyIGlzIERNQWVkIHRvIHRoZSBTTE0sIHRoZSBvdGhlciBjYW4gYmUgZmlsbGVkIHdpdGggbmV3IGRhdGEuIEJ1dAotCXRvIGtlZXAgdGhlIHRpbWluZywgdGhhdCByZXF1aXJlcyB0aGF0IHRoZSB1c2VyIGRhdGEgcmVtYWluIGluIG1lbW9yeSBhbmQKLQlhcmUgbm90IHN3YXBwZWQgb3V0LiBSZXF1aXJlcyBtbSBoYWNraW5nLCB0b28sIGJ1dCBtYXliZSBub3Qgc28gYmFkIGFzCi0JbWV0aG9kIDIpLgotCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX1NMTS5oPgotCi0KLSN1bmRlZglERUJVRwotCi0vKiBEZWZpbmUgdGhpcyBpZiB0aGUgcGFnZSBkYXRhIGFyZSBjb250aW51b3VzIGluIHBoeXNpY2FsIG1lbW9yeS4gVGhhdAotICogcmVxdWlyZXMgbGVzcyByZXByb2dyYW1taW5nIG9mIHRoZSBTVC1ETUEgKi8KLSNkZWZpbmUJU0xNX0NPTlRJTlVPVVNfRE1BCi0KLS8qIFVzZSBjb250aW51b3VzIHJlcHJvZ3JhbW1pbmcgb2YgdGhlIFNULURNQSBjb3VudGVyIHJlZ2lzdGVyLiBUaGlzIGlzCi0gKiAtLXN0cmljdGx5IHNwZWFraW5nLS0gbm90IGFsbG93ZWQsIEF0YXJpIHJlY29tbWVuZHMgbm90IHRvIGxvb2sgYXQgdGhlCi0gKiBjb3VudGVyIHJlZ2lzdGVyIHdoaWxlIGEgRE1BIGlzIGdvaW5nIG9uLiBCdXQgSSBkb24ndCBrbm93IGlmIHRoYXQgYXBwbGllcwotICogb25seSBmb3IgcmVhZGluZyB0aGUgcmVnaXN0ZXIsIG9yIGFsc28gd3JpdGluZyB0byBpdC4gV3JpdGluZyBvbmx5IHdvcmtzCi0gKiBmaW5lIGZvciBtZS4uLiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIHRpbWluZyBiZWNvbWVzIGFic29sdXRlbHkKLSAqIHVuY3JpdGljYWw6IEp1c3QgdXBkYXRlIGVhY2gsIHNheSAyMDBtcywgdGhlIGNvdW50ZXIgcmVnIHRvIGl0cyBtYXhpbXVtLAotICogYW5kIHRoZSBETUEgd2lsbCB3b3JrIHVudGlsIHRoZSBzdGF0dXMgYnl0ZSBpbnRlcnJ1cHQgb2NjdXJzLgotICovCi0jZGVmaW5lCVNMTV9DT05UX0NOVF9SRVBST0cKLQotI2RlZmluZSBDTURTRVRfVEFSR19MVU4oY21kLHRhcmcsbHVuKQkJCVwKLSAgICBkbyB7CQkJCQkJCQkJCVwKLQkJY21kWzBdID0gKGNtZFswXSAmIH4weGUwKSB8ICh0YXJnKTw8NTsJXAotCQljbWRbMV0gPSAoY21kWzFdICYgfjB4ZTApIHwgKGx1bik8PDU7CVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUJU1RBUlRfVElNRVIodG8pCW1vZF90aW1lcigmc2xtX3RpbWVyLCBqaWZmaWVzICsgKHRvKSkKLSNkZWZpbmUJU1RPUF9USU1FUigpCWRlbF90aW1lcigmc2xtX3RpbWVyKQotCi0KLXN0YXRpYyBjaGFyIHNsbXJlcXNlbnNlX2NtZFs2XSA9IHsgMHgwMywgMCwgMCwgMCwgMCwgMCB9Owotc3RhdGljIGNoYXIgc2xtcHJpbnRfY21kWzZdICAgID0geyAweDBhLCAwLCAwLCAwLCAwLCAwIH07Ci1zdGF0aWMgY2hhciBzbG1pbnF1aXJ5X2NtZFs2XSAgPSB7IDB4MTIsIDAsIDAsIDAsIDAsIDB4ODAgfTsKLXN0YXRpYyBjaGFyIHNsbW1zZW5zZV9jbWRbNl0gICA9IHsgMHgxYSwgMCwgMCwgMCwgMjU1LCAwIH07Ci0jaWYgMAotc3RhdGljIGNoYXIgc2xtbXNlbGVjdF9jbWRbNl0gID0geyAweDE1LCAwLCAwLCAwLCAwLCAwIH07Ci0jZW5kaWYKLQotCi0jZGVmaW5lCU1BWF9TTE0JCTIKLQotc3RhdGljIHN0cnVjdCBzbG0gewotCXVuc2lnbmVkCXRhcmdldDsJCQkvKiB0YXJnZXQgbnVtYmVyICovCi0JdW5zaWduZWQJbHVuOwkJCS8qIExVTiBpbiB0YXJnZXQgY29udHJvbGxlciAqLwotCWF0b21pY190CXdyX29rOyAJCQkvKiBzZXQgdG8gMCBpZiBvdXRwdXQgcGFydCBidXN5ICovCi0JYXRvbWljX3QJcmRfb2s7CQkJLyogc2V0IHRvIDAgaWYgc3RhdHVzIHBhcnQgYnVzeSAqLwotfSBzbG1faW5mb1tNQVhfU0xNXTsKLQotaW50IE5fU0xNX1ByaW50ZXJzID0gMDsKLQotLyogcHJpbnRlciBidWZmZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCSpTTE1CdWZmZXI7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIJKkJ1ZmZlclA7CS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCi1zdGF0aWMgaW50CQkJCUJ1ZmZlclNpemU7CS8qIGxlbmd0aCBvZiBidWZmZXIgZm9yIHBhZ2Ugc2l6ZSAqLwotCi10eXBlZGVmIGVudW0geyBJRExFLCBGSUxMSU5HLCBQUklOVElORyB9IFNMTVNUQVRFOwotc3RhdGljIFNMTVNUQVRFCQkJU0xNU3RhdGU7Ci1zdGF0aWMgaW50CQkJCVNMTUJ1Zk93bmVyOwkvKiBTTE0jIGN1cnJlbnRseSB1c2luZyB0aGUgYnVmZmVyICovCi0KLS8qIERNQSB2YXJpYWJsZXMgKi8KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNQ3VyQWRkcjsJCS8qIGN1cnJlbnQgYmFzZSBhZGRyIG9mIERNQSBjaHVuayAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNRW5kQWRkcjsJCS8qIGV4cGVjdGVkIGVuZCBhZGRyICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwlTTE1TbGljZVNpemU7CS8qIHNpemUgb2Ygb25lIERNQSBjaHVuayAqLwotI2VuZGlmCi1zdGF0aWMgaW50CQkJCVNMTUVycm9yOwotCi0vKiB3YWl0IHF1ZXVlcyAqLwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNsbV93YWl0KTsJLyogd2FpdGluZyBmb3IgYnVmZmVyICovCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJpbnRfd2FpdCk7CS8qIHdhaXRpbmcgZm9yIHByaW50aW5nIGZpbmlzaGVkICovCi0KLS8qIHN0YXR1cyBjb2RlcyAqLwotI2RlZmluZQlTTE1TVEFUX09LCQkweDAwCi0jZGVmaW5lCVNMTVNUQVRfT1JORVJZCTB4MDIKLSNkZWZpbmUJU0xNU1RBVF9UT05FUgkweDAzCi0jZGVmaW5lCVNMTVNUQVRfV0FSTVVQCTB4MDQKLSNkZWZpbmUJU0xNU1RBVF9QQVBFUgkweDA1Ci0jZGVmaW5lCVNMTVNUQVRfRFJVTQkweDA2Ci0jZGVmaW5lCVNMTVNUQVRfSU5KQU0JMHgwNwotI2RlZmluZQlTTE1TVEFUX1RIUkpBTQkweDA4Ci0jZGVmaW5lCVNMTVNUQVRfT1VUSkFNCTB4MDkKLSNkZWZpbmUJU0xNU1RBVF9DT1ZFUgkweDBhCi0jZGVmaW5lCVNMTVNUQVRfRlVTRVIJMHgwYgotI2RlZmluZQlTTE1TVEFUX0lNQUdFUgkweDBjCi0jZGVmaW5lCVNMTVNUQVRfTU9UT1IJMHgwZAotI2RlZmluZQlTTE1TVEFUX1ZJREVPCTB4MGUKLSNkZWZpbmUJU0xNU1RBVF9TWVNUTwkweDEwCi0jZGVmaW5lCVNMTVNUQVRfT1BDT0RFCTB4MTIKLSNkZWZpbmUJU0xNU1RBVF9ERVZOVU0JMHgxNQotI2RlZmluZQlTTE1TVEFUX1BBUkFNCTB4MWEKLSNkZWZpbmUJU0xNU1RBVF9BQ1NJVE8JMHgxYgkvKiBkcml2ZXIgZGVmaW5lZCAqLwotI2RlZmluZQlTTE1TVEFUX05PVEFMTAkweDFjCS8qIGRyaXZlciBkZWZpbmVkICovCi0KLXN0YXRpYyBjaGFyICpTTE1FcnJvcnNbXSA9IHsKLQkvKiAweDAwICovCSJPSyBhbmQgcmVhZHkiLAotCS8qIDB4MDEgKi8JTlVMTCwKLQkvKiAweDAyICovCSJvcm5lcnkgcHJpbnRlciIsCi0JLyogMHgwMyAqLwkidG9uZXIgZW1wdHkiLAotCS8qIDB4MDQgKi8JIndhcm1pbmcgdXAiLAotCS8qIDB4MDUgKi8JInBhcGVyIGVtcHR5IiwKLQkvKiAweDA2ICovCSJkcnVtIGVtcHR5IiwKLQkvKiAweDA3ICovCSJpbnB1dCBqYW0iLAotCS8qIDB4MDggKi8JInRocm91Z2ggamFtIiwKLQkvKiAweDA5ICovCSJvdXRwdXQgamFtIiwKLQkvKiAweDBhICovCSJjb3ZlciBvcGVuIiwKLQkvKiAweDBiICovCSJmdXNlciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwYyAqLwkiaW1hZ2VyIG1hbGZ1bmN0aW9uIiwKLQkvKiAweDBkICovCSJtb3RvciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwZSAqLwkidmlkZW8gbWFsZnVuY3Rpb24iLAotCS8qIDB4MGYgKi8JTlVMTCwKLQkvKiAweDEwICovCSJwcmludGVyIHN5c3RlbSB0aW1lb3V0IiwKLQkvKiAweDExICovCU5VTEwsCi0JLyogMHgxMiAqLwkiaW52YWxpZCBvcGVyYXRpb24gY29kZSIsCi0JLyogMHgxMyAqLwlOVUxMLAotCS8qIDB4MTQgKi8JTlVMTCwKLQkvKiAweDE1ICovCSJpbnZhbGlkIGRldmljZSBudW1iZXIiLAotCS8qIDB4MTYgKi8JTlVMTCwKLQkvKiAweDE3ICovCU5VTEwsCi0JLyogMHgxOCAqLwlOVUxMLAotCS8qIDB4MTkgKi8JTlVMTCwKLQkvKiAweDFhICovCSJpbnZhbGlkIHBhcmFtZXRlciBsaXN0IiwKLQkvKiAweDFiICovCSJBQ1NJIHRpbWVvdXQiLAotCS8qIDB4MWMgKi8JIm5vdCBhbGwgcHJpbnRlZCIKLX07Ci0KLSNkZWZpbmUJTl9FUlJPUlMJKHNpemVvZihTTE1FcnJvcnMpL3NpemVvZigqU0xNRXJyb3JzKSkKLQotLyogcmVhbCAoZHJpdmVyIGNhdXNlZCkgZXJyb3I/ICovCi0jZGVmaW5lCUlTX1JFQUxfRVJST1IoeCkJKHggPiAweDEwKQotCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIJKm5hbWU7Ci0JaW50IAl3LCBoOwotfSBTdGRQYWdlU2l6ZVtdID0gewotCXsgIkxldHRlciIsIDI0MDAsIDMxODAgfSwKLQl7ICJMZWdhbCIsICAyNDAwLCA0MDgwIH0sCi0JeyAiQTQiLCAgICAgMjMzNiwgMzM4NiB9LAotCXsgIkI1IiwgICAgIDIwMTYsIDI5MTQgfQotfTsKLQotI2RlZmluZQlOX1NURF9TSVpFUwkJKHNpemVvZihTdGRQYWdlU2l6ZSkvc2l6ZW9mKCpTdGRQYWdlU2l6ZSkpCi0KLSNkZWZpbmUJU0xNX0JVRkZFUl9TSVpFCSgyMzM2KjMzODYvOCkJLyogQTQgZm9yIG5vdyAqLwotI2RlZmluZQlTTE1fRE1BX0FNT1VOVAkyNTUJCQkJLyogI3NlY3RvcnMgdG8gcHJvZ3JhbSB0aGUgRE1BIGZvciAqLwotCi0jaWZkZWYJU0xNX0NPTlRJTlVPVVNfRE1BCi0jIGRlZmluZQlTTE1fRE1BX0lOVF9PRkZTRVQJMAkJLyogRE1BIGdvZXMgdW50aWwgc2VjY250IDAsIG5vIG9mZnMgKi8KLSMgZGVmaW5lCVNMTV9ETUFfRU5EX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX1NMSUNFX1NJWkUodykgCSgyNTUqNTEyKQotI2Vsc2UKLSMgZGVmaW5lCVNMTV9ETUFfSU5UX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX0RNQV9FTkRfT0ZGU0VUCTMyCQkvKiAzMiBCeXRlIFNULURNQSBGSUZPICovCi0jIGRlZmluZQlTTE1fU0xJQ0VfU0laRSh3KQkoKDI1NCo1MTIpLyh3LzgpKih3LzgpKQotI2VuZGlmCi0KLS8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGppZmZpZXMgdG8gd2FpdCBmb3IgJ24nIGJ5dGVzICovCi0jaWZkZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotI2RlZmluZQlETUFfVElNRV9GT1IobikJCTUwCi0jZGVmaW5lCURNQV9TVEFSVFVQX1RJTUUJMAotI2Vsc2UKLSNkZWZpbmUJRE1BX1RJTUVfRk9SKG4pCQkobi8xNDAwLTEpCi0jZGVmaW5lCURNQV9TVEFSVFVQX1RJTUUJNjUwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICpzbG1fZXJyc3RyKCBpbnQgc3RhdCApOwotc3RhdGljIGludCBzbG1fZ2V0c3RhdHMoIGNoYXIgKmJ1ZmZlciwgaW50IGRldmljZSApOwotc3RhdGljIHNzaXplX3Qgc2xtX3JlYWQoIHN0cnVjdCBmaWxlKiBmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKnBwb3MgKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X3ByaW50KCBpbnQgZGV2aWNlICk7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgc2xtX2ludGVycnVwdChpbnQgaXJjLCB2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIHNsbV90ZXN0X3JlYWR5KCB1bnNpZ25lZCBsb25nIGR1bW15ICk7Ci1zdGF0aWMgdm9pZCBzZXRfZG1hX2FkZHIoIHVuc2lnbmVkIGxvbmcgcGFkZHIgKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9kbWFfYWRkciggdm9pZCApOwotc3RhdGljIHNzaXplX3Qgc2xtX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcyApOwotc3RhdGljIGludCBzbG1faW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7Ci1zdGF0aWMgaW50IHNsbV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOwotc3RhdGljIGludCBzbG1fcmVsZWFzZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKLXN0YXRpYyBpbnQgc2xtX3JlcV9zZW5zZSggaW50IGRldmljZSApOwotc3RhdGljIGludCBzbG1fbW9kZV9zZW5zZSggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgYWJzX2ZsYWcgKTsKLSNpZiAwCi1zdGF0aWMgaW50IHNsbV9tb2RlX3NlbGVjdCggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ZsYWcgKTsKLSNlbmRpZgotc3RhdGljIGludCBzbG1fZ2V0X3BhZ2VzaXplKCBpbnQgZGV2aWNlLCBpbnQgKncsIGludCAqaCApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgREVGSU5FX1RJTUVSKHNsbV90aW1lciwgc2xtX3Rlc3RfcmVhZHksIDAsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbG1fZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkucmVhZCA9CQlzbG1fcmVhZCwKLQkud3JpdGUgPQlzbG1fd3JpdGUsCi0JLmlvY3RsID0Jc2xtX2lvY3RsLAotCS5vcGVuID0JCXNsbV9vcGVuLAotCS5yZWxlYXNlID0Jc2xtX3JlbGVhc2UsCi19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSAgIFN0YXR1cyBGdW5jdGlvbnMJCQkJCQkJICAqLwotCi0KLXN0YXRpYyBjaGFyICpzbG1fZXJyc3RyKCBpbnQgc3RhdCApCi0KLXsJY2hhciAqcDsKLQlzdGF0aWMgY2hhcglzdHJbMjJdOwotCi0Jc3RhdCAmPSAweDFmOwotCWlmIChzdGF0ID49IDAgJiYgc3RhdCA8IE5fRVJST1JTICYmIChwID0gU0xNRXJyb3JzW3N0YXRdKSkKLQkJcmV0dXJuKCBwICk7Ci0Jc3ByaW50Ziggc3RyLCAidW5rbm93biBzdGF0dXMgMHglMDJ4Iiwgc3RhdCApOwotCXJldHVybiggc3RyICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fZ2V0c3RhdHMoIGNoYXIgKmJ1ZmZlciwgaW50IGRldmljZSApCi0KLXsJaW50IAkJCWxlbiA9IDAsIHN0YXQsIGksIHcsIGg7Ci0JdW5zaWduZWQgY2hhcglidWZbMjU2XTsKLQkKLQlzdGF0ID0gc2xtX21vZGVfc2Vuc2UoIGRldmljZSwgYnVmLCAwICk7Ci0JaWYgKElTX1JFQUxfRVJST1Ioc3RhdCkpCi0JCXJldHVybiggLUVJTyApOwotCQotI2RlZmluZSBTSE9SVERBVEEoaSkJCSgoYnVmW2ldIDw8IDgpIHwgYnVmW2krMV0pCi0jZGVmaW5lCUJPT0xEQVRBKGksbWFzaykJKChidWZbaV0gJiBtYXNrKSA/ICJvbiIgOiAib2ZmIikKLQotCXcgPSBTSE9SVERBVEEoIDMgKTsKLQloID0gU0hPUlREQVRBKCAxICk7Ci0JCQotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3RhdHVzXHRcdCVzXG4iLAotCQkJCQlzbG1fZXJyc3RyKCBzdGF0ICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlBhZ2UgU2l6ZVx0JWR4JWQiLAotCQkJCQl3LCBoICk7Ci0KLQlmb3IoIGkgPSAwOyBpIDwgTl9TVERfU0laRVM7ICsraSApIHsKLQkJaWYgKHcgPT0gU3RkUGFnZVNpemVbaV0udyAmJiBoID09IFN0ZFBhZ2VTaXplW2ldLmgpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPCBOX1NURF9TSVpFUykKLQkJbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICIgKCVzKSIsIFN0ZFBhZ2VTaXplW2ldLm5hbWUgKTsKLQlidWZmZXJbbGVuKytdID0gJ1xuJzsKLQotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiVG9wL0xlZnQgTWFyZ2luXHQlZC8lZFxuIiwKLQkJCQkJU0hPUlREQVRBKCA1ICksIFNIT1JUREFUQSggNyApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJNYW51YWwgRmVlZFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDAxICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIklucHV0IFNlbGVjdFx0JWRcbiIsCi0JCQkJCShidWZbOV0gPj4gMSkgJiA3ICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJBdXRvIFNlbGVjdFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlByZWZlZWQgUGFwZXJcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHgyMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJUaGljayBQaXhlbHNcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHg0MCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJIL1YgUmVzb2wuXHQlZC8lZCBkcGlcbiIsCi0JCQkJCVNIT1JUREFUQSggMTIgKSwgU0hPUlREQVRBKCAxMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJTeXN0ZW0gVGltZW91dFx0JWRcbiIsCi0JCQkJCWJ1ZlsxNF0gKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlNjYW4gVGltZVx0JWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTUgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiUGFnZSBDb3VudFx0JWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTcgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiSW4vT3V0IENhcC5cdCVkLyVkXG4iLAotCQkJCQlTSE9SVERBVEEoIDE5ICksIFNIT1JUREFUQSggMjEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3RhZ2dlciBPdXRwdXRcdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MDEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiT3V0cHV0IFNlbGVjdFx0JWRcbiIsCi0JCQkJCShidWZbMjNdID4+IDEpICYgNyApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiRHVwbGV4IFByaW50XHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDIzLCAweDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkNvbG9yIFNlcC5cdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MjAgKSApOwotCi0JcmV0dXJuKCBsZW4gKTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBzbG1fcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkJIGxvZmZfdCAqcHBvcyApCi0KLXsKLQlzdHJ1Y3QgaW5vZGUgKm5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQlpbnQgbGVuZ3RoOwotCWludCBlbmQ7Ci0KLQlpZiAoIShwYWdlID0gX19nZXRfZnJlZV9wYWdlKCBHRlBfS0VSTkVMICkpKQotCQlyZXR1cm4oIC1FTk9NRU0gKTsKLQkKLQlsZW5ndGggPSBzbG1fZ2V0c3RhdHMoIChjaGFyICopcGFnZSwgaW1pbm9yKG5vZGUpICk7Ci0JaWYgKGxlbmd0aCA8IDApIHsKLQkJY291bnQgPSBsZW5ndGg7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoZmlsZS0+Zl9wb3MgPj0gbGVuZ3RoKSB7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChjb3VudCArIGZpbGUtPmZfcG9zID4gbGVuZ3RoKQotCQljb3VudCA9IGxlbmd0aCAtIGZpbGUtPmZfcG9zOwotCWVuZCA9IGNvdW50ICsgZmlsZS0+Zl9wb3M7Ci0JaWYgKGNvcHlfdG9fdXNlcihidWYsIChjaGFyICopcGFnZSArIGZpbGUtPmZfcG9zLCBjb3VudCkpIHsKLQkJY291bnQgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9Ci0JZmlsZS0+Zl9wb3MgPSBlbmQ7Ci1vdXQ6CWZyZWVfcGFnZSggcGFnZSApOwotCXJldHVybiggY291bnQgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkJICAgUHJpbnRpbmcJCQkJCQkJCSAgKi8KLQotCi1zdGF0aWMgdm9pZCBzdGFydF9wcmludCggaW50IGRldmljZSApCi0KLXsJc3RydWN0IHNsbSAqc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0JdW5zaWduZWQgY2hhcgkqY21kOwotCXVuc2lnbmVkIGxvbmcJcGFkZHI7Ci0JaW50CQkJCWk7Ci0JCi0Jc3RkbWFfbG9jayggc2xtX2ludGVycnVwdCwgTlVMTCApOwotCi0JQ01EU0VUX1RBUkdfTFVOKCBzbG1wcmludF9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCWNtZCA9IHNsbXByaW50X2NtZDsKLQlwYWRkciA9IHZpcnRfdG9fcGh5cyggU0xNQnVmZmVyICk7Ci0JZG1hX2NhY2hlX21haW50ZW5hbmNlKCBwYWRkciwgdmlydF90b19waHlzKEJ1ZmZlclApLXBhZGRyLCAxICk7Ci0JRElTQUJMRV9JUlEoKTsKLQotCS8qIExvdyBvbiBBMSAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDg4OwotCU1GUERFTEFZKCk7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIGJ5dGVzIGV4Y2VwdCB0aGUgbGFzdCAqLwotCWZvciggaSA9IDA7IGkgPCA1OyArK2kgKSB7Ci0JCURNQV9MT05HX1dSSVRFKCAqY21kKyssIDB4OGEgKTsKLQkJdWRlbGF5KDIwKTsKLQkJaWYgKCFhY3NpX3dhaXRfZm9yX0lSUSggSFovMiApKSB7Ci0JCQlTTE1FcnJvciA9IDE7Ci0JCQlyZXR1cm47IC8qIHRpbWVvdXQgKi8KLQkJfQotCX0KLQkvKiBsYXN0IGNvbW1hbmQgYnl0ZSAqLwotCURNQV9MT05HX1dSSVRFKCAqY21kKyssIDB4ODIgKTsKLQlNRlBERUxBWSgpOwotCS8qIHNldCBETUEgYWRkcmVzcyAqLwotCXNldF9kbWFfYWRkciggcGFkZHIgKTsKLQkvKiBwcm9ncmFtIERNQSBmb3Igd3JpdGUgYW5kIHNlbGVjdCBzZWN0b3IgY291bnRlciByZWcgKi8KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHgxOTI7Ci0JTUZQREVMQVkoKTsKLQkvKiBwcm9ncmFtIGZvciAyNTUqNTEyIGJ5dGVzIGFuZCBzdGFydCBETUEgKi8KLQlETUFfTE9OR19XUklURSggU0xNX0RNQV9BTU9VTlQsIDB4MTEyICk7Ci0KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCVNMTUN1ckFkZHIgPSBwYWRkcjsKLQlTTE1FbmRBZGRyID0gcGFkZHIgKyBTTE1TbGljZVNpemUgKyBTTE1fRE1BX0lOVF9PRkZTRVQ7Ci0jZW5kaWYKLQlTVEFSVF9USU1FUiggRE1BX1NUQVJUVVBfVElNRSArIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkpOwotI2lmICFkZWZpbmVkKFNMTV9DT05UX0NOVF9SRVBST0cpICYmIGRlZmluZWQoREVCVUcpCi0JcHJpbnRrKCAiU0xNOiBDdXJBZGRyPSUjbHggRW5kQWRkcj0lI2x4IHRpbWVyPSVsZFxuIiwKLQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIsIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkgKTsKLSNlbmRpZgotCQotCUVOQUJMRV9JUlEoKTsKLX0KLQotCi0vKiBPbmx5IGNhbGxlZCB3aGVuIGFuIGVycm9yIGhhcHBlbmVkIG9yIGF0IHRoZSBlbmQgb2YgYSBwYWdlICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzbG1faW50ZXJydXB0KGludCBpcmMsIHZvaWQgKmRhdGEpCi0KLXsJdW5zaWduZWQgbG9uZwlhZGRyOwotCWludAkJCQlzdGF0OwotCQotCVNUT1BfVElNRVIoKTsKLQlhZGRyID0gZ2V0X2RtYV9hZGRyKCk7Ci0Jc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCk7Ci0JU0xNRXJyb3IgPSAoc3RhdCA8IDApICAgICAgICAgICAgID8gU0xNU1RBVF9BQ1NJVE8gOgotCQkgICAgICAgKGFkZHIgPCB2aXJ0X3RvX3BoeXMoQnVmZmVyUCkpID8gU0xNU1RBVF9OT1RBTEwgOgotCQkJCQkJCQkJICAgIHN0YXQ7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4MDsKLQlNRlBERUxBWSgpOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCAiU0xNOiBpbnRlcnJ1cHQsIGFkZHI9JSNseCwgZXJyb3I9JWRcbiIsIGFkZHIsIFNMTUVycm9yICk7Ci0jZW5kaWYKLQotCXdha2VfdXAoICZwcmludF93YWl0ICk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCUVOQUJMRV9JUlEoKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgc2xtX3Rlc3RfcmVhZHkoIHVuc2lnbmVkIGxvbmcgZHVtbXkgKQotCi17Ci0jaWZkZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCS8qIHByb2dyYW0gZm9yIDI1NSo1MTIgYnl0ZXMgYWdhaW4gKi8KLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gU0xNX0RNQV9BTU9VTlQ7Ci0JU1RBUlRfVElNRVIoIERNQV9USU1FX0ZPUigwKSApOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCAiU0xNOiByZXByb2dyYW1taW5nIHRpbWVyIGZvciAlZCBqaWZmaWVzLCBhZGRyPSUjbHhcbiIsCi0JCQlETUFfVElNRV9GT1IoMCksIGdldF9kbWFfYWRkcigpICk7Ci0jZW5kaWYKLQkKLSNlbHNlIC8qICFTTE1fQ09OVF9DTlRfUkVQUk9HICovCi0KLQl1bnNpZ25lZCBsb25nCWZsYWdzLCBhZGRyOwotCWludAkJCQlkLCB0aTsKLSNpZmRlZiBERUJVRwotCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RtLCBlbmRfdG07Ci0JaW50CQkJICAgZGlkX3dhaXQgPSAwOwotI2VuZGlmCi0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlhZGRyID0gZ2V0X2RtYV9hZGRyKCk7Ci0JaWYgKChkID0gU0xNRW5kQWRkciAtIGFkZHIpID4gMCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQotCQkvKiBzbGljZSBub3QgeWV0IGZpbmlzaGVkLCBkZWNpZGUgd2hldGhlciB0byBzdGFydCBhbm90aGVyIHRpbWVyIG9yIHRvCi0JCSAqIGJ1c3ktd2FpdCAqLwotCQl0aSA9IERNQV9USU1FX0ZPUiggZCApOwotCQlpZiAodGkgPiAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJCXByaW50ayggIlNMTTogcmVwcm9ncmFtbWluZyB0aW1lciBmb3IgJWQgamlmZmllcywgcmVzdCAlZCBieXRlc1xuIiwKLQkJCQkJdGksIGQgKTsKLSNlbmRpZgotCQkJU1RBUlRfVElNRVIoIHRpICk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogd2FpdCBmb3IgZGVzaXJlZCBlbmQgYWRkcmVzcyB0byBiZSByZWFjaGVkICovCi0jaWZkZWYgREVCVUcKLQkJZG9fZ2V0dGltZW9mZGF5KCAmc3RhcnRfdG0gKTsKLQkJZGlkX3dhaXQgPSAxOwotI2VuZGlmCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCXdoaWxlKCBnZXRfZG1hX2FkZHIoKSA8IFNMTUVuZEFkZHIgKQotCQkJYmFycmllcigpOwotCX0KLQotCS8qIHNsaWNlIGZpbmlzaGVkLCBzdGFydCBuZXh0IG9uZSAqLwotCVNMTUN1ckFkZHIgKz0gU0xNU2xpY2VTaXplOwotCi0jaWZkZWYgU0xNX0NPTlRJTlVPVVNfRE1BCi0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhZ2FpbiAqLwotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSBTTE1fRE1BX0FNT1VOVDsKLSNlbHNlCi0JLyogc2V0IERNQSBhZGRyZXNzOwotCSAqIGFkZCAyIGJ5dGVzIGZvciB0aGUgb25lcyBpbiB0aGUgU0xNIGNvbnRyb2xsZXIgRklGTyEgKi8KLQlzZXRfZG1hX2FkZHIoIFNMTUN1ckFkZHIgKyAyICk7Ci0JLyogdG9nZ2xlIERNQSB0byB3cml0ZSBhbmQgc2VsZWN0IHNlY3RvciBjb3VudGVyIHJlZyAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDkyOwotCU1GUERFTEFZKCk7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4MTkyOwotCU1GUERFTEFZKCk7Ci0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhbmQgc3RhcnQgRE1BICovCi0JRE1BX0xPTkdfV1JJVEUoIFNMTV9ETUFfQU1PVU5ULCAweDExMiApOwotI2VuZGlmCi0JCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0jaWZkZWYgREVCVUcKLQlpZiAoZGlkX3dhaXQpIHsKLQkJaW50IG1zOwotCQlkb19nZXR0aW1lb2ZkYXkoICZlbmRfdG0gKTsKLQkJbXMgPSAoZW5kX3RtLnR2X3NlYyoxMDAwMDAwK2VuZF90bS50dl91c2VjKSAtCi0JCQkgKHN0YXJ0X3RtLnR2X3NlYyoxMDAwMDAwK3N0YXJ0X3RtLnR2X3VzZWMpOyAKLQkJcHJpbnRrKCAiU0xNOiBkaWQgJWxkLiVsZCBtcyBidXN5IHdhaXRpbmcgZm9yICVkIGJ5dGVzXG4iLAotCQkJCW1zLzEwMDAsIG1zJTEwMDAsIGQgKTsKLQl9Ci0JZWxzZQotCQlwcmludGsoICJTTE06IGRpZG4ndCB3YWl0ICghKVxuIiApOwotI2VuZGlmCi0KLQlpZiAoKHVuc2lnbmVkIGNoYXIgKilQVE9WKCBTTE1DdXJBZGRyICsgU0xNU2xpY2VTaXplICkgPj0gQnVmZmVyUCkgewotCQkvKiB3aWxsIGJlIGxhc3Qgc2xpY2UsIG5vIHRpbWVyIG5lY2Vzc2FyeSAqLwotI2lmZGVmIERFQlVHCi0JCXByaW50ayggIlNMTTogQ3VyQWRkcj0lI2x4IEVuZEFkZHI9JSNseCBsYXN0IHNsaWNlIC0+IG5vIHRpbWVyXG4iLAotCQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIgKTsKLSNlbmRpZgotCX0KLQllbHNlIHsKLQkJLyogbm90IGxhc3Qgc2xpY2UgKi8KLQkJU0xNRW5kQWRkciA9IFNMTUN1ckFkZHIgKyBTTE1TbGljZVNpemUgKyBTTE1fRE1BX0lOVF9PRkZTRVQ7Ci0JCVNUQVJUX1RJTUVSKCBETUFfVElNRV9GT1IoIFNMTVNsaWNlU2l6ZSApKTsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoICJTTE06IEN1ckFkZHI9JSNseCBFbmRBZGRyPSUjbHggdGltZXI9JWxkXG4iLAotCQkJCVNMTUN1ckFkZHIsIFNMTUVuZEFkZHIsIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkgKTsKLSNlbmRpZgotCX0KLSNlbmRpZiAvKiBTTE1fQ09OVF9DTlRfUkVQUk9HICovCi19Ci0KLQotc3RhdGljIHZvaWQgc2V0X2RtYV9hZGRyKCB1bnNpZ25lZCBsb25nIHBhZGRyICkKLQotewl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWRtYV93ZC5kbWFfbG8gPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlNRlBERUxBWSgpOwotCWRtYV93ZC5kbWFfbWQgPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlwYWRkciA+Pj0gODsKLQlNRlBERUxBWSgpOwotCWlmIChBVEFSSUhXX1BSRVNFTlQoIEVYVERfRE1BICkpCi0JCXN0X2RtYV9leHRfZG1haGkgPSAodW5zaWduZWQgc2hvcnQpcGFkZHI7Ci0JZWxzZQotCQlkbWFfd2QuZG1hX2hpID0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JTUZQREVMQVkoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9hZGRyKCB2b2lkICkKLQotewl1bnNpZ25lZCBsb25nCWFkZHI7Ci0JCi0JYWRkciA9IGRtYV93ZC5kbWFfbG8gJiAweGZmOwotCU1GUERFTEFZKCk7Ci0JYWRkciB8PSAoZG1hX3dkLmRtYV9tZCAmIDB4ZmYpIDw8IDg7Ci0JTUZQREVMQVkoKTsKLQlhZGRyIHw9IChkbWFfd2QuZG1hX2hpICYgMHhmZikgPDwgMTY7Ci0JTUZQREVMQVkoKTsKLQotCXJldHVybiggYWRkciApOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHNsbV93cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkJICBsb2ZmX3QgKnBwb3MgKQotCi17Ci0Jc3RydWN0IGlub2RlICpub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpbnQJCWRldmljZSA9IGltaW5vcihub2RlKTsKLQlpbnQJCW4sIGZpbGxlZCwgdywgaDsKLQotCXdoaWxlKCBTTE1TdGF0ZSA9PSBQUklOVElORyB8fAotCQkgICAoU0xNU3RhdGUgPT0gRklMTElORyAmJiBTTE1CdWZPd25lciAhPSBkZXZpY2UpICkgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCAmc2xtX3dhaXQgKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuKCAtRVJFU1RBUlRTWVMgKTsKLQl9Ci0JaWYgKFNMTVN0YXRlID09IElETEUpIHsKLQkJLyogZmlyc3QgZGF0YSBvZiBwYWdlOiBnZXQgY3VycmVudCBwYWdlIHNpemUgICovCi0JCWlmIChzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKQotCQkJcmV0dXJuKCAtRUlPICk7Ci0JCUJ1ZmZlclNpemUgPSB3KmgvODsKLQkJaWYgKEJ1ZmZlclNpemUgPiBTTE1fQlVGRkVSX1NJWkUpCi0JCQlyZXR1cm4oIC1FTk9NRU0gKTsKLQotCQlTTE1TdGF0ZSA9IEZJTExJTkc7Ci0JCVNMTUJ1Zk93bmVyID0gZGV2aWNlOwotCX0KLQotCW4gPSBjb3VudDsKLQlmaWxsZWQgPSBCdWZmZXJQIC0gU0xNQnVmZmVyOwotCWlmIChmaWxsZWQgKyBuID4gQnVmZmVyU2l6ZSkKLQkJbiA9IEJ1ZmZlclNpemUgLSBmaWxsZWQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoQnVmZmVyUCwgYnVmLCBuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JQnVmZmVyUCArPSBuOwotCWZpbGxlZCArPSBuOwotCi0JaWYgKGZpbGxlZCA9PSBCdWZmZXJTaXplKSB7Ci0JCS8qIENoZWNrIHRoZSBwYXBlciBzaXplIGFnYWluISBUaGUgdXNlciBtYXkgaGF2ZSBzd2l0Y2hlZCBpdCBpbiB0aGUKLQkJICogdGltZSBiZXR3ZWVuIHN0YXJ0aW5nIHRoZSBkYXRhIGFuZCBmaW5pc2hpbmcgdGhlbS4gV291bGQgZW5kIHVwIGluCi0JCSAqIGEgdHJhc2h5IHBhZ2UuLi4gKi8KLQkJaWYgKHNsbV9nZXRfcGFnZXNpemUoIGRldmljZSwgJncsICZoICkpCi0JCQlyZXR1cm4oIC1FSU8gKTsKLQkJaWYgKEJ1ZmZlclNpemUgIT0gdypoLzgpIHsKLQkJCXByaW50ayggS0VSTl9OT1RJQ0UgInNsbSVkOiBwYWdlIHNpemUgY2hhbmdlZCB3aGlsZSBwcmludGluZ1xuIiwKLQkJCQkJZGV2aWNlICk7Ci0JCQlyZXR1cm4oIC1FQUdBSU4gKTsKLQkJfQotCi0JCVNMTVN0YXRlID0gUFJJTlRJTkc7Ci0JCS8qIGNob29zZSBhIHNsaWNlIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIHRoZSBsaW5lIHNpemUgKi8KLSNpZm5kZWYgU0xNX0NPTlRfQ05UX1JFUFJPRwotCQlTTE1TbGljZVNpemUgPSBTTE1fU0xJQ0VfU0laRSh3KTsKLSNlbmRpZgotCQkKLQkJc3RhcnRfcHJpbnQoIGRldmljZSApOwotCQlzbGVlcF9vbiggJnByaW50X3dhaXQgKTsKLQkJaWYgKFNMTUVycm9yICYmIElTX1JFQUxfRVJST1IoU0xNRXJyb3IpKSB7Ci0JCQlwcmludGsoIEtFUk5fRVJSICJzbG0lZDogJXNcbiIsIGRldmljZSwgc2xtX2VycnN0cihTTE1FcnJvcikgKTsKLQkJCW4gPSAtRUlPOwotCQl9Ci0KLQkJU0xNU3RhdGUgPSBJRExFOwotCQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoICZzbG1fd2FpdCApOwotCX0KLQkKLQlyZXR1cm4oIG4gKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgICBpb2N0bCBGdW5jdGlvbnMJCQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX2lvY3RsKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCi0KLXsJaW50CQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpLCBlcnI7Ci0JCi0JLyogSSBjYW4gdGhpbmsgb2Ygc2V0dGluZzoKLQkgKiAgLSBtYW51YWwgZmVlZAotCSAqICAtIHBhcGVyIGZvcm1hdAotCSAqICAtIGNvcHkgY291bnQKLQkgKiAgLSAuLi4KLQkgKiBidXQgaGF2ZW4ndCBpbXBsZW1lbnRlZCB0aGF0IHlldCA6LSkKLQkgKiBCVFcsIGhhcyBhbnlib2R5IGJldHRlciBkb2NzIGFib3V0IHRoZSBNT0RFIFNFTlNFL01PREUgU0VMRUNUIGRhdGE/Ci0JICovCi0Jc3dpdGNoKCBjbWQgKSB7Ci0KLQkgIGNhc2UgU0xNSU9SRVNFVDoJCS8qIHJlc2V0IGJ1ZmZlciwgaS5lLiBlbXB0eSB0aGUgYnVmZmVyICovCi0JCWlmICghKGZpbGUtPmZfbW9kZSAmIDIpKQotCQkJcmV0dXJuKCAtRUlOVkFMICk7Ci0JCWlmIChTTE1TdGF0ZSA9PSBQUklOVElORykKLQkJCXJldHVybiggLUVCVVNZICk7Ci0JCVNMTVN0YXRlID0gSURMRTsKLQkJQnVmZmVyUCA9IFNMTUJ1ZmZlcjsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmc2xtX3dhaXQgKTsKLQkJcmV0dXJuKCAwICk7Ci0JCQotCSAgY2FzZSBTTE1JT0dTVEFUOiB7CS8qIGdldCBzdGF0dXMgKi8KLQkJaW50IHN0YXQ7Ci0JCWNoYXIgKnN0cjsKLQotCQlzdGF0ID0gc2xtX3JlcV9zZW5zZSggZGV2aWNlICk7Ci0JCWlmIChhcmcpIHsKLQkJCXN0ciA9IHNsbV9lcnJzdHIoIHN0YXQgKTsKLQkJCWlmIChwdXRfdXNlcihzdGF0LAotICAgIAkgICAgCSAgICAJICAgIAkgICAgIChsb25nICopJigoc3RydWN0IFNMTV9zdGF0dXMgKilhcmcpLT5zdGF0KSkKLSAgICAJICAgIAkgICAgCSAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAoY29weV90b191c2VyKCAoKHN0cnVjdCBTTE1fc3RhdHVzICopYXJnKS0+c3RyLCBzdHIsCi0JCQkJCQkgc3RybGVuKHN0cikgKyAxKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlyZXR1cm4oIHN0YXQgKTsKLQkgIH0KLQkJCi0JICBjYXNlIFNMTUlPR1BTSVpFOiB7CS8qIGdldCBwYXBlciBzaXplICovCi0JCWludCB3LCBoOwotCQkKLQkJaWYgKChlcnIgPSBzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKSkgcmV0dXJuKCBlcnIgKTsKLQkJCi0gICAgCSAgICAJaWYgKHB1dF91c2VyKHcsIChsb25nICopJigoc3RydWN0IFNMTV9wYXBlcl9zaXplICopYXJnKS0+d2lkdGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChwdXRfdXNlcihoLCAobG9uZyAqKSYoKHN0cnVjdCBTTE1fcGFwZXJfc2l6ZSAqKWFyZyktPmhlaWdodCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuKCAwICk7Ci0JICB9Ci0JCQotCSAgY2FzZSBTTE1JT0dNRkVFRDoJLyogZ2V0IG1hbnVhbCBmZWVkICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JICBjYXNlIFNMTUlPU1BTSVpFOgkvKiBzZXQgcGFwZXIgc2l6ZSAqLwotCQlyZXR1cm4oIC1FSU5WQUwgKTsKLQotCSAgY2FzZSBTTE1JT1NNRkVFRDoJLyogc2V0IG1hbnVhbCBmZWVkICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JfQotCXJldHVybiggLUVJTlZBTCApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSBPcGVuaW5nIGFuZCBDbG9zaW5nCQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkKLQotewlpbnQgZGV2aWNlOwotCXN0cnVjdCBzbG0gKnNpcDsKLQkKLQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpOwotCWlmIChkZXZpY2UgPj0gTl9TTE1fUHJpbnRlcnMpCi0JCXJldHVybiggLUVOWElPICk7Ci0Jc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMikgewotCQkvKiBvcGVuIGZvciB3cml0aW5nIGlzIGV4Y2x1c2l2ZSAqLwotCQlpZiAoICFhdG9taWNfZGVjX2FuZF90ZXN0KCZzaXAtPndyX29rKSApIHsKLQkJCWF0b21pY19pbmMoJnNpcC0+d3Jfb2spOwkKLQkJCXJldHVybiggLUVCVVNZICk7Ci0JCX0KLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIDEpIHsKLQkJLyogb3BlbiBmb3IgcmVhZGluZyBpcyBleGNsdXNpdmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoICFhdG9taWNfZGVjX2FuZF90ZXN0KCZzaXAtPnJkX29rKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnNpcC0+cmRfb2spOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCAtRUJVU1kgKTsKLSAgICAgICAgICAgICAgICB9Ci0JfQotCi0JcmV0dXJuKCAwICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fcmVsZWFzZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKQotCi17CWludCBkZXZpY2U7Ci0Jc3RydWN0IHNsbSAqc2lwOwotCQotCWRldmljZSA9IGltaW5vcihpbm9kZSk7Ci0Jc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMikKLQkJYXRvbWljX2luYyggJnNpcC0+d3Jfb2sgKTsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgMSkKLQkJYXRvbWljX2luYyggJnNpcC0+cmRfb2sgKTsKLQkKLQlyZXR1cm4oIDAgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCSBBQ1NJIFByaW1pdGl2ZXMgZm9yIHRoZSBTTE0JCQkJCSAgKi8KLQotCi1zdGF0aWMgaW50IHNsbV9yZXFfc2Vuc2UoIGludCBkZXZpY2UgKQotCi17CWludAkJCXN0YXQsIHJ2OwotCXN0cnVjdCBzbG0gKnNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCQotCXN0ZG1hX2xvY2soIE5VTEwsIE5VTEwgKTsKLQotCUNNRFNFVF9UQVJHX0xVTiggc2xtcmVxc2Vuc2VfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlpZiAoIWFjc2ljbWRfbm9kbWEoIHNsbXJlcXNlbnNlX2NtZCwgMCApIHx8Ci0JCShzdGF0ID0gYWNzaV9nZXRzdGF0dXMoKSkgPCAwKQotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCWVsc2UKLQkJcnYgPSBzdGF0ICYgMHgxZjsKLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuKCBydiApOwotfQotCi0KLXN0YXRpYyBpbnQgc2xtX21vZGVfc2Vuc2UoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGFic19mbGFnICkKLQotewl1bnNpZ25lZCBjaGFyCXN0YXQsIGxlbjsKLQlpbnQJCQkJcnYgPSAwOwotCXN0cnVjdCBzbG0JCSpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbW1zZW5zZV9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCXNsbW1zZW5zZV9jbWRbNV0gPSBhYnNfZmxhZyA/IDB4ODAgOiAwOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtbXNlbnNlX2NtZCwgMCApKSB7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCAmc3RhdCwgMSApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCQotCWlmICghYWNzaV9leHRzdGF0dXMoICZsZW4sIDEgKSkgewotCQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQlidWZmZXJbMF0gPSBsZW47Ci0JaWYgKCFhY3NpX2V4dHN0YXR1cyggYnVmZmVyKzEsIGxlbiApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCQotCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCXJ2ID0gc3RhdCAmIDB4MWY7Ci0KLSAgdGhlX2VuZDoKLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiggcnYgKTsKLX0KLQotCi0jaWYgMAotLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIGludCBzbG1fbW9kZV9zZWxlY3QoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwKLQkJCQkJCQlpbnQgZGVmYXVsdF9mbGFnICkKLQotewlpbnQJCQlzdGF0LCBydjsKLQlzdHJ1Y3Qgc2xtCSpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbW1zZWxlY3RfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlzbG1tc2VsZWN0X2NtZFs1XSA9IGRlZmF1bHRfZmxhZyA/IDB4ODAgOiAwOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtbXNlbGVjdF9jbWQsIDAgKSkgewotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCi0JaWYgKCFkZWZhdWx0X2ZsYWcpIHsKLQkJdW5zaWduZWQgY2hhciBjID0gbGVuOwotCQlpZiAoIWFjc2lfZXh0Y21kKCAmYywgMSApKSB7Ci0JCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQkJZ290byB0aGVfZW5kOwotCQl9Ci0JCWlmICghYWNzaV9leHRjbWQoIGJ1ZmZlciwgbGVuICkpIHsKLQkJCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCQlnb3RvIHRoZV9lbmQ7Ci0JCX0KLQl9Ci0JCi0Jc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCk7Ci0JcnYgPSAoc3RhdCA8IDAgPyBTTE1TVEFUX0FDU0lUTyA6IHN0YXQpOwotCi0gIHRoZV9lbmQ6Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4oIHJ2ICk7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IHNsbV9nZXRfcGFnZXNpemUoIGludCBkZXZpY2UsIGludCAqdywgaW50ICpoICkKLQotewljaGFyCWJ1ZlsyNTZdOwotCWludAkJc3RhdDsKLQkKLQlzdGF0ID0gc2xtX21vZGVfc2Vuc2UoIGRldmljZSwgYnVmLCAwICk7Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQotCWlmIChzdGF0ICE9IFNMTVNUQVRfT0spCi0JCXJldHVybiggLUVJTyApOwotCi0JKncgPSAoYnVmWzNdIDw8IDgpIHwgYnVmWzRdOwotCSpoID0gKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKLQlyZXR1cm4oIDAgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkJSW5pdGlhbGl6YXRpb24JCQkJCQkJICAqLwotCi0KLWludCBhdHRhY2hfc2xtKCBpbnQgdGFyZ2V0LCBpbnQgbHVuICkKLQotewlzdGF0aWMgaW50CWRpZF9yZWdpc3RlcjsKLQlpbnQJCQlsZW47Ci0KLQlpZiAoTl9TTE1fUHJpbnRlcnMgPj0gTUFYX1NMTSkgewotCQlwcmludGsoIEtFUk5fV0FSTklORyAiVG9vIG11Y2ggU0xNc1xuIiApOwotCQlyZXR1cm4oIDAgKTsKLQl9Ci0JCi0JLyogZG8gYW4gSU5RVUlSWSAqLwotCXVkZWxheSgxMDApOwotCUNNRFNFVF9UQVJHX0xVTiggc2xtaW5xdWlyeV9jbWQsIHRhcmdldCwgbHVuICk7Ci0JaWYgKCFhY3NpY21kX25vZG1hKCBzbG1pbnF1aXJ5X2NtZCwgMCApKSB7Ci0JICBpbnFfdGltZW91dDoKLQkJcHJpbnRrKCBLRVJOX0VSUiAiU0xNIGlucXVpcnkgY29tbWFuZCB0aW1lZCBvdXQuXG4iICk7Ci0JICBpbnFfZmFpbDoKLQkJYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JCXJldHVybiggMCApOwotCX0KLQkvKiByZWFkIHN0YXR1cyBhbmQgaGVhZGVyIG9mIHJldHVybiBkYXRhICovCi0JaWYgKCFhY3NpX2V4dHN0YXR1cyggU0xNQnVmZmVyLCA2ICkpCi0JCWdvdG8gaW5xX3RpbWVvdXQ7Ci0KLQlpZiAoU0xNQnVmZmVyWzFdICE9IDIpIHsgLyogZGV2aWNlIHR5cGUgPT0gcHJpbnRlcj8gKi8KLQkJcHJpbnRrKCBLRVJOX0VSUiAiU0xNIGlucXVpcnkgcmV0dXJuZWQgZGV2aWNlIHR5cGUgIT0gcHJpbnRlclxuIiApOwotCQlnb3RvIGlucV9mYWlsOwotCX0KLQlsZW4gPSBTTE1CdWZmZXJbNV07Ci0JCi0JLyogcmVhZCBpZCBzdHJpbmcgKi8KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCBTTE1CdWZmZXIsIGxlbiApKQotCQlnb3RvIGlucV90aW1lb3V0OwotCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCVNMTUJ1ZmZlcltsZW5dID0gMDsKLQotCWlmICghZGlkX3JlZ2lzdGVyKSB7Ci0JCWRpZF9yZWdpc3RlciA9IDE7Ci0JfQotCi0Jc2xtX2luZm9bTl9TTE1fUHJpbnRlcnNdLnRhcmdldCA9IHRhcmdldDsKLQlzbG1faW5mb1tOX1NMTV9QcmludGVyc10ubHVuICAgID0gbHVuOwotCWF0b21pY19zZXQoJnNsbV9pbmZvW05fU0xNX1ByaW50ZXJzXS53cl9vaywgMSApOyAKLQlhdG9taWNfc2V0KCZzbG1faW5mb1tOX1NMTV9QcmludGVyc10ucmRfb2ssIDEgKTsKLQkKLQlwcmludGsoIEtFUk5fSU5GTyAiICBQcmludGVyOiAlc1xuIiwgU0xNQnVmZmVyICk7Ci0JcHJpbnRrKCBLRVJOX0lORk8gIkRldGVjdGVkIHNsbSVkIGF0IGlkICVkIGx1biAlZFxuIiwKLQkJCU5fU0xNX1ByaW50ZXJzLCB0YXJnZXQsIGx1biApOwotCU5fU0xNX1ByaW50ZXJzKys7Ci0JcmV0dXJuKCAxICk7Ci19Ci0KLWludCBzbG1faW5pdCggdm9pZCApCi0KLXsKLQlpbnQgaTsKLQlpZiAocmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiwgJnNsbV9mb3BzICkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiVW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgQUNTSSBTTE1cbiIsIEFDU0lfTUFKT1IgKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JCi0JaWYgKCEoU0xNQnVmZmVyID0gYXRhcmlfc3RyYW1fYWxsb2MoIFNMTV9CVUZGRVJfU0laRSwgIlNMTSIgKSkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiVW5hYmxlIHRvIGdldCBTTE0gU1QtUmFtIGJ1ZmZlci5cbiIgKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXYoIEFDU0lfTUFKT1IsICJzbG0iICk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCVNMTVN0YXRlID0gSURMRTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIE1PRFVMRQotCi0vKiBmcm9tIGFjc2kuYyAqLwotdm9pZCBhY3NpX2F0dGFjaF9TTE1zKCBpbnQgKCphdHRhY2hfZnVuYykoIGludCwgaW50ICkgKTsKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc2xtX2luaXQoKSkpCi0JCXJldHVybiggZXJyICk7Ci0JLyogVGhpcyBjYWxscyBhdHRhY2hfc2xtKCkgZm9yIGV2ZXJ5IHRhcmdldC9sdW4gd2hlcmUgYWNzaS5jIGRldGVjdGVkIGEKLQkgKiBwcmludGVyICovCi0JYWNzaV9hdHRhY2hfU0xNcyggYXR0YWNoX3NsbSApOwotCXJldHVybiggMCApOwotfQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JaWYgKHVucmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiApICE9IDApCi0JCXByaW50ayggS0VSTl9FUlIgImFjc2lfc2xtOiBjbGVhbnVwX21vZHVsZSBmYWlsZWRcbiIpOwotCWF0YXJpX3N0cmFtX2ZyZWUoIFNMTUJ1ZmZlciApOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMGZjYWQ0My4uYTJkNjYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAljYXNlIFNHX0VNVUxBVEVEX0hPU1Q6CiAJY2FzZSBTR19JTzoKIAljYXNlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EOgotCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZXAsIGRpc2ssIGNtZCwgYXJncCk7CisJCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxlcCwgZGlzay0+cXVldWUsIGRpc2ssIGNtZCwgYXJncCk7CiAKIAkvKiBzY3NpX2NtZF9pb2N0bCB3b3VsZCBub3JtYWxseSBoYW5kbGUgdGhlc2UsIGJlbG93LCBidXQgKi8KIAkvKiB0aGV5IGFyZW4ndCBhIGdvb2QgZml0IGZvciBjY2lzcywgYXMgQ0QtUk9NcyBhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggNDUwMzI5MC4uZTQyNWRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTY4LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb29wLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIGludmFsaWRhdGVfYmRldigpICovCiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgpAQCAtNjAwLDEzICs2MDEsNiBAQAogCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBkYXRhOwogCXN0cnVjdCBiaW8gKmJpbzsKIAotCS8qCi0JICogbG9vcCBjYW4gYmUgdXNlZCBpbiBhbiBlbmNyeXB0ZWQgZGV2aWNlLAotCSAqIGhlbmNlLCBpdCBtdXN0bid0IGJlIHN0b3BwZWQgYXQgYWxsCi0JICogYmVjYXVzZSBpdCBjb3VsZCBiZSBpbmRpcmVjdGx5IHVzZWQgZHVyaW5nIHN1c3BlbnNpb24KLQkgKi8KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGxvLT5sb19iaW8pIHsKQEAgLTE1NzQsOCArMTU2OCw3IEBACiAJCWxvb3BfZGVsX29uZShsbyk7CiAKIAlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoTE9PUF9NQUpPUiwgMCksIHJhbmdlKTsKLQlpZiAodW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9vcDogY2Fubm90IHVucmVnaXN0ZXIgYmxrZGV2XG4iKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihMT09QX01BSk9SLCAibG9vcCIpOwogfQogCiBtb2R1bGVfaW5pdChsb29wX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggYzU3NWZiMS4uYzEyOTUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0xMjIsMTcgKzEyMiwxMiBAQAogCWludCByZXN1bHQ7CiAJc3RydWN0IG1zZ2hkciBtc2c7CiAJc3RydWN0IGt2ZWMgaW92OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2lnc2V0X3Qgb2xkc2V0OworCXNpZ3NldF90IGJsb2NrZWQsIG9sZHNldDsKIAogCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKIAkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXNpZ2RlbHNldG1hc2soJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHS0lMTCkpOwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXNpZ2luaXRzZXRpbnYoJmJsb2NrZWQsIHNpZ21hc2soU0lHS0lMTCkpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYmxvY2tlZCwgJm9sZHNldCk7CiAKIAlkbyB7CiAJCXNvY2stPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PSU87CkBAIC0xNTEsMTEgKzE0Niw5IEBACiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlzaWdpbmZvX3QgaW5mbzsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuYmQgKHBpZCAlZDogJXMpIGdvdCBzaWduYWwgJWRcbiIsCi0JCQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCAKLQkJCQlkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgJmluZm8pKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwkJCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sCisJCQkJZGVxdWV1ZV9zaWduYWxfbG9jayhjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgJmluZm8pKTsKIAkJCXJlc3VsdCA9IC1FSU5UUjsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNjksMTAgKzE2Miw3IEBACiAJCWJ1ZiArPSByZXN1bHQ7CiAJfSB3aGlsZSAoc2l6ZSA+IDApOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQljdXJyZW50LT5ibG9ja2VkID0gb2xkc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkc2V0LCBOVUxMKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IGNlNjRlODYuLjMxYmUzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC0xNTkzLDYgKzE1OTMsNyBAQAogCWxvbmcgbWluX3NsZWVwX3RpbWUsIHJlc2lkdWU7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJZm9yICg7OykgewogCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKQEAgLTE2NTIsOSArMTY1Myw2IEBACiAJCQkJfQogCQkJfQogCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCQkJfQogCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZTNjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKQEAgLTAsMCArMSw5NzIgQEAKKy8qIHN1bnZkYy5jOiBTdW4gTERPTSBWaXJ0dWFsIERpc2sgQ2xpZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInN1bnZkYyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bmUgMjUsIDIwMDciCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuIExET00gdmlydHVhbCBkaXNrIGNsaWVudCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKKyNkZWZpbmUgVkRDX1RYX1JJTkdfU0laRQkyNTYKKworI2RlZmluZSBXQUlUSU5HX0ZPUl9MSU5LX1VQCTB4MDEKKyNkZWZpbmUgV0FJVElOR19GT1JfVFhfU1BBQ0UJMHgwMgorI2RlZmluZSBXQUlUSU5HX0ZPUl9HRU5fQ01ECTB4MDQKKyNkZWZpbmUgV0FJVElOR19GT1JfQU5ZCQktMQorCitzdHJ1Y3QgdmRjX3JlcV9lbnRyeSB7CisJc3RydWN0IHJlcXVlc3QJCSpyZXE7Cit9OworCitzdHJ1Y3QgdmRjX3BvcnQgeworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlCXZpbzsKKworCXN0cnVjdCB2ZGMJCSp2cDsKKworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKworCXN0cnVjdCB2ZGNfY29tcGxldGlvbgkqY21wOworCisJdTY0CQkJcmVxX2lkOworCXU2NAkJCXNlcTsKKwlzdHJ1Y3QgdmRjX3JlcV9lbnRyeQlycV9hcnJbVkRDX1RYX1JJTkdfU0laRV07CisKKwl1bnNpZ25lZCBsb25nCQlyaW5nX2Nvb2tpZXM7CisKKwl1NjQJCQltYXhfeGZlcl9zaXplOworCXUzMgkJCXZkaXNrX2Jsb2NrX3NpemU7CisKKwkvKiBUaGUgc2VydmVyIGZpbGxzIHRoZXNlIGluIGZvciB1cyBpbiB0aGUgZGlzayBhdHRyaWJ1dGUKKwkgKiBBQ0sgcGFja2V0LgorCSAqLworCXU2NAkJCW9wZXJhdGlvbnM7CisJdTMyCQkJdmRpc2tfc2l6ZTsKKwl1OAkJCXZkaXNrX3R5cGU7CisJdTgJCQlkZXZfbm87CisKKwljaGFyCQkJZGlza19uYW1lWzMyXTsKKworCXN0cnVjdCB2aW9fZGlza19nZW9tCWdlb207CisJc3RydWN0IHZpb19kaXNrX3Z0b2MJbGFiZWw7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2ZGNfcG9ydCAqdG9fdmRjX3BvcnQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHZpbywgc3RydWN0IHZkY19wb3J0LCB2aW8pOworfQorCitzdHJ1Y3QgdmRjIHsKKwkvKiBQcm90ZWN0cyBwcm90X2xpc3QuICAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgdmlvX2RldgkJKmRldjsKKworCXN0cnVjdCBsaXN0X2hlYWQJcG9ydF9saXN0OworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0ICovCitzdGF0aWMgc3RydWN0IHZpb192ZXJzaW9uIHZkY192ZXJzaW9uc1tdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworI2RlZmluZSBWRENCTEtfTkFNRQkidmRpc2siCitzdGF0aWMgaW50IHZkY19tYWpvcjsKKyNkZWZpbmUgUEFSVElUSU9OX1NISUZUCTMKKworc3RhdGljIGlubGluZSB1MzIgdmRjX3R4X2RyaW5nX2F2YWlsKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCXJldHVybiB2aW9fZHJpbmdfYXZhaWwoZHIsIFZEQ19UWF9SSU5HX1NJWkUpOworfQorCitzdGF0aWMgaW50IHZkY19nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IGRpc2stPnByaXZhdGVfZGF0YTsKKworCWdlby0+aGVhZHMgPSAodTgpIHBvcnQtPmdlb20ubnVtX2hkOworCWdlby0+c2VjdG9ycyA9ICh1OCkgcG9ydC0+Z2VvbS5udW1fc2VjOworCWdlby0+Y3lsaW5kZXJzID0gcG9ydC0+Z2VvbS5udW1fY3lsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgdmRjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5nZXRnZW8JCT0gdmRjX2dldGdlbywKK307CisKK3N0YXRpYyB2b2lkIHZkY19maW5pc2goc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgaW50IGVyciwgaW50IHdhaXRpbmdfZm9yKQoreworCWlmICh2aW8tPmNtcCAmJgorCSAgICAod2FpdGluZ19mb3IgPT0gLTEgfHwKKwkgICAgIHZpby0+Y21wLT53YWl0aW5nX2ZvciA9PSB3YWl0aW5nX2ZvcikpIHsKKwkJdmlvLT5jbXAtPmVyciA9IGVycjsKKwkJY29tcGxldGUoJnZpby0+Y21wLT5jb20pOworCQl2aW8tPmNtcCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGNfaGFuZHNoYWtlX2NvbXBsZXRlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJdmRjX2ZpbmlzaCh2aW8sIDAsIFdBSVRJTkdfRk9SX0xJTktfVVApOworfQorCitzdGF0aWMgaW50IHZkY19oYW5kbGVfdW5rbm93bihzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlvX21zZ190YWcgKnBrdCA9IGFyZzsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlY2VpdmVkIHVua25vd24gbXNnIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkgICAgICAgcGt0LT50eXBlLCBwa3QtPnN0eXBlLCBwa3QtPnN0eXBlX2VudiwgcGt0LT5zaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlc2V0dGluZyBjb25uZWN0aW9uLlxuIik7CisKKwlsZGNfZGlzY29ubmVjdChwb3J0LT52aW8ubHApOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHZkY19zZW5kX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSB0b192ZGNfcG9ydCh2aW8pOworCXN0cnVjdCB2aW9fZGlza19hdHRyX2luZm8gcGt0OworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKworCXBrdC50YWcudHlwZSA9IFZJT19UWVBFX0NUUkw7CisJcGt0LnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0lORk87CisJcGt0LnRhZy5zdHlwZV9lbnYgPSBWSU9fQVRUUl9JTkZPOworCXBrdC50YWcuc2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisKKwlwa3QueGZlcl9tb2RlID0gVklPX0RSSU5HX01PREU7CisJcGt0LnZkaXNrX2Jsb2NrX3NpemUgPSBwb3J0LT52ZGlza19ibG9ja19zaXplOworCXBrdC5tYXhfeGZlcl9zaXplID0gcG9ydC0+bWF4X3hmZXJfc2l6ZTsKKworCXZpb2RiZyhIUywgIlNFTkQgQVRUUiB4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsdV1cbiIsCisJICAgICAgIHBrdC54ZmVyX21vZGUsIHBrdC52ZGlza19ibG9ja19zaXplLCBwa3QubWF4X3hmZXJfc2l6ZSk7CisKKwlyZXR1cm4gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZwa3QsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCB2ZGNfaGFuZGxlX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IHRvX3ZkY19wb3J0KHZpbyk7CisJc3RydWN0IHZpb19kaXNrX2F0dHJfaW5mbyAqcGt0ID0gYXJnOworCisJdmlvZGJnKEhTLCAiR09UIEFUVFIgc3R5cGVbMHgleF0gb3BzWyVseF0gZGlza19zaXplWyVsdV0gZGlza190eXBlWyV4XSAiCisJICAgICAgICJ4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsdV1cbiIsCisJICAgICAgIHBrdC0+dGFnLnN0eXBlLCBwa3QtPm9wZXJhdGlvbnMsCisJICAgICAgIHBrdC0+dmRpc2tfc2l6ZSwgcGt0LT52ZGlza190eXBlLAorCSAgICAgICBwa3QtPnhmZXJfbW9kZSwgcGt0LT52ZGlza19ibG9ja19zaXplLAorCSAgICAgICBwa3QtPm1heF94ZmVyX3NpemUpOworCisJaWYgKHBrdC0+dGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0FDSykgeworCQlzd2l0Y2ggKHBrdC0+dmRpc2tfdHlwZSkgeworCQljYXNlIFZEX0RJU0tfVFlQRV9ESVNLOgorCQljYXNlIFZEX0RJU0tfVFlQRV9TTElDRToKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQm9ndXMgdmRpc2tfdHlwZSAweCV4XG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgcGt0LT52ZGlza190eXBlKTsKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKwkJfQorCisJCWlmIChwa3QtPnZkaXNrX2Jsb2NrX3NpemUgPiBwb3J0LT52ZGlza19ibG9ja19zaXplKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQkxPQ0sgc2l6ZSBpbmNyZWFzZWQgIgorCQkJICAgICAgICIldSAtLT4gJXVcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLAorCQkJICAgICAgIHBvcnQtPnZkaXNrX2Jsb2NrX3NpemUsIHBrdC0+dmRpc2tfYmxvY2tfc2l6ZSk7CisJCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJCX0KKworCQlwb3J0LT5vcGVyYXRpb25zID0gcGt0LT5vcGVyYXRpb25zOworCQlwb3J0LT52ZGlza19zaXplID0gcGt0LT52ZGlza19zaXplOworCQlwb3J0LT52ZGlza190eXBlID0gcGt0LT52ZGlza190eXBlOworCQlpZiAocGt0LT5tYXhfeGZlcl9zaXplIDwgcG9ydC0+bWF4X3hmZXJfc2l6ZSkKKwkJCXBvcnQtPm1heF94ZmVyX3NpemUgPSBwa3QtPm1heF94ZmVyX3NpemU7CisJCXBvcnQtPnZkaXNrX2Jsb2NrX3NpemUgPSBwa3QtPnZkaXNrX2Jsb2NrX3NpemU7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBBdHRyaWJ1dGUgTkFDS1xuIiwgdmlvLT5uYW1lKTsKKworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB2ZGNfZW5kX3NwZWNpYWwoc3RydWN0IHZkY19wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyAqZGVzYykKK3sKKwlpbnQgZXJyID0gZGVzYy0+c3RhdHVzOworCisJdmRjX2ZpbmlzaCgmcG9ydC0+dmlvLCAtZXJyLCBXQUlUSU5HX0ZPUl9HRU5fQ01EKTsKK30KKworc3RhdGljIHZvaWQgdmRjX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCB1cHRvZGF0ZSwgaW50IG51bV9zZWN0b3JzKQoreworCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJlcSwgdXB0b2RhdGUsIG51bV9zZWN0b3JzKSkKKwkJcmV0dXJuOworCWFkZF9kaXNrX3JhbmRvbW5lc3MocmVxLT5ycV9kaXNrKTsKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxLCB1cHRvZGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHZkY19lbmRfb25lKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQl1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2MgPSB2aW9fZHJpbmdfZW50cnkoZHIsIGluZGV4KTsKKwlzdHJ1Y3QgdmRjX3JlcV9lbnRyeSAqcnFlID0gJnBvcnQtPnJxX2FycltpbmRleF07CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKworCWlmICh1bmxpa2VseShkZXNjLT5oZHIuc3RhdGUgIT0gVklPX0RFU0NfRE9ORSkpCisJCXJldHVybjsKKworCWxkY191bm1hcChwb3J0LT52aW8ubHAsIGRlc2MtPmNvb2tpZXMsIGRlc2MtPm5jb29raWVzKTsKKwlkZXNjLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19GUkVFOworCWRyLT5jb25zID0gKGluZGV4ICsgMSkgJiAoVkRDX1RYX1JJTkdfU0laRSAtIDEpOworCisJcmVxID0gcnFlLT5yZXE7CisJaWYgKHJlcSA9PSBOVUxMKSB7CisJCXZkY19lbmRfc3BlY2lhbChwb3J0LCBkZXNjKTsKKwkJcmV0dXJuOworCX0KKworCXJxZS0+cmVxID0gTlVMTDsKKworCXZkY19lbmRfcmVxdWVzdChyZXEsICFkZXNjLT5zdGF0dXMsIGRlc2MtPnNpemUgPj4gOSk7CisKKwlpZiAoYmxrX3F1ZXVlX3N0b3BwZWQocG9ydC0+ZGlzay0+cXVldWUpKQorCQlibGtfc3RhcnRfcXVldWUocG9ydC0+ZGlzay0+cXVldWUpOworfQorCitzdGF0aWMgaW50IHZkY19hY2soc3RydWN0IHZkY19wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSAqcGt0ID0gbXNnYnVmOworCisJaWYgKHVubGlrZWx5KHBrdC0+ZHJpbmdfaWRlbnQgIT0gZHItPmlkZW50IHx8CisJCSAgICAgcGt0LT5zdGFydF9pZHggIT0gcGt0LT5lbmRfaWR4IHx8CisJCSAgICAgcGt0LT5zdGFydF9pZHggPj0gVkRDX1RYX1JJTkdfU0laRSkpCisJCXJldHVybiAwOworCisJdmRjX2VuZF9vbmUocG9ydCwgZHIsIHBrdC0+c3RhcnRfaWR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkY19uYWNrKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCS8qIFhYWCBJbXBsZW1lbnQgbWUgWFhYICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkY19ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSBhcmc7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpby0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGV2ZW50ID09IExEQ19FVkVOVF9SRVNFVCB8fAorCQkgICAgIGV2ZW50ID09IExEQ19FVkVOVF9VUCkpIHsKKwkJdmlvX2xpbmtfc3RhdGVfY2hhbmdlKHZpbywgZXZlbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgdmlvX21zZ190YWcgdGFnOworCQkJdTY0IHJhd1s4XTsKKwkJfSBtc2didWY7CisKKwkJZXJyID0gbGRjX3JlYWQodmlvLT5scCwgJm1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZikpOworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJdmlvX2Nvbm5fcmVzZXQodmlvKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlcnIgPT0gMCkKKwkJCWJyZWFrOworCQl2aW9kYmcoREFUQSwgIlRBRyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJCSAgICAgICBtc2didWYudGFnLnR5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlLAorCQkgICAgICAgbXNnYnVmLnRhZy5zdHlwZV9lbnYsCisJCSAgICAgICBtc2didWYudGFnLnNpZCk7CisJCWVyciA9IHZpb192YWxpZGF0ZV9zaWQodmlvLCAmbXNnYnVmLnRhZyk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGxpa2VseShtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfREFUQSkpIHsKKwkJCWlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0FDSykKKwkJCQllcnIgPSB2ZGNfYWNrKHBvcnQsICZtc2didWYpOworCQkJZWxzZSBpZiAobXNnYnVmLnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9OQUNLKQorCQkJCWVyciA9IHZkY19uYWNrKHBvcnQsICZtc2didWYpOworCQkJZWxzZQorCQkJCWVyciA9IHZkY19oYW5kbGVfdW5rbm93bihwb3J0LCAmbXNnYnVmKTsKKwkJfSBlbHNlIGlmIChtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfQ1RSTCkgeworCQkJZXJyID0gdmlvX2NvbnRyb2xfcGt0X2VuZ2luZSh2aW8sICZtc2didWYpOworCQl9IGVsc2UgeworCQkJZXJyID0gdmRjX2hhbmRsZV91bmtub3duKHBvcnQsICZtc2didWYpOworCQl9CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisJfQorCWlmIChlcnIgPCAwKQorCQl2ZGNfZmluaXNoKCZwb3J0LT52aW8sIGVyciwgV0FJVElOR19GT1JfQU5ZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX3ZkY190eF90cmlnZ2VyKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJc3RydWN0IHZpb19kcmluZ19kYXRhIGhkciA9IHsKKwkJLnRhZyA9IHsKKwkJCS50eXBlCQk9IFZJT19UWVBFX0RBVEEsCisJCQkuc3R5cGUJCT0gVklPX1NVQlRZUEVfSU5GTywKKwkJCS5zdHlwZV9lbnYJPSBWSU9fRFJJTkdfREFUQSwKKwkJCS5zaWQJCT0gdmlvX3NlbmRfc2lkKCZwb3J0LT52aW8pLAorCQl9LAorCQkuZHJpbmdfaWRlbnQJCT0gZHItPmlkZW50LAorCQkuc3RhcnRfaWR4CQk9IGRyLT5wcm9kLAorCQkuZW5kX2lkeAkJPSBkci0+cHJvZCwKKwl9OworCWludCBlcnIsIGRlbGF5OworCisJaGRyLnNlcSA9IGRyLT5zbmRfbnh0OworCWRlbGF5ID0gMTsKKwlkbyB7CisJCWVyciA9IHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJCWlmIChlcnIgPiAwKSB7CisJCQlkci0+c25kX254dCsrOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KGRlbGF5KTsKKwkJaWYgKChkZWxheSA8PD0gMSkgPiAxMjgpCisJCQlkZWxheSA9IDEyODsKKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fc2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1twb3J0LT5yaW5nX2Nvb2tpZXNdOworCXN0cnVjdCB2ZGNfcmVxX2VudHJ5ICpycWU7CisJc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IG1hcF9wZXJtOworCWludCBuc2csIGVyciwgaTsKKwl1NjQgbGVuOworCXU4IG9wOworCisJbWFwX3Blcm0gPSBMRENfTUFQX1NIQURPVyB8IExEQ19NQVBfRElSRUNUIHwgTERDX01BUF9JTzsKKworCWlmIChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpIHsKKwkJbWFwX3Blcm0gfD0gTERDX01BUF9XOworCQlvcCA9IFZEX09QX0JSRUFEOworCX0gZWxzZSB7CisJCW1hcF9wZXJtIHw9IExEQ19NQVBfUjsKKwkJb3AgPSBWRF9PUF9CV1JJVEU7CisJfQorCisJbnNnID0gYmxrX3JxX21hcF9zZyhyZXEtPnEsIHJlcSwgc2cpOworCisJbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspCisJCWxlbiArPSBzZ1tpXS5sZW5ndGg7CisKKwlpZiAodW5saWtlbHkodmRjX3R4X2RyaW5nX2F2YWlsKGRyKSA8IDEpKSB7CisJCWJsa19zdG9wX3F1ZXVlKHBvcnQtPmRpc2stPnF1ZXVlKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZGVzYyA9IHZpb19kcmluZ19jdXIoZHIpOworCisJZXJyID0gbGRjX21hcF9zZyhwb3J0LT52aW8ubHAsIHNnLCBuc2csCisJCQkgZGVzYy0+Y29va2llcywgcG9ydC0+cmluZ19jb29raWVzLAorCQkJIG1hcF9wZXJtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfbWFwX3NnKCkgZmFpbHVyZSwgZXJyPSVkLlxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlycWUgPSAmcG9ydC0+cnFfYXJyW2RyLT5wcm9kXTsKKwlycWUtPnJlcSA9IHJlcTsKKworCWRlc2MtPmhkci5hY2sgPSBWSU9fQUNLX0VOQUJMRTsKKwlkZXNjLT5yZXFfaWQgPSBwb3J0LT5yZXFfaWQ7CisJZGVzYy0+b3BlcmF0aW9uID0gb3A7CisJaWYgKHBvcnQtPnZkaXNrX3R5cGUgPT0gVkRfRElTS19UWVBFX0RJU0spIHsKKwkJZGVzYy0+c2xpY2UgPSAyOworCX0gZWxzZSB7CisJCWRlc2MtPnNsaWNlID0gMDsKKwl9CisJZGVzYy0+c3RhdHVzID0gfjA7CisJZGVzYy0+b2Zmc2V0ID0gKHJlcS0+c2VjdG9yIDw8IDkpIC8gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZTsKKwlkZXNjLT5zaXplID0gbGVuOworCWRlc2MtPm5jb29raWVzID0gZXJyOworCisJLyogVGhpcyBoYXMgdG8gYmUgYSBub24tU01QIHdyaXRlIGJhcnJpZXIgYmVjYXVzZSB3ZSBhcmUgd3JpdGluZworCSAqIHRvIG1lbW9yeSB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgcGVlciBMRE9NLgorCSAqLworCXdtYigpOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX1JFQURZOworCisJZXJyID0gX192ZGNfdHhfdHJpZ2dlcihwb3J0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2ZGNfdHhfdHJpZ2dlcigpIGZhaWx1cmUsIGVycj0lZFxuIiwgZXJyKTsKKwl9IGVsc2UgeworCQlwb3J0LT5yZXFfaWQrKzsKKwkJZHItPnByb2QgPSAoZHItPnByb2QgKyAxKSAmIChWRENfVFhfUklOR19TSVpFIC0gMSk7CisJfQorb3V0OgorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZG9fdmRjX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQoreworCXdoaWxlICgxKSB7CisJCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCisJCWlmICghcmVxKQorCQkJYnJlYWs7CisKKwkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQlpZiAoX19zZW5kX3JlcXVlc3QocmVxKSA8IDApCisJCQl2ZGNfZW5kX3JlcXVlc3QocmVxLCAwLCByZXEtPmhhcmRfbnJfc2VjdG9ycyk7CisJfQorfQorCitzdGF0aWMgaW50IGdlbmVyaWNfcmVxdWVzdChzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHU4IG9wLCB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisJc3RydWN0IHZpb19jb21wbGV0aW9uIGNvbXA7CisJc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IG1hcF9wZXJtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9wX2xlbiwgZXJyOworCXZvaWQgKnJlcV9idWY7CisKKwlpZiAoISgoKHU2NCkxIDw8ICgodTY0KW9wIC0gMSkpICYgcG9ydC0+b3BlcmF0aW9ucykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIFZEX09QX0JSRUFEOgorCWNhc2UgVkRfT1BfQldSSVRFOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBWRF9PUF9GTFVTSDoKKwkJb3BfbGVuID0gMDsKKwkJbWFwX3Blcm0gPSAwOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX1dDRToKKwkJb3BfbGVuID0gc2l6ZW9mKHUzMik7CisJCW1hcF9wZXJtID0gTERDX01BUF9XOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfU0VUX1dDRToKKwkJb3BfbGVuID0gc2l6ZW9mKHUzMik7CisJCW1hcF9wZXJtID0gTERDX01BUF9SOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX1ZUT0M6CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfdnRvYyk7CisJCW1hcF9wZXJtID0gTERDX01BUF9XOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfU0VUX1ZUT0M6CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfdnRvYyk7CisJCW1hcF9wZXJtID0gTERDX01BUF9SOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX0RJU0tHRU9NOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2dlb20pOworCQltYXBfcGVybSA9IExEQ19NQVBfVzsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX1NFVF9ESVNLR0VPTToKKwkJb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza19nZW9tKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1I7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9TQ1NJQ01EOgorCQlvcF9sZW4gPSAxNjsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1JXOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX0RFVklEOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2RldmlkKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1c7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9HRVRfRUZJOgorCWNhc2UgVkRfT1BfU0VUX0VGSToKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9OworCisJbWFwX3Blcm0gfD0gTERDX01BUF9TSEFET1cgfCBMRENfTUFQX0RJUkVDVCB8IExEQ19NQVBfSU87CisKKwlvcF9sZW4gPSAob3BfbGVuICsgNykgJiB+NzsKKwlyZXFfYnVmID0ga3phbGxvYyhvcF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcmVxX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobGVuID4gb3BfbGVuKQorCQlsZW4gPSBvcF9sZW47CisKKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCW1lbWNweShyZXFfYnVmLCBidWYsIGxlbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKworCS8qIFhYWCBJZiB3ZSB3YW50IHRvIHVzZSB0aGlzIGNvZGUgZ2VuZXJpY2FsbHkgd2UgaGF2ZSB0bworCSAqIFhYWCBoYW5kbGUgVFggcmluZyBleGhhdXN0aW9uIGV0Yy4KKwkgKi8KKwlkZXNjID0gdmlvX2RyaW5nX2N1cihkcik7CisKKwllcnIgPSBsZGNfbWFwX3NpbmdsZShwb3J0LT52aW8ubHAsIHJlcV9idWYsIG9wX2xlbiwKKwkJCSAgICAgZGVzYy0+Y29va2llcywgcG9ydC0+cmluZ19jb29raWVzLAorCQkJICAgICBtYXBfcGVybSk7CisJaWYgKGVyciA8IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKwkJa2ZyZWUocmVxX2J1Zik7CisJCXJldHVybiBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZjb21wLmNvbSk7CisJY29tcC53YWl0aW5nX2ZvciA9IFdBSVRJTkdfRk9SX0dFTl9DTUQ7CisJcG9ydC0+dmlvLmNtcCA9ICZjb21wOworCisJZGVzYy0+aGRyLmFjayA9IFZJT19BQ0tfRU5BQkxFOworCWRlc2MtPnJlcV9pZCA9IHBvcnQtPnJlcV9pZDsKKwlkZXNjLT5vcGVyYXRpb24gPSBvcDsKKwlkZXNjLT5zbGljZSA9IDA7CisJZGVzYy0+c3RhdHVzID0gfjA7CisJZGVzYy0+b2Zmc2V0ID0gMDsKKwlkZXNjLT5zaXplID0gb3BfbGVuOworCWRlc2MtPm5jb29raWVzID0gZXJyOworCisJLyogVGhpcyBoYXMgdG8gYmUgYSBub24tU01QIHdyaXRlIGJhcnJpZXIgYmVjYXVzZSB3ZSBhcmUgd3JpdGluZworCSAqIHRvIG1lbW9yeSB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgcGVlciBMRE9NLgorCSAqLworCXdtYigpOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX1JFQURZOworCisJZXJyID0gX192ZGNfdHhfdHJpZ2dlcihwb3J0KTsKKwlpZiAoZXJyID49IDApIHsKKwkJcG9ydC0+cmVxX2lkKys7CisJCWRyLT5wcm9kID0gKGRyLT5wcm9kICsgMSkgJiAoVkRDX1RYX1JJTkdfU0laRSAtIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXAuY29tKTsKKwkJZXJyID0gY29tcC5lcnI7CisJfSBlbHNlIHsKKwkJcG9ydC0+dmlvLmNtcCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9XKQorCQltZW1jcHkoYnVmLCByZXFfYnVmLCBsZW4pOworCisJa2ZyZWUocmVxX2J1Zik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZGNfYWxsb2NfdHhfcmluZyhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXVuc2lnbmVkIGxvbmcgbGVuLCBlbnRyeV9zaXplOworCWludCBuY29va2llczsKKwl2b2lkICpkcmluZzsKKworCWVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2Rlc2MpICsKKwkJKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKiBwb3J0LT5yaW5nX2Nvb2tpZXMpOworCWxlbiA9IChWRENfVFhfUklOR19TSVpFICogZW50cnlfc2l6ZSk7CisKKwluY29va2llcyA9IFZJT19NQVhfUklOR19DT09LSUVTOworCWRyaW5nID0gbGRjX2FsbG9jX2V4cF9kcmluZyhwb3J0LT52aW8ubHAsIGxlbiwKKwkJCQkgICAgZHItPmNvb2tpZXMsICZuY29va2llcywKKwkJCQkgICAgKExEQ19NQVBfU0hBRE9XIHwKKwkJCQkgICAgIExEQ19NQVBfRElSRUNUIHwKKwkJCQkgICAgIExEQ19NQVBfUlcpKTsKKwlpZiAoSVNfRVJSKGRyaW5nKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHJpbmcpOworCisJZHItPmJhc2UgPSBkcmluZzsKKwlkci0+ZW50cnlfc2l6ZSA9IGVudHJ5X3NpemU7CisJZHItPm51bV9lbnRyaWVzID0gVkRDX1RYX1JJTkdfU0laRTsKKwlkci0+cHJvZCA9IGRyLT5jb25zID0gMDsKKwlkci0+cGVuZGluZyA9IFZEQ19UWF9SSU5HX1NJWkU7CisJZHItPm5jb29raWVzID0gbmNvb2tpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmRjX2ZyZWVfdHhfcmluZyhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCisJaWYgKGRyLT5iYXNlKSB7CisJCWxkY19mcmVlX2V4cF9kcmluZyhwb3J0LT52aW8ubHAsIGRyLT5iYXNlLAorCQkJCSAgIChkci0+ZW50cnlfc2l6ZSAqIGRyLT5udW1fZW50cmllcyksCisJCQkJICAgZHItPmNvb2tpZXMsIGRyLT5uY29va2llcyk7CisJCWRyLT5iYXNlID0gTlVMTDsKKwkJZHItPmVudHJ5X3NpemUgPSAwOworCQlkci0+bnVtX2VudHJpZXMgPSAwOworCQlkci0+cGVuZGluZyA9IDA7CisJCWRyLT5uY29va2llcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHByb2JlX2Rpc2soc3RydWN0IHZkY19wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fY29tcGxldGlvbiBjb21wOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCXN0cnVjdCBnZW5kaXNrICpnOworCWludCBlcnI7CisKKwlpbml0X2NvbXBsZXRpb24oJmNvbXAuY29tKTsKKwljb21wLmVyciA9IDA7CisJY29tcC53YWl0aW5nX2ZvciA9IFdBSVRJTkdfRk9SX0xJTktfVVA7CisJcG9ydC0+dmlvLmNtcCA9ICZjb21wOworCisJdmlvX3BvcnRfdXAoJnBvcnQtPnZpbyk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wLmNvbSk7CisJaWYgKGNvbXAuZXJyKQorCQlyZXR1cm4gY29tcC5lcnI7CisKKwllcnIgPSBnZW5lcmljX3JlcXVlc3QocG9ydCwgVkRfT1BfR0VUX1ZUT0MsCisJCQkgICAgICAmcG9ydC0+bGFiZWwsIHNpemVvZihwb3J0LT5sYWJlbCkpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlZEX09QX0dFVF9WVE9DIHJldHVybnMgZXJyb3IgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gZ2VuZXJpY19yZXF1ZXN0KHBvcnQsIFZEX09QX0dFVF9ESVNLR0VPTSwKKwkJCSAgICAgICZwb3J0LT5nZW9tLCBzaXplb2YocG9ydC0+Z2VvbSkpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlZEX09QX0dFVF9ESVNLR0VPTSByZXR1cm5zICIKKwkJICAgICAgICJlcnJvciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwb3J0LT52ZGlza19zaXplID0gKCh1NjQpcG9ydC0+Z2VvbS5udW1fY3lsICoKKwkJCSAgICAodTY0KXBvcnQtPmdlb20ubnVtX2hkICoKKwkJCSAgICAodTY0KXBvcnQtPmdlb20ubnVtX3NlYyk7CisKKwlxID0gYmxrX2luaXRfcXVldWUoZG9fdmRjX3JlcXVlc3QsICZwb3J0LT52aW8ubG9jayk7CisJaWYgKCFxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcXVldWUuXG4iLAorCQkgICAgICAgcG9ydC0+dmlvLm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZyA9IGFsbG9jX2Rpc2soMSA8PCBQQVJUSVRJT05fU0hJRlQpOworCWlmICghZykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQ291bGQgbm90IGFsbG9jYXRlIGdlbmRpc2suXG4iLAorCQkgICAgICAgcG9ydC0+dmlvLm5hbWUpOworCQlibGtfY2xlYW51cF9xdWV1ZShxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9ydC0+ZGlzayA9IGc7CisKKwlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEsIHBvcnQtPnJpbmdfY29va2llcyk7CisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIHBvcnQtPnJpbmdfY29va2llcyk7CisJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHEsIHBvcnQtPm1heF94ZmVyX3NpemUpOworCWctPm1ham9yID0gdmRjX21ham9yOworCWctPmZpcnN0X21pbm9yID0gcG9ydC0+ZGV2X25vIDw8IFBBUlRJVElPTl9TSElGVDsKKwlzdHJjcHkoZy0+ZGlza19uYW1lLCBwb3J0LT5kaXNrX25hbWUpOworCisJZy0+Zm9wcyA9ICZ2ZGNfZm9wczsKKwlnLT5xdWV1ZSA9IHE7CisJZy0+cHJpdmF0ZV9kYXRhID0gcG9ydDsKKwlnLT5kcml2ZXJmc19kZXYgPSAmcG9ydC0+dmlvLnZkZXYtPmRldjsKKworCXNldF9jYXBhY2l0eShnLCBwb3J0LT52ZGlza19zaXplKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogJXUgc2VjdG9ycyAoJXUgTUIpXG4iLAorCSAgICAgICBnLT5kaXNrX25hbWUsCisJICAgICAgIHBvcnQtPnZkaXNrX3NpemUsIChwb3J0LT52ZGlza19zaXplID4+ICgyMCAtIDkpKSk7CisKKwlhZGRfZGlzayhnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyB2ZGNfbGRjX2NmZyA9IHsKKwkuZXZlbnQJCT0gdmRjX2V2ZW50LAorCS5tdHUJCT0gNjQsCisJLm1vZGUJCT0gTERDX01PREVfVU5SRUxJQUJMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgdmRjX3Zpb19vcHMgPSB7CisJLnNlbmRfYXR0cgkJPSB2ZGNfc2VuZF9hdHRyLAorCS5oYW5kbGVfYXR0cgkJPSB2ZGNfaGFuZGxlX2F0dHIsCisJLmhhbmRzaGFrZV9jb21wbGV0ZQk9IHZkY19oYW5kc2hha2VfY29tcGxldGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZGNfcG9ydF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2ZGMgKnZwOworCWNvbnN0IHU2NCAqcG9ydF9pZDsKKwlpbnQgZXJyOworCisJdnAgPSBkZXZfZ2V0X2RydmRhdGEodmRldi0+ZGV2LnBhcmVudCk7CisJaWYgKCF2cCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBwb3J0IHBhcmVudCB2ZGMuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaHAgPSBtZGVzY19ncmFiKCk7CisKKwlwb3J0X2lkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgImlkIiwgTlVMTCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXBvcnRfaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBsYWNrcyBpZCBwcm9wZXJ0eS5cbiIpOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9tZGVzYzsKKwl9CisJaWYgKCgqcG9ydF9pZCA8PCBQQVJUSVRJT05fU0hJRlQpICYgfih1NjQpTUlOT1JNQVNLKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlBvcnQgaWQgWyVsdV0gdG9vIGxhcmdlLlxuIiwgKnBvcnRfaWQpOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9tZGVzYzsKKwl9CisKKwlwb3J0ID0ga3phbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghcG9ydCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgdmRjX3BvcnQuXG4iKTsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2VfbWRlc2M7CisJfQorCisJcG9ydC0+dnAgPSB2cDsKKwlwb3J0LT5kZXZfbm8gPSAqcG9ydF9pZDsKKworCWlmIChwb3J0LT5kZXZfbm8gPj0gMjYpCisJCXNucHJpbnRmKHBvcnQtPmRpc2tfbmFtZSwgc2l6ZW9mKHBvcnQtPmRpc2tfbmFtZSksCisJCQkgVkRDQkxLX05BTUUgIiVjJWMiLAorCQkJICdhJyArIChwb3J0LT5kZXZfbm8gLyAyNikgLSAxLAorCQkJICdhJyArIChwb3J0LT5kZXZfbm8gJSAyNikpOworCWVsc2UKKwkJc25wcmludGYocG9ydC0+ZGlza19uYW1lLCBzaXplb2YocG9ydC0+ZGlza19uYW1lKSwKKwkJCSBWRENCTEtfTkFNRSAiJWMiLCAnYScgKyAocG9ydC0+ZGV2X25vICUgMjYpKTsKKworCWVyciA9IHZpb19kcml2ZXJfaW5pdCgmcG9ydC0+dmlvLCB2ZGV2LCBWREVWX0RJU0ssCisJCQkgICAgICB2ZGNfdmVyc2lvbnMsIEFSUkFZX1NJWkUodmRjX3ZlcnNpb25zKSwKKwkJCSAgICAgICZ2ZGNfdmlvX29wcywgcG9ydC0+ZGlza19uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSA9IDUxMjsKKwlwb3J0LT5tYXhfeGZlcl9zaXplID0gKCgxMjggKiAxMDI0KSAvIHBvcnQtPnZkaXNrX2Jsb2NrX3NpemUpOworCXBvcnQtPnJpbmdfY29va2llcyA9ICgocG9ydC0+bWF4X3hmZXJfc2l6ZSAqCisJCQkgICAgICAgcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSkgLyBQQUdFX1NJWkUpICsgMjsKKworCWVyciA9IHZpb19sZGNfYWxsb2MoJnBvcnQtPnZpbywgJnZkY19sZGNfY2ZnLCBwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJZXJyID0gdmRjX2FsbG9jX3R4X3JpbmcocG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfbGRjOworCisJZXJyID0gcHJvYmVfZGlzayhwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV90eF9yaW5nOworCisJSU5JVF9MSVNUX0hFQUQoJnBvcnQtPmxpc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJnBvcnQtPmxpc3QsICZ2cC0+cG9ydF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHBvcnQpOworCisJbWRlc2NfcmVsZWFzZShocCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3R4X3Jpbmc6CisJdmRjX2ZyZWVfdHhfcmluZyhwb3J0KTsKKworZXJyX291dF9mcmVlX2xkYzoKKwl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKK2Vycl9vdXRfZnJlZV9wb3J0OgorCWtmcmVlKHBvcnQpOworCitlcnJfb3V0X3JlbGVhc2VfbWRlc2M6CisJbWRlc2NfcmVsZWFzZShocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZGNfcG9ydF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHBvcnQpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnZpby50aW1lcik7CisKKwkJdmRjX2ZyZWVfdHhfcmluZyhwb3J0KTsKKwkJdmlvX2xkY19mcmVlKCZwb3J0LT52aW8pOworCisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKworCQlrZnJlZShwb3J0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2ZGNfcG9ydF9tYXRjaFtdID0geworCXsKKwkJLnR5cGUgPSAidmRjLXBvcnQiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZkY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2ZGNfcG9ydF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdmRjX3BvcnRfbWF0Y2gsCisJLnByb2JlCQk9IHZkY19wb3J0X3Byb2JlLAorCS5yZW1vdmUJCT0gdmRjX3BvcnRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2ZGNfcG9ydCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZkY19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RhdGljIGludCB2ZGNfdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCB2ZGMgKnZwOworCisJaWYgKHZkY192ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJdnAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdnAtPmxvY2spOworCXZwLT5kZXYgPSB2ZGV2OworCUlOSVRfTElTVF9IRUFEKCZ2cC0+cG9ydF9saXN0KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCB2cCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZGNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCisJc3RydWN0IHZkYyAqdnAgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlpZiAodnApIHsKKwkJa2ZyZWUodnApOworCQlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmRjX21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJibG9jayIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgdmRjX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZkY19kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdmRjX21hdGNoLAorCS5wcm9iZQkJPSB2ZGNfcHJvYmUsCisJLnJlbW92ZQkJPSB2ZGNfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2ZGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCB2ZGNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdpc3Rlcl9ibGtkZXYoMCwgVkRDQkxLX05BTUUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwl2ZGNfbWFqb3IgPSBlcnI7CisJZXJyID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmdmRjX2RyaXZlcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9ibGtkZXY7CisKKwllcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfcG9ydF9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfdmRjOworCisJcmV0dXJuIDA7CisKK291dF91bnJlZ2lzdGVyX3ZkYzoKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZkY19kcml2ZXIpOworCitvdXRfdW5yZWdpc3Rlcl9ibGtkZXY6CisJdW5yZWdpc3Rlcl9ibGtkZXYodmRjX21ham9yLCBWRENCTEtfTkFNRSk7CisJdmRjX21ham9yID0gMDsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmRjX2V4aXQodm9pZCkKK3sKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZkY19wb3J0X2RyaXZlcik7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX2Jsa2Rldih2ZGNfbWFqb3IsIFZEQ0JMS19OQU1FKTsKK30KKworbW9kdWxlX2luaXQodmRjX2luaXQpOworbW9kdWxlX2V4aXQodmRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91Yi5jIGIvZHJpdmVycy9ibG9jay91Yi5jCmluZGV4IDE4YzhiNmMuLjhiMTNkN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdWIuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKQEAgLTE3MDksNyArMTcwOSw3IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOwogCXZvaWQgX191c2VyICp1c2VybWVtID0gKHZvaWQgX191c2VyICopIGFyZzsKIAotCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxwLCBkaXNrLCBjbWQsIHVzZXJtZW0pOworCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxwLCBkaXNrLT5xdWV1ZSwgZGlzaywgY21kLCB1c2VybWVtKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdW1lbS5jIGIvZHJpdmVycy9ibG9jay91bWVtLmMKaW5kZXggNmY1ZDYyMC4uZGVjNzRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91bWVtLmMKKysrIGIvZHJpdmVycy9ibG9jay91bWVtLmMKQEAgLTEwNSwxMiArMTA1LDYgQEAKIAl1bnNpZ25lZCBsb25nCWNzcl9iYXNlOwogCXVuc2lnbmVkIGNoYXIJX19pb21lbSAqY3NyX3JlbWFwOwogCXVuc2lnbmVkIGxvbmcJY3NyX2xlbjsKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCXVuc2lnbmVkIGxvbmcJbWVtX2Jhc2U7Ci0JdW5zaWduZWQgY2hhcglfX2lvbWVtICptZW1fcmVtYXA7Ci0JdW5zaWduZWQgbG9uZwltZW1fbGVuOwotI2VuZGlmCi0KIAl1bnNpZ25lZCBpbnQJd2luX3NpemU7IC8qIFBDSSB3aW5kb3cgc2l6ZSAqLwogCXVuc2lnbmVkIGludAltbV9zaXplOyAgLyogc2l6ZSBpbiBrYnl0ZXMgKi8KIApAQCAtODcyLDEwICs4NjYsNiBAQAogCiAJY2FyZC0+Y3NyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKIAljYXJkLT5jc3JfbGVuICA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKTsKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWNhcmQtPm1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7Ci0JY2FyZC0+bWVtX2xlbiAgPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSk7Ci0jZW5kaWYKIAogCXByaW50ayhLRVJOX0lORk8gIk1pY3JvIE1lbW9yeSh0bSkgY29udHJvbGxlciAjJWQgZm91bmQgYXQgJTAyeDolMDJ4IChQQ0kgTWVtIE1vZHVsZSAoQmF0dGVyeSBCYWNrdXApKVxuIiwKIAkgICAgICAgY2FyZC0+Y2FyZF9udW1iZXIsIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4pOwpAQCAtOTAzLDI3ICs4OTMsNiBAQAogCXByaW50ayhLRVJOX0lORk8gIk1NJWQ6IENTUiAweCUwOGx4IC0+IDB4JXAgKDB4JWx4KVxuIiwgY2FyZC0+Y2FyZF9udW1iZXIsCiAJICAgICAgIGNhcmQtPmNzcl9iYXNlLCBjYXJkLT5jc3JfcmVtYXAsIGNhcmQtPmNzcl9sZW4pOwogCi0jaWZkZWYgQ09ORklHX01NX01BUF9NRU1PUlkKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX2xlbiwgIk1pY3JvIE1lbW9yeSIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTU0lZDogVW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvblxuIiwgY2FyZC0+Y2FyZF9udW1iZXIpOwotCQlyZXQgPSAtRU5PTUVNOwotCi0JCWdvdG8gZmFpbGVkX3JlcV9tZW07Ci0JfQotCi0JaWYgKCEoY2FyZC0+bWVtX3JlbWFwID0gaW9yZW1hcChjYXJkLT5tZW1fYmFzZSwgY2FyZHMtPm1lbV9sZW4pKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1NJWQ6IFVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uXG4iLCBjYXJkLT5jYXJkX251bWJlcik7Ci0JCXJldCA9IC1FTk9NRU07Ci0KLQkJZ290byBmYWlsZWRfcmVtYXBfbWVtOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIk1NJWQ6IE1FTSAweCU4bHggLT4gMHglOGx4ICgweCVseClcbiIsIGNhcmQtPmNhcmRfbnVtYmVyLAotCSAgICAgICBjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX3JlbWFwLCBjYXJkLT5tZW1fbGVuKTsKLSNlbHNlCi0JcHJpbnRrKEtFUk5fSU5GTyAiTU0lZDogTUVNIGFyZWEgbm90IHJlbWFwcGVkIChDT05GSUdfTU1fTUFQX01FTU9SWSBub3Qgc2V0KVxuIiwKLQkgICAgICAgY2FyZC0+Y2FyZF9udW1iZXIpOwotI2VuZGlmCiAJc3dpdGNoKGNhcmQtPmRldi0+ZGV2aWNlKSB7CiAJY2FzZSAweDU0MTU6CiAJCWNhcmQtPmZsYWdzIHw9IFVNX0ZMQUdfTk9fQllURV9TVEFUVVMgfCBVTV9GTEFHX05PX0JBVFRSRUc7CkBAIC0xMDkxLDEyICsxMDYwLDYgQEAKIAkJCQkgICAgY2FyZC0+bW1fcGFnZXNbMV0uZGVzYywKIAkJCQkgICAgY2FyZC0+bW1fcGFnZXNbMV0ucGFnZV9kbWEpOwogIGZhaWxlZF9tYWdpYzoKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWlvdW5tYXAoY2FyZC0+bWVtX3JlbWFwKTsKLSBmYWlsZWRfcmVtYXBfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX2xlbik7Ci0gZmFpbGVkX3JlcV9tZW06Ci0jZW5kaWYKIAlpb3VubWFwKGNhcmQtPmNzcl9yZW1hcCk7CiAgZmFpbGVkX3JlbWFwX2NzcjoKIAlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+Y3NyX2Jhc2UsIGNhcmQtPmNzcl9sZW4pOwpAQCAtMTExNiwxMCArMTA3OSw2IEBACiAJdGFza2xldF9raWxsKCZjYXJkLT50YXNrbGV0KTsKIAlpb3VubWFwKGNhcmQtPmNzcl9yZW1hcCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmNzcl9iYXNlLCBjYXJkLT5jc3JfbGVuKTsKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWlvdW5tYXAoY2FyZC0+bWVtX3JlbWFwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+bWVtX2Jhc2UsIGNhcmQtPm1lbV9sZW4pOwotI2VuZGlmCiAJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKIAogCWlmIChjYXJkLT5tbV9wYWdlc1swXS5kZXNjKQpAQCAtMTEzMywyMyArMTA5MiwxOCBAQAogCWJsa19jbGVhbnVwX3F1ZXVlKGNhcmQtPnF1ZXVlKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1tX3BjaV9pZHNbXSA9IHsgewotCS52ZW5kb3IgPQlQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSwKLQkuZGV2aWNlID0JUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQxNUNOLAotCX0sIHsKLQkudmVuZG9yID0JUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksCi0JLmRldmljZSA9CVBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzU0MjVDTiwKLQl9LCB7Ci0JLnZlbmRvciA9CVBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLAotCS5kZXZpY2UgPQlQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV82MTU1LAotCX0sIHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtbV9wY2lfaWRzW10gPSB7CisgICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQxNUNOKX0sCisgICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQyNUNOKX0sCisgICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNjE1NSl9LAorICAgIHsKIAkudmVuZG9yCT0JMHg4MDg2LAogCS5kZXZpY2UJPQkweEI1NTUsCiAJLnN1YnZlbmRvcj0JMHgxMzMyLAogCS5zdWJkZXZpY2U9CTB4NTQ2MCwKIAkuY2xhc3MJPQkweDA1MDAwMCwKIAkuY2xhc3NfbWFzaz0JMCwKLQl9LCB7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9CisgICAgfSwgeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1tX3BjaV9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwppbmRleCA2ODU5MmMzLi5kYWUzOTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwpAQCAtMjUyLDEwICsyNTIsMTAgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CiAJc3RydWN0IHZpb2Rhc2RfZGV2aWNlICpkID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCi0JZ2VvLT5zZWN0b3JzID0gZC0+c2VjdG9ycyA/IGQtPnNlY3RvcnMgOiAwOworCWdlby0+c2VjdG9ycyA9IGQtPnNlY3RvcnMgPyBkLT5zZWN0b3JzIDogMzI7CiAJZ2VvLT5oZWFkcyA9IGQtPnRyYWNrcyA/IGQtPnRyYWNrcyAgOiA2NDsKIAlnZW8tPmN5bGluZGVycyA9IGQtPmN5bGluZGVycyA/IGQtPmN5bGluZGVycyA6Ci0JCWdldF9jYXBhY2l0eShkaXNrKSAvIChnZW8tPmN5bGluZGVycyAqIGdlby0+aGVhZHMpOworCQlnZXRfY2FwYWNpdHkoZGlzaykgLyAoZ2VvLT5zZWN0b3JzICogZ2VvLT5oZWFkcyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyZWM2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCkBAIC0wLDAgKzEsMTE2NCBAQAorLyoKKyAqIFhpbGlueCBTeXN0ZW1BQ0UgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA3IFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBUaGUgU3lzdGVtQUNFIGNoaXAgaXMgZGVzaWduZWQgdG8gY29uZmlndXJlIEZQR0FzIGJ5IGxvYWRpbmcgYW4gRlBHQQorICogYml0c3RyZWFtIGZyb20gYSBmaWxlIG9uIGEgQ0YgY2FyZCBhbmQgc3F1aXJ0aW5nIGl0IGludG8gRlBHQXMgY29ubmVjdGVkCisgKiB0byB0aGUgU3lzdGVtQUNFIEpUQUcgY2hhaW4uICBJdCBhbHNvIGhhcyB0aGUgYWR2YW50YWdlIG9mIHByb3ZpZGluZyBhbgorICogTVBVIGludGVyZmFjZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworICogYW5kIHRvIHVzZSB0aGUgYXR0YWNoZWQgQ0YgY2FyZCBmb3IgZ2VuZXJhbCBwdXJwb3NlIHN0b3JhZ2UuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYSBibG9jayBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU3lzdGVtQUNFLgorICoKKyAqIEluaXRpYWxpemF0aW9uOgorICogICAgVGhlIGRyaXZlciByZWdpc3RlcnMgaXRzZWxmIGFzIGEgcGxhdGZvcm1fZGV2aWNlIGRyaXZlciBhdCBtb2R1bGUKKyAqICAgIGxvYWQgdGltZS4gIFRoZSBwbGF0Zm9ybSBidXMgd2lsbCB0YWtlIGNhcmUgb2YgY2FsbGluZyB0aGUKKyAqICAgIGFjZV9wcm9iZSgpIG1ldGhvZCBmb3IgYWxsIFN5c3RlbUFDRSBpbnN0YW5jZXMgaW4gdGhlIHN5c3RlbS4gIEFueQorICogICAgbnVtYmVyIG9mIFN5c3RlbUFDRSBpbnN0YW5jZXMgYXJlIHN1cHBvcnRlZC4gIGFjZV9wcm9iZSgpIGNhbGxzCisgKiAgICBhY2Vfc2V0dXAoKSB3aGljaCBpbml0aWFsaXplZCBhbGwgZGF0YSBzdHJ1Y3R1cmVzLCByZWFkcyB0aGUgQ0YKKyAqICAgIGlkIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXJzIHRoZSBkZXZpY2UuCisgKgorICogUHJvY2Vzc2luZzoKKyAqICAgIEp1c3QgYWJvdXQgYWxsIG9mIHRoZSBoZWF2eSBsaWZ0aW5nIGluIHRoaXMgZHJpdmVyIGlzIHBlcmZvcm1lZCBieQorICogICAgYSBGaW5pdGUgU3RhdGUgTWFjaGluZSAoRlNNKS4gIFRoZSBkcml2ZXIgbmVlZHMgdG8gd2FpdCBvbiBhIG51bWJlcgorICogICAgb2YgZXZlbnRzOyBzb21lIHJhaXNlZCBieSBpbnRlcnJ1cHRzLCBzb21lIHdoaWNoIG5lZWQgdG8gYmUgcG9sbGVkCisgKiAgICBmb3IuICBEZXNjcmliaW5nIGFsbCBvZiB0aGUgYmVoYXZpb3VyIGluIGEgRlNNIHNlZW1zIHRvIGJlIHRoZQorICogICAgZWFzaWVzdCB3YXkgdG8ga2VlcCB0aGUgY29tcGxleGl0eSBsb3cgYW5kIG1ha2UgaXQgZWFzeSB0bworICogICAgdW5kZXJzdGFuZCB3aGF0IHRoZSBkcml2ZXIgaXMgZG9pbmcuICBJZiB0aGUgYmxvY2sgb3BzIG9yIHRoZQorICogICAgcmVxdWVzdCBmdW5jdGlvbiBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIGhhcmR3YXJlLCB0aGVuIHRoZXkKKyAqICAgIHNpbXBseSBuZWVkIHRvIGZsYWcgdGhlIHJlcXVlc3QgYW5kIGtpY2sgb2YgRlNNIHByb2Nlc3NpbmcuCisgKgorICogICAgVGhlIEZTTSBpdHNlbGYgaXMgYXRvbWljLXNhZmUgY29kZSB3aGljaCBjYW4gYmUgcnVuIGZyb20gYW55CisgKiAgICBjb250ZXh0LiAgVGhlIGdlbmVyYWwgcHJvY2VzcyBmbG93IGlzOgorICogICAgMS4gb2J0YWluIHRoZSBhY2UtPmxvY2sgc3BpbmxvY2suCisgKiAgICAyLiBsb29wIG9uIGFjZV9mc21fZG9zdGF0ZSgpIHVudGlsIHRoZSBhY2UtPmZzbV9jb250aW51ZSBmbGFnIGlzCisgKiAgICAgICBjbGVhcmVkLgorICogICAgMy4gcmVsZWFzZSB0aGUgbG9jay4KKyAqCisgKiAgICBJbmRpdmlkdWFsIHN0YXRlcyBkbyBub3Qgc2xlZXAgaW4gYW55IHdheS4gIElmIGEgY29uZGl0aW9uIG5lZWRzIHRvCisgKiAgICBiZSB3YWl0ZWQgZm9yIHRoZW4gdGhlIHN0YXRlIG11Y2ggY2xlYXIgdGhlIGZzbV9jb250aW51ZSBmbGFnIGFuZAorICogICAgZWl0aGVyIHNjaGVkdWxlIHRoZSBGU00gdG8gYmUgcnVuIGFnYWluIGF0IGEgbGF0ZXIgdGltZSwgb3IgZXhwZWN0CisgKiAgICBhbiBpbnRlcnJ1cHQgdG8gY2FsbCB0aGUgRlNNIHdoZW4gdGhlIGRlc2lyZWQgY29uZGl0aW9uIGlzIG1ldC4KKyAqCisgKiAgICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGUgRlNNIGlzIHByb2Nlc3NlZCBhdCBpbnRlcnJ1cHQgY29udGV4dAorICogICAgZWl0aGVyIHdoZW4gdGhlIGRyaXZlcidzIHRhc2tsZXQgaXMgc2NoZWR1bGVkLCBvciB3aGVuIGFuIGlycSBpcworICogICAgcmFpc2VkIGJ5IHRoZSBoYXJkd2FyZS4gIFRoZSB0YXNrbGV0IGNhbiBiZSBzY2hlZHVsZWQgYXQgYW55IHRpbWUuCisgKiAgICBUaGUgcmVxdWVzdCBtZXRob2QgaW4gcGFydGljdWxhciBzY2hlZHVsZXMgdGhlIHRhc2tsZXQgd2hlbiBhIG5ldworICogICAgcmVxdWVzdCBoYXMgYmVlbiBpbmRpY2F0ZWQgYnkgdGhlIGJsb2NrIGxheWVyLiAgT25jZSBzdGFydGVkLCB0aGUKKyAqICAgIEZTTSBwcm9jZWVkcyBhcyBmYXIgYXMgaXQgY2FuIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgdW50aWwgaXQKKyAqICAgIG5lZWRzIG9uIGEgaGFyZHdhcmUgZXZlbnQuICBBdCB0aGlzIHBvaW50LCBpdCBtdXN0IHlpZWxkIGV4ZWN1dGlvbi4KKyAqCisgKiAgICBBIHN0YXRlIGhhcyB0d28gb3B0aW9ucyB3aGVuIHlpZWxkaW5nIGV4ZWN1dGlvbjoKKyAqICAgIDEuIGFjZV9mc21feWllbGQoKQorICogICAgICAgLSBDYWxsIGlmIG5lZWQgdG8gcG9sbCBmb3IgZXZlbnQuCisgKiAgICAgICAtIGNsZWFycyB0aGUgZnNtX2NvbnRpbnVlIGZsYWcgdG8gZXhpdCB0aGUgcHJvY2Vzc2luZyBsb29wCisgKiAgICAgICAtIHJlc2NoZWR1bGVzIHRoZSB0YXNrbGV0IHRvIHJ1biBhZ2FpbiBhcyBzb29uIGFzIHBvc3NpYmxlCisgKiAgICAyLiBhY2VfZnNtX3lpZWxkaXJxKCkKKyAqICAgICAgIC0gQ2FsbCBpZiBhbiBpcnEgaXMgZXhwZWN0ZWQgZnJvbSB0aGUgSFcKKyAqICAgICAgIC0gY2xlYXJzIHRoZSBmc21fY29udGludWUgZmxhZyB0byBleGl0IHRoZSBwcm9jZXNzaW5nIGxvb3AKKyAqICAgICAgIC0gZG9lcyBub3QgcmVzY2hlZHVsZSB0aGUgdGFza2xldCBzbyB0aGUgRlNNIHdpbGwgbm90IGJlIHByb2Nlc3NlZAorICogICAgICAgICBhZ2FpbiB1bnRpbCBhbiBpcnEgaXMgcmVjZWl2ZWQuCisgKiAgICBBZnRlciBjYWxsaW5nIGEgeWllbGQgZnVuY3Rpb24sIHRoZSBzdGF0ZSBtdXN0IHJldHVybiBjb250cm9sIGJhY2sKKyAqICAgIHRvIHRoZSBGU00gbWFpbiBsb29wLgorICoKKyAqICAgIEFkZGl0aW9uYWxseSwgdGhlIGRyaXZlciBtYWludGFpbnMgYSBrZXJuZWwgdGltZXIgd2hpY2ggY2FuIHByb2Nlc3MKKyAqICAgIHRoZSBGU00uICBJZiB0aGUgRlNNIGdldHMgc3RhbGxlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIG1pc3NlZAorICogICAgaW50ZXJydXB0LCB0aGVuIHRoZSBrZXJuZWwgdGltZXIgd2lsbCBleHBpcmUgYW5kIHRoZSBkcml2ZXIgY2FuCisgKiAgICBjb250aW51ZSB3aGVyZSBpdCBsZWZ0IG9mZi4KKyAqCisgKiBUbyBEbzoKKyAqICAgIC0gQWRkIEZQR0EgY29uZmlndXJhdGlvbiBjb250cm9sIGludGVyZmFjZS4KKyAqICAgIC0gUmVxdWVzdCBtYWpvciBudW1iZXIgZnJvbSBsYW5hbmEKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworTU9EVUxFX0FVVEhPUigiR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggU3lzdGVtQUNFIGRldmljZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogU3lzdGVtQUNFIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFDRV9CVVNNT0RFICgweDAwKQorCisjZGVmaW5lIEFDRV9TVEFUVVMgKDB4MDQpCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHTE9DSyAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBBQ0VfU1RBVFVTX01QVUxPQ0sgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdFUlJPUiAgICAgKDB4MDAwMDAwMDQpCS8qIGNvbmZpZyBjb250cm9sbGVyIGVycm9yICovCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZDRVJST1IgICAgICgweDAwMDAwMDA4KQkvKiBDRiBjb250cm9sbGVyIGVycm9yICovCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZERVRFQ1QgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0RBVEFCVUZSRFkgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19EQVRBQlVGTU9ERSAgKDB4MDAwMDAwNDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHRE9ORSAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBBQ0VfU1RBVFVTX1JEWUZPUkNGQ01EICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdNT0RFUElOICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHQUREUl9NQVNLICgweDAwMDBlMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGQlNZICAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRlJEWSAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZEV0YgICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGRFNDICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkRSUSAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZDT1JSICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGRVJSICAgICAgICAoMHgwMDgwMDAwMCkKKworI2RlZmluZSBBQ0VfRVJST1IgKDB4MDgpCisjZGVmaW5lIEFDRV9DRkdMQkEgKDB4MGMpCisjZGVmaW5lIEFDRV9NUFVMQkEgKDB4MTApCisKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRCAoMHgxNCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9SRVNFVCAgICAgICgweDAxMDApCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfSURFTlRJRlkgICAoMHgwMjAwKQorI2RlZmluZSBBQ0VfU0VDQ05UQ01EX1JFQURfREFUQSAgKDB4MDMwMCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9XUklURV9EQVRBICgweDA0MDApCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfQUJPUlQgICAgICAoMHgwNjAwKQorCisjZGVmaW5lIEFDRV9WRVJTSU9OICgweDE2KQorI2RlZmluZSBBQ0VfVkVSU0lPTl9SRVZJU0lPTl9NQVNLICgweDAwRkYpCisjZGVmaW5lIEFDRV9WRVJTSU9OX01JTk9SX01BU0sgICAgKDB4MEYwMCkKKyNkZWZpbmUgQUNFX1ZFUlNJT05fTUFKT1JfTUFTSyAgICAoMHhGMDAwKQorCisjZGVmaW5lIEFDRV9DVFJMICgweDE4KQorI2RlZmluZSBBQ0VfQ1RSTF9GT1JDRUxPQ0tSRVEgICAoMHgwMDAxKQorI2RlZmluZSBBQ0VfQ1RSTF9MT0NLUkVRICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBBQ0VfQ1RSTF9GT1JDRUNGR0FERFIgICAoMHgwMDA0KQorI2RlZmluZSBBQ0VfQ1RSTF9GT1JDRUNGR01PREUgICAoMHgwMDA4KQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdNT0RFICAgICAgICAoMHgwMDEwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdTVEFSVCAgICAgICAoMHgwMDIwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdTRUwgICAgICAgICAoMHgwMDQwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdSRVNFVCAgICAgICAoMHgwMDgwKQorI2RlZmluZSBBQ0VfQ1RSTF9EQVRBQlVGUkRZSVJRICAoMHgwMTAwKQorI2RlZmluZSBBQ0VfQ1RSTF9FUlJPUklSUSAgICAgICAoMHgwMjAwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdET05FSVJRICAgICAoMHgwNDAwKQorI2RlZmluZSBBQ0VfQ1RSTF9SRVNFVElSUSAgICAgICAoMHgwODAwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdQUk9HICAgICAgICAoMHgxMDAwKQorI2RlZmluZSBBQ0VfQ1RSTF9DRkdBRERSX01BU0sgICAoMHhlMDAwKQorCisjZGVmaW5lIEFDRV9GQVRTVEFUICgweDFjKQorCisjZGVmaW5lIEFDRV9OVU1fTUlOT1JTIDE2CisjZGVmaW5lIEFDRV9TRUNUT1JfU0laRSAoNTEyKQorI2RlZmluZSBBQ0VfRklGT19TSVpFICgzMikKKyNkZWZpbmUgQUNFX0JVRl9QRVJfU0VDVE9SIChBQ0VfU0VDVE9SX1NJWkUgLyBBQ0VfRklGT19TSVpFKQorCitzdHJ1Y3QgYWNlX3JlZ19vcHM7CisKK3N0cnVjdCBhY2VfZGV2aWNlIHsKKwkvKiBkcml2ZXIgc3RhdGUgZGF0YSAqLworCWludCBpZDsKKwlpbnQgbWVkaWFfY2hhbmdlOworCWludCB1c2VyczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBkYXRhICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGZzbV90YXNrbGV0OworCXVpbnQgZnNtX3Rhc2s7CQkvKiBDdXJyZW50IGFjdGl2aXR5IChBQ0VfVEFTS18qKSAqLworCXVpbnQgZnNtX3N0YXRlOwkJLyogQ3VycmVudCBzdGF0ZSAoQUNFX0ZTTV9TVEFURV8qKSAqLworCXVpbnQgZnNtX2NvbnRpbnVlX2ZsYWc7CS8qIGNsZWFyZWQgdG8gZXhpdCBGU00gbWFpbmxvb3AgKi8KKwl1aW50IGZzbV9pdGVyX251bTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFsbF90aW1lcjsKKworCS8qIFRyYW5zZmVyIHN0YXRlL3Jlc3VsdCwgdXNlIGZvciBib3RoIGlkIGFuZCBibG9jayByZXF1ZXN0ICovCisJc3RydWN0IHJlcXVlc3QgKnJlcTsJLyogcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQgKi8KKwl2b2lkICpkYXRhX3B0cjsJCS8qIHBvaW50ZXIgdG8gSS9PIGJ1ZmZlciAqLworCWludCBkYXRhX2NvdW50OwkJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgcmVtYWluaW5nICovCisJaW50IGRhdGFfcmVzdWx0OwkvKiBSZXN1bHQgb2YgdHJhbnNmZXI7IDAgOj0gc3VjY2VzcyAqLworCisJaW50IGlkX3JlcV9jb3VudDsJLyogY291bnQgb2YgaWQgcmVxdWVzdHMgKi8KKwlpbnQgaWRfcmVzdWx0OworCXN0cnVjdCBjb21wbGV0aW9uIGlkX2NvbXBsZXRpb247CS8qIHVzZWQgd2hlbiBpZCByZXEgZmluaXNoZXMgKi8KKwlpbnQgaW5faXJxOworCisJLyogRGV0YWlscyBvZiBoYXJkd2FyZSBkZXZpY2UgKi8KKwl1bnNpZ25lZCBsb25nIHBoeXNhZGRyOworCXZvaWQgKmJhc2VhZGRyOworCWludCBpcnE7CisJaW50IGJ1c193aWR0aDsJCS8qIDAgOj0gOCBiaXQ7IDEgOj0gMTYgYml0ICovCisJc3RydWN0IGFjZV9yZWdfb3BzICpyZWdfb3BzOworCWludCBsb2NrX2NvdW50OworCisJLyogQmxvY2sgZGV2aWNlIGRhdGEgc3RydWN0dXJlcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBnZW5kaXNrICpnZDsKKworCS8qIEluc2VydGVkIENGIGNhcmQgcGFyYW1ldGVycyAqLworCXN0cnVjdCBoZF9kcml2ZWlkIGNmX2lkOworfTsKKworc3RhdGljIGludCBhY2VfbWFqb3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG93IGxldmVsIHJlZ2lzdGVyIGFjY2VzcworICovCisKK3N0cnVjdCBhY2VfcmVnX29wcyB7CisJdTE2KCppbikgKHN0cnVjdCBhY2VfZGV2aWNlICogYWNlLCBpbnQgcmVnKTsKKwl2b2lkICgqb3V0KSAoc3RydWN0IGFjZV9kZXZpY2UgKiBhY2UsIGludCByZWcsIHUxNiB2YWwpOworCXZvaWQgKCpkYXRhaW4pIChzdHJ1Y3QgYWNlX2RldmljZSAqIGFjZSk7CisJdm9pZCAoKmRhdGFvdXQpIChzdHJ1Y3QgYWNlX2RldmljZSAqIGFjZSk7Cit9OworCisvKiA4IEJpdCBidXMgd2lkdGggKi8KK3N0YXRpYyB1MTYgYWNlX2luXzgoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwl2b2lkICpyID0gYWNlLT5iYXNlYWRkciArIHJlZzsKKwlyZXR1cm4gaW5fOChyKSB8IChpbl84KHIgKyAxKSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQgYWNlX291dF84KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUxNiB2YWwpCit7CisJdm9pZCAqciA9IGFjZS0+YmFzZWFkZHIgKyByZWc7CisJb3V0XzgociwgdmFsKTsKKwlvdXRfOChyICsgMSwgdmFsID4+IDgpOworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YWluXzgoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl2b2lkICpyID0gYWNlLT5iYXNlYWRkciArIDB4NDA7CisJdTggKmRzdCA9IGFjZS0+ZGF0YV9wdHI7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFOworCXdoaWxlIChpLS0pCisJCSpkc3QrKyA9IGluXzgocisrKTsKKwlhY2UtPmRhdGFfcHRyID0gZHN0OworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YW91dF84KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJdm9pZCAqciA9IGFjZS0+YmFzZWFkZHIgKyAweDQwOworCXU4ICpzcmMgPSBhY2UtPmRhdGFfcHRyOworCWludCBpID0gQUNFX0ZJRk9fU0laRTsKKwl3aGlsZSAoaS0tKQorCQlvdXRfOChyKyssICpzcmMrKyk7CisJYWNlLT5kYXRhX3B0ciA9IHNyYzsKK30KKworc3RhdGljIHN0cnVjdCBhY2VfcmVnX29wcyBhY2VfcmVnXzhfb3BzID0geworCS5pbiA9IGFjZV9pbl84LAorCS5vdXQgPSBhY2Vfb3V0XzgsCisJLmRhdGFpbiA9IGFjZV9kYXRhaW5fOCwKKwkuZGF0YW91dCA9IGFjZV9kYXRhb3V0XzgsCit9OworCisvKiAxNiBiaXQgYmlnIGVuZGlhbiBidXMgYXR0YWNobWVudCAqLworc3RhdGljIHUxNiBhY2VfaW5fYmUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnKQoreworCXJldHVybiBpbl9iZTE2KGFjZS0+YmFzZWFkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBhY2Vfb3V0X2JlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlvdXRfYmUxNihhY2UtPmJhc2VhZGRyICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YWluX2JlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkUgLyAyOworCXUxNiAqZHN0ID0gYWNlLT5kYXRhX3B0cjsKKwl3aGlsZSAoaS0tKQorCQkqZHN0KysgPSBpbl9sZTE2KGFjZS0+YmFzZWFkZHIgKyAweDQwKTsKKwlhY2UtPmRhdGFfcHRyID0gZHN0OworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YW91dF9iZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFIC8gMjsKKwl1MTYgKnNyYyA9IGFjZS0+ZGF0YV9wdHI7CisJd2hpbGUgKGktLSkKKwkJb3V0X2xlMTYoYWNlLT5iYXNlYWRkciArIDB4NDAsICpzcmMrKyk7CisJYWNlLT5kYXRhX3B0ciA9IHNyYzsKK30KKworLyogMTYgYml0IGxpdHRsZSBlbmRpYW4gYnVzIGF0dGFjaG1lbnQgKi8KK3N0YXRpYyB1MTYgYWNlX2luX2xlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gaW5fbGUxNihhY2UtPmJhc2VhZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgYWNlX291dF9sZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUxNiB2YWwpCit7CisJb3V0X2xlMTYoYWNlLT5iYXNlYWRkciArIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFpbl9sZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFIC8gMjsKKwl1MTYgKmRzdCA9IGFjZS0+ZGF0YV9wdHI7CisJd2hpbGUgKGktLSkKKwkJKmRzdCsrID0gaW5fYmUxNihhY2UtPmJhc2VhZGRyICsgMHg0MCk7CisJYWNlLT5kYXRhX3B0ciA9IGRzdDsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFvdXRfbGUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWludCBpID0gQUNFX0ZJRk9fU0laRSAvIDI7CisJdTE2ICpzcmMgPSBhY2UtPmRhdGFfcHRyOworCXdoaWxlIChpLS0pCisJCW91dF9iZTE2KGFjZS0+YmFzZWFkZHIgKyAweDQwLCAqc3JjKyspOworCWFjZS0+ZGF0YV9wdHIgPSBzcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNlX3JlZ19vcHMgYWNlX3JlZ19iZTE2X29wcyA9IHsKKwkuaW4gPSBhY2VfaW5fYmUxNiwKKwkub3V0ID0gYWNlX291dF9iZTE2LAorCS5kYXRhaW4gPSBhY2VfZGF0YWluX2JlMTYsCisJLmRhdGFvdXQgPSBhY2VfZGF0YW91dF9iZTE2LAorfTsKKworc3RhdGljIHN0cnVjdCBhY2VfcmVnX29wcyBhY2VfcmVnX2xlMTZfb3BzID0geworCS5pbiA9IGFjZV9pbl9sZTE2LAorCS5vdXQgPSBhY2Vfb3V0X2xlMTYsCisJLmRhdGFpbiA9IGFjZV9kYXRhaW5fbGUxNiwKKwkuZGF0YW91dCA9IGFjZV9kYXRhb3V0X2xlMTYsCit9OworCitzdGF0aWMgaW5saW5lIHUxNiBhY2VfaW4oc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gYWNlLT5yZWdfb3BzLT5pbihhY2UsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFjZV9pbjMyKHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcpCit7CisJcmV0dXJuIGFjZV9pbihhY2UsIHJlZykgfCAoYWNlX2luKGFjZSwgcmVnICsgMikgPDwgMTYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX291dChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCWFjZS0+cmVnX29wcy0+b3V0KGFjZSwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX291dDMyKHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUzMiB2YWwpCit7CisJYWNlX291dChhY2UsIHJlZywgdmFsKTsKKwlhY2Vfb3V0KGFjZSwgcmVnICsgMiwgdmFsID4+IDE2KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWJ1ZyBzdXBwb3J0IGZ1bmN0aW9ucworICovCisKKyNpZiBkZWZpbmVkKERFQlVHKQorc3RhdGljIHZvaWQgYWNlX2R1bXBfbWVtKHZvaWQgKmJhc2UsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqcHRyID0gYmFzZTsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJS44eDoiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWlmICghKGogJSA0KSkKKwkJCQlwcmludGsoIiAiKTsKKwkJCXByaW50aygiJS4yeCIsIHB0cltpICsgal0pOworCQl9CisJCXByaW50aygiICIpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJCXByaW50aygiJWMiLCBpc3ByaW50KHB0cltpICsgal0pID8gcHRyW2kgKyBqXSA6ICcuJyk7CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFjZV9kdW1wX21lbSh2b2lkICpiYXNlLCBpbnQgbGVuKQoreworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFjZV9kdW1wX3JlZ3Moc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlkZXZfaW5mbyhhY2UtPmRldiwgIiAgICBjdHJsOiAgJS44eCAgc2VjY250L2NtZDogJS40eCAgICAgIHZlcjolLjR4XG4iCisJCSAiICAgIHN0YXR1czolLjh4ICBtcHVfbGJhOiUuOHggIGJ1c21vZGU6JTR4XG4iCisJCSAiICAgIGVycm9yOiAlLjh4ICBjZmdfbGJhOiUuOHggIGZhdHN0YXQ6JS40eFxuIiwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX0NUUkwpLAorCQkgYWNlX2luKGFjZSwgQUNFX1NFQ0NOVENNRCksCisJCSBhY2VfaW4oYWNlLCBBQ0VfVkVSU0lPTiksCisJCSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpLAorCQkgYWNlX2luMzIoYWNlLCBBQ0VfTVBVTEJBKSwKKwkJIGFjZV9pbihhY2UsIEFDRV9CVVNNT0RFKSwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX0VSUk9SKSwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX0NGR0xCQSksIGFjZV9pbihhY2UsIEFDRV9GQVRTVEFUKSk7Cit9CisKK3ZvaWQgYWNlX2ZpeF9kcml2ZWlkKHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwl1MTYgKmJ1ZiA9ICh2b2lkICopaWQ7CisJaW50IGk7CisKKwkvKiBBbGwgaGFsZiB3b3JkcyBoYXZlIHdyb25nIGJ5dGUgb3JkZXI7IHN3YXAgdGhlIGJ5dGVzICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgaGRfZHJpdmVpZCk7IGkgKz0gMiwgYnVmKyspCisJCSpidWYgPSBsZTE2X3RvX2NwdSgqYnVmKTsKKworCS8qIFNvbWUgb2YgdGhlIGRhdGEgdmFsdWVzIGFyZSAzMmJpdDsgc3dhcCB0aGUgaGFsZiB3b3JkcyAgKi8KKwlpZC0+bGJhX2NhcGFjaXR5ID0gKChpZC0+bGJhX2NhcGFjaXR5ID4+IDE2KSAmIDB4MDAwMEZGRkYpIHwKKwkgICAgKChpZC0+bGJhX2NhcGFjaXR5IDw8IDE2KSAmIDB4RkZGRjAwMDApOworCWlkLT5zcGcgPSAoKGlkLT5zcGcgPj4gMTYpICYgMHgwMDAwRkZGRikgfAorCSAgICAoKGlkLT5zcGcgPDwgMTYpICYgMHhGRkZGMDAwMCk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaW5pdGUgU3RhdGUgTWFjaGluZSAoRlNNKSBpbXBsZW1lbnRhdGlvbgorICovCisKKy8qIEZTTSB0YXNrczsgdXNlZCB0byBkaXJlY3Qgc3RhdGUgdHJhbnNpdGlvbnMgKi8KKyNkZWZpbmUgQUNFX1RBU0tfSURMRSAgICAgIDAKKyNkZWZpbmUgQUNFX1RBU0tfSURFTlRJRlkgIDEKKyNkZWZpbmUgQUNFX1RBU0tfUkVBRCAgICAgIDIKKyNkZWZpbmUgQUNFX1RBU0tfV1JJVEUgICAgIDMKKyNkZWZpbmUgQUNFX0ZTTV9OVU1fVEFTS1MgIDQKKworLyogRlNNIHN0YXRlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfSURMRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9SRVFfTE9DSyAgICAgICAgICAgMQorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1dBSVRfTE9DSyAgICAgICAgICAyCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfV0FJVF9DRlJFQURZICAgICAgIDMKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9QUkVQQVJFICAgNAorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1RSQU5TRkVSICA1CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfSURFTlRJRllfQ09NUExFVEUgIDYKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9SRVFfUFJFUEFSRSAgICAgICAgNworI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1JFUV9UUkFOU0ZFUiAgICAgICA4CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfUkVRX0NPTVBMRVRFICAgICAgIDkKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9FUlJPUiAgICAgICAgICAgICAxMAorI2RlZmluZSBBQ0VfRlNNX05VTV9TVEFURVMgICAgICAgICAgICAgIDExCisKKy8qIFNldCBmbGFnIHRvIGV4aXQgRlNNIGxvb3AgYW5kIHJlc2NoZWR1bGUgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkIGFjZV9mc21feWllbGQoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX2ZzbV95aWVsZCgpXG4iKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZhY2UtPmZzbV90YXNrbGV0KTsKKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMDsKK30KKworLyogU2V0IGZsYWcgdG8gZXhpdCBGU00gbG9vcCBhbmQgd2FpdCBmb3IgSVJRIHRvIHJlc2NoZWR1bGUgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkIGFjZV9mc21feWllbGRpcnEoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX2ZzbV95aWVsZGlycSgpXG4iKTsKKworCWlmIChhY2UtPmlycSA9PSBOT19JUlEpCisJCS8qIE5vIElSUSBhc3NpZ25lZCwgc28gbmVlZCB0byBwb2xsICovCisJCXRhc2tsZXRfc2NoZWR1bGUoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAwOworfQorCisvKiBHZXQgdGhlIG5leHQgcmVhZC93cml0ZSByZXF1ZXN0OyBlbmRpbmcgcmVxdWVzdHMgdGhhdCB3ZSBkb24ndCBoYW5kbGUgKi8KK3N0cnVjdCByZXF1ZXN0ICphY2VfZ2V0X25leHRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKKwkJaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkpCisJCQlicmVhazsKKwkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwl9CisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIHZvaWQgYWNlX2ZzbV9kb3N0YXRlKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwl1MzIgc3RhdHVzOworCXUxNiB2YWw7CisJaW50IGNvdW50OworCWludCBpOworCisjaWYgZGVmaW5lZChERUJVRykKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiZnNtX3N0YXRlPSVpLCBpZF9yZXFfY291bnQ9JWlcbiIsCisJCWFjZS0+ZnNtX3N0YXRlLCBhY2UtPmlkX3JlcV9jb3VudCk7CisjZW5kaWYKKworCXN3aXRjaCAoYWNlLT5mc21fc3RhdGUpIHsKKwljYXNlIEFDRV9GU01fU1RBVEVfSURMRToKKwkJLyogU2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGRvICovCisJCWlmIChhY2UtPmlkX3JlcV9jb3VudCB8fCBhY2VfZ2V0X25leHRfcmVxdWVzdChhY2UtPnF1ZXVlKSkgeworCQkJYWNlLT5mc21faXRlcl9udW0rKzsKKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9SRVFfTE9DSzsKKwkJCW1vZF90aW1lcigmYWNlLT5zdGFsbF90aW1lciwgamlmZmllcyArIEhaKTsKKwkJCWlmICghdGltZXJfcGVuZGluZygmYWNlLT5zdGFsbF90aW1lcikpCisJCQkJYWRkX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyKTsKKwkJCWJyZWFrOworCQl9CisJCWRlbF90aW1lcigmYWNlLT5zdGFsbF90aW1lcik7CisJCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAwOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9SRVFfTE9DSzoKKwkJaWYgKGFjZV9pbihhY2UsIEFDRV9TVEFUVVMpICYgQUNFX1NUQVRVU19NUFVMT0NLKSB7CisJCQkvKiBBbHJlYWR5IGhhdmUgdGhlIGxvY2ssIGp1bXAgdG8gbmV4dCBzdGF0ZSAqLworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1dBSVRfQ0ZSRUFEWTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVxdWVzdCB0aGUgbG9jayAqLworCQl2YWwgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgdmFsIHwgQUNFX0NUUkxfTE9DS1JFUSk7CisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9XQUlUX0xPQ0s7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1dBSVRfTE9DSzoKKwkJaWYgKGFjZV9pbihhY2UsIEFDRV9TVEFUVVMpICYgQUNFX1NUQVRVU19NUFVMT0NLKSB7CisJCQkvKiBnb3QgdGhlIGxvY2s7IG1vdmUgdG8gbmV4dCBzdGF0ZSAqLworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1dBSVRfQ0ZSRUFEWTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogd2FpdCBhIGJpdCBmb3IgdGhlIGxvY2sgKi8KKwkJYWNlX2ZzbV95aWVsZChhY2UpOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9XQUlUX0NGUkVBRFk6CisJCXN0YXR1cyA9IGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyk7CisJCWlmICghKHN0YXR1cyAmIEFDRV9TVEFUVVNfUkRZRk9SQ0ZDTUQpIHx8CisJCSAgICAoc3RhdHVzICYgQUNFX1NUQVRVU19DRkJTWSkpIHsKKwkJCS8qIENGIGNhcmQgaXNuJ3QgcmVhZHk7IGl0IG5lZWRzIHRvIGJlIHBvbGxlZCAqLworCQkJYWNlX2ZzbV95aWVsZChhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBEZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW1hbmQ7IGRldGVybWluZSB3aGF0IHRvIGRvIG5leHQgKi8KKwkJaWYgKGFjZS0+aWRfcmVxX2NvdW50KQorCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1BSRVBBUkU7CisJCWVsc2UKKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9SRVFfUFJFUEFSRTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfSURFTlRJRllfUFJFUEFSRToKKwkJLyogU2VuZCBpZGVudGlmeSBjb21tYW5kICovCisJCWFjZS0+ZnNtX3Rhc2sgPSBBQ0VfVEFTS19JREVOVElGWTsKKwkJYWNlLT5kYXRhX3B0ciA9ICZhY2UtPmNmX2lkOworCQlhY2UtPmRhdGFfY291bnQgPSBBQ0VfQlVGX1BFUl9TRUNUT1I7CisJCWFjZV9vdXQoYWNlLCBBQ0VfU0VDQ05UQ01ELCBBQ0VfU0VDQ05UQ01EX0lERU5USUZZKTsKKworCQkvKiBBcyBwZXIgZGF0YXNoZWV0LCBwdXQgY29uZmlnIGNvbnRyb2xsZXIgaW4gcmVzZXQgKi8KKwkJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCQlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIHZhbCB8IEFDRV9DVFJMX0NGR1JFU0VUKTsKKworCQkvKiBpcnEgaGFuZGxlciB0YWtlcyBvdmVyIGZyb20gdGhpcyBwb2ludDsgd2FpdCBmb3IgdGhlCisJCSAqIHRyYW5zZmVyIHRvIGNvbXBsZXRlICovCisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JREVOVElGWV9UUkFOU0ZFUjsKKwkJYWNlX2ZzbV95aWVsZGlycShhY2UpOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9UUkFOU0ZFUjoKKwkJLyogQ2hlY2sgdGhhdCB0aGUgc3lzYWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSAqLworCQlzdGF0dXMgPSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgQUNFX1NUQVRVU19DRkJTWSkgeworCQkJZGV2X2RiZyhhY2UtPmRldiwgIkNGQlNZIHNldDsgdD0laSBpdGVyPSVpIGRjPSVpXG4iLAorCQkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX2l0ZXJfbnVtLAorCQkJCWFjZS0+ZGF0YV9jb3VudCk7CisJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBBQ0VfU1RBVFVTX0RBVEFCVUZSRFkpKSB7CisJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRyYW5zZmVyIHRoZSBuZXh0IGJ1ZmZlciAqLworCQlhY2UtPnJlZ19vcHMtPmRhdGFpbihhY2UpOworCQlhY2UtPmRhdGFfY291bnQtLTsKKworCQkvKiBJZiB0aGVyZSBhcmUgc3RpbGwgYnVmZmVycyB0byBiZSB0cmFuc2ZlcnM7IGp1bXAgb3V0IGhlcmUgKi8KKwkJaWYgKGFjZS0+ZGF0YV9jb3VudCAhPSAwKSB7CisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHRyYW5zZmVyIGZpbmlzaGVkOyBraWNrIHN0YXRlIG1hY2hpbmUgKi8KKwkJZGV2X2RiZyhhY2UtPmRldiwgImlkZW50aWZ5IGZpbmlzaGVkXG4iKTsKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX0NPTVBMRVRFOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9DT01QTEVURToKKwkJYWNlX2ZpeF9kcml2ZWlkKCZhY2UtPmNmX2lkKTsKKwkJYWNlX2R1bXBfbWVtKCZhY2UtPmNmX2lkLCA1MTIpOwkvKiBEZWJ1ZzogRHVtcCBvdXQgZGlzayBJRCAqLworCisJCWlmIChhY2UtPmRhdGFfcmVzdWx0KSB7CisJCQkvKiBFcnJvciBvY2N1cmVkLCBkaXNhYmxlIHRoZSBkaXNrICovCisJCQlhY2UtPm1lZGlhX2NoYW5nZSA9IDE7CisJCQlzZXRfY2FwYWNpdHkoYWNlLT5nZCwgMCk7CisJCQlkZXZfZXJyKGFjZS0+ZGV2LCAiZXJyb3IgZmV0Y2hpbmcgQ0YgaWQgKCVpKVxuIiwKKwkJCQlhY2UtPmRhdGFfcmVzdWx0KTsKKwkJfSBlbHNlIHsKKwkJCWFjZS0+bWVkaWFfY2hhbmdlID0gMDsKKworCQkJLyogUmVjb3JkIGRpc2sgcGFyYW1ldGVycyAqLworCQkJc2V0X2NhcGFjaXR5KGFjZS0+Z2QsIGFjZS0+Y2ZfaWQubGJhX2NhcGFjaXR5KTsKKwkJCWRldl9pbmZvKGFjZS0+ZGV2LCAiY2FwYWNpdHk6ICVpIHNlY3RvcnNcbiIsCisJCQkJIGFjZS0+Y2ZfaWQubGJhX2NhcGFjaXR5KTsKKwkJfQorCisJCS8qIFdlJ3JlIGRvbmUsIGRyb3AgdG8gSURMRSBzdGF0ZSBhbmQgbm90aWZ5IHdhaXRlcnMgKi8KKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCWFjZS0+aWRfcmVzdWx0ID0gYWNlLT5kYXRhX3Jlc3VsdDsKKwkJd2hpbGUgKGFjZS0+aWRfcmVxX2NvdW50KSB7CisJCQljb21wbGV0ZSgmYWNlLT5pZF9jb21wbGV0aW9uKTsKKwkJCWFjZS0+aWRfcmVxX2NvdW50LS07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfUkVRX1BSRVBBUkU6CisJCXJlcSA9IGFjZV9nZXRfbmV4dF9yZXF1ZXN0KGFjZS0+cXVldWUpOworCQlpZiAoIXJlcSkgeworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rYXksIGl0J3MgYSBkYXRhIHJlcXVlc3QsIHNldCBpdCB1cCBmb3IgdHJhbnNmZXIgKi8KKwkJZGV2X2RiZyhhY2UtPmRldiwKKwkJCSJyZXF1ZXN0OiBzZWM9JWx4IGhjbnQ9JWx4LCBjY250PSV4LCBkaXI9JWlcbiIsCisJCQlyZXEtPnNlY3RvciwgcmVxLT5oYXJkX25yX3NlY3RvcnMsCisJCQlyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycywgcnFfZGF0YV9kaXIocmVxKSk7CisKKwkJYWNlLT5yZXEgPSByZXE7CisJCWFjZS0+ZGF0YV9wdHIgPSByZXEtPmJ1ZmZlcjsKKwkJYWNlLT5kYXRhX2NvdW50ID0gcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiBBQ0VfQlVGX1BFUl9TRUNUT1I7CisJCWFjZV9vdXQzMihhY2UsIEFDRV9NUFVMQkEsIHJlcS0+c2VjdG9yICYgMHgwRkZGRkZGRik7CisKKwkJY291bnQgPSByZXEtPmhhcmRfbnJfc2VjdG9yczsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkpIHsKKwkJCS8qIEtpY2sgb2ZmIHdyaXRlIHJlcXVlc3QgKi8KKwkJCWRldl9kYmcoYWNlLT5kZXYsICJ3cml0ZSBkYXRhXG4iKTsKKwkJCWFjZS0+ZnNtX3Rhc2sgPSBBQ0VfVEFTS19XUklURTsKKwkJCWFjZV9vdXQoYWNlLCBBQ0VfU0VDQ05UQ01ELAorCQkJCWNvdW50IHwgQUNFX1NFQ0NOVENNRF9XUklURV9EQVRBKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEtpY2sgb2ZmIHJlYWQgcmVxdWVzdCAqLworCQkJZGV2X2RiZyhhY2UtPmRldiwgInJlYWQgZGF0YVxuIik7CisJCQlhY2UtPmZzbV90YXNrID0gQUNFX1RBU0tfUkVBRDsKKwkJCWFjZV9vdXQoYWNlLCBBQ0VfU0VDQ05UQ01ELAorCQkJCWNvdW50IHwgQUNFX1NFQ0NOVENNRF9SRUFEX0RBVEEpOworCQl9CisKKwkJLyogQXMgcGVyIGRhdGFzaGVldCwgcHV0IGNvbmZpZyBjb250cm9sbGVyIGluIHJlc2V0ICovCisJCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwkJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwgfCBBQ0VfQ1RSTF9DRkdSRVNFVCk7CisKKwkJLyogTW92ZSB0byB0aGUgdHJhbnNmZXIgc3RhdGUuICBUaGUgc3lzdGVtYWNlIHdpbGwgcmFpc2UKKwkJICogYW4gaW50ZXJydXB0IG9uY2UgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvCisJCSAqLworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfUkVRX1RSQU5TRkVSOworCQlpZiAoYWNlLT5mc21fdGFzayA9PSBBQ0VfVEFTS19SRUFEKQorCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOwkvKiB3YWl0IGZvciBkYXRhIHJlYWR5ICovCisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1JFUV9UUkFOU0ZFUjoKKwkJLyogQ2hlY2sgdGhhdCB0aGUgc3lzYWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSAqLworCQlzdGF0dXMgPSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgQUNFX1NUQVRVU19DRkJTWSkgeworCQkJZGV2X2RiZyhhY2UtPmRldiwKKwkJCQkiQ0ZCU1kgc2V0OyB0PSVpIGl0ZXI9JWkgYz0laSBkYz0laSBpcnE9JWlcbiIsCisJCQkJYWNlLT5mc21fdGFzaywgYWNlLT5mc21faXRlcl9udW0sCisJCQkJYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyAqIDE2LAorCQkJCWFjZS0+ZGF0YV9jb3VudCwgYWNlLT5pbl9pcnEpOworCQkJYWNlX2ZzbV95aWVsZChhY2UpOwkvKiBuZWVkIHRvIHBvbGwgQ0ZCU1kgYml0ICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBBQ0VfU1RBVFVTX0RBVEFCVUZSRFkpKSB7CisJCQlkZXZfZGJnKGFjZS0+ZGV2LAorCQkJCSJEQVRBQlVGIG5vdCBzZXQ7IHQ9JWkgaXRlcj0laSBjPSVpIGRjPSVpIGlycT0laVxuIiwKKwkJCQlhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9pdGVyX251bSwKKwkJCQlhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogMTYsCisJCQkJYWNlLT5kYXRhX2NvdW50LCBhY2UtPmluX2lycSk7CisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRyYW5zZmVyIHRoZSBuZXh0IGJ1ZmZlciAqLworCQlpID0gMTY7CisJCWlmIChhY2UtPmZzbV90YXNrID09IEFDRV9UQVNLX1dSSVRFKQorCQkJYWNlLT5yZWdfb3BzLT5kYXRhb3V0KGFjZSk7CisJCWVsc2UKKwkJCWFjZS0+cmVnX29wcy0+ZGF0YWluKGFjZSk7CisJCWFjZS0+ZGF0YV9jb3VudC0tOworCisJCS8qIElmIHRoZXJlIGFyZSBzdGlsbCBidWZmZXJzIHRvIGJlIHRyYW5zZmVyczsganVtcCBvdXQgaGVyZSAqLworCQlpZiAoYWNlLT5kYXRhX2NvdW50ICE9IDApIHsKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogYmlvIGZpbmlzaGVkOyBpcyB0aGVyZSBhbm90aGVyIG9uZT8gKi8KKwkJaSA9IGFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KGFjZS0+cmVxLCAxLCBpKSkgeworCQkJLyogZGV2X2RiZyhhY2UtPmRldiwgIm5leHQgYmxvY2s7IGg9JWxpIGM9JWlcbiIsCisJCQkgKiAgICAgIGFjZS0+cmVxLT5oYXJkX25yX3NlY3RvcnMsCisJCQkgKiAgICAgIGFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCQkJICovCisJCQlhY2UtPmRhdGFfcHRyID0gYWNlLT5yZXEtPmJ1ZmZlcjsKKwkJCWFjZS0+ZGF0YV9jb3VudCA9IGFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiAxNjsKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1JFUV9DT01QTEVURTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfUkVRX0NPTVBMRVRFOgorCQkvKiBDb21wbGV0ZSB0aGUgYmxvY2sgcmVxdWVzdCAqLworCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KGFjZS0+cmVxKTsKKwkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGFjZS0+cmVxLCAxKTsKKwkJYWNlLT5yZXEgPSBOVUxMOworCisJCS8qIEZpbmlzaGVkIHJlcXVlc3Q7IGdvIHRvIGlkbGUgc3RhdGUgKi8KKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lETEU7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYWNlX2ZzbV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gKHZvaWQgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBMb29wIG92ZXIgc3RhdGUgbWFjaGluZSB1bnRpbCB0b2xkIHRvIHN0b3AgKi8KKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMTsKKwl3aGlsZSAoYWNlLT5mc21fY29udGludWVfZmxhZykKKwkJYWNlX2ZzbV9kb3N0YXRlKGFjZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWNlX3N0YWxsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gKHZvaWQgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfd2FybihhY2UtPmRldiwKKwkJICJraWNraW5nIHN0YWxsZWQgZnNtOyBzdGF0ZT0laSB0YXNrPSVpIGl0ZXI9JWkgZGM9JWlcbiIsCisJCSBhY2UtPmZzbV9zdGF0ZSwgYWNlLT5mc21fdGFzaywgYWNlLT5mc21faXRlcl9udW0sCisJCSBhY2UtPmRhdGFfY291bnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKworCS8qIFJlYXJtIHRoZSBzdGFsbCB0aW1lciAqYmVmb3JlKiBlbnRlcmluZyBGU00gKHdoaWNoIG1heSB0aGVuCisJICogZGVsZXRlIHRoZSB0aW1lcikgKi8KKwltb2RfdGltZXIoJmFjZS0+c3RhbGxfdGltZXIsIGppZmZpZXMgKyBIWik7CisKKwkvKiBMb29wIG92ZXIgc3RhdGUgbWFjaGluZSB1bnRpbCB0b2xkIHRvIHN0b3AgKi8KKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMTsKKwl3aGlsZSAoYWNlLT5mc21fY29udGludWVfZmxhZykKKwkJYWNlX2ZzbV9kb3N0YXRlKGFjZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMKKyAqLworc3RhdGljIGludCBhY2VfaW50ZXJydXB0X2NoZWNrc3RhdGUoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl1MzIgc3JlZyA9IGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyk7CisJdTE2IGNyZWcgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisKKwkvKiBDaGVjayBmb3IgZXJyb3Igb2NjdXJhbmNlICovCisJaWYgKChzcmVnICYgKEFDRV9TVEFUVVNfQ0ZHRVJST1IgfCBBQ0VfU1RBVFVTX0NGQ0VSUk9SKSkgJiYKKwkgICAgKGNyZWcgJiBBQ0VfQ1RSTF9FUlJPUklSUSkpIHsKKwkJZGV2X2VycihhY2UtPmRldiwgInRyYW5zZmVyIGZhaWx1cmVcbiIpOworCQlhY2VfZHVtcF9yZWdzKGFjZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTE2IGNyZWc7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGRldl9pZDsKKworCS8qIGJlIHNhZmUgYW5kIGdldCB0aGUgbG9jayAqLworCXNwaW5fbG9jaygmYWNlLT5sb2NrKTsKKwlhY2UtPmluX2lycSA9IDE7CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJY3JlZyA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIGNyZWcgfCBBQ0VfQ1RSTF9SRVNFVElSUSk7CisJYWNlX291dChhY2UsIEFDRV9DVFJMLCBjcmVnKTsKKworCS8qIGNoZWNrIGZvciBJTyBmYWlsdXJlcyAqLworCWlmIChhY2VfaW50ZXJydXB0X2NoZWNrc3RhdGUoYWNlKSkKKwkJYWNlLT5kYXRhX3Jlc3VsdCA9IC1FSU87CisKKwlpZiAoYWNlLT5mc21fdGFzayA9PSAwKSB7CisJCWRldl9lcnIoYWNlLT5kZXYsCisJCQkic3B1cmlvdXMgaXJxOyBzdGF0PSUuOHggY3RybD0lLjh4IGNtZD0lLjR4XG4iLAorCQkJYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKSwgYWNlX2luMzIoYWNlLCBBQ0VfQ1RSTCksCisJCQlhY2VfaW4oYWNlLCBBQ0VfU0VDQ05UQ01EKSk7CisJCWRldl9lcnIoYWNlLT5kZXYsICJmc21fdGFzaz0laSBmc21fc3RhdGU9JWkgZGF0YV9jb3VudD0laVxuIiwKKwkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX3N0YXRlLCBhY2UtPmRhdGFfY291bnQpOworCX0KKworCS8qIExvb3Agb3ZlciBzdGF0ZSBtYWNoaW5lIHVudGlsIHRvbGQgdG8gc3RvcCAqLworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAxOworCXdoaWxlIChhY2UtPmZzbV9jb250aW51ZV9mbGFnKQorCQlhY2VfZnNtX2Rvc3RhdGUoYWNlKTsKKworCS8qIGRvbmUgd2l0aCBpbnRlcnJ1cHQ7IGRyb3AgdGhlIGxvY2sgKi8KKwlhY2UtPmluX2lycSA9IDA7CisJc3Bpbl91bmxvY2soJmFjZS0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmxvY2sgb3BzCisgKi8KK3N0YXRpYyB2b2lkIGFjZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlOworCisJcmVxID0gYWNlX2dldF9uZXh0X3JlcXVlc3QocSk7CisKKwlpZiAocmVxKSB7CisJCWFjZSA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQl0YXNrbGV0X3NjaGVkdWxlKCZhY2UtPmZzbV90YXNrbGV0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWNlX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmdkKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfbWVkaWFfY2hhbmdlZCgpOiAlaVxuIiwgYWNlLT5tZWRpYV9jaGFuZ2UpOworCisJcmV0dXJuIGFjZS0+bWVkaWFfY2hhbmdlOworfQorCitzdGF0aWMgaW50IGFjZV9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmdkKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBnZC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX3JldmFsaWRhdGVfZGlzaygpXG4iKTsKKworCWlmIChhY2UtPm1lZGlhX2NoYW5nZSkgeworCQlkZXZfZGJnKGFjZS0+ZGV2LCAicmVxdWVzdGluZyBjZiBpZCBhbmQgc2NoZWR1bGluZyB0YXNrbGV0XG4iKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisJCWFjZS0+aWRfcmVxX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCisJCXRhc2tsZXRfc2NoZWR1bGUoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhY2UtPmlkX2NvbXBsZXRpb24pOworCX0KKworCWRldl9kYmcoYWNlLT5kZXYsICJyZXZhbGlkYXRlIGNvbXBsZXRlXG4iKTsKKwlyZXR1cm4gYWNlLT5pZF9yZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgYWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9vcGVuKCkgdXNlcnM9JWlcbiIsIGFjZS0+dXNlcnMgKyAxKTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGFjZTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisJYWNlLT51c2VycysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCisJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2YWw7CisKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX3JlbGVhc2UoKSB1c2Vycz0laVxuIiwgYWNlLT51c2VycyAtIDEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCWFjZS0+dXNlcnMtLTsKKwlpZiAoYWNlLT51c2VycyA9PSAwKSB7CisJCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwkJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwgJiB+QUNFX0NUUkxfTE9DS1JFUSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKmdlbyA9IChzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICopYXJnOworCXN0cnVjdCBoZF9nZW9tZXRyeSBnOworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfaW9jdGwoKVxuIik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSERJT19HRVRHRU86CisJCWcuaGVhZHMgPSBhY2UtPmNmX2lkLmhlYWRzOworCQlnLnNlY3RvcnMgPSBhY2UtPmNmX2lkLnNlY3RvcnM7CisJCWcuY3lsaW5kZXJzID0gYWNlLT5jZl9pZC5jeWxzOworCQlnLnN0YXJ0ID0gMDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihnZW8sICZnLCBzaXplb2YoZykpID8gLUVGQVVMVCA6IDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgYWNlX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhY2Vfb3BlbiwKKwkucmVsZWFzZSA9IGFjZV9yZWxlYXNlLAorCS5tZWRpYV9jaGFuZ2VkID0gYWNlX21lZGlhX2NoYW5nZWQsCisJLnJldmFsaWRhdGVfZGlzayA9IGFjZV9yZXZhbGlkYXRlX2Rpc2ssCisJLmlvY3RsID0gYWNlX2lvY3RsLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN5c3RlbUFDRSBkZXZpY2Ugc2V0dXAvdGVhcmRvd24gY29kZQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhY2Vfc2V0dXAoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl1MTYgdmVyc2lvbjsKKwl1MTYgdmFsOworCisJaW50IHJjOworCisJc3Bpbl9sb2NrX2luaXQoJmFjZS0+bG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZhY2UtPmlkX2NvbXBsZXRpb24pOworCisJLyoKKwkgKiBNYXAgdGhlIGRldmljZQorCSAqLworCWFjZS0+YmFzZWFkZHIgPSBpb3JlbWFwKGFjZS0+cGh5c2FkZHIsIDB4ODApOworCWlmICghYWNlLT5iYXNlYWRkcikKKwkJZ290byBlcnJfaW9yZW1hcDsKKworCWlmIChhY2UtPmlycSAhPSBOT19JUlEpIHsKKwkJcmMgPSByZXF1ZXN0X2lycShhY2UtPmlycSwgYWNlX2ludGVycnVwdCwgMCwgInN5c3RlbWFjZSIsIGFjZSk7CisJCWlmIChyYykgeworCQkJLyogRmFpbHVyZSAtIGZhbGwgYmFjayB0byBwb2xsZWQgbW9kZSAqLworCQkJZGV2X2VycihhY2UtPmRldiwgInJlcXVlc3RfaXJxIGZhaWxlZFxuIik7CisJCQlhY2UtPmlycSA9IE5PX0lSUTsKKwkJfQorCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFjaGluZSB0YXNrbGV0IGFuZCBzdGFsbCB0aW1lcgorCSAqLworCXRhc2tsZXRfaW5pdCgmYWNlLT5mc21fdGFza2xldCwgYWNlX2ZzbV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylhY2UpOworCXNldHVwX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyLCBhY2Vfc3RhbGxfdGltZXIsICh1bnNpZ25lZCBsb25nKWFjZSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHJlcXVlc3QgcXVldWUKKwkgKi8KKwlhY2UtPnF1ZXVlID0gYmxrX2luaXRfcXVldWUoYWNlX3JlcXVlc3QsICZhY2UtPmxvY2spOworCWlmIChhY2UtPnF1ZXVlID09IE5VTEwpCisJCWdvdG8gZXJyX2Jsa19pbml0cTsKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShhY2UtPnF1ZXVlLCA1MTIpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBHRCBzdHJ1Y3R1cmUKKwkgKi8KKwlhY2UtPmdkID0gYWxsb2NfZGlzayhBQ0VfTlVNX01JTk9SUyk7CisJaWYgKCFhY2UtPmdkKQorCQlnb3RvIGVycl9hbGxvY19kaXNrOworCisJYWNlLT5nZC0+bWFqb3IgPSBhY2VfbWFqb3I7CisJYWNlLT5nZC0+Zmlyc3RfbWlub3IgPSBhY2UtPmlkICogQUNFX05VTV9NSU5PUlM7CisJYWNlLT5nZC0+Zm9wcyA9ICZhY2VfZm9wczsKKwlhY2UtPmdkLT5xdWV1ZSA9IGFjZS0+cXVldWU7CisJYWNlLT5nZC0+cHJpdmF0ZV9kYXRhID0gYWNlOworCXNucHJpbnRmKGFjZS0+Z2QtPmRpc2tfbmFtZSwgMzIsICJ4cyVjIiwgYWNlLT5pZCArICdhJyk7CisKKwkvKiBzZXQgYnVzIHdpZHRoICovCisJaWYgKGFjZS0+YnVzX3dpZHRoID09IDEpIHsKKwkJLyogMHgwMTAxIHNob3VsZCB3b3JrIHJlZ2FyZGxlc3Mgb2YgZW5kaWFuZXNzICovCisJCWFjZV9vdXRfbGUxNihhY2UsIEFDRV9CVVNNT0RFLCAweDAxMDEpOworCisJCS8qIHJlYWQgaXQgYmFjayB0byBkZXRlcm1pbmUgZW5kaWFuZXNzICovCisJCWlmIChhY2VfaW5fbGUxNihhY2UsIEFDRV9CVVNNT0RFKSA9PSAweDAwMDEpCisJCQlhY2UtPnJlZ19vcHMgPSAmYWNlX3JlZ19sZTE2X29wczsKKwkJZWxzZQorCQkJYWNlLT5yZWdfb3BzID0gJmFjZV9yZWdfYmUxNl9vcHM7CisJfSBlbHNlIHsKKwkJYWNlX291dF84KGFjZSwgQUNFX0JVU01PREUsIDB4MDApOworCQlhY2UtPnJlZ19vcHMgPSAmYWNlX3JlZ184X29wczsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdmVyc2lvbiByZWdpc3RlciBpcyBzYW5lICovCisJdmVyc2lvbiA9IGFjZV9pbihhY2UsIEFDRV9WRVJTSU9OKTsKKwlpZiAoKHZlcnNpb24gPT0gMCkgfHwgKHZlcnNpb24gPT0gMHhGRkZGKSkKKwkJZ290byBlcnJfcmVhZDsKKworCS8qIFB1dCBzeXNhY2UgaW4gYSBzYW5lIHN0YXRlIGJ5IGNsZWFyaW5nIG1vc3QgY29udHJvbCByZWcgYml0cyAqLworCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgQUNFX0NUUkxfRk9SQ0VDRkdNT0RFIHwKKwkJQUNFX0NUUkxfREFUQUJVRlJEWUlSUSB8IEFDRV9DVFJMX0VSUk9SSVJRKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCXZhbCB8PSBBQ0VfQ1RSTF9EQVRBQlVGUkRZSVJRIHwgQUNFX0NUUkxfRVJST1JJUlE7CisJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwpOworCisJLyogUHJpbnQgdGhlIGlkZW50aWZpY2F0aW9uICovCisJZGV2X2luZm8oYWNlLT5kZXYsICJYaWxpbnggU3lzdGVtQUNFIHJldmlzaW9uICVpLiVpLiVpXG4iLAorCQkgKHZlcnNpb24gPj4gMTIpICYgMHhmLCAodmVyc2lvbiA+PiA4KSAmIDB4MGYsIHZlcnNpb24gJiAweGZmKTsKKwlkZXZfZGJnKGFjZS0+ZGV2LCAicGh5c2FkZHIgMHglbHgsIG1hcHBlZCB0byAweCVwLCBpcnE9JWlcbiIsCisJCWFjZS0+cGh5c2FkZHIsIGFjZS0+YmFzZWFkZHIsIGFjZS0+aXJxKTsKKworCWFjZS0+bWVkaWFfY2hhbmdlID0gMTsKKwlhY2VfcmV2YWxpZGF0ZV9kaXNrKGFjZS0+Z2QpOworCisJLyogTWFrZSB0aGUgc3lzYWNlIGRldmljZSAnbGl2ZScgKi8KKwlhZGRfZGlzayhhY2UtPmdkKTsKKworCXJldHVybiAwOworCisgICAgICBlcnJfcmVhZDoKKwlwdXRfZGlzayhhY2UtPmdkKTsKKyAgICAgIGVycl9hbGxvY19kaXNrOgorCWJsa19jbGVhbnVwX3F1ZXVlKGFjZS0+cXVldWUpOworICAgICAgZXJyX2Jsa19pbml0cToKKwlpb3VubWFwKGFjZS0+YmFzZWFkZHIpOworCWlmIChhY2UtPmlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKGFjZS0+aXJxLCBhY2UpOworICAgICAgZXJyX2lvcmVtYXA6CisJcHJpbnRrKEtFUk5fSU5GTyAieHN5c2FjZTogZXJyb3IgaW5pdGlhbGl6aW5nIGRldmljZSBhdCAweCVseFxuIiwKKwkgICAgICAgYWNlLT5waHlzYWRkcik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhY2VfdGVhcmRvd24oc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpZiAoYWNlLT5nZCkgeworCQlkZWxfZ2VuZGlzayhhY2UtPmdkKTsKKwkJcHV0X2Rpc2soYWNlLT5nZCk7CisJfQorCisJaWYgKGFjZS0+cXVldWUpCisJCWJsa19jbGVhbnVwX3F1ZXVlKGFjZS0+cXVldWUpOworCisJdGFza2xldF9raWxsKCZhY2UtPmZzbV90YXNrbGV0KTsKKworCWlmIChhY2UtPmlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKGFjZS0+aXJxLCBhY2UpOworCisJaW91bm1hcChhY2UtPmJhc2VhZGRyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQbGF0Zm9ybSBCdXMgU3VwcG9ydAorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFjZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldmljZSk7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZTsKKwlpbnQgaTsKKworCWRldl9kYmcoZGV2aWNlLCAiYWNlX3Byb2JlKCVwKVxuIiwgZGV2aWNlKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGFjZSBkZXZpY2Ugc3RydWN0dXJlCisJICovCisJYWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjZV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjZSkKKwkJZ290byBlcnJfYWxsb2M7CisKKwlhY2UtPmRldiA9IGRldmljZTsKKwlhY2UtPmlkID0gZGV2LT5pZDsKKwlhY2UtPmlycSA9IE5PX0lSUTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yZXNvdXJjZXM7IGkrKykgeworCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJYWNlLT5waHlzYWRkciA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CisJCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9JUlEpCisJCQlhY2UtPmlycSA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CisJfQorCisJLyogRklYTUU6IFNob3VsZCBnZXQgYnVzX3dpZHRoIGZyb20gdGhlIHBsYXRmb3JtX2RldmljZSBzdHJ1Y3QgKi8KKwlhY2UtPmJ1c193aWR0aCA9IDE7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBhY2UpOworCisJLyogQ2FsbCB0aGUgYnVzLWluZGVwZW5kYW50IHNldHVwIGNvZGUgKi8KKwlpZiAoYWNlX3NldHVwKGFjZSkgIT0gMCkKKwkJZ290byBlcnJfc2V0dXA7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX3NldHVwOgorCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCWtmcmVlKGFjZSk7CisgICAgICBlcnJfYWxsb2M6CisJcHJpbnRrKEtFUk5fRVJSICJ4c3lzYWNlOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBkZXZpY2VcbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogUGxhdGZvcm0gYnVzIHJlbW92ZSgpIG1ldGhvZAorICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlkZXZfZGJnKGRldmljZSwgImFjZV9yZW1vdmUoJXApXG4iLCBkZXZpY2UpOworCisJaWYgKGFjZSkgeworCQlhY2VfdGVhcmRvd24oYWNlKTsKKwkJa2ZyZWUoYWNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGFjZV9kcml2ZXIgPSB7CisJLm5hbWUgPSAieHN5c2FjZSIsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBhY2VfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFjZV9yZW1vdmUpLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNb2R1bGUgaW5pdC9leGl0IHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFjZV9pbml0KHZvaWQpCit7CisJYWNlX21ham9yID0gcmVnaXN0ZXJfYmxrZGV2KGFjZV9tYWpvciwgInhzeXNhY2UiKTsKKwlpZiAoYWNlX21ham9yIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAieHN5c2FjZTogcmVnaXN0ZXJfYmxrZGV2KCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGFjZV9tYWpvcjsKKwl9CisKKwlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgWGlsaW54IFN5c3RlbUFDRSBkcml2ZXIsIG1ham9yPSVpXG4iLCBhY2VfbWFqb3IpOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmFjZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNlX2V4aXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiVW5yZWdpc3RlcmluZyBYaWxpbnggU3lzdGVtQUNFIGRyaXZlclxuIik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmFjZV9kcml2ZXIpOworCXVucmVnaXN0ZXJfYmxrZGV2KGFjZV9tYWpvciwgInhzeXNhY2UiKTsKK30KKworbW9kdWxlX2luaXQoYWNlX2luaXQpOworbW9kdWxlX2V4aXQoYWNlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay96MnJhbS5jIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCmluZGV4IDdjYzI2ODUuLmU0MGZhOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svejJyYW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKQEAgLTQ0LDkgKzQ0LDYgQEAKIGV4dGVybiBpbnQgbTY4a19yZWFsbnVtX21lbW9yeTsKIGV4dGVybiBzdHJ1Y3QgbWVtX2luZm8gbTY4a19tZW1vcnlbTlVNX01FTUlORk9dOwogCi0jZGVmaW5lIFRSVUUgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgICAgICgwKQotCiAjZGVmaW5lIFoyTUlOT1JfQ09NQklORUQgICAgICAoMCkKICNkZWZpbmUgWjJNSU5PUl9aMk9OTFkgICAgICAgICgxKQogI2RlZmluZSBaMk1JTk9SX0NISVBPTkxZICAgICAgKDIpCkBAIC0zNzQsOSArMzcxLDcgQEAKIHsKICAgICBpbnQgaSwgajsKICAgICBibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoWjJSQU1fTUFKT1IsIDApLCAyNTYpOwotICAgIGlmICggdW5yZWdpc3Rlcl9ibGtkZXYoIFoyUkFNX01BSk9SLCBERVZJQ0VfTkFNRSApICE9IDAgKQotCXByaW50ayggS0VSTl9FUlIgREVWSUNFX05BTUUgIjogdW5yZWdpc3RlciBvZiBkZXZpY2UgZmFpbGVkXG4iKTsKLQorICAgIHVucmVnaXN0ZXJfYmxrZGV2KFoyUkFNX01BSk9SLCBERVZJQ0VfTkFNRSk7CiAgICAgZGVsX2dlbmRpc2soejJyYW1fZ2VuZGlzayk7CiAgICAgcHV0X2Rpc2soejJyYW1fZ2VuZGlzayk7CiAgICAgYmxrX2NsZWFudXBfcXVldWUoejJfcXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCmluZGV4IGFhNTQ2OGYuLjQ5OTAxOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYworKysgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKQEAgLTI2OTUsMTEgKzI2OTUsMTIgQEAKIHsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcmV0OworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaXAtPmlfYmRldi0+YmRfZGlzazsKIAogCS8qCiAJICogVHJ5IHRoZSBnZW5lcmljIFNDU0kgY29tbWFuZCBpb2N0bCdzIGZpcnN0LgogCSAqLwotCXJldCA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIGlwLT5pX2JkZXYtPmJkX2Rpc2ssIGNtZCwgYXJncCk7CisJcmV0ID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgZGlzay0+cXVldWUsIGRpc2ssIGNtZCwgYXJncCk7CiAJaWYgKHJldCAhPSAtRU5PVFRZKQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IGY2NjQ4NjguLmQ4ZDcxMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogY29uZmlnIFJPQ0tFVFBPUlQKIAl0cmlzdGF0ZSAiQ29tdHJvbCBSb2NrZXRQb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIENvbXRyb2wgUm9ja2V0UG9ydCBhbmQgUm9ja2V0TW9kZW0gUENJIGJvYXJkcy4gICAKICAgICAgICAgICBUaGVzZSBib2FyZHMgcHJvdmlkZSAyLCA0LCA4LCAxNiwgb3IgMzIgaGlnaC1zcGVlZCBzZXJpYWwgcG9ydHMgb3IKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCiBjb25maWcgRElHSUVQQ0EKIAl0cmlzdGF0ZSAiRGlnaWJvYXJkIEludGVsbGlnZW50IEFzeW5jIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIERpZ2kgSW50ZXJuYXRpb25hbCdzIFh4LCBYZXZlLCBhbmQgWGVtIHNlcmllcwogCSAgb2YgY2FyZHMgd2hpY2ggcHJvdmlkZSBtdWx0aXBsZSBzZXJpYWwgcG9ydHMuIFlvdSB3b3VsZCBuZWVkCkBAIC0yMTMsOCArMjEzLDYgQEAKIAkgIFRoaXMgaXMgdXBncmFkZWQgKDEuOS4xKSBkcml2ZXIgZnJvbSBvcmlnaW5hbCBNb3hhIGRyaXZlcnMgd2l0aAogCSAgY2hhbmdlcyBmaW5hbGx5IHJlc3VsdGluZyBpbiBQQ0kgcHJvYmluZy4KIAotCSAgVXNlIGF0IHlvdXIgb3duIHJpc2suCi0KIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCiAJICBteHNlcl9uZXcuIElmIHlvdSB3YW50IHRvIGRvIHRoYXQsIHNheSBNIGhlcmUuCiAKQEAgLTM1NCw3ICszNTIsNyBAQAogCiBjb25maWcgU1RBTExJT04KIAl0cmlzdGF0ZSAiU3RhbGxpb24gRWFzeUlPIG9yIEVDOC8zMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gU1RBTERSViAmJiBCUk9LRU5fT05fU01QCisJZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAgJiYgKElTQSB8fCBFSVNBIHx8IFBDSSkKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhbiBFYXN5SU8gb3IgRWFzeUNvbm5lY3Rpb24gOC8zMiBtdWx0aXBvcnQgU3RhbGxpb24KIAkgIGNhcmQsIHRoZW4gdGhpcyBpcyBmb3IgeW91OyBzYXkgWS4gIE1ha2Ugc3VyZSB0byByZWFkCkBAIC0zNjUsNyArMzYzLDcgQEAKIAogY29uZmlnIElTVEFMTElPTgogCXRyaXN0YXRlICJTdGFsbGlvbiBFQzgvNjQsIE9OYm9hcmQsIEJydW1ieSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU1RBTERSViAmJiBCUk9LRU5fT05fU01QCisJZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAgJiYgKElTQSB8fCBFSVNBIHx8IFBDSSkKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhbiBFYXN5Q29ubmVjdGlvbiA4LzY0LCBPTmJvYXJkLCBCcnVtYnkgb3IgU3RhbGxpb24KIAkgIHNlcmlhbCBtdWx0aXBvcnQgY2FyZCwgc2F5IFkgaGVyZS4gTWFrZSBzdXJlIHRvIHJlYWQKQEAgLTk3OSwxNSArOTc3LDE0IEBACiAJZGVwZW5kcyBvbiBDUFVfVlI0MVhYCiAKIGNvbmZpZyBSQVdfRFJJVkVSCi0JdHJpc3RhdGUgIlJBVyBkcml2ZXIgKC9kZXYvcmF3L3Jhd04pIChPQlNPTEVURSkiCisJdHJpc3RhdGUgIlJBVyBkcml2ZXIgKC9kZXYvcmF3L3Jhd04pIgogCWRlcGVuZHMgb24gQkxPQ0sKIAloZWxwCi0JICBUaGUgcmF3IGRyaXZlciBwZXJtaXRzIGJsb2NrIGRldmljZXMgdG8gYmUgYm91bmQgdG8gL2Rldi9yYXcvcmF3Ti4gCi0JICBPbmNlIGJvdW5kLCBJL08gYWdhaW5zdCAvZGV2L3Jhdy9yYXdOIHVzZXMgZWZmaWNpZW50IHplcm8tY29weSBJL08uIAorCSAgVGhlIHJhdyBkcml2ZXIgcGVybWl0cyBibG9jayBkZXZpY2VzIHRvIGJlIGJvdW5kIHRvIC9kZXYvcmF3L3Jhd04uCisJICBPbmNlIGJvdW5kLCBJL08gYWdhaW5zdCAvZGV2L3Jhdy9yYXdOIHVzZXMgZWZmaWNpZW50IHplcm8tY29weSBJL08uCiAJICBTZWUgdGhlIHJhdyg4KSBtYW5wYWdlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgICAgICAgICBUaGUgcmF3IGRyaXZlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4KLSAgICAgICAgICBBcHBsaWNhdGlvbnMgc2hvdWxkIHNpbXBseSBvcGVuIHRoZSBkZXZpY2UgKGVnIC9kZXYvaGRhMSkKKyAgICAgICAgICBBcHBsaWNhdGlvbnMgc2hvdWxkIHByZWZlcmFibHkgb3BlbiB0aGUgZGV2aWNlIChlZyAvZGV2L2hkYTEpCiAgICAgICAgICAgd2l0aCB0aGUgT19ESVJFQ1QgZmxhZy4KIAogY29uZmlnIE1BWF9SQVdfREVWUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDJmNTZlY2MuLmYyOTk2YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIG9iai0kKENPTkZJR19WVCkJCSs9IHZ0X2lvY3RsLm8gdmNfc2NyZWVuLm8gY29uc29sZW1hcC5vIFwKIAkJCQkgICBjb25zb2xlbWFwX2RlZnRibC5vIHNlbGVjdGlvbi5vIGtleWJvYXJkLm8KIG9iai0kKENPTkZJR19IV19DT05TT0xFKQkrPSB2dC5vIGRlZmtleW1hcC5vCitvYmotJChDT05GSUdfQVVESVQpCQkrPSB0dHlfYXVkaXQubwogb2JqLSQoQ09ORklHX01BR0lDX1NZU1JRKQkrPSBzeXNycS5vCiBvYmotJChDT05GSUdfRVNQU0VSSUFMKQkJKz0gZXNwLm8KIG9iai0kKENPTkZJR19NVk1FMTQ3X1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwppbmRleCA0ZWFjZWFiLi43YjAyYmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCkBAIC03MzgsNiArNzM4LDcgQEAKIAl9CiAJLyogSWYgdGhlIHF1b3RpZW50IGlzIHplcm8gcmVmdXNlIHRoZSBjaGFuZ2UgKi8KIAlpZiAoIXF1b3QgJiYgb2xkX3Rlcm1pb3MpIHsKKwkJLyogRklYTUU6IFdpbGwgbmVlZCB1cGRhdGluZyBmb3IgbmV3IHR0eSBpbiB0aGUgZW5kICovCiAJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CiAJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PSAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCk7CiAJCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOwpAQCAtNzgzLDcgKzc4NCw2IEBACiAJLyoKIAkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKIAkgKi8KLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQogCiAJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfRFI7CiAJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKQEAgLTEzNjcsMTEgKzEzNjcsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCi0JaWYgKCAgIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKCAgIFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgCi0JCT09IFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpCi0JICByZXR1cm47Ci0KIAljaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOwogCiAJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jIGIvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYwppbmRleCAxNzljN2EzLi5lYzExNmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvYXBtLWVtdWxhdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0zMjksMTMgKzMzMCw4IEBACiAJCQkvKgogCQkJICogV2FpdCBmb3IgdGhlIHN1c3BlbmQvcmVzdW1lIHRvIGNvbXBsZXRlLiAgSWYgdGhlcmUKIAkJCSAqIGFyZSBwZW5kaW5nIGFja25vd2xlZGdlcywgd2Ugd2FpdCBoZXJlIGZvciB0aGVtLgotCQkJICoKLQkJCSAqIE5vdGU6IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIFBNIHN1YnN5c3RlbSBkb2VzCi0JCQkgKiBub3Qga2ljayB1cyBvdXQgb2YgdGhlIHdhaXQgd2hlbiBpdCBzdXNwZW5kcyB0aGUKLQkJCSAqIHRocmVhZHMuCiAJCQkgKi8KIAkJCWZsYWdzID0gY3VycmVudC0+ZmxhZ3M7Ci0JCQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCQkJd2FpdF9ldmVudChhcG1fc3VzcGVuZF93YWl0cXVldWUsCiAJCQkJICAgYXMtPnN1c3BlbmRfc3RhdGUgPT0gU1VTUEVORF9ET05FKTsKQEAgLTM2NSwxMyArMzYxLDggQEAKIAkJCS8qCiAJCQkgKiBXYWl0IGZvciB0aGUgc3VzcGVuZC9yZXN1bWUgdG8gY29tcGxldGUuICBJZiB0aGVyZQogCQkJICogYXJlIHBlbmRpbmcgYWNrbm93bGVkZ2VzLCB3ZSB3YWl0IGhlcmUgZm9yIHRoZW0uCi0JCQkgKgotCQkJICogTm90ZTogd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgUE0gc3Vic3lzdGVtIGRvZXMKLQkJCSAqIG5vdCBraWNrIHVzIG91dCBvZiB0aGUgd2FpdCB3aGVuIGl0IHN1c3BlbmRzIHRoZQotCQkJICogdGhyZWFkcy4KIAkJCSAqLwogCQkJZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKLQkJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAogCQkJCQkgYXMtPnN1c3BlbmRfc3RhdGUgPT0gU1VTUEVORF9ET05FKTsKQEAgLTU5OCw3ICs1ODksNiBAQAogCQlrYXBtZF90c2sgPSBOVUxMOwogCQlyZXR1cm4gcmV0OwogCX0KLQlrYXBtZF90c2stPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCXdha2VfdXBfcHJvY2VzcyhrYXBtZF90c2spOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMgYi9kcml2ZXJzL2NoYXIvYnJpcV9wYW5lbC5jCmluZGV4IGVkNTNmNTQuLmI2ZjI2MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMKKysrIGIvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYwpAQCAtOTEsMTEgKzkxLDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBjOwogCXVuc2lnbmVkIGNoYXIgY3A7CiAKLSNpZiAwCS8qICBDYW4ndCBzZWVrIChwcmVhZCkgb24gdGhpcyBkZXZpY2UgICovCi0JaWYgKHBwb3MgIT0gJmZpbGUtPmZfcG9zKQotCQlyZXR1cm4gLUVTUElQRTsKLSNlbmRpZgotCiAJaWYgKCF2ZmRfaXNfb3BlbikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTEzOSwxMSArMTM0LDYgQEAKIAlzaXplX3QgaW5keCA9IGxlbjsKIAlpbnQgaSwgZXNjID0gMDsKIAotI2lmIDAJLyogIENhbid0IHNlZWsgKHB3cml0ZSkgb24gdGhpcyBkZXZpY2UgICovCi0JaWYgKHBwb3MgIT0gJmZpbGUtPmZfcG9zKQotCQlyZXR1cm4gLUVTUElQRTsKLSNlbmRpZgotCiAJaWYgKCF2ZmRfaXNfb3BlbikKIAkJcmV0dXJuIC1FQlVTWTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYyBiL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKaW5kZXggZmQ0MGI5NS4uNGIzOTE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYworKysgYi9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCkBAIC0xNzcsNiArMTc3LDcgQEAKIAl1bnNpZ25lZCBsb25nCXJlZmNvdW50OwogCXVuc2lnbmVkIGxvbmcJc3VtOwogCXVuc2lnbmVkIGNoYXIJKmludmVyc2VfdHJhbnNsYXRpb25zWzRdOworCXUxNgkJKmludmVyc2VfdHJhbnNfdW5pY29kZTsKIAlpbnQJCXJlYWRvbmx5OwogfTsKIApAQCAtMjA3LDYgKzIwOCw0MSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc2V0X2ludmVyc2VfdHJhbnNfdW5pY29kZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwKKwkJCQkgICAgICBzdHJ1Y3QgdW5pX3BhZ2VkaXIgKnApCit7CisJaW50IGksIGosIGssIGdseXBoOworCXUxNiAqKnAxLCAqcDI7CisJdTE2ICpxOworCisJaWYgKCFwKSByZXR1cm47CisJcSA9IHAtPmludmVyc2VfdHJhbnNfdW5pY29kZTsKKwlpZiAoIXEpIHsKKwkJcSA9IHAtPmludmVyc2VfdHJhbnNfdW5pY29kZSA9CisJCQlrbWFsbG9jKE1BWF9HTFlQSCAqIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFxKQorCQkJcmV0dXJuOworCX0KKwltZW1zZXQocSwgMCwgTUFYX0dMWVBIICogc2l6ZW9mKHUxNikpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJcDEgPSBwLT51bmlfcGdkaXJbaV07CisJCWlmICghcDEpCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJCXAyID0gcDFbal07CisJCQlpZiAoIXAyKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChrID0gMDsgayA8IDY0OyBrKyspIHsKKwkJCQlnbHlwaCA9IHAyW2tdOworCQkJCWlmIChnbHlwaCA+PSAwICYmIGdseXBoIDwgTUFYX0dMWVBICisJCQkJCSAgICAgICAmJiBxW2dseXBoXSA8IDMyKQorCQkgIAkJCXFbZ2x5cGhdID0gKGkgPDwgMTEpICsgKGogPDwgNikgKyBrOworCQkJfQorCQl9CisJfQorfQorCiB1bnNpZ25lZCBzaG9ydCAqc2V0X3RyYW5zbGF0ZShpbnQgbSwgc3RydWN0IHZjX2RhdGEgKnZjKQogewogCWludl90cmFuc2xhdGVbdmMtPnZjX251bV0gPSBtOwpAQCAtMjE3LDE5ICsyNTMsMjkgQEAKICAqIEludmVyc2UgdHJhbnNsYXRpb24gaXMgaW1wb3NzaWJsZSBmb3Igc2V2ZXJhbCByZWFzb25zOgogICogMS4gVGhlIGZvbnQ8LT5jaGFyYWN0ZXIgbWFwcyBhcmUgbm90IDEtMS4KICAqIDIuIFRoZSB0ZXh0IG1heSBoYXZlIGJlZW4gd3JpdHRlbiB3aGlsZSBhIGRpZmZlcmVudCB0cmFuc2xhdGlvbiBtYXAKLSAqICAgIHdhcyBhY3RpdmUsIG9yIHVzaW5nIFVuaWNvZGUuCisgKiAgICB3YXMgYWN0aXZlLgogICogU3RpbGwsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBhIGNlcnRhaW4gZXh0ZW50IHRvIGN1dCBhbmQgcGFzdGUgbm9uLUFTQ0lJLgogICovCi11bnNpZ25lZCBjaGFyIGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgpCit1MTYgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCwgaW50IHVzZV91bmljb2RlKQogewogCXN0cnVjdCB1bmlfcGFnZWRpciAqcDsKKwlpbnQgbTsKIAlpZiAoZ2x5cGggPCAwIHx8IGdseXBoID49IE1BWF9HTFlQSCkKIAkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAoIShwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSpjb25wLT52Y191bmlfcGFnZWRpcl9sb2MpIHx8Ci0JCSAhcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaW52X3RyYW5zbGF0ZVtjb25wLT52Y19udW1dXSkKKwllbHNlIGlmICghKHAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKmNvbnAtPnZjX3VuaV9wYWdlZGlyX2xvYykpCiAJCXJldHVybiBnbHlwaDsKLQllbHNlCi0JCXJldHVybiBwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpbnZfdHJhbnNsYXRlW2NvbnAtPnZjX251bV1dW2dseXBoXTsKKwllbHNlIGlmICh1c2VfdW5pY29kZSkgeworCQlpZiAoIXAtPmludmVyc2VfdHJhbnNfdW5pY29kZSkKKwkJCXJldHVybiBnbHlwaDsKKwkJZWxzZQorCQkJcmV0dXJuIHAtPmludmVyc2VfdHJhbnNfdW5pY29kZVtnbHlwaF07CisJfSBlbHNlIHsKKwkJbSA9IGludl90cmFuc2xhdGVbY29ucC0+dmNfbnVtXTsKKwkJaWYgKCFwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1ttXSkKKwkJCXJldHVybiBnbHlwaDsKKwkJZWxzZQorCQkJcmV0dXJuIHAtPmludmVyc2VfdHJhbnNsYXRpb25zW21dW2dseXBoXTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV91c2VyX21hcHModm9pZCkKQEAgLTI0Myw2ICsyODksNyBAQAogCQlwID0gKHN0cnVjdCB1bmlfcGFnZWRpciAqKSp2Y19jb25zW2ldLmQtPnZjX3VuaV9wYWdlZGlyX2xvYzsKIAkJaWYgKHAgJiYgcCAhPSBxKSB7CiAJCQlzZXRfaW52ZXJzZV90cmFuc2wodmNfY29uc1tpXS5kLCBwLCBVU0VSX01BUCk7CisJCQlzZXRfaW52ZXJzZV90cmFuc191bmljb2RlKHZjX2NvbnNbaV0uZCwgcCk7CiAJCQlxID0gcDsKIAkJfQogCX0KQEAgLTM1Myw2ICs0MDAsMTAgQEAKIAkJa2ZyZWUocC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbaV0pOwogCQlwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSA9IE5VTEw7CiAJfQorCWlmIChwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUpIHsKKwkJa2ZyZWUocC0+aW52ZXJzZV90cmFuc191bmljb2RlKTsKKwkJcC0+aW52ZXJzZV90cmFuc191bmljb2RlID0gTlVMTDsKKwl9CiB9CiAKIHZvaWQgY29uX2ZyZWVfdW5pbWFwKHN0cnVjdCB2Y19kYXRhICp2YykKQEAgLTUxMSw2ICs1NjIsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8PSAzOyBpKyspCiAJCXNldF9pbnZlcnNlX3RyYW5zbCh2YywgcCwgaSk7IC8qIFVwZGF0ZSBhbGwgaW52ZXJzZSB0cmFuc2xhdGlvbnMgKi8KKwlzZXRfaW52ZXJzZV90cmFuc191bmljb2RlKHZjLCBwKTsKICAgCiAJcmV0dXJuIGVycjsKIH0KQEAgLTU2MSw2ICs2MTMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8PSAzOyBpKyspCiAJCXNldF9pbnZlcnNlX3RyYW5zbCh2YywgcCwgaSk7CS8qIFVwZGF0ZSBhbGwgaW52ZXJzZSB0cmFuc2xhdGlvbnMgKi8KKwlzZXRfaW52ZXJzZV90cmFuc191bmljb2RlKHZjLCBwKTsKIAlkZmx0ID0gcDsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNjE3LDYgKzY3MCwxOSBAQAogCQlwLT5yZWFkb25seSA9IHJkb25seTsKIH0KIAorLyogbWF5IGJlIGNhbGxlZCBkdXJpbmcgYW4gaW50ZXJydXB0ICovCit1MzIgY29udl84Yml0X3RvX3VuaSh1bnNpZ25lZCBjaGFyIGMpCit7CisJLyoKKwkgKiBBbHdheXMgdXNlIFVTRVJfTUFQLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGtleWJvYXJkLAorCSAqIHdoaWNoIHNob3VsZG4ndCBiZSBhZmZlY3RlZCBieSBHMC9HMSBzd2l0Y2hpbmcsIGV0Yy4KKwkgKiBJZiB0aGUgdXNlciBtYXAgc3RpbGwgY29udGFpbnMgZGVmYXVsdCB2YWx1ZXMsIGkuZS4gdGhlCisJICogZGlyZWN0LXRvLWZvbnQgbWFwcGluZywgdGhlbiBhc3N1bWUgdXNlciBpcyB1c2luZyBMYXRpbjEuCisJICovCisJdW5zaWduZWQgc2hvcnQgdW5pID0gdHJhbnNsYXRpb25zW1VTRVJfTUFQXVtjXTsKKwlyZXR1cm4gdW5pID09ICgweGYwMDAgfCBjKSA/IGMgOiB1bmk7Cit9CisKIGludAogY29udl91bmlfdG9fcGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGxvbmcgdWNzKSAKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKaW5kZXggY2EzNzZiOS4uN2IwODM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTY0Niw2ICs2NDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjgwLDYgKzY4MSw0NCBAQAogCiAjZGVmaW5lIFNURF9DT01fRkxBR1MgKDApCiAKKy8qIGZpcm13YXJlIHN0dWZmICovCisjZGVmaW5lIFpMX01BWF9CTE9DS1MJMTYKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JMHgwMjAxMDIwMworI2RlZmluZSBSQU1fU0laRSAweDgwMDAwCisKKyNkZWZpbmUgWl9GUEdBX0xPQURFRChYKQkoKHJlYWRsKCYoWCktPmluaXRfY3RybCkgJiAoMTw8MTcpKSAhPSAwKQorCitlbnVtIHpibG9ja190eXBlIHsKKwlaQkxPQ0tfUFJHID0gMCwKKwlaQkxPQ0tfRlBHQSA9IDEKK307CisKK3N0cnVjdCB6ZmlsZV9oZWFkZXIgeworCWNoYXIgbmFtZVs2NF07CisJY2hhciBkYXRlWzMyXTsKKwljaGFyIGF1eFszMl07CisJdTMyIG5fY29uZmlnOworCXUzMiBjb25maWdfb2Zmc2V0OworCXUzMiBuX2Jsb2NrczsKKwl1MzIgYmxvY2tfb2Zmc2V0OworCXUzMiByZXNlcnZlZFs5XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgemZpbGVfY29uZmlnIHsKKwljaGFyIG5hbWVbNjRdOworCXUzMiBtYWlsYm94OworCXUzMiBmdW5jdGlvbjsKKwl1MzIgbl9ibG9ja3M7CisJdTMyIGJsb2NrX2xpc3RbWkxfTUFYX0JMT0NLU107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHpmaWxlX2Jsb2NrIHsKKwl1MzIgdHlwZTsKKwl1MzIgZmlsZV9vZmZzZXQ7CisJdTMyIHJhbV9vZmZzZXQ7CisJdTMyIHNpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpjeV9zZXJpYWxfZHJpdmVyOwogCiAjaWZkZWYgQ09ORklHX0lTQQpAQCAtMTg1MSwxMSArMTg5MCwxMSBAQAogCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKIAlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCXN0YXRpYyBzdHJ1Y3QgRklSTV9JRCAqZmlybV9pZDsKLQlzdGF0aWMgc3RydWN0IFpGV19DVFJMICp6ZndfY3RybDsKLQlzdGF0aWMgc3RydWN0IEJPQVJEX0NUUkwgKmJvYXJkX2N0cmw7Ci0Jc3RhdGljIHN0cnVjdCBDSF9DVFJMICpjaF9jdHJsOwotCXN0YXRpYyBzdHJ1Y3QgQlVGX0NUUkwgKmJ1Zl9jdHJsOworCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKwlzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqYnVmX2N0cmw7CiAJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gamlmZmllcyArIEhaOwogCWludCBjYXJkLCBwb3J0OwogCkBAIC0xOTk5LDcgKzIwMzgsNiBAQAogCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CiAJCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CiAJCXN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7Ci0JCWludCByZXR2YWw7CiAKIAkJYmFzZV9hZGRyID0gY2FyZC0+YmFzZV9hZGRyOwogCkBAIC0yMzcxLDcgKzI0MDksNiBAQAogCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CiAJCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CiAJCXN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7Ci0JCWludCByZXR2YWw7CiAKIAkJYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkcjsKIAkJZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CkBAIC00MTI3LDEwICs0MTY0LDYgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiY3ljOmN5X3NldF90ZXJtaW9zIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7CiAjZW5kaWYKIAotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiYKLQkJCSh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTiB8IElYQU5ZKSkgPT0KLQkJCShvbGRfdGVybWlvcy0+Y19pZmxhZyAmIChJWE9OIHwgSVhBTlkpKSkKLQkJcmV0dXJuOwogCXNldF9saW5lX2NoYXIoaW5mbyk7CiAKIAlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKQEAgLTQ3MzksMTcgKzQ3NzIsMjk1IEBACiB9CQkJCS8qIGN5X2RldGVjdF9pc2EgKi8KIAogI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHhfaW5pdCh2b2lkIF9faW9tZW0gKiBhZGRyLCBfX3UzMiBpbml0Y3RsKQorc3RhdGljIGlubGluZSBpbnQgX19kZXZpbml0IGN5Y19pc2Z3c3RyKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGE7CisKKwlmb3IgKGEgPSAwOyBhIDwgc2l6ZSAmJiAqc3RyOyBhKyssIHN0cisrKQorCQlpZiAoKnN0ciAmIDB4ODApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoOyBhIDwgc2l6ZTsgYSsrLCBzdHIrKykKKwkJaWYgKCpzdHIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZXZpbml0IGN5el9mcGdhX2NvcHkodm9pZCBfX2lvbWVtICpmcGdhLCB1OCAqZGF0YSwKKwkJdW5zaWduZWQgaW50IHNpemUpCit7CisJZm9yICg7IHNpemUgPiAwOyBzaXplLS0pIHsKKwkJY3lfd3JpdGVsKGZwZ2EsICpkYXRhKyspOworCQl1ZGVsYXkoMTApOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBseF9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaXJxLAorCQlzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKmFkZHIpCiB7CiAJLyogUmVzZXQgUExYICovCi0JY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCByZWFkbChhZGRyICsgaW5pdGN0bCkgfCAweDQwMDAwMDAwKTsKKwljeV93cml0ZWwoJmFkZHItPmluaXRfY3RybCwgcmVhZGwoJmFkZHItPmluaXRfY3RybCkgfCAweDQwMDAwMDAwKTsKIAl1ZGVsYXkoMTAwTCk7Ci0JY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCByZWFkbChhZGRyICsgaW5pdGN0bCkgJiB+MHg0MDAwMDAwMCk7CisJY3lfd3JpdGVsKCZhZGRyLT5pbml0X2N0cmwsIHJlYWRsKCZhZGRyLT5pbml0X2N0cmwpICYgfjB4NDAwMDAwMDApOwogCiAJLyogUmVsb2FkIENvbmZpZy4gUmVnaXN0ZXJzIGZyb20gRUVQUk9NICovCi0JY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCByZWFkbChhZGRyICsgaW5pdGN0bCkgfCAweDIwMDAwMDAwKTsKKwljeV93cml0ZWwoJmFkZHItPmluaXRfY3RybCwgcmVhZGwoJmFkZHItPmluaXRfY3RybCkgfCAweDIwMDAwMDAwKTsKIAl1ZGVsYXkoMTAwTCk7Ci0JY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCByZWFkbChhZGRyICsgaW5pdGN0bCkgJiB+MHgyMDAwMDAwMCk7CisJY3lfd3JpdGVsKCZhZGRyLT5pbml0X2N0cmwsIHJlYWRsKCZhZGRyLT5pbml0X2N0cmwpICYgfjB4MjAwMDAwMDApOworCisJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMgdGhlIEVFUFJPTSwKKwkgKiB0aGUgSVJRIGlzIGxvc3QgYW5kLCB0aHVzLCB3ZSBoYXZlIHRvIHJlLXdyaXRlIGl0IHRvIHRoZSBQQ0kgY29uZmlnLgorCSAqIHJlZ2lzdGVycy4gVGhpcyB3aWxsIHJlbWFpbiBoZXJlIHVudGlsIHdlIGZpbmQgYSBwZXJtYW5lbnQgZml4LgorCSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IF9fY3l6X2xvYWRfZncoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdTMyIG1haWxib3gsIHZvaWQgX19pb21lbSAqYmFzZSwKKwkJdm9pZCBfX2lvbWVtICpmcGdhKQoreworCXZvaWQgKnB0ciA9IGZ3LT5kYXRhOworCXN0cnVjdCB6ZmlsZV9oZWFkZXIgKmggPSBwdHI7CisJc3RydWN0IHpmaWxlX2NvbmZpZyAqYywgKmNzOworCXN0cnVjdCB6ZmlsZV9ibG9jayAqYiwgKmJzOworCXVuc2lnbmVkIGludCBhLCB0bXAsIGxlbiA9IGZ3LT5zaXplOworI2RlZmluZSBCQURfRlcgS0VSTl9FUlIgIkJhZCBmaXJtd2FyZTogIgorCWlmIChsZW4gPCBzaXplb2YoKmgpKSB7CisJCXByaW50ayhCQURfRlcgInRvbyBzaG9ydDogJXU8JXp1XG4iLCBsZW4sIHNpemVvZigqaCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcyA9IHB0ciArIGgtPmNvbmZpZ19vZmZzZXQ7CisJYnMgPSBwdHIgKyBoLT5ibG9ja19vZmZzZXQ7CisKKwlpZiAoKHZvaWQgKikoY3MgKyBoLT5uX2NvbmZpZykgPiBwdHIgKyBsZW4gfHwKKwkJCSh2b2lkICopKGJzICsgaC0+bl9ibG9ja3MpID4gcHRyICsgbGVuKSB7CisJCXByaW50ayhCQURfRlcgInRvbyBzaG9ydCIpOworCQlyZXR1cm4gIC1FSU5WQUw7CisJfQorCisJaWYgKGN5Y19pc2Z3c3RyKGgtPm5hbWUsIHNpemVvZihoLT5uYW1lKSkgfHwKKwkJCWN5Y19pc2Z3c3RyKGgtPmRhdGUsIHNpemVvZihoLT5kYXRlKSkpIHsKKwkJcHJpbnRrKEJBRF9GVyAiYmFkIGZvcm1hdHRlZCBoZWFkZXIgc3RyaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cm5jbXAobmFtZSwgaC0+bmFtZSwgc2l6ZW9mKGgtPm5hbWUpKSkgeworCQlwcmludGsoQkFEX0ZXICJiYWQgbmFtZSAnJXMnIChleHBlY3RlZCAnJXMnKVxuIiwgaC0+bmFtZSwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRtcCA9IDA7CisJZm9yIChjID0gY3M7IGMgPCBjcyArIGgtPm5fY29uZmlnOyBjKyspIHsKKwkJZm9yIChhID0gMDsgYSA8IGMtPm5fYmxvY2tzOyBhKyspCisJCQlpZiAoYy0+YmxvY2tfbGlzdFthXSA+IGgtPm5fYmxvY2tzKSB7CisJCQkJcHJpbnRrKEJBRF9GVyAiYmFkIGJsb2NrIHJlZiBudW1iZXIgaW4gY2Znc1xuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCWlmIChjLT5tYWlsYm94ID09IG1haWxib3ggJiYgYy0+ZnVuY3Rpb24gPT0gMCkgLyogMCBpcyBub3JtYWwgKi8KKwkJCXRtcCsrOworCX0KKwlpZiAoIXRtcCkgeworCQlwcmludGsoQkFEX0ZXICJub3RoaW5nIGFwcHJvcHJpYXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChiID0gYnM7IGIgPCBicyArIGgtPm5fYmxvY2tzOyBiKyspCisJCWlmIChiLT5maWxlX29mZnNldCArIGItPnNpemUgPiBsZW4pIHsKKwkJCXByaW50ayhCQURfRlcgImJhZCBibG9jayBkYXRhIG9mZnNldFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJLyogZXZlcnl0aGluZyBpcyBPSywgbGV0J3Mgc2VlayduJ2xvYWQgaXQgKi8KKwlmb3IgKGMgPSBjczsgYyA8IGNzICsgaC0+bl9jb25maWc7IGMrKykKKwkJaWYgKGMtPm1haWxib3ggPT0gbWFpbGJveCAmJiBjLT5mdW5jdGlvbiA9PSAwKQorCQkJYnJlYWs7CisKKwlmb3IgKGEgPSAwOyBhIDwgYy0+bl9ibG9ja3M7IGErKykgeworCQliID0gJmJzW2MtPmJsb2NrX2xpc3RbYV1dOworCQlpZiAoYi0+dHlwZSA9PSBaQkxPQ0tfRlBHQSkgeworCQkJaWYgKGZwZ2EgIT0gTlVMTCkKKwkJCQljeXpfZnBnYV9jb3B5KGZwZ2EsIHB0ciArIGItPmZpbGVfb2Zmc2V0LAorCQkJCQkJYi0+c2l6ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYmFzZSAhPSBOVUxMKQorCQkJCW1lbWNweV90b2lvKGJhc2UgKyBiLT5yYW1fb2Zmc2V0LAorCQkJCQkgICAgICAgcHRyICsgYi0+ZmlsZV9vZmZzZXQsIGItPnNpemUpOworCQl9CisJfQorI3VuZGVmIEJBRF9GVworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjeXpfbG9hZF9mdyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJCXN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqY3RsX2FkZHIsIGludCBpcnEpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCXN0cnVjdCBDVVNUT01fUkVHIF9faW9tZW0gKmN1c3QgPSBiYXNlX2FkZHI7CisJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnB0X3pmd2N0cmw7CisJdm9pZCBfX2lvbWVtICp0bXA7CisJdTMyIG1haWxib3gsIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZncsICJjeXpmaXJtLmJpbiIsICZwZGV2LT5kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGZpcm13YXJlXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgd2hldGhlciB0aGUgZmlybXdhcmUgaXMgYWxyZWFkeSBsb2FkZWQgYW5kIHJ1bm5pbmcuIElmCisJICAgcG9zaXRpdmUsIHNraXAgdGhpcyBib2FyZCAqLworCWlmIChaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSAmJiByZWFkbCgmZmlkLT5zaWduYXR1cmUpID09IFpGSVJNX0lEKSB7CisJCXUzMiBjbnR2YWwgPSByZWFkbChiYXNlX2FkZHIgKyAweDE5MCk7CisKKwkJdWRlbGF5KDEwMCk7CisJCWlmIChjbnR2YWwgIT0gcmVhZGwoYmFzZV9hZGRyICsgMHgxOTApKSB7CisJCQkvKiBGVyBjb3VudGVyIGlzIHdvcmtpbmcsIEZXIGlzIHJ1bm5pbmcgKi8KKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIkN5Y2xhZGVzLVogRlcgYWxyZWFkeSBsb2FkZWQuICIKKwkJCQkJIlNraXBwaW5nIGJvYXJkLlxuIik7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBlcnJfcmVsOworCQl9CisJfQorCisJLyogc3RhcnQgYm9vdCAqLworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0LCByZWFkbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0KSAmCisJCQl+MHgwMDAzMDgwMFVMKTsKKworCW1haWxib3ggPSByZWFkbCgmY3RsX2FkZHItPm1haWxfYm94XzApOworCisJaWYgKG1haWxib3ggPT0gMCB8fCBaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkgeworCQkvKiBzdG9wcyBDUFUgYW5kIHNldCB3aW5kb3cgdG8gYmVnaW5uaW5nIG9mIFJBTSAqLworCQljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fQ1JFRyk7CisJCWN5X3dyaXRlbCgmY3VzdC0+Y3B1X3N0b3AsIDApOworCQljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJcGx4X2luaXQocGRldiwgaXJxLCBjdGxfYWRkcik7CisKKwlpZiAobWFpbGJveCAhPSAwKSB7CisJCS8qIGxvYWQgRlBHQSAqLworCQlyZXR2YWwgPSBfX2N5el9sb2FkX2Z3KGZ3LCAiQ3ljbG9tLVoiLCBtYWlsYm94LCBOVUxMLAorCQkJCWJhc2VfYWRkcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycl9yZWw7CisJCWlmICghWl9GUEdBX0xPQURFRChjdGxfYWRkcikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZ3IHVwbG9hZCBzdWNjZXNzZnVsLCBidXQgZncgaXMgIgorCQkJCQkibm90IGxvYWRlZFxuIik7CisJCQlnb3RvIGVycl9yZWw7CisJCX0KKwl9CisKKwkvKiBzdG9wcyBDUFUgYW5kIHNldCB3aW5kb3cgdG8gYmVnaW5uaW5nIG9mIFJBTSAqLworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9DUkVHKTsKKwljeV93cml0ZWwoJmN1c3QtPmNwdV9zdG9wLCAwKTsKKwljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNKTsKKwl1ZGVsYXkoMTAwKTsKKworCS8qIGNsZWFyIG1lbW9yeSAqLworCWZvciAodG1wID0gYmFzZV9hZGRyOyB0bXAgPCBiYXNlX2FkZHIgKyBSQU1fU0laRTsgdG1wKyspCisJCWN5X3dyaXRlYih0bXAsIDI1NSk7CisJaWYgKG1haWxib3ggIT0gMCkgeworCQkvKiBzZXQgd2luZG93IHRvIGxhc3QgNTEySyBvZiBSQU0gKi8KKwkJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSArIFJBTV9TSVpFKTsKKwkJLy9zbGVlcCgxKTsKKwkJZm9yICh0bXAgPSBiYXNlX2FkZHI7IHRtcCA8IGJhc2VfYWRkciArIFJBTV9TSVpFOyB0bXArKykKKwkJCWN5X3dyaXRlYih0bXAsIDI1NSk7CisJCS8qIHNldCB3aW5kb3cgdG8gYmVnaW5uaW5nIG9mIFJBTSAqLworCQljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNKTsKKwkJLy9zbGVlcCgxKTsKKwl9CisKKwlyZXR2YWwgPSBfX2N5el9sb2FkX2Z3KGZ3LCAiQ3ljbG9tLVoiLCBtYWlsYm94LCBiYXNlX2FkZHIsIE5VTEwpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJLyogZmluaXNoIGJvb3QgYW5kIHN0YXJ0IGJvYXJkcyAqLworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9DUkVHKTsKKwljeV93cml0ZWwoJmN1c3QtPmNwdV9zdGFydCwgMCk7CisJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX1JBTSk7CisJaSA9IDA7CisJd2hpbGUgKChzdGF0dXMgPSByZWFkbCgmZmlkLT5zaWduYXR1cmUpKSAhPSBaRklSTV9JRCAmJiBpKysgPCA0MCkKKwkJbXNsZWVwKDEwMCk7CisJaWYgKHN0YXR1cyAhPSBaRklSTV9JRCkgeworCQlpZiAoc3RhdHVzID09IFpGSVJNX0hMVCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAieW91IG5lZWQgYW4gZXh0ZXJuYWwgcG93ZXIgc3VwcGx5ICIKKwkJCQkiZm9yIHRoaXMgbnVtYmVyIG9mIHBvcnRzLiBGaXJtd2FyZSBoYWx0ZWQgYW5kICIKKwkJCQkiYm9hcmQgcmVzZXQuXG4iKTsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlnb3RvIGVycjsKKwkJfQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZmlkLT5zaWduYXR1cmUgPSAweCV4Li4uIFdhaXRpbmcgIgorCQkJCSJzb21lIG1vcmUgdGltZVxuIiwgc3RhdHVzKTsKKwkJd2hpbGUgKChzdGF0dXMgPSByZWFkbCgmZmlkLT5zaWduYXR1cmUpKSAhPSBaRklSTV9JRCAmJgorCQkJCWkrKyA8IDIwMCkKKwkJCW1zbGVlcCgxMDApOworCQlpZiAoc3RhdHVzICE9IFpGSVJNX0lEKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCb2FyZCBub3Qgc3RhcnRlZCBpbiAyMCBzZWNvbmRzISAiCisJCQkJCSJHaXZpbmcgdXAuIChmaWQtPnNpZ25hdHVyZSA9IDB4JXgpXG4iLAorCQkJCQlzdGF0dXMpOworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIioqKiBXYXJuaW5nICoqKjogaWYgeW91IGFyZSAiCisJCQkJInVwZ3JhZGluZyB0aGUgRlcsIHBsZWFzZSBwb3dlciBjeWNsZSB0aGUgIgorCQkJCSJzeXN0ZW0gYmVmb3JlIGxvYWRpbmcgdGhlIG5ldyBGVyB0byB0aGUgIgorCQkJCSJDeWNsYWRlcy1aLlxuIik7CisKKwkJCWlmIChaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkKKwkJCQlwbHhfaW5pdChwZGV2LCBpcnEsIGN0bF9hZGRyKTsKKworCQkJcmV0dmFsID0gLUVJTzsKKwkJCWdvdG8gZXJyOworCQl9CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkZpcm13YXJlIHN0YXJ0ZWQgYWZ0ZXIgJWQgc2Vjb25kcy5cbiIsCisJCQkJaSAvIDEwKTsKKwl9CisJcHRfemZ3Y3RybCA9IGJhc2VfYWRkciArIHJlYWRsKCZmaWQtPnpmd2N0cmxfYWRkcik7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJmaWQ9PiAlcCwgemZ3Y3RybF9hZGRyPT4gJXgsIG5wdF96ZndjdHJsPT4gJXBcbiIsCisJCQliYXNlX2FkZHIgKyBJRF9BRERSRVNTLCByZWFkbCgmZmlkLT56ZndjdHJsX2FkZHIpLAorCQkJYmFzZV9hZGRyICsgcmVhZGwoJmZpZC0+emZ3Y3RybF9hZGRyKSk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ3ljbGFkZXMtWiBGVyBsb2FkZWQ6IHZlcnNpb24gPSAleCwgcG9ydHMgPSAldVxuIiwKKwkJcmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwuZndfdmVyc2lvbiksCisJCXJlYWRsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLm5fY2hhbm5lbCkpOworCisJaWYgKHJlYWRsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLm5fY2hhbm5lbCkgPT0gMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibm8gQ3ljbGFkZXMtWiBwb3J0cyB3ZXJlIGZvdW5kLiBQbGVhc2UgIgorCQkJImNoZWNrIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIFogaG9zdCBjYXJkIGFuZCB0aGUgIgorCQkJInNlcmlhbCBleHBhbmRlcnMuXG4iKTsKKworCQlpZiAoWl9GUEdBX0xPQURFRChjdGxfYWRkcikpCisJCQlwbHhfaW5pdChwZGV2LCBpcnEsIGN0bF9hZGRyKTsKKworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTnVsbCBudW1iZXIgb2YgcG9ydHMgZGV0ZWN0ZWQuIEJvYXJkICIKKwkJCQkicmVzZXQuXG4iKTsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBlcnI7CisJfQorCisJY3lfd3JpdGVsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLm9wX3N5c3RlbSwgQ19PU19MSU5VWCk7CisJY3lfd3JpdGVsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLmRyX3ZlcnNpb24sIERSSVZFUl9WRVJTSU9OKTsKKworCS8qCisJICAgRWFybHkgZmlybXdhcmUgZmFpbGVkIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIGNvbW1hbmRzLgorCSAgIFRoaXMgZW5hYmxlcyBmaXJtd2FyZSBpbnRlcnJ1cHRzIGZvciB0aG9zZSBjb21tYW5kcy4KKwkgKi8KKwljeV93cml0ZWwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCwgcmVhZGwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCkgfAorCQkJKDEgPDwgMTcpKTsKKwljeV93cml0ZWwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCwgcmVhZGwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCkgfAorCQkJMHgwMDAzMDgwMFVMKTsKKworCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCisJcmV0dXJuIDA7CitlcnJfcmVsOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworZXJyOgorCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGN5X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKQEAgLTQ4MzEsMTYgKzUxNDIsOSBAQAogCQl9CiAKIAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQTFggYmVmb3JlIHJlc2V0dGluZyBpdCAqLwotCQljeV93cml0ZXcoYWRkcjAgKyAweDY4LAotCQkJcmVhZHcoYWRkcjAgKyAweDY4KSAmIH4weDA5MDApOworCQljeV93cml0ZXcoYWRkcjAgKyAweDY4LCByZWFkdyhhZGRyMCArIDB4NjgpICYgfjB4MDkwMCk7CiAKLQkJcGx4X2luaXQoYWRkcjAsIDB4NmMpOwotCQkvKiBGb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb24sIG9uY2UgdGhlIFBMWDkwNjAgcmVsb2FkcwotCQkgICB0aGUgRUVQUk9NLCB0aGUgSVJRIGlzIGxvc3QgYW5kLCB0aHVzLCB3ZSBoYXZlIHRvCi0JCSAgIHJlLXdyaXRlIGl0IHRvIHRoZSBQQ0kgY29uZmlnLiByZWdpc3RlcnMuCi0JCSAgIFRoaXMgd2lsbCByZW1haW4gaGVyZSB1bnRpbCB3ZSBmaW5kIGEgcGVybWFuZW50Ci0JCSAgIGZpeC4gKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKKwkJcGx4X2luaXQocGRldiwgaXJxLCBhZGRyMCk7CiAKIAkJbWFpbGJveCA9ICh1MzIpcmVhZGwoJmN0bF9hZGRyLT5tYWlsX2JveF8wKTsKIApAQCAtNDg4MSw2ICs1MTg1LDkgQEAKIAkJCWlmICgobWFpbGJveCA9PSBaT19WMSkgfHwgKG1haWxib3ggPT0gWk9fVjIpKQogCQkJCWN5X3dyaXRlbChhZGRyMiArIElEX0FERFJFU1MsIDBMKTsKIAorCQkJcmV0dmFsID0gY3l6X2xvYWRfZncocGRldiwgYWRkcjIsIGFkZHIwLCBpcnEpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycl91bm1hcDsKIAkJCS8qIFRoaXMgbXVzdCBiZSBhIEN5Y2xhZGVzLThaby9QQ0kuICBUaGUgZXh0ZW5kYWJsZQogCQkJICAgdmVyc2lvbiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgZGV2aWNlX2lkIGFuZCB3aWxsCiAJCQkgICBiZSBhbGxvY2F0ZWQgaXRzIG1heGltdW0gbnVtYmVyIG9mIHBvcnRzLiAqLwpAQCAtNDk1NywxNSArNTI2NCw3IEBACiAJCWNhc2UgUExYXzkwNjA6CiAJCWNhc2UgUExYXzkwODA6CiAJCWRlZmF1bHQ6CS8qIE9sZCBib2FyZHMsIHVzZSBQTFhfOTA2MCAqLwotCi0JCQlwbHhfaW5pdChhZGRyMCwgMHg2Yyk7Ci0JCS8qIEZvciBzb21lIHlldCB1bmtub3duIHJlYXNvbiwgb25jZSB0aGUgUExYOTA2MCByZWxvYWRzCi0JCSAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KLQkJICAgcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuIHJlZ2lzdGVycy4KLQkJICAgVGhpcyB3aWxsIHJlbWFpbiBoZXJlIHVudGlsIHdlIGZpbmQgYSBwZXJtYW5lbnQKLQkJICAgZml4LiAqLwotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKLQorCQkJcGx4X2luaXQocGRldiwgaXJxLCBhZGRyMCk7CiAJCQljeV93cml0ZXcoYWRkcjAgKyAweDY4LCByZWFkdyhhZGRyMCArIDB4NjgpIHwgMHgwOTAwKTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKaW5kZXggNWI5MWJjMC4uMzM0NTY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYwpAQCAtNzMsOSArNzMsOSBAQAogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywgb3JkZXIpOwogfQogCi1pbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZHJtX2RldmljZV90ICpkZXYsIGRybV9hdGlfcGNpZ2FydF9pbmZvICpnYXJ0X2luZm8pCitpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvICpnYXJ0X2luZm8pCiB7Ci0JZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5ID0gZGV2LT5zZzsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCWludCBpOwogCWludCBvcmRlcjsKQEAgLTEyMiw5ICsxMjIsOSBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fYXRpX3BjaWdhcnRfY2xlYW51cCk7CiAKLWludCBkcm1fYXRpX3BjaWdhcnRfaW5pdChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKK2ludCBkcm1fYXRpX3BjaWdhcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKIHsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnkgPSBkZXYtPnNnOwogCXZvaWQgKmFkZHJlc3MgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJdTMyICpwY2lfZ2FydCwgcGFnZV9iYXNlLCBidXNfYWRkcmVzcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaAppbmRleCAwODkxOTg0Li4yZDZmMmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKQEAgLTEwOSwzMSArMTA5LDMxIEBACiAgKiBcbm90ZSBLVzogQWN0dWFsbHkgaXQncyBpbGxlZ2FsIHRvIGNoYW5nZSBlaXRoZXIgZm9yCiAgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSByZWFzb25zLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY2xpcF9yZWN0IHsKK3N0cnVjdCBkcm1fY2xpcF9yZWN0IHsKIAl1bnNpZ25lZCBzaG9ydCB4MTsKIAl1bnNpZ25lZCBzaG9ydCB5MTsKIAl1bnNpZ25lZCBzaG9ydCB4MjsKIAl1bnNpZ25lZCBzaG9ydCB5MjsKLX0gZHJtX2NsaXBfcmVjdF90OworfTsKIAogLyoqCiAgKiBEcmF3YWJsZSBpbmZvcm1hdGlvbi4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8geworc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvIHsKIAl1bnNpZ25lZCBpbnQgbnVtX3JlY3RzOwotCWRybV9jbGlwX3JlY3RfdCAqcmVjdHM7Ci19IGRybV9kcmF3YWJsZV9pbmZvX3Q7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzOworfTsKIAogLyoqCiAgKiBUZXh0dXJlIHJlZ2lvbiwKICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3RleF9yZWdpb24geworc3RydWN0IGRybV90ZXhfcmVnaW9uIHsKIAl1bnNpZ25lZCBjaGFyIG5leHQ7CiAJdW5zaWduZWQgY2hhciBwcmV2OwogCXVuc2lnbmVkIGNoYXIgaW5fdXNlOwogCXVuc2lnbmVkIGNoYXIgcGFkZGluZzsKIAl1bnNpZ25lZCBpbnQgYWdlOwotfSBkcm1fdGV4X3JlZ2lvbl90OworfTsKIAogLyoqCiAgKiBIYXJkd2FyZSBsb2NrLgpAQCAtMTQyLDE3ICsxNDIsMTcgQEAKICAqIHByb2Nlc3NvciBidXMgY29udGVudGlvbiBvbiBhIG11bHRpcHJvY2Vzc29yIHN5c3RlbSwgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkKICAqIG90aGVyIGRhdGEgc3RvcmVkIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9od19sb2NrIHsKK3N0cnVjdCBkcm1faHdfbG9jayB7CiAJX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBsb2NrOwkJLyoqPCBsb2NrIHZhcmlhYmxlICovCiAJY2hhciBwYWRkaW5nWzYwXTsJCQkvKio8IFBhZCB0byBjYWNoZSBsaW5lICovCi19IGRybV9od19sb2NrX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUdldFZlcnNpb24oKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZlcnNpb24geworc3RydWN0IGRybV92ZXJzaW9uIHsKIAlpbnQgdmVyc2lvbl9tYWpvcjsJICAvKio8IE1ham9yIHZlcnNpb24gKi8KIAlpbnQgdmVyc2lvbl9taW5vcjsJICAvKio8IE1pbm9yIHZlcnNpb24gKi8KIAlpbnQgdmVyc2lvbl9wYXRjaGxldmVsOwkgIC8qKjwgUGF0Y2ggbGV2ZWwgKi8KQEAgLTE2MiwzMyArMTYyLDMzIEBACiAJY2hhciBfX3VzZXIgKmRhdGU7CSAgLyoqPCBVc2VyLXNwYWNlIGJ1ZmZlciB0byBob2xkIGRhdGUgKi8KIAlzaXplX3QgZGVzY19sZW47CSAgLyoqPCBMZW5ndGggb2YgZGVzYyBidWZmZXIgKi8KIAljaGFyIF9fdXNlciAqZGVzYzsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGVzYyAqLwotfSBkcm1fdmVyc2lvbl90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX1VOSVFVRSBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1HZXRCdXNpZCgpIGFuZCBkcm1TZXRCdXNJZCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fdW5pcXVlIHsKK3N0cnVjdCBkcm1fdW5pcXVlIHsKIAlzaXplX3QgdW5pcXVlX2xlbjsJICAvKio8IExlbmd0aCBvZiB1bmlxdWUgKi8KIAljaGFyIF9fdXNlciAqdW5pcXVlOwkgIC8qKjwgVW5pcXVlIG5hbWUgZm9yIGRyaXZlciBpbnN0YW50aWF0aW9uICovCi19IGRybV91bmlxdWVfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9saXN0IHsKK3N0cnVjdCBkcm1fbGlzdCB7CiAJaW50IGNvdW50OwkJICAvKio8IExlbmd0aCBvZiB1c2VyLXNwYWNlIHN0cnVjdHVyZXMgKi8KLQlkcm1fdmVyc2lvbl90IF9fdXNlciAqdmVyc2lvbjsKLX0gZHJtX2xpc3RfdDsKKwlzdHJ1Y3QgZHJtX3ZlcnNpb24gX191c2VyICp2ZXJzaW9uOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2Jsb2NrIHsKK3N0cnVjdCBkcm1fYmxvY2sgewogCWludCB1bnVzZWQ7Ci19IGRybV9ibG9ja190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQ09OVFJPTCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1DdGxJbnN0SGFuZGxlcigpIGFuZCBkcm1DdGxVbmluc3RIYW5kbGVyKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jb250cm9sIHsKK3N0cnVjdCBkcm1fY29udHJvbCB7CiAJZW51bSB7CiAJCURSTV9BRERfQ09NTUFORCwKIAkJRFJNX1JNX0NPTU1BTkQsCkBAIC0xOTYsMjQgKzE5NiwyNCBAQAogCQlEUk1fVU5JTlNUX0hBTkRMRVIKIAl9IGZ1bmM7CiAJaW50IGlycTsKLX0gZHJtX2NvbnRyb2xfdDsKK307CiAKIC8qKgogICogVHlwZSBvZiBtZW1vcnkgdG8gbWFwLgogICovCi10eXBlZGVmIGVudW0gZHJtX21hcF90eXBlIHsKK2VudW0gZHJtX21hcF90eXBlIHsKIAlfRFJNX0ZSQU1FX0JVRkZFUiA9IDAsCSAgLyoqPCBXQyAobm8gY2FjaGluZyksIG5vIGNvcmUgZHVtcCAqLwogCV9EUk1fUkVHSVNURVJTID0gMSwJICAvKio8IG5vIGNhY2hpbmcsIG5vIGNvcmUgZHVtcCAqLwogCV9EUk1fU0hNID0gMiwJCSAgLyoqPCBzaGFyZWQsIGNhY2hlZCAqLwogCV9EUk1fQUdQID0gMywJCSAgLyoqPCBBR1AvR0FSVCAqLwogCV9EUk1fU0NBVFRFUl9HQVRIRVIgPSA0LCAgLyoqPCBTY2F0dGVyL2dhdGhlciBtZW1vcnkgZm9yIFBDSSBETUEgKi8KIAlfRFJNX0NPTlNJU1RFTlQgPSA1LAkgIC8qKjwgQ29uc2lzdGVudCBtZW1vcnkgZm9yIFBDSSBETUEgKi8KLX0gZHJtX21hcF90eXBlX3Q7Cit9OwogCiAvKioKICAqIE1lbW9yeSBtYXBwaW5nIGZsYWdzLgogICovCi10eXBlZGVmIGVudW0gZHJtX21hcF9mbGFncyB7CitlbnVtIGRybV9tYXBfZmxhZ3MgewogCV9EUk1fUkVTVFJJQ1RFRCA9IDB4MDEsCSAgICAgLyoqPCBDYW5ub3QgYmUgbWFwcGVkIHRvIHVzZXItdmlydHVhbCAqLwogCV9EUk1fUkVBRF9PTkxZID0gMHgwMiwKIAlfRFJNX0xPQ0tFRCA9IDB4MDQsCSAgICAgLyoqPCBzaGFyZWQsIGNhY2hlZCwgbG9ja2VkICovCkBAIC0yMjEsMTIgKzIyMSwxMiBAQAogCV9EUk1fV1JJVEVfQ09NQklOSU5HID0gMHgxMCwgLyoqPCB1c2Ugd3JpdGUtY29tYmluaW5nIGlmIGF2YWlsYWJsZSAqLwogCV9EUk1fQ09OVEFJTlNfTE9DSyA9IDB4MjAsICAgLyoqPCBTSE0gcGFnZSB0aGF0IGNvbnRhaW5zIGxvY2sgKi8KIAlfRFJNX1JFTU9WQUJMRSA9IDB4NDAJICAgICAvKio8IFJlbW92YWJsZSBtYXBwaW5nICovCi19IGRybV9tYXBfZmxhZ3NfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgeworc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgewogCXVuc2lnbmVkIGludCBjdHhfaWQ7CSAvKio8IENvbnRleHQgcmVxdWVzdGluZyBwcml2YXRlIG1hcHBpbmcgKi8KIAl2b2lkICpoYW5kbGU7CQkgLyoqPCBIYW5kbGUgb2YgbWFwICovCi19IGRybV9jdHhfcHJpdl9tYXBfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0dFVF9NQVAsIERSTV9JT0NUTF9BRERfTUFQIGFuZCBEUk1fSU9DVExfUk1fTUFQIGlvY3RscwpAQCAtMjM0LDMwICsyMzQsMzAgQEAKICAqCiAgKiBcc2EgZHJtQWRkTWFwKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9tYXAgeworc3RydWN0IGRybV9tYXAgewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkgLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KIAl1bnNpZ25lZCBsb25nIHNpemU7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBzaXplIChieXRlcykgKi8KLQlkcm1fbWFwX3R5cGVfdCB0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KLQlkcm1fbWFwX2ZsYWdzX3QgZmxhZ3M7CSAvKio8IEZsYWdzICovCisJZW51bSBkcm1fbWFwX3R5cGUgdHlwZTsJIC8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gbWFwICovCisJZW51bSBkcm1fbWFwX2ZsYWdzIGZsYWdzOwkgLyoqPCBGbGFncyAqLwogCXZvaWQgKmhhbmRsZTsJCSAvKio8IFVzZXItc3BhY2U6ICJIYW5kbGUiIHRvIHBhc3MgdG8gbW1hcCgpICovCiAJCQkJIC8qKjwgS2VybmVsLXNwYWNlOiBrZXJuZWwtdmlydHVhbCBhZGRyZXNzICovCiAJaW50IG10cnI7CQkgLyoqPCBNVFJSIHNsb3QgdXNlZCAqLwogCS8qICAgUHJpdmF0ZSBkYXRhICovCi19IGRybV9tYXBfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0dFVF9DTElFTlQgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2NsaWVudCB7CitzdHJ1Y3QgZHJtX2NsaWVudCB7CiAJaW50IGlkeDsJCS8qKjwgV2hpY2ggY2xpZW50IGRlc2lyZWQ/ICovCiAJaW50IGF1dGg7CQkvKio8IElzIGNsaWVudCBhdXRoZW50aWNhdGVkPyAqLwogCXVuc2lnbmVkIGxvbmcgcGlkOwkvKio8IFByb2Nlc3MgSUQgKi8KIAl1bnNpZ25lZCBsb25nIHVpZDsJLyoqPCBVc2VyIElEICovCiAJdW5zaWduZWQgbG9uZyBtYWdpYzsJLyoqPCBNYWdpYyAqLwogCXVuc2lnbmVkIGxvbmcgaW9jczsJLyoqPCBJb2N0bCBjb3VudCAqLwotfSBkcm1fY2xpZW50X3Q7Cit9OwogCi10eXBlZGVmIGVudW0geworZW51bSBkcm1fc3RhdF90eXBlIHsKIAlfRFJNX1NUQVRfTE9DSywKIAlfRFJNX1NUQVRfT1BFTlMsCiAJX0RSTV9TVEFUX0NMT1NFUywKQEAgLTI3NSwyMyArMjc1LDIzIEBACiAJX0RSTV9TVEFUX1NQRUNJQUwsCS8qKjwgU3BlY2lhbCBETUEgKGUuZy4sIHByaW9yaXR5IG9yIHBvbGxlZCkgKi8KIAlfRFJNX1NUQVRfTUlTU0VECS8qKjwgTWlzc2VkIERNQSBvcHBvcnR1bml0eSAqLwogCSAgICAvKiBBZGQgdG8gdGhlICpFTkQqIG9mIHRoZSBsaXN0ICovCi19IGRybV9zdGF0X3R5cGVfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0dFVF9TVEFUUyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc3RhdHMgeworc3RydWN0IGRybV9zdGF0cyB7CiAJdW5zaWduZWQgbG9uZyBjb3VudDsKIAlzdHJ1Y3QgewogCQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCQlkcm1fc3RhdF90eXBlX3QgdHlwZTsKKwkJZW51bSBkcm1fc3RhdF90eXBlIHR5cGU7CiAJfSBkYXRhWzE1XTsKLX0gZHJtX3N0YXRzX3Q7Cit9OwogCiAvKioKICAqIEhhcmR3YXJlIGxvY2tpbmcgZmxhZ3MuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fbG9ja19mbGFncyB7CitlbnVtIGRybV9sb2NrX2ZsYWdzIHsKIAlfRFJNX0xPQ0tfUkVBRFkgPSAweDAxLAkgICAgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBpcyByZWFkeSBmb3IgRE1BICovCiAJX0RSTV9MT0NLX1FVSUVTQ0VOVCA9IDB4MDIsICAvKio8IFdhaXQgdW50aWwgaGFyZHdhcmUgcXVpZXNjZW50ICovCiAJX0RSTV9MT0NLX0ZMVVNIID0gMHgwNCwJICAgICAvKio8IEZsdXNoIHRoaXMgY29udGV4dCdzIERNQSBxdWV1ZSBmaXJzdCAqLwpAQCAtMzAxLDE3ICszMDEsMTcgQEAKIAkgICBmdWxsLXNjcmVlbiBER0EtbGlrZSBtb2RlLiAqLwogCV9EUk1fSEFMVF9BTExfUVVFVUVTID0gMHgxMCwgLyoqPCBIYWx0IGFsbCBjdXJyZW50IGFuZCBmdXR1cmUgcXVldWVzICovCiAJX0RSTV9IQUxUX0NVUl9RVUVVRVMgPSAweDIwICAvKio8IEhhbHQgYWxsIGN1cnJlbnQgcXVldWVzICovCi19IGRybV9sb2NrX2ZsYWdzX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9MT0NLLCBEUk1fSU9DVExfVU5MT0NLIGFuZCBEUk1fSU9DVExfRklOSVNIIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUdldExvY2soKSBhbmQgZHJtVW5sb2NrKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9sb2NrIHsKK3N0cnVjdCBkcm1fbG9jayB7CiAJaW50IGNvbnRleHQ7Ci0JZHJtX2xvY2tfZmxhZ3NfdCBmbGFnczsKLX0gZHJtX2xvY2tfdDsKKwllbnVtIGRybV9sb2NrX2ZsYWdzIGZsYWdzOworfTsKIAogLyoqCiAgKiBETUEgZmxhZ3MKQEAgLTMyMSw3ICszMjEsNyBAQAogICoKICAqIFxzYSBkcm1fZG1hLgogICovCi10eXBlZGVmIGVudW0gZHJtX2RtYV9mbGFncyB7CitlbnVtIGRybV9kbWFfZmxhZ3MgewogCS8qIEZsYWdzIGZvciBETUEgYnVmZmVyIGRpc3BhdGNoICovCiAJX0RSTV9ETUFfQkxPQ0sgPSAweDAxLAkgICAgICAvKio8CiAJCQkJICAgICAgICogQmxvY2sgdW50aWwgYnVmZmVyIGRpc3BhdGNoZWQuCkBAIC0zNDAsMTQgKzM0MCwxNCBAQAogCV9EUk1fRE1BX1dBSVQgPSAweDEwLAkgICAgICAvKio8IFdhaXQgZm9yIGZyZWUgYnVmZmVycyAqLwogCV9EUk1fRE1BX1NNQUxMRVJfT0sgPSAweDIwLCAgIC8qKjwgU21hbGxlci10aGFuLXJlcXVlc3RlZCBidWZmZXJzIE9LICovCiAJX0RSTV9ETUFfTEFSR0VSX09LID0gMHg0MCAgICAgLyoqPCBMYXJnZXItdGhhbi1yZXF1ZXN0ZWQgYnVmZmVycyBPSyAqLwotfSBkcm1fZG1hX2ZsYWdzX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BRERfQlVGUyBhbmQgRFJNX0lPQ1RMX01BUktfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZGRCdWZzKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfZGVzYyB7CitzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHsKIAlpbnQgY291bnQ7CQkgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBvZiB0aGlzIHNpemUgKi8KIAlpbnQgc2l6ZTsJCSAvKio8IFNpemUgaW4gYnl0ZXMgKi8KIAlpbnQgbG93X21hcms7CQkgLyoqPCBMb3cgd2F0ZXIgbWFyayAqLwpAQCAtMzYzLDQ0ICszNjMsNDQgQEAKIAkJCQkgICogU3RhcnQgYWRkcmVzcyBvZiB3aGVyZSB0aGUgQUdQIGJ1ZmZlcnMgYXJlCiAJCQkJICAqIGluIHRoZSBBR1AgYXBlcnR1cmUKIAkJCQkgICovCi19IGRybV9idWZfZGVzY190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfSU5GT19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfaW5mbyB7CitzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKIAlpbnQgY291bnQ7CQkvKio8IEVudHJpZXMgaW4gbGlzdCAqLwotCWRybV9idWZfZGVzY190IF9fdXNlciAqbGlzdDsKLX0gZHJtX2J1Zl9pbmZvX3Q7CisJc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKmxpc3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9GUkVFX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9mcmVlIHsKK3N0cnVjdCBkcm1fYnVmX2ZyZWUgewogCWludCBjb3VudDsKIAlpbnQgX191c2VyICpsaXN0OwotfSBkcm1fYnVmX2ZyZWVfdDsKK307CiAKIC8qKgogICogQnVmZmVyIGluZm9ybWF0aW9uCiAgKgogICogXHNhIGRybV9idWZfbWFwLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX3B1YiB7CitzdHJ1Y3QgZHJtX2J1Zl9wdWIgewogCWludCBpZHg7CQkgICAgICAgLyoqPCBJbmRleCBpbnRvIHRoZSBtYXN0ZXIgYnVmZmVyIGxpc3QgKi8KIAlpbnQgdG90YWw7CQkgICAgICAgLyoqPCBCdWZmZXIgc2l6ZSAqLwogCWludCB1c2VkOwkJICAgICAgIC8qKjwgQW1vdW50IG9mIGJ1ZmZlciBpbiB1c2UgKGZvciBETUEpICovCiAJdm9pZCBfX3VzZXIgKmFkZHJlc3M7CSAgICAgICAvKio8IEFkZHJlc3Mgb2YgYnVmZmVyICovCi19IGRybV9idWZfcHViX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9NQVBfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX21hcCB7CitzdHJ1Y3QgZHJtX2J1Zl9tYXAgewogCWludCBjb3VudDsJCS8qKjwgTGVuZ3RoIG9mIHRoZSBidWZmZXIgbGlzdCAqLwogCXZvaWQgX191c2VyICp2aXJ0dWFsOwkJLyoqPCBNbWFwJ2QgYXJlYSBpbiB1c2VyLXZpcnR1YWwgKi8KLQlkcm1fYnVmX3B1Yl90IF9fdXNlciAqbGlzdDsJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KLX0gZHJtX2J1Zl9tYXBfdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9wdWIgX191c2VyICpsaXN0OwkvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfRE1BIGlvY3RsIGFyZ3VtZW50IHR5cGUuCkBAIC00MDksNDggKzQwOSw0OCBAQAogICoKICAqIFxzYSBkcm1ETUEoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2RtYSB7CitzdHJ1Y3QgZHJtX2RtYSB7CiAJaW50IGNvbnRleHQ7CQkJICAvKio8IENvbnRleHQgaGFuZGxlICovCiAJaW50IHNlbmRfY291bnQ7CQkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHRvIHNlbmQgKi8KIAlpbnQgX191c2VyICpzZW5kX2luZGljZXM7CSAgLyoqPCBMaXN0IG9mIGhhbmRsZXMgdG8gYnVmZmVycyAqLwogCWludCBfX3VzZXIgKnNlbmRfc2l6ZXM7CQkgIC8qKjwgTGVuZ3RocyBvZiBkYXRhIHRvIHNlbmQgKi8KLQlkcm1fZG1hX2ZsYWdzX3QgZmxhZ3M7CQkgIC8qKjwgRmxhZ3MgKi8KKwllbnVtIGRybV9kbWFfZmxhZ3MgZmxhZ3M7CSAgLyoqPCBGbGFncyAqLwogCWludCByZXF1ZXN0X2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCAqLwogCWludCByZXF1ZXN0X3NpemU7CQkgIC8qKjwgRGVzaXJlZCBzaXplIGZvciBidWZmZXJzICovCiAJaW50IF9fdXNlciAqcmVxdWVzdF9pbmRpY2VzOwkgIC8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCiAJaW50IF9fdXNlciAqcmVxdWVzdF9zaXplczsKIAlpbnQgZ3JhbnRlZF9jb3VudDsJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyBncmFudGVkICovCi19IGRybV9kbWFfdDsKK307CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIGRybV9jdHhfZmxhZ3MgewogCV9EUk1fQ09OVEVYVF9QUkVTRVJWRUQgPSAweDAxLAogCV9EUk1fQ09OVEVYVF8yRE9OTFkgPSAweDAyCi19IGRybV9jdHhfZmxhZ3NfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FERF9DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtQ3JlYXRlQ29udGV4dCgpIGFuZCBkcm1EZXN0cm95Q29udGV4dCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY3R4IHsKK3N0cnVjdCBkcm1fY3R4IHsKIAlkcm1fY29udGV4dF90IGhhbmRsZTsKLQlkcm1fY3R4X2ZsYWdzX3QgZmxhZ3M7Ci19IGRybV9jdHhfdDsKKwllbnVtIGRybV9jdHhfZmxhZ3MgZmxhZ3M7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9SRVNfQ1RYIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jdHhfcmVzIHsKK3N0cnVjdCBkcm1fY3R4X3JlcyB7CiAJaW50IGNvdW50OwotCWRybV9jdHhfdCBfX3VzZXIgKmNvbnRleHRzOwotfSBkcm1fY3R4X3Jlc190OworCXN0cnVjdCBkcm1fY3R4IF9fdXNlciAqY29udGV4dHM7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BRERfRFJBVyBhbmQgRFJNX0lPQ1RMX1JNX0RSQVcgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2RyYXcgeworc3RydWN0IGRybV9kcmF3IHsKIAlkcm1fZHJhd2FibGVfdCBoYW5kbGU7Ci19IGRybV9kcmF3X3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9VUERBVEVfRFJBVyBpb2N0bCBhcmd1bWVudCB0eXBlLgpAQCAtNDU5LDUyICs0NTksNTIgQEAKIAlEUk1fRFJBV0FCTEVfQ0xJUFJFQ1RTLAogfSBkcm1fZHJhd2FibGVfaW5mb190eXBlX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGRybV91cGRhdGVfZHJhdyB7CitzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IHsKIAlkcm1fZHJhd2FibGVfdCBoYW5kbGU7CiAJdW5zaWduZWQgaW50IHR5cGU7CiAJdW5zaWduZWQgaW50IG51bTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YTsKLX0gZHJtX3VwZGF0ZV9kcmF3X3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9HRVRfTUFHSUMgYW5kIERSTV9JT0NUTF9BVVRIX01BR0lDIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hdXRoIHsKK3N0cnVjdCBkcm1fYXV0aCB7CiAJZHJtX21hZ2ljX3QgbWFnaWM7Ci19IGRybV9hdXRoX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9JUlFfQlVTSUQgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtR2V0SW50ZXJydXB0RnJvbUJ1c0lEKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9pcnFfYnVzaWQgeworc3RydWN0IGRybV9pcnFfYnVzaWQgewogCWludCBpcnE7CS8qKjwgSVJRIG51bWJlciAqLwogCWludCBidXNudW07CS8qKjwgYnVzIG51bWJlciAqLwogCWludCBkZXZudW07CS8qKjwgZGV2aWNlIG51bWJlciAqLwogCWludCBmdW5jbnVtOwkvKio8IGZ1bmN0aW9uIG51bWJlciAqLwotfSBkcm1faXJxX2J1c2lkX3Q7Cit9OwogCi10eXBlZGVmIGVudW0geworZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHsKIAlfRFJNX1ZCTEFOS19BQlNPTFVURSA9IDB4MCwJLyoqPCBXYWl0IGZvciBzcGVjaWZpYyB2Ymxhbmsgc2VxdWVuY2UgbnVtYmVyICovCiAJX0RSTV9WQkxBTktfUkVMQVRJVkUgPSAweDEsCS8qKjwgV2FpdCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIHZibGFua3MgKi8KIAlfRFJNX1ZCTEFOS19ORVhUT05NSVNTID0gMHgxMDAwMDAwMCwJLyoqPCBJZiBtaXNzZWQsIHdhaXQgZm9yIG5leHQgdmJsYW5rICovCiAJX0RSTV9WQkxBTktfU0VDT05EQVJZID0gMHgyMDAwMDAwMCwJLyoqPCBTZWNvbmRhcnkgZGlzcGxheSBjb250cm9sbGVyICovCiAJX0RSTV9WQkxBTktfU0lHTkFMID0gMHg0MDAwMDAwMAkvKio8IFNlbmQgc2lnbmFsIGluc3RlYWQgb2YgYmxvY2tpbmcgKi8KLX0gZHJtX3ZibGFua19zZXFfdHlwZV90OworfTsKIAogI2RlZmluZSBfRFJNX1ZCTEFOS19UWVBFU19NQVNLIChfRFJNX1ZCTEFOS19BQlNPTFVURSB8IF9EUk1fVkJMQU5LX1JFTEFUSVZFKQogI2RlZmluZSBfRFJNX1ZCTEFOS19GTEFHU19NQVNLIChfRFJNX1ZCTEFOS19TSUdOQUwgfCBfRFJNX1ZCTEFOS19TRUNPTkRBUlkgfCBcCiAJCQkJX0RSTV9WQkxBTktfTkVYVE9OTUlTUykKIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0IHsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJdW5zaWduZWQgbG9uZyBzaWduYWw7CiB9OwogCiBzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJbG9uZyB0dmFsX3NlYzsKIAlsb25nIHR2YWxfdXNlYzsKQEAgLTUxNSw0MSArNTE1LDQxIEBACiAgKgogICogXHNhIGRybVdhaXRWQmxhbmsoKS4KICAqLwotdHlwZWRlZiB1bmlvbiBkcm1fd2FpdF92YmxhbmsgewordW5pb24gZHJtX3dhaXRfdmJsYW5rIHsKIAlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgcmVxdWVzdDsKIAlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5IHJlcGx5OwotfSBkcm1fd2FpdF92YmxhbmtfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FHUF9FTkFCTEUgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtQWdwRW5hYmxlKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfbW9kZSB7CitzdHJ1Y3QgZHJtX2FncF9tb2RlIHsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CS8qKjwgQUdQIG1vZGUgKi8KLX0gZHJtX2FncF9tb2RlX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BR1BfQUxMT0MgYW5kIERSTV9JT0NUTF9BR1BfRlJFRSBpb2N0bHMgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtQWdwQWxsb2MoKSBhbmQgZHJtQWdwRnJlZSgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciB7CitzdHJ1Y3QgZHJtX2FncF9idWZmZXIgewogCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBiaW5kaW5nIC8gdW5iaW5kaW5nICovCiAJdW5zaWduZWQgbG9uZyB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlICovCiAJdW5zaWduZWQgbG9uZyBwaHlzaWNhbDsJLyoqPCBQaHlzaWNhbCB1c2VkIGJ5IGk4MTAgKi8KLX0gZHJtX2FncF9idWZmZXJfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FHUF9CSU5EIGFuZCBEUk1fSU9DVExfQUdQX1VOQklORCBpb2N0bHMgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtQWdwQmluZCgpIGFuZCBkcm1BZ3BVbmJpbmQoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHsKK3N0cnVjdCBkcm1fYWdwX2JpbmRpbmcgewogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IEZyb20gZHJtX2FncF9idWZmZXIgKi8KIAl1bnNpZ25lZCBsb25nIG9mZnNldDsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KLX0gZHJtX2FncF9iaW5kaW5nX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9BR1BfSU5GTyBpb2N0bCBhcmd1bWVudCB0eXBlLgpAQCAtNTU4LDcgKzU1OCw3IEBACiAgKiBkcm1BZ3BCYXNlKCksIGRybUFncFNpemUoKSwgZHJtQWdwTWVtb3J5VXNlZCgpLCBkcm1BZ3BNZW1vcnlBdmFpbCgpLAogICogZHJtQWdwVmVuZG9ySWQoKSBhbmQgZHJtQWdwRGV2aWNlSWQoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9pbmZvIHsKK3N0cnVjdCBkcm1fYWdwX2luZm8gewogCWludCBhZ3BfdmVyc2lvbl9tYWpvcjsKIAlpbnQgYWdwX3ZlcnNpb25fbWlub3I7CiAJdW5zaWduZWQgbG9uZyBtb2RlOwpAQCAtNTcwLDI1ICs1NzAsMjUgQEAKIAkvKiBQQ0kgaW5mb3JtYXRpb24gKi8KIAl1bnNpZ25lZCBzaG9ydCBpZF92ZW5kb3I7CiAJdW5zaWduZWQgc2hvcnQgaWRfZGV2aWNlOwotfSBkcm1fYWdwX2luZm9fdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1NHX0FMTE9DIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciB7CitzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHsKIAl1bnNpZ25lZCBsb25nIHNpemU7CS8qKjwgSW4gYnl0ZXMgLS0gd2lsbCByb3VuZCB0byBwYWdlIGJvdW5kYXJ5ICovCiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgbWFwcGluZyAvIHVubWFwcGluZyAqLwotfSBkcm1fc2NhdHRlcl9nYXRoZXJfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1NFVF9WRVJTSU9OIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zZXRfdmVyc2lvbiB7CitzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHsKIAlpbnQgZHJtX2RpX21ham9yOwogCWludCBkcm1fZGlfbWlub3I7CiAJaW50IGRybV9kZF9tYWpvcjsKIAlpbnQgZHJtX2RkX21pbm9yOwotfSBkcm1fc2V0X3ZlcnNpb25fdDsKK307CiAKICNkZWZpbmUgRFJNX0lPQ1RMX0JBU0UJCQknZCcKICNkZWZpbmUgRFJNX0lPKG5yKQkJCV9JTyhEUk1fSU9DVExfQkFTRSxucikKQEAgLTU5Niw2MSArNTk2LDYxIEBACiAjZGVmaW5lIERSTV9JT1cobnIsdHlwZSkJCV9JT1coRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKICNkZWZpbmUgRFJNX0lPV1IobnIsdHlwZSkJCV9JT1dSKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1ZFUlNJT04JCURSTV9JT1dSKDB4MDAsIGRybV92ZXJzaW9uX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfVU5JUVVFCQlEUk1fSU9XUigweDAxLCBkcm1fdW5pcXVlX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIGRybV9hdXRoX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9JUlFfQlVTSUQJCURSTV9JT1dSKDB4MDMsIGRybV9pcnFfYnVzaWRfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQVAgICAgICAgICAgICAgICBEUk1fSU9XUigweDA0LCBkcm1fbWFwX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgZHJtX2NsaWVudF90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX1NUQVRTICAgICAgICAgICAgIERSTV9JT1IoIDB4MDYsIGRybV9zdGF0c190KQotI2RlZmluZSBEUk1fSU9DVExfU0VUX1ZFUlNJT04JCURSTV9JT1dSKDB4MDcsIGRybV9zZXRfdmVyc2lvbl90KQorI2RlZmluZSBEUk1fSU9DVExfVkVSU0lPTgkJRFJNX0lPV1IoMHgwMCwgc3RydWN0IGRybV92ZXJzaW9uKQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1VOSVFVRQkJRFJNX0lPV1IoMHgwMSwgc3RydWN0IGRybV91bmlxdWUpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFHSUMJCURSTV9JT1IoIDB4MDIsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0lSUV9CVVNJRAkJRFJNX0lPV1IoMHgwMywgc3RydWN0IGRybV9pcnFfYnVzaWQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFQICAgICAgICAgICAgICAgRFJNX0lPV1IoMHgwNCwgc3RydWN0IGRybV9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfQ0xJRU5UICAgICAgICAgICAgRFJNX0lPV1IoMHgwNSwgc3RydWN0IGRybV9jbGllbnQpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU1RBVFMgICAgICAgICAgICAgRFJNX0lPUiggMHgwNiwgc3RydWN0IGRybV9zdGF0cykKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9WRVJTSU9OCQlEUk1fSU9XUigweDA3LCBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uKQogCi0jZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBkcm1fdW5pcXVlX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BVVRIX01BR0lDCQlEUk1fSU9XKCAweDExLCBkcm1fYXV0aF90KQotI2RlZmluZSBEUk1fSU9DVExfQkxPQ0sJCQlEUk1fSU9XUigweDEyLCBkcm1fYmxvY2tfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIGRybV9ibG9ja190KQotI2RlZmluZSBEUk1fSU9DVExfQ09OVFJPTAkJRFJNX0lPVyggMHgxNCwgZHJtX2NvbnRyb2xfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FERF9NQVAJCURSTV9JT1dSKDB4MTUsIGRybV9tYXBfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBkcm1fYnVmX2Rlc2NfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX01BUktfQlVGUwkJRFJNX0lPVyggMHgxNywgZHJtX2J1Zl9kZXNjX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9JTkZPX0JVRlMJCURSTV9JT1dSKDB4MTgsIGRybV9idWZfaW5mb190KQotI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIGRybV9idWZfbWFwX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9GUkVFX0JVRlMJCURSTV9JT1coIDB4MWEsIGRybV9idWZfZnJlZV90KQorI2RlZmluZSBEUk1fSU9DVExfU0VUX1VOSVFVRQkJRFJNX0lPVyggMHgxMCwgc3RydWN0IGRybV91bmlxdWUpCisjZGVmaW5lIERSTV9JT0NUTF9BVVRIX01BR0lDCQlEUk1fSU9XKCAweDExLCBzdHJ1Y3QgZHJtX2F1dGgpCisjZGVmaW5lIERSTV9JT0NUTF9CTE9DSwkJCURSTV9JT1dSKDB4MTIsIHN0cnVjdCBkcm1fYmxvY2spCisjZGVmaW5lIERSTV9JT0NUTF9VTkJMT0NLCQlEUk1fSU9XUigweDEzLCBzdHJ1Y3QgZHJtX2Jsb2NrKQorI2RlZmluZSBEUk1fSU9DVExfQ09OVFJPTAkJRFJNX0lPVyggMHgxNCwgc3RydWN0IGRybV9jb250cm9sKQorI2RlZmluZSBEUk1fSU9DVExfQUREX01BUAkJRFJNX0lPV1IoMHgxNSwgc3RydWN0IGRybV9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQlVGUwkJRFJNX0lPV1IoMHgxNiwgc3RydWN0IGRybV9idWZfZGVzYykKKyNkZWZpbmUgRFJNX0lPQ1RMX01BUktfQlVGUwkJRFJNX0lPVyggMHgxNywgc3RydWN0IGRybV9idWZfZGVzYykKKyNkZWZpbmUgRFJNX0lPQ1RMX0lORk9fQlVGUwkJRFJNX0lPV1IoMHgxOCwgc3RydWN0IGRybV9idWZfaW5mbykKKyNkZWZpbmUgRFJNX0lPQ1RMX01BUF9CVUZTCQlEUk1fSU9XUigweDE5LCBzdHJ1Y3QgZHJtX2J1Zl9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9GUkVFX0JVRlMJCURSTV9JT1coIDB4MWEsIHN0cnVjdCBkcm1fYnVmX2ZyZWUpCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1JNX01BUAkJRFJNX0lPVyggMHgxYiwgZHJtX21hcF90KQorI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQCQlEUk1fSU9XKCAweDFiLCBzdHJ1Y3QgZHJtX21hcCkKIAotI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgZHJtX2N0eF9wcml2X21hcF90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCAJRFJNX0lPV1IoMHgxZCwgZHJtX2N0eF9wcml2X21hcF90KQorI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWAkJRFJNX0lPVyggMHgxYywgc3RydWN0IGRybV9jdHhfcHJpdl9tYXApCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYIAlEUk1fSU9XUigweDFkLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKIAotI2RlZmluZSBEUk1fSU9DVExfQUREX0NUWAkJRFJNX0lPV1IoMHgyMCwgZHJtX2N0eF90KQotI2RlZmluZSBEUk1fSU9DVExfUk1fQ1RYCQlEUk1fSU9XUigweDIxLCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9NT0RfQ1RYCQlEUk1fSU9XKCAweDIyLCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfQ1RYCQlEUk1fSU9XUigweDIzLCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9TV0lUQ0hfQ1RYCQlEUk1fSU9XKCAweDI0LCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9ORVdfQ1RYCQlEUk1fSU9XKCAweDI1LCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9SRVNfQ1RYCQlEUk1fSU9XUigweDI2LCBkcm1fY3R4X3Jlc190KQotI2RlZmluZSBEUk1fSU9DVExfQUREX0RSQVcJCURSTV9JT1dSKDB4MjcsIGRybV9kcmF3X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9STV9EUkFXCQlEUk1fSU9XUigweDI4LCBkcm1fZHJhd190KQotI2RlZmluZSBEUk1fSU9DVExfRE1BCQkJRFJNX0lPV1IoMHgyOSwgZHJtX2RtYV90KQotI2RlZmluZSBEUk1fSU9DVExfTE9DSwkJCURSTV9JT1coIDB4MmEsIGRybV9sb2NrX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9VTkxPQ0sJCURSTV9JT1coIDB4MmIsIGRybV9sb2NrX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9GSU5JU0gJCURSTV9JT1coIDB4MmMsIGRybV9sb2NrX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0NUWAkJRFJNX0lPV1IoMHgyMSwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RfQ1RYCQlEUk1fSU9XKCAweDIyLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfU1dJVENIX0NUWAkJRFJNX0lPVyggMHgyNCwgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9ORVdfQ1RYCQlEUk1fSU9XKCAweDI1LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIHN0cnVjdCBkcm1fY3R4X3JlcykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9EUkFXCQlEUk1fSU9XUigweDI3LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9STV9EUkFXCQlEUk1fSU9XUigweDI4LCBzdHJ1Y3QgZHJtX2RyYXcpCisjZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBzdHJ1Y3QgZHJtX2RtYSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0xPQ0sJCQlEUk1fSU9XKCAweDJhLCBzdHJ1Y3QgZHJtX2xvY2spCisjZGVmaW5lIERSTV9JT0NUTF9VTkxPQ0sJCURSTV9JT1coIDB4MmIsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgc3RydWN0IGRybV9sb2NrKQogCiAjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUNRVUlSRQkJRFJNX0lPKCAgMHgzMCkKICNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9SRUxFQVNFCQlEUk1fSU8oICAweDMxKQotI2RlZmluZSBEUk1fSU9DVExfQUdQX0VOQUJMRQkJRFJNX0lPVyggMHgzMiwgZHJtX2FncF9tb2RlX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfSU5GTwkJRFJNX0lPUiggMHgzMywgZHJtX2FncF9pbmZvX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfQUxMT0MJCURSTV9JT1dSKDB4MzQsIGRybV9hZ3BfYnVmZmVyX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfRlJFRQkJRFJNX0lPVyggMHgzNSwgZHJtX2FncF9idWZmZXJfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9CSU5ECQlEUk1fSU9XKCAweDM2LCBkcm1fYWdwX2JpbmRpbmdfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQJCURSTV9JT1coIDB4MzcsIGRybV9hZ3BfYmluZGluZ190KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0VOQUJMRQkJRFJNX0lPVyggMHgzMiwgc3RydWN0IGRybV9hZ3BfbW9kZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9JTkZPCQlEUk1fSU9SKCAweDMzLCBzdHJ1Y3QgZHJtX2FncF9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0FMTE9DCQlEUk1fSU9XUigweDM0LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRlJFRQkJRFJNX0lPVyggMHgzNSwgc3RydWN0IGRybV9hZ3BfYnVmZmVyKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0JJTkQJCURSTV9JT1coIDB4MzYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfVU5CSU5ECQlEUk1fSU9XKCAweDM3LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nKQogCi0jZGVmaW5lIERSTV9JT0NUTF9TR19BTExPQwkJRFJNX0lPVyggMHgzOCwgZHJtX3NjYXR0ZXJfZ2F0aGVyX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9TR19GUkVFCQlEUk1fSU9XKCAweDM5LCBkcm1fc2NhdHRlcl9nYXRoZXJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NHX0FMTE9DCQlEUk1fSU9XKCAweDM4LCBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyKQorI2RlZmluZSBEUk1fSU9DVExfU0dfRlJFRQkJRFJNX0lPVyggMHgzOSwgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlcikKIAotI2RlZmluZSBEUk1fSU9DVExfV0FJVF9WQkxBTksJCURSTV9JT1dSKDB4M2EsIGRybV93YWl0X3ZibGFua190KQorI2RlZmluZSBEUk1fSU9DVExfV0FJVF9WQkxBTksJCURSTV9JT1dSKDB4M2EsIHVuaW9uIGRybV93YWl0X3ZibGFuaykKIAotI2RlZmluZSBEUk1fSU9DVExfVVBEQVRFX0RSQVcJCURSTV9JT1coMHgzZiwgZHJtX3VwZGF0ZV9kcmF3X3QpCisjZGVmaW5lIERSTV9JT0NUTF9VUERBVEVfRFJBVwkJRFJNX0lPVygweDNmLCBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3KQogCiAvKioKICAqIERldmljZSBzcGVjaWZpYyBpb2N0bHMgc2hvdWxkIG9ubHkgYmUgaW4gdGhlaXIgcmVzcGVjdGl2ZSBoZWFkZXJzCkBAIC02NjMsNCArNjYzLDQ5IEBACiAjZGVmaW5lIERSTV9DT01NQU5EX0JBU0UgICAgICAgICAgICAgICAgMHg0MAogI2RlZmluZSBEUk1fQ09NTUFORF9FTkQJCQkweEEwCiAKKy8qIHR5cGVkZWYgYXJlYSAqLworI2lmbmRlZiBfX0tFUk5FTF9fCit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpcF9yZWN0IGRybV9jbGlwX3JlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvIGRybV9kcmF3YWJsZV9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiBkcm1fdGV4X3JlZ2lvbl90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2h3X2xvY2sgZHJtX2h3X2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IGRybV92ZXJzaW9uIGRybV92ZXJzaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdW5pcXVlIGRybV91bmlxdWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9saXN0IGRybV9saXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYmxvY2sgZHJtX2Jsb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY29udHJvbCBkcm1fY29udHJvbF90OwordHlwZWRlZiBlbnVtIGRybV9tYXBfdHlwZSBkcm1fbWFwX3R5cGVfdDsKK3R5cGVkZWYgZW51bSBkcm1fbWFwX2ZsYWdzIGRybV9tYXBfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgZHJtX2N0eF9wcml2X21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCBkcm1fbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpZW50IGRybV9jbGllbnRfdDsKK3R5cGVkZWYgZW51bSBkcm1fc3RhdF90eXBlIGRybV9zdGF0X3R5cGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zdGF0cyBkcm1fc3RhdHNfdDsKK3R5cGVkZWYgZW51bSBkcm1fbG9ja19mbGFncyBkcm1fbG9ja19mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgZHJtX2xvY2tfdDsKK3R5cGVkZWYgZW51bSBkcm1fZG1hX2ZsYWdzIGRybV9kbWFfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZGVzYyBkcm1fYnVmX2Rlc2NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfaW5mbyBkcm1fYnVmX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfZnJlZSBkcm1fYnVmX2ZyZWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIGRybV9idWZfcHViX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX21hcCBkcm1fYnVmX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RtYSBkcm1fZG1hX3Q7Cit0eXBlZGVmIHVuaW9uIGRybV93YWl0X3ZibGFuayBkcm1fd2FpdF92YmxhbmtfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfbW9kZSBkcm1fYWdwX21vZGVfdDsKK3R5cGVkZWYgZW51bSBkcm1fY3R4X2ZsYWdzIGRybV9jdHhfZmxhZ3NfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jdHggZHJtX2N0eF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgZHJtX2N0eF9yZXNfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9kcmF3IGRybV9kcmF3X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgZHJtX3VwZGF0ZV9kcmF3X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCBkcm1fYXV0aF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2lycV9idXNpZCBkcm1faXJxX2J1c2lkX3Q7Cit0eXBlZGVmIGVudW0gZHJtX3ZibGFua19zZXFfdHlwZSBkcm1fdmJsYW5rX3NlcV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYnVmZmVyIGRybV9hZ3BfYnVmZmVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgZHJtX2FncF9iaW5kaW5nX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8gZHJtX2FncF9pbmZvX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgZHJtX3NjYXR0ZXJfZ2F0aGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gZHJtX3NldF92ZXJzaW9uX3Q7CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCmluZGV4IGQ0OTQzMTUuLjBkZjg3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCkBAIC03NSw2ICs3NSw4IEBACiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlICJkcm0uaCIKIAorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCiAjZGVmaW5lIF9fT1NfSEFTX0FHUCAoZGVmaW5lZChDT05GSUdfQUdQKSB8fCAoZGVmaW5lZChDT05GSUdfQUdQX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKSkKICNkZWZpbmUgX19PU19IQVNfTVRSUiAoZGVmaW5lZChDT05GSUdfTVRSUikpCiAKQEAgLTI3NCwzMiArMjc2LDIzIEBACiAJaW50IGZsYWdzOwogfSBkcm1faW9jdGxfZGVzY190OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fZGV2c3RhdGUgewotCXBpZF90IG93bmVyOwkJCS8qKjwgWCBzZXJ2ZXIgcGlkIGhvbGRpbmcgeF9sb2NrICovCi19IGRybV9kZXZzdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBkcm1fbWFnaWNfZW50cnkgewotCWRybV9oYXNoX2l0ZW1fdCBoYXNoX2l0ZW07CitzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gaGFzaF9pdGVtOwogCXN0cnVjdCBkcm1fZmlsZSAqcHJpdjsKIAlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpuZXh0OwotfSBkcm1fbWFnaWNfZW50cnlfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9tYWdpY19oZWFkIHsKLQlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpoZWFkOwotCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKnRhaWw7Ci19IGRybV9tYWdpY19oZWFkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGRybV92bWFfZW50cnkgeworc3RydWN0IGRybV92bWFfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqbmV4dDsKIAlwaWRfdCBwaWQ7Ci19IGRybV92bWFfZW50cnlfdDsKK307CiAKIC8qKgogICogRE1BIGJ1ZmZlci4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1ZiB7CitzdHJ1Y3QgZHJtX2J1ZiB7CiAJaW50IGlkeDsJCSAgICAgICAvKio8IEluZGV4IGludG8gbWFzdGVyIGJ1Zmxpc3QgKi8KIAlpbnQgdG90YWw7CQkgICAgICAgLyoqPCBCdWZmZXIgc2l6ZSAqLwogCWludCBvcmRlcjsJCSAgICAgICAvKio8IGxvZy1iYXNlLTIodG90YWwpICovCkBAIC0zMjUsMzAgKzMxOCwzMCBAQAogCiAJaW50IGRldl9wcml2X3NpemU7CQkgLyoqPCBTaXplIG9mIGJ1ZmZlciBwcml2YXRlIHN0b3JhZ2UgKi8KIAl2b2lkICpkZXZfcHJpdmF0ZTsJCSAvKio8IFBlci1idWZmZXIgcHJpdmF0ZSBzdG9yYWdlICovCi19IGRybV9idWZfdDsKK307CiAKIC8qKiBidWZzIGlzIG9uZSBsb25nZXIgdGhhbiBpdCBoYXMgdG8gYmUgKi8KLXR5cGVkZWYgc3RydWN0IGRybV93YWl0bGlzdCB7CitzdHJ1Y3QgZHJtX3dhaXRsaXN0IHsKIAlpbnQgY291bnQ7CQkJLyoqPCBOdW1iZXIgb2YgcG9zc2libGUgYnVmZmVycyAqLwotCWRybV9idWZfdCAqKmJ1ZnM7CQkvKio8IExpc3Qgb2YgcG9pbnRlcnMgdG8gYnVmZmVycyAqLwotCWRybV9idWZfdCAqKnJwOwkJCS8qKjwgUmVhZCBwb2ludGVyICovCi0JZHJtX2J1Zl90ICoqd3A7CQkJLyoqPCBXcml0ZSBwb2ludGVyICovCi0JZHJtX2J1Zl90ICoqZW5kOwkJLyoqPCBFbmQgcG9pbnRlciAqLworCXN0cnVjdCBkcm1fYnVmICoqYnVmczsJCS8qKjwgTGlzdCBvZiBwb2ludGVycyB0byBidWZmZXJzICovCisJc3RydWN0IGRybV9idWYgKipycDsJCQkvKio8IFJlYWQgcG9pbnRlciAqLworCXN0cnVjdCBkcm1fYnVmICoqd3A7CQkJLyoqPCBXcml0ZSBwb2ludGVyICovCisJc3RydWN0IGRybV9idWYgKiplbmQ7CQkvKio8IEVuZCBwb2ludGVyICovCiAJc3BpbmxvY2tfdCByZWFkX2xvY2s7CiAJc3BpbmxvY2tfdCB3cml0ZV9sb2NrOwotfSBkcm1fd2FpdGxpc3RfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9mcmVlbGlzdCB7CitzdHJ1Y3QgZHJtX2ZyZWVsaXN0IHsKIAlpbnQgaW5pdGlhbGl6ZWQ7CSAgICAgICAvKio8IEZyZWVsaXN0IGluIHVzZSAqLwogCWF0b21pY190IGNvdW50OwkJICAgICAgIC8qKjwgTnVtYmVyIG9mIGZyZWUgYnVmZmVycyAqLwotCWRybV9idWZfdCAqbmV4dDsJICAgICAgIC8qKjwgRW5kIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqbmV4dDsJICAgICAgIC8qKjwgRW5kIHBvaW50ZXIgKi8KIAogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRpbmc7ICAgICAvKio8IFByb2Nlc3NlcyB3YWl0aW5nIG9uIGZyZWUgYnVmcyAqLwogCWludCBsb3dfbWFyazsJCSAgICAgICAvKio8IExvdyB3YXRlciBtYXJrICovCiAJaW50IGhpZ2hfbWFyazsJCSAgICAgICAvKio8IEhpZ2ggd2F0ZXIgbWFyayAqLwogCWF0b21pY190IHdmaDsJCSAgICAgICAvKio8IElmIHdhaXRpbmcgZm9yIGhpZ2ggbWFyayAqLwogCXNwaW5sb2NrX3QgbG9jazsKLX0gZHJtX2ZyZWVsaXN0X3Q7Cit9OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fZG1hX2hhbmRsZSB7CiAJZG1hX2FkZHJfdCBidXNhZGRyOwpAQCAtMzU5LDE5ICszNTIsMTkgQEAKIC8qKgogICogQnVmZmVyIGVudHJ5LiAgVGhlcmUgaXMgb25lIG9mIHRoaXMgZm9yIGVhY2ggYnVmZmVyIHNpemUgb3JkZXIuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfZW50cnkgeworc3RydWN0IGRybV9idWZfZW50cnkgewogCWludCBidWZfc2l6ZTsJCQkvKio8IHNpemUgKi8KIAlpbnQgYnVmX2NvdW50OwkJCS8qKjwgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KLQlkcm1fYnVmX3QgKmJ1Zmxpc3Q7CQkvKio8IGJ1ZmZlciBsaXN0ICovCisJc3RydWN0IGRybV9idWYgKmJ1Zmxpc3Q7CQkvKio8IGJ1ZmZlciBsaXN0ICovCiAJaW50IHNlZ19jb3VudDsKIAlpbnQgcGFnZV9vcmRlcjsKLQlkcm1fZG1hX2hhbmRsZV90ICoqc2VnbGlzdDsKKwlzdHJ1Y3QgZHJtX2RtYV9oYW5kbGUgKipzZWdsaXN0OwogCi0JZHJtX2ZyZWVsaXN0X3QgZnJlZWxpc3Q7Ci19IGRybV9idWZfZW50cnlfdDsKKwlzdHJ1Y3QgZHJtX2ZyZWVsaXN0IGZyZWVsaXN0OworfTsKIAogLyoqIEZpbGUgcHJpdmF0ZSBkYXRhICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZmlsZSB7CitzdHJ1Y3QgZHJtX2ZpbGUgewogCWludCBhdXRoZW50aWNhdGVkOwogCWludCBtYXN0ZXI7CiAJaW50IG1pbm9yOwpAQCAtMzc5LDE2ICszNzIsMTUgQEAKIAl1aWRfdCB1aWQ7CiAJZHJtX21hZ2ljX3QgbWFnaWM7CiAJdW5zaWduZWQgbG9uZyBpb2N0bF9jb3VudDsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKm5leHQ7Ci0Jc3RydWN0IGRybV9maWxlICpwcmV2OworCXN0cnVjdCBsaXN0X2hlYWQgbGhlYWQ7CiAJc3RydWN0IGRybV9oZWFkICpoZWFkOwogCWludCByZW1vdmVfYXV0aF9vbl9jbG9zZTsKIAl1bnNpZ25lZCBsb25nIGxvY2tfY291bnQ7CiAJdm9pZCAqZHJpdmVyX3ByaXY7Ci19IGRybV9maWxlX3Q7Cit9OwogCiAvKiogV2FpdCBxdWV1ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3F1ZXVlIHsKK3N0cnVjdCBkcm1fcXVldWUgewogCWF0b21pY190IHVzZV9jb3VudDsJCS8qKjwgT3V0c3RhbmRpbmcgdXNlcyAoKzEpICovCiAJYXRvbWljX3QgZmluYWxpemF0aW9uOwkJLyoqPCBGaW5hbGl6YXRpb24gaW4gcHJvZ3Jlc3MgKi8KIAlhdG9taWNfdCBibG9ja19jb3VudDsJCS8qKjwgQ291bnQgb2YgcHJvY2Vzc2VzIHdhaXRpbmcgKi8KQEAgLTQwMSwxNiArMzkzLDE2IEBACiAJYXRvbWljX3QgdG90YWxfZmx1c2hlZDsJCS8qKjwgVG90YWwgZmx1c2hlcyBzdGF0aXN0aWMgKi8KIAlhdG9taWNfdCB0b3RhbF9sb2NrczsJCS8qKjwgVG90YWwgbG9ja3Mgc3RhdGlzdGljcyAqLwogI2VuZGlmCi0JZHJtX2N0eF9mbGFnc190IGZsYWdzOwkJLyoqPCBDb250ZXh0IHByZXNlcnZpbmcgYW5kIDJELW9ubHkgKi8KLQlkcm1fd2FpdGxpc3RfdCB3YWl0bGlzdDsJLyoqPCBQZW5kaW5nIGJ1ZmZlcnMgKi8KKwllbnVtIGRybV9jdHhfZmxhZ3MgZmxhZ3M7CS8qKjwgQ29udGV4dCBwcmVzZXJ2aW5nIGFuZCAyRC1vbmx5ICovCisJc3RydWN0IGRybV93YWl0bGlzdCB3YWl0bGlzdDsJLyoqPCBQZW5kaW5nIGJ1ZmZlcnMgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBmbHVzaF9xdWV1ZTsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyB1bnRpbCBmbHVzaCAqLwotfSBkcm1fcXVldWVfdDsKK307CiAKIC8qKgogICogTG9jayBkYXRhLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fbG9ja19kYXRhIHsKLQlkcm1faHdfbG9ja190ICpod19sb2NrOwkJLyoqPCBIYXJkd2FyZSBsb2NrICovCitzdHJ1Y3QgZHJtX2xvY2tfZGF0YSB7CisJc3RydWN0IGRybV9od19sb2NrICpod19sb2NrOwkvKio8IEhhcmR3YXJlIGxvY2sgKi8KIAlzdHJ1Y3QgZmlsZSAqZmlscDsJCS8qKjwgRmlsZSBkZXNjciBvZiBsb2NrIGhvbGRlciAoMD1rZXJuZWwpICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgbG9ja19xdWV1ZTsJLyoqPCBRdWV1ZSBvZiBibG9ja2VkIHByb2Nlc3NlcyAqLwogCXVuc2lnbmVkIGxvbmcgbG9ja190aW1lOwkvKio8IFRpbWUgb2YgbGFzdCBsb2NrIGluIGppZmZpZXMgKi8KQEAgLTQxOCwxNiArNDEwLDE2IEBACiAJdWludDMyX3Qga2VybmVsX3dhaXRlcnM7CiAJdWludDMyX3QgdXNlcl93YWl0ZXJzOwogCWludCBpZGxlX2hhc19sb2NrOwotfSBkcm1fbG9ja19kYXRhX3Q7Cit9OwogCiAvKioKICAqIERNQSBkYXRhLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlX2RtYSB7CitzdHJ1Y3QgZHJtX2RldmljZV9kbWEgewogCi0JZHJtX2J1Zl9lbnRyeV90IGJ1ZnNbRFJNX01BWF9PUkRFUiArIDFdOwkvKio8IGJ1ZmZlcnMsIGdyb3VwZWQgYnkgdGhlaXIgc2l6ZSBvcmRlciAqLworCXN0cnVjdCBkcm1fYnVmX2VudHJ5IGJ1ZnNbRFJNX01BWF9PUkRFUiArIDFdOwkvKio8IGJ1ZmZlcnMsIGdyb3VwZWQgYnkgdGhlaXIgc2l6ZSBvcmRlciAqLwogCWludCBidWZfY291bnQ7CQkJLyoqPCB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyAqLwotCWRybV9idWZfdCAqKmJ1Zmxpc3Q7CQkvKio8IFZlY3RvciBvZiBwb2ludGVycyBpbnRvIGRybV9kZXZpY2VfZG1hOjpidWZzICovCisJc3RydWN0IGRybV9idWYgKipidWZsaXN0OwkJLyoqPCBWZWN0b3Igb2YgcG9pbnRlcnMgaW50byBkcm1fZGV2aWNlX2RtYTo6YnVmcyAqLwogCWludCBzZWdfY291bnQ7CiAJaW50IHBhZ2VfY291bnQ7CQkJLyoqPCBudW1iZXIgb2YgcGFnZXMgKi8KIAl1bnNpZ25lZCBsb25nICpwYWdlbGlzdDsJLyoqPCBwYWdlIGxpc3QgKi8KQEAgLTQzOSwyOCArNDMxLDI3IEBACiAJCV9EUk1fRE1BX1VTRV9QQ0lfUk8gPSAweDA4CiAJfSBmbGFnczsKIAotfSBkcm1fZGV2aWNlX2RtYV90OworfTsKIAogLyoqCiAgKiBBR1AgbWVtb3J5IGVudHJ5LiAgU3RvcmVkIGFzIGEgZG91Ymx5IGxpbmtlZCBsaXN0LgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX21lbSB7CitzdHJ1Y3QgZHJtX2FncF9tZW0gewogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkJLyoqPCBoYW5kbGUgKi8KIAlEUk1fQUdQX01FTSAqbWVtb3J5OwogCXVuc2lnbmVkIGxvbmcgYm91bmQ7CQkvKio8IGFkZHJlc3MgKi8KIAlpbnQgcGFnZXM7Ci0Jc3RydWN0IGRybV9hZ3BfbWVtICpwcmV2OwkvKio8IHByZXZpb3VzIGVudHJ5ICovCi0Jc3RydWN0IGRybV9hZ3BfbWVtICpuZXh0OwkvKio8IG5leHQgZW50cnkgKi8KLX0gZHJtX2FncF9tZW1fdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Cit9OwogCiAvKioKICAqIEFHUCBkYXRhLgogICoKICAqIFxzYSBkcm1fYWdwX2luaXQoKSBhbmQgZHJtX2RldmljZTo6YWdwLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2hlYWQgeworc3RydWN0IGRybV9hZ3BfaGVhZCB7CiAJRFJNX0FHUF9LRVJOIGFncF9pbmZvOwkJLyoqPCBBR1AgZGV2aWNlIGluZm9ybWF0aW9uICovCi0JZHJtX2FncF9tZW1fdCAqbWVtb3J5OwkJLyoqPCBtZW1vcnkgZW50cmllcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbWVtb3J5OwogCXVuc2lnbmVkIGxvbmcgbW9kZTsJCS8qKjwgQUdQIG1vZGUgKi8KIAlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2U7CiAJaW50IGVuYWJsZWQ7CQkJLyoqPCB3aGV0aGVyIHRoZSBBR1AgYnVzIGFzIGJlZW4gZW5hYmxlZCAqLwpAQCAtNDY5LDUxICs0NjAsNTEgQEAKIAlpbnQgYWdwX210cnI7CiAJaW50IGNhbnRfdXNlX2FwZXJ0dXJlOwogCXVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrOwotfSBkcm1fYWdwX2hlYWRfdDsKK307CiAKIC8qKgogICogU2NhdHRlci1nYXRoZXIgbWVtb3J5LgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2dfbWVtIHsKK3N0cnVjdCBkcm1fc2dfbWVtIHsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsKIAl2b2lkICp2aXJ0dWFsOwogCWludCBwYWdlczsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VsaXN0OwogCWRtYV9hZGRyX3QgKmJ1c2FkZHI7Ci19IGRybV9zZ19tZW1fdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9zaWdkYXRhIHsKK3N0cnVjdCBkcm1fc2lnZGF0YSB7CiAJaW50IGNvbnRleHQ7Ci0JZHJtX2h3X2xvY2tfdCAqbG9jazsKLX0gZHJtX3NpZ2RhdGFfdDsKKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgKmxvY2s7Cit9OwogCiAvKioKICAqIE1hcHBpbmdzIGxpc3QKICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX21hcF9saXN0IHsKK3N0cnVjdCBkcm1fbWFwX2xpc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgbGlzdCBoZWFkICovCi0JZHJtX2hhc2hfaXRlbV90IGhhc2g7Ci0JZHJtX21hcF90ICptYXA7CQkJLyoqPCBtYXBwaW5nICovCisJc3RydWN0IGRybV9oYXNoX2l0ZW0gaGFzaDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOwkJCS8qKjwgbWFwcGluZyAqLwogCXVuc2lnbmVkIGludCB1c2VyX3Rva2VuOwotfSBkcm1fbWFwX2xpc3RfdDsKK307CiAKLXR5cGVkZWYgZHJtX21hcF90IGRybV9sb2NhbF9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9tYXAgZHJtX2xvY2FsX21hcF90OwogCiAvKioKICAqIENvbnRleHQgaGFuZGxlIGxpc3QKICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9saXN0IHsKK3N0cnVjdCBkcm1fY3R4X2xpc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgbGlzdCBoZWFkICovCiAJZHJtX2NvbnRleHRfdCBoYW5kbGU7CQkvKio8IGNvbnRleHQgaGFuZGxlICovCi0JZHJtX2ZpbGVfdCAqdGFnOwkJLyoqPCBhc3NvY2lhdGVkIGZkIHByaXZhdGUgZGF0YSAqLwotfSBkcm1fY3R4X2xpc3RfdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnRhZzsJCS8qKjwgYXNzb2NpYXRlZCBmZCBwcml2YXRlIGRhdGEgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV92Ymxfc2lnIHsKK3N0cnVjdCBkcm1fdmJsX3NpZyB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLX0gZHJtX3ZibF9zaWdfdDsKK307CiAKIC8qIGxvY2F0aW9uIG9mIEdBUlQgdGFibGUgKi8KICNkZWZpbmUgRFJNX0FUSV9HQVJUX01BSU4gMQpAQCAtNTIzLDE5ICs1MTQsMTkgQEAKICNkZWZpbmUgRFJNX0FUSV9HQVJUX1BDSUUgMgogI2RlZmluZSBEUk1fQVRJX0dBUlRfSUdQIDMKIAotdHlwZWRlZiBzdHJ1Y3QgYXRpX3BjaWdhcnRfaW5mbyB7CitzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gewogCWludCBnYXJ0X3RhYmxlX2xvY2F0aW9uOwogCWludCBnYXJ0X3JlZ19pZjsKIAl2b2lkICphZGRyOwogCWRtYV9hZGRyX3QgYnVzX2FkZHI7CiAJZHJtX2xvY2FsX21hcF90IG1hcHBpbmc7CiAJaW50IHRhYmxlX3NpemU7Ci19IGRybV9hdGlfcGNpZ2FydF9pbmZvOworfTsKIAogLyoKICAqIEdlbmVyaWMgbWVtb3J5IG1hbmFnZXIgc3RydWN0cwogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fbW1fbm9kZSB7CitzdHJ1Y3QgZHJtX21tX25vZGUgewogCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7CiAJc3RydWN0IGxpc3RfaGVhZCBtbF9lbnRyeTsKIAlpbnQgZnJlZTsKQEAgLTU0MywxMiArNTM0LDEyIEBACiAJdW5zaWduZWQgbG9uZyBzaXplOwogCXN0cnVjdCBkcm1fbW0gKm1tOwogCXZvaWQgKnByaXZhdGU7Ci19IGRybV9tbV9ub2RlX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fbW0geworc3RydWN0IGRybV9tbSB7CiAJc3RydWN0IGxpc3RfaGVhZCBmbF9lbnRyeTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1sX2VudHJ5OwotfSBkcm1fbW1fdDsKK307CiAKIC8qKgogICogRFJNIGRyaXZlciBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCB0aGUgY29tbW9uIGNvZGUgZm9yCkBAIC01NjAsMjEgKzU1MSwyMSBAQAogc3RydWN0IGRybV9kcml2ZXIgewogCWludCAoKmxvYWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAlpbnQgKCpmaXJzdG9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLQlpbnQgKCpvcGVuKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKKwlpbnQgKCpvcGVuKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9maWxlICopOwogCXZvaWQgKCpwcmVjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBmaWxlICogZmlscCk7Ci0Jdm9pZCAoKnBvc3RjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIGRybV9maWxlX3QgKik7CisJdm9pZCAoKnBvc3RjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkcm1fZmlsZSAqKTsKIAl2b2lkICgqbGFzdGNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJaW50ICgqdW5sb2FkKSAoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJaW50ICgqZG1hX2lvY3RsKSAoRFJNX0lPQ1RMX0FSR1MpOwogCXZvaWQgKCpkbWFfcmVhZHkpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpkbWFfcXVpZXNjZW50KSAoc3RydWN0IGRybV9kZXZpY2UgKik7Ci0JaW50ICgqY29udGV4dF9jdG9yKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBjb250ZXh0KTsKLQlpbnQgKCpjb250ZXh0X2R0b3IpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwotCWludCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgb2xkLAorCWludCAoKmNvbnRleHRfY3RvcikgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KTsKKwlpbnQgKCpjb250ZXh0X2R0b3IpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY29udGV4dCk7CisJaW50ICgqa2VybmVsX2NvbnRleHRfc3dpdGNoKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG9sZCwKIAkJCQkgICAgICBpbnQgbmV3KTsKLQl2b2lkICgqa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaykgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLQlpbnQgKCp2Ymxhbmtfd2FpdCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKLQlpbnQgKCp2Ymxhbmtfd2FpdDIpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisJdm9pZCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwlpbnQgKCp2Ymxhbmtfd2FpdCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworCWludCAoKnZibGFua193YWl0MikgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCWludCAoKmRyaV9saWJyYXJ5X25hbWUpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjaGFyICpidWYpOwogCiAJLyoqCkBAIC01ODgsMjIgKzU3OSwyMyBAQAogCSAqIGNhcmQgaXMgYWJzb2x1dGVseSBcYiBub3QgQUdQIChyZXR1cm4gb2YgMCksIGFic29sdXRlbHkgXGIgaXMgQUdQCiAJICogKHJldHVybiBvZiAxKSwgb3IgbWF5IG9yIG1heSBub3QgYmUgQUdQIChyZXR1cm4gb2YgMikuCiAJICovCi0JaW50ICgqZGV2aWNlX2lzX2FncCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKKwlpbnQgKCpkZXZpY2VfaXNfYWdwKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIAkvKiB0aGVzZSBoYXZlIHRvIGJlIGZpbGxlZCBpbiAqLwogCiAJaXJxcmV0dXJuX3QoKmlycV9oYW5kbGVyKSAoRFJNX0lSUV9BUkdTKTsKLQl2b2lkICgqaXJxX3ByZWluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7Ci0Jdm9pZCAoKmlycV9wb3N0aW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLQl2b2lkICgqaXJxX3VuaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLQl2b2lkICgqcmVjbGFpbV9idWZmZXJzKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICogZmlscCk7CisJdm9pZCAoKmlycV9wcmVpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmlycV9wb3N0aW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCppcnFfdW5pbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnJlY2xhaW1fYnVmZmVycykgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICogZmlscCk7CiAJdm9pZCAoKnJlY2xhaW1fYnVmZmVyc19sb2NrZWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCk7CiAJdm9pZCAoKnJlY2xhaW1fYnVmZmVyc19pZGxlbG9ja2VkKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJc3RydWN0IGZpbGUgKiBmaWxwKTsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X21hcF9vZnMpIChkcm1fbWFwX3QgKiBtYXApOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfcmVnX29mcykgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLQl2b2lkICgqc2V0X3ZlcnNpb24pIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3NldF92ZXJzaW9uX3QgKiBzdik7CisJdW5zaWduZWQgbG9uZyAoKmdldF9tYXBfb2ZzKSAoc3RydWN0IGRybV9tYXAgKiBtYXApOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfcmVnX29mcykgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCXZvaWQgKCpzZXRfdmVyc2lvbikgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gKnN2KTsKIAogCWludCBtYWpvcjsKIAlpbnQgbWlub3I7CkBAIC02MjUsMTkgKzYxNywxOSBAQAogICogdGhhdCBtYXkgY29udGFpbiBtdWx0aXBsZSBoZWFkcy4gRW1iZWQgb25lIHBlciBoZWFkIG9mIHRoZXNlIGluIHRoZQogICogcHJpdmF0ZSBkcm1fZGV2aWNlIHN0cnVjdHVyZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2hlYWQgeworc3RydWN0IGRybV9oZWFkIHsKIAlpbnQgbWlub3I7CQkJLyoqPCBNaW5vciBkZXZpY2UgbnVtYmVyICovCiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290OyAgLyoqPCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLwogCWRldl90IGRldmljZTsJCQkvKio8IERldmljZSBudW1iZXIgZm9yIG1rbm9kICovCiAJc3RydWN0IGNsYXNzX2RldmljZSAqZGV2X2NsYXNzOwotfSBkcm1faGVhZF90OworfTsKIAogLyoqCiAgKiBEUk0gZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50IGEgY29tcGxldGUgY2FyZCB0aGF0CiAgKiBtYXkgY29udGFpbiBtdWx0aXBsZSBoZWFkcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2RldmljZSB7CitzdHJ1Y3QgZHJtX2RldmljZSB7CiAJY2hhciAqdW5pcXVlOwkJCS8qKjwgVW5pcXVlIGlkZW50aWZpZXI6IGUuZy4sIGJ1c2lkICovCiAJaW50IHVuaXF1ZV9sZW47CQkJLyoqPCBMZW5ndGggb2YgdW5pcXVlIGZpZWxkICovCiAJY2hhciAqZGV2bmFtZTsJCQkvKio8IEZvciAvcHJvYy9pbnRlcnJ1cHRzICovCkBAIC02NjMsMzUgKzY1NSwzMyBAQAogCS8qKiBcbmFtZSBQZXJmb3JtYW5jZSBjb3VudGVycyAqLwogCS8qQHsgKi8KIAl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOwotCWRybV9zdGF0X3R5cGVfdCB0eXBlc1sxNV07CisJZW51bSBkcm1fc3RhdF90eXBlIHR5cGVzWzE1XTsKIAlhdG9taWNfdCBjb3VudHNbMTVdOwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBBdXRoZW50aWNhdGlvbiAqLwogCS8qQHsgKi8KLQlkcm1fZmlsZV90ICpmaWxlX2ZpcnN0OwkJLyoqPCBmaWxlIGxpc3QgaGVhZCAqLwotCWRybV9maWxlX3QgKmZpbGVfbGFzdDsJCS8qKjwgZmlsZSBsaXN0IHRhaWwgKi8KLQlkcm1fb3Blbl9oYXNoX3QgbWFnaWNsaXN0OwkvKio8IG1hZ2ljIGhhc2ggdGFibGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVsaXN0OworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIG1hZ2ljbGlzdDsJLyoqPCBtYWdpYyBoYXNoIHRhYmxlICovCiAJc3RydWN0IGxpc3RfaGVhZCBtYWdpY2ZyZWU7CiAJLypAfSAqLwogCiAJLyoqIFxuYW1lIE1lbW9yeSBtYW5hZ2VtZW50ICovCiAJLypAeyAqLwotCWRybV9tYXBfbGlzdF90ICptYXBsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIHJlZ2lvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hcGxpc3Q7CS8qKjwgTGlua2VkIGxpc3Qgb2YgcmVnaW9ucyAqLwogCWludCBtYXBfY291bnQ7CQkJLyoqPCBOdW1iZXIgb2YgbWFwcGFibGUgcmVnaW9ucyAqLwotCWRybV9vcGVuX2hhc2hfdCBtYXBfaGFzaDsJLyoqPCBVc2VyIHRva2VuIGhhc2ggdGFibGUgZm9yIG1hcHMgKi8KKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCBtYXBfaGFzaDsJLyoqPCBVc2VyIHRva2VuIGhhc2ggdGFibGUgZm9yIG1hcHMgKi8KIAogCS8qKiBcbmFtZSBDb250ZXh0IGhhbmRsZSBtYW5hZ2VtZW50ICovCiAJLypAeyAqLwotCWRybV9jdHhfbGlzdF90ICpjdHhsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIGNvbnRleHQgaGFuZGxlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY3R4bGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiBjb250ZXh0IGhhbmRsZXMgKi8KIAlpbnQgY3R4X2NvdW50OwkJCS8qKjwgTnVtYmVyIG9mIGNvbnRleHQgaGFuZGxlcyAqLwogCXN0cnVjdCBtdXRleCBjdHhsaXN0X211dGV4OwkvKio8IEZvciBjdHhsaXN0ICovCiAKLQlkcm1fbWFwX3QgKipjb250ZXh0X3NhcmVhczsJICAgIC8qKjwgcGVyLWNvbnRleHQgU0FSRUEncyAqLwotCWludCBtYXhfY29udGV4dDsKKwlzdHJ1Y3QgaWRyIGN0eF9pZHI7CiAKLQlkcm1fdm1hX2VudHJ5X3QgKnZtYWxpc3Q7CS8qKjwgTGlzdCBvZiB2bWFzIChmb3IgZGVidWdnaW5nKSAqLwotCWRybV9sb2NrX2RhdGFfdCBsb2NrOwkJLyoqPCBJbmZvcm1hdGlvbiBvbiBoYXJkd2FyZSBsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCB2bWFsaXN0OwkvKio8IExpc3Qgb2Ygdm1hcyAoZm9yIGRlYnVnZ2luZykgKi8KKwlzdHJ1Y3QgZHJtX2xvY2tfZGF0YSBsb2NrOwkvKio8IEluZm9ybWF0aW9uIG9uIGhhcmR3YXJlIGxvY2sgKi8KIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgRE1BIHF1ZXVlcyAoY29udGV4dHMpICovCkBAIC02OTksOCArNjg5LDggQEAKIAlpbnQgcXVldWVfY291bnQ7CQkvKio8IE51bWJlciBvZiBhY3RpdmUgRE1BIHF1ZXVlcyAqLwogCWludCBxdWV1ZV9yZXNlcnZlZDsJCSAgLyoqPCBOdW1iZXIgb2YgcmVzZXJ2ZWQgRE1BIHF1ZXVlcyAqLwogCWludCBxdWV1ZV9zbG90czsJCS8qKjwgQWN0dWFsIGxlbmd0aCBvZiBxdWV1ZWxpc3QgKi8KLQlkcm1fcXVldWVfdCAqKnF1ZXVlbGlzdDsJLyoqPCBWZWN0b3Igb2YgcG9pbnRlcnMgdG8gRE1BIHF1ZXVlcyAqLwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYTsJCS8qKjwgT3B0aW9uYWwgcG9pbnRlciBmb3IgRE1BIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgZHJtX3F1ZXVlICoqcXVldWVsaXN0OwkvKio8IFZlY3RvciBvZiBwb2ludGVycyB0byBETUEgcXVldWVzICovCisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWE7CQkvKio8IE9wdGlvbmFsIHBvaW50ZXIgZm9yIERNQSBzdXBwb3J0ICovCiAJLypAfSAqLwogCiAJLyoqIFxuYW1lIENvbnRleHQgc3VwcG9ydCAqLwpAQCAtNzI1LDggKzcxNSw4IEBACiAJYXRvbWljX3QgdmJsX3JlY2VpdmVkOwogCWF0b21pY190IHZibF9yZWNlaXZlZDI7CQkvKio8IG51bWJlciBvZiBzZWNvbmRhcnkgVkJMQU5LIGludGVycnVwdHMgKi8KIAlzcGlubG9ja190IHZibF9sb2NrOwotCWRybV92Ymxfc2lnX3QgdmJsX3NpZ3M7CQkvKio8IHNpZ25hbCBsaXN0IHRvIHNlbmQgb24gVkJMQU5LICovCi0JZHJtX3ZibF9zaWdfdCB2Ymxfc2lnczI7CS8qKjwgc2lnbmFscyB0byBzZW5kIG9uIHNlY29uZGFyeSBWQkxBTksgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZibF9zaWdzOwkJLyoqPCBzaWduYWwgbGlzdCB0byBzZW5kIG9uIFZCTEFOSyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdmJsX3NpZ3MyOwkvKio8IHNpZ25hbHMgdG8gc2VuZCBvbiBzZWNvbmRhcnkgVkJMQU5LICovCiAJdW5zaWduZWQgaW50IHZibF9wZW5kaW5nOwogCXNwaW5sb2NrX3QgdGFza2xldF9sb2NrOwkvKio8IEZvciBkcm1fbG9ja2VkX3Rhc2tsZXQgKi8KIAl2b2lkICgqbG9ja2VkX3Rhc2tsZXRfZnVuYykoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC03MzksNyArNzI5LDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBidWZfcmVhZGVyczsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyB0byByZWFkICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgYnVmX3dyaXRlcnM7CS8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgdG8gY3R4IHN3aXRjaCAqLwogCi0JZHJtX2FncF9oZWFkX3QgKmFncDsJLyoqPCBBR1AgZGF0YSAqLworCXN0cnVjdCBkcm1fYWdwX2hlYWQgKmFncDsJLyoqPCBBR1AgZGF0YSAqLwogCiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CQkvKio8IFBDSSBkZXZpY2Ugc3RydWN0dXJlICovCiAJaW50IHBjaV92ZW5kb3I7CQkJLyoqPCBQQ0kgdmVuZG9yIGlkICovCkBAIC03NDcsMjYgKzczNywyMyBAQAogI2lmZGVmIF9fYWxwaGFfXwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKICNlbmRpZgotCWRybV9zZ19tZW1fdCAqc2c7CS8qKjwgU2NhdHRlciBnYXRoZXIgbWVtb3J5ICovCisJc3RydWN0IGRybV9zZ19tZW0gKnNnOwkvKio8IFNjYXR0ZXIgZ2F0aGVyIG1lbW9yeSAqLwogCXVuc2lnbmVkIGxvbmcgKmN0eF9iaXRtYXA7CS8qKjwgY29udGV4dCBiaXRtYXAgKi8KIAl2b2lkICpkZXZfcHJpdmF0ZTsJCS8qKjwgZGV2aWNlIHByaXZhdGUgZGF0YSAqLwotCWRybV9zaWdkYXRhX3Qgc2lnZGF0YTsJICAgLyoqPCBGb3IgYmxvY2tfYWxsX3NpZ25hbHMgKi8KKwlzdHJ1Y3QgZHJtX3NpZ2RhdGEgc2lnZGF0YTsJICAgLyoqPCBGb3IgYmxvY2tfYWxsX3NpZ25hbHMgKi8KIAlzaWdzZXRfdCBzaWdtYXNrOwogCiAJc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcjsKIAlkcm1fbG9jYWxfbWFwX3QgKmFncF9idWZmZXJfbWFwOwogCXVuc2lnbmVkIGludCBhZ3BfYnVmZmVyX3Rva2VuOwotCWRybV9oZWFkX3QgcHJpbWFyeTsJCS8qKjwgcHJpbWFyeSBzY3JlZW4gaGVhZCAqLworCXN0cnVjdCBkcm1faGVhZCBwcmltYXJ5OwkJLyoqPCBwcmltYXJ5IHNjcmVlbiBoZWFkICovCiAKIAkvKiogXG5hbWUgRHJhd2FibGUgaW5mb3JtYXRpb24gKi8KIAkvKkB7ICovCiAJc3BpbmxvY2tfdCBkcndfbG9jazsKLQl1bnNpZ25lZCBpbnQgZHJ3X2JpdGZpZWxkX2xlbmd0aDsKLQl1MzIgKmRyd19iaXRmaWVsZDsKLQl1bnNpZ25lZCBpbnQgZHJ3X2luZm9fbGVuZ3RoOwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKipkcndfaW5mbzsKKwlzdHJ1Y3QgaWRyIGRyd19pZHI7CiAJLypAfSAqLwotfSBkcm1fZGV2aWNlX3Q7Cit9OwogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgIGludCBmZWF0dXJlKQpAQCAtODM4LDcgKzgyNSw3IEBACiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGxvbmcgZHJtX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqZGV2KTsKK2V4dGVybiBpbnQgZHJtX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCQkJCS8qIERldmljZSBzdXBwb3J0IChkcm1fZm9wcy5oKSAqLwogZXh0ZXJuIGludCBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CkBAIC04NTcsNyArODQ0LDcgQEAKIAkJCWludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiBleHRlcm4gdm9pZCAqZHJtX3JlYWxsb2Modm9pZCAqb2xkcHQsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpOwogCi1leHRlcm4gRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3AoZHJtX2RldmljZV90ICogZGV2LCBpbnQgcGFnZXMsIHUzMiB0eXBlKTsKK2V4dGVybiBEUk1fQUdQX01FTSAqZHJtX2FsbG9jX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGFnZXMsIHUzMiB0eXBlKTsKIGV4dGVybiBpbnQgZHJtX2ZyZWVfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlLCBpbnQgcGFnZXMpOwogZXh0ZXJuIGludCBkcm1fYmluZF9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIHVuc2lnbmVkIGludCBzdGFydCk7CiBleHRlcm4gaW50IGRybV91bmJpbmRfYWdwKERSTV9BR1BfTUVNICogaGFuZGxlKTsKQEAgLTg5Niw5ICs4ODMsOSBAQAogZXh0ZXJuIGludCBkcm1fcm1jdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCi1leHRlcm4gaW50IGRybV9jdHhiaXRtYXBfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fY3R4Yml0bWFwX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY3R4X2hhbmRsZSk7CitleHRlcm4gaW50IGRybV9jdHhiaXRtYXBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9jdHhiaXRtYXBfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9jdHhiaXRtYXBfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3R4X2hhbmRsZSk7CiAKIGV4dGVybiBpbnQgZHJtX3NldHNhcmVhY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwpAQCAtOTEyLDggKzg5OSw5IEBACiAJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGRybV9kcmF3YWJsZV9pbmZvX3QgKmRybV9nZXRfZHJhd2FibGVfaW5mbyhkcm1fZGV2aWNlX3QgKmRldiwKK2V4dGVybiBzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmRybV9nZXRfZHJhd2FibGVfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkJICBkcm1fZHJhd2FibGVfdCBpZCk7CitleHRlcm4gdm9pZCBkcm1fZHJhd2FibGVfZnJlZV9hbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIAkJCQkvKiBBdXRoZW50aWNhdGlvbiBJT0NUTCBzdXBwb3J0IChkcm1fYXV0aC5oKSAqLwogZXh0ZXJuIGludCBkcm1fZ2V0bWFnaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC05MjYsMTAgKzkxNCwxMCBAQAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBkcm1fdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9sb2NrX3Rha2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KTsKLWV4dGVybiBpbnQgZHJtX2xvY2tfZnJlZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpOwotZXh0ZXJuIHZvaWQgZHJtX2lkbGVsb2NrX3Rha2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEpOwotZXh0ZXJuIHZvaWQgZHJtX2lkbGVsb2NrX3JlbGVhc2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEpOworZXh0ZXJuIGludCBkcm1fbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgZHJtX2xvY2tfZnJlZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCk7CitleHRlcm4gdm9pZCBkcm1faWRsZWxvY2tfdGFrZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhKTsKK2V4dGVybiB2b2lkIGRybV9pZGxlbG9ja19yZWxlYXNlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpOwogCiAvKgogICogVGhlc2UgYXJlIGV4cG9ydGVkIHRvIGRyaXZlcnMgc28gdGhhdCB0aGV5IGNhbiBpbXBsZW1lbnQgZmVuY2luZyB1c2luZwpAQCAtOTQwLDE1ICs5MjgsMTUgQEAKIGV4dGVybiBpbnQgZHJtX2tlcm5lbF90YWtlX2h3X2xvY2soc3RydWN0IGZpbGUgKmZpbHApOwogCiAJCQkJLyogQnVmZmVyIG1hbmFnZW1lbnQgc3VwcG9ydCAoZHJtX2J1ZnMuaCkgKi8KLWV4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfYWdwKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KTsKLWV4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfcGNpKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KTsKLWV4dGVybiBpbnQgZHJtX2FkZG1hcChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JCSAgICAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAotCQkgICAgICBkcm1fbWFwX2ZsYWdzX3QgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKiBtYXBfcHRyKTsKK2V4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FkZGJ1ZnNfcGNpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FkZG1hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZW51bSBkcm1fbWFwX3R5cGUgdHlwZSwKKwkJICAgICAgZW51bSBkcm1fbWFwX2ZsYWdzIGZsYWdzLCBkcm1fbG9jYWxfbWFwX3QgKiogbWFwX3B0cik7CiBleHRlcm4gaW50IGRybV9hZGRtYXBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fcm1tYXAoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApOwotZXh0ZXJuIGludCBkcm1fcm1tYXBfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2xvY2FsX21hcF90ICogbWFwKTsKK2V4dGVybiBpbnQgZHJtX3JtbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqIG1hcCk7CitleHRlcm4gaW50IGRybV9ybW1hcF9sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2FsX21hcF90ICogbWFwKTsKIGV4dGVybiBpbnQgZHJtX3JtbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCkBAIC05NjMsNTYgKzk1MSw1NiBAQAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBkcm1fbWFwYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9zdGFydChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgdW5zaWduZWQgaW50IHJlc291cmNlKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgdW5zaWduZWQgaW50IHJlc291cmNlKTsKIAogCQkJCS8qIERNQSBzdXBwb3J0IChkcm1fZG1hLmgpICovCi1leHRlcm4gaW50IGRybV9kbWFfc2V0dXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9kbWFfdGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9mcmVlX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1Zik7Ci1leHRlcm4gdm9pZCBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IGRybV9kbWFfc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2ZyZWVfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKTsKK2V4dGVybiB2b2lkIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIAkJCQkvKiBJUlEgc3VwcG9ydCAoZHJtX2lycS5oKSAqLwogZXh0ZXJuIGludCBkcm1fY29udHJvbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBkcm1faXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiBpbnQgZHJtX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBpbnQgZHJtX3dhaXRfdmJsYW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnZibF9zZXEpOwotZXh0ZXJuIHZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9sb2NrZWRfdGFza2xldChkcm1fZGV2aWNlX3QgKmRldiwgdm9pZCgqZnVuYykoZHJtX2RldmljZV90KikpOworZXh0ZXJuIGludCBkcm1fdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICp2Ymxfc2VxKTsKK2V4dGVybiB2b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQoKmZ1bmMpKHN0cnVjdCBkcm1fZGV2aWNlKikpOwogCiAJCQkJLyogQUdQL0dBUlQgc3VwcG9ydCAoZHJtX2FncHN1cHBvcnQuaCkgKi8KLWV4dGVybiBkcm1fYWdwX2hlYWRfdCAqZHJtX2FncF9pbml0KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IGRybV9hZ3BfYWNxdWlyZShkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHN0cnVjdCBkcm1fYWdwX2hlYWQgKmRybV9hZ3BfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZHJtX2FncF9hY3F1aXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBkcm1fYWdwX2FjcXVpcmVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGRybV9hZ3BfcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgZHJtX2FncF9yZWxlYXNlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfZW5hYmxlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9tb2RlX3QgbW9kZSk7CitleHRlcm4gaW50IGRybV9hZ3BfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX21vZGUgbW9kZSk7CiBleHRlcm4gaW50IGRybV9hZ3BfZW5hYmxlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9pbmZvKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9pbmZvX3QgKiBpbmZvKTsKK2V4dGVybiBpbnQgZHJtX2FncF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2luZm8gKiBpbmZvKTsKIGV4dGVybiBpbnQgZHJtX2FncF9pbmZvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2FsbG9jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgKnJlcXVlc3QpOwogZXh0ZXJuIGludCBkcm1fYWdwX2FsbG9jX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9mcmVlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciAqcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZ3BfZnJlZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF91bmJpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KTsKK2V4dGVybiBpbnQgZHJtX2FncF91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYmluZGluZyAqcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZ3BfdW5iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYmluZGluZyAqcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZ3BfYmluZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBEUk1fQUdQX01FTSAqZHJtX2FncF9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLApAQCAtMTAyNCwxNiArMTAxMiwxOCBAQAogCQkJCS8qIFN0dWIgc3VwcG9ydCAoZHJtX3N0dWIuaCkgKi8KIGV4dGVybiBpbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCSAgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKLWV4dGVybiBpbnQgZHJtX3B1dF9kZXYoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgZHJtX3B1dF9oZWFkKGRybV9oZWFkX3QgKiBoZWFkKTsKK2V4dGVybiBpbnQgZHJtX3B1dF9kZXYoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGRybV9wdXRfaGVhZChzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBkcm1fZGVidWc7CiBleHRlcm4gdW5zaWduZWQgaW50IGRybV9jYXJkc19saW1pdDsKLWV4dGVybiBkcm1faGVhZF90ICoqZHJtX2hlYWRzOworZXh0ZXJuIHN0cnVjdCBkcm1faGVhZCAqKmRybV9oZWFkczsKIGV4dGVybiBzdHJ1Y3QgY2xhc3MgKmRybV9jbGFzczsKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRybV9wcm9jX3Jvb3Q7CiAKK2V4dGVybiBkcm1fbG9jYWxfbWFwX3QgKmRybV9nZXRzYXJlYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwogCQkJCS8qIFByb2Mgc3VwcG9ydCAoZHJtX3Byb2MuaCkgKi8KLWV4dGVybiBpbnQgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gaW50IGRybV9wcm9jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSBpbnQgbWlub3IsCiAJCQkgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LAogCQkJIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKmRldl9yb290KTsKQEAgLTEwNDIsNDUgKzEwMzIsNDUgQEAKIAkJCSAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290KTsKIAogCQkJCS8qIFNjYXR0ZXIgR2F0aGVyIFN1cHBvcnQgKGRybV9zY2F0dGVyLmgpICovCi1leHRlcm4gdm9pZCBkcm1fc2dfY2xlYW51cChkcm1fc2dfbWVtX3QgKiBlbnRyeSk7CitleHRlcm4gdm9pZCBkcm1fc2dfY2xlYW51cChzdHJ1Y3QgZHJtX3NnX21lbSAqIGVudHJ5KTsKIGV4dGVybiBpbnQgZHJtX3NnX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBkcm1fc2dfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogCQkJICAgICAgIC8qIEFUSSBQQ0lHQVJUIHN1cHBvcnQgKGF0aV9wY2lnYXJ0LmgpICovCi1leHRlcm4gaW50IGRybV9hdGlfcGNpZ2FydF9pbml0KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQlkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbyk7Ci1leHRlcm4gaW50IGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbyk7CitleHRlcm4gaW50IGRybV9hdGlfcGNpZ2FydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKTsKK2V4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKiBnYXJ0X2luZm8pOwogCi1leHRlcm4gZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIHNpemVfdCBzaXplLAorZXh0ZXJuIGRybV9kbWFfaGFuZGxlX3QgKmRybV9wY2lfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiAJCQkJICAgICAgIHNpemVfdCBhbGlnbiwgZG1hX2FkZHJfdCBtYXhhZGRyKTsKLWV4dGVybiB2b2lkIF9fZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpOwotZXh0ZXJuIHZvaWQgZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpOworZXh0ZXJuIHZvaWQgX19kcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpOworZXh0ZXJuIHZvaWQgZHJtX3BjaV9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKTsKIAogCQkJICAgICAgIC8qIHN5c2ZzIHN1cHBvcnQgKGRybV9zeXNmcy5jKSAqLwogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqZHJtX3N5c2ZzX2NyZWF0ZShzdHJ1Y3QgbW9kdWxlICpvd25lciwgY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGVzdHJveShzdHJ1Y3QgY2xhc3MgKmNzKTsKIGV4dGVybiBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgY2xhc3MgKmNzLAotCQkJCQkJIGRybV9oZWFkX3QgKmhlYWQpOworCQkJCQkJIHN0cnVjdCBkcm1faGVhZCAqaGVhZCk7CiBleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpOwogCiAvKgogICogQmFzaWMgbWVtb3J5IG1hbmFnZXIgc3VwcG9ydCAoZHJtX21tLmMpCiAgKi8KLWV4dGVybiBkcm1fbW1fbm9kZV90ICpkcm1fbW1fZ2V0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBwYXJlbnQsCitleHRlcm4gc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fZ2V0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqIHBhcmVudCwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQpOwotdm9pZCBkcm1fbW1fcHV0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBjdXIpOwotZXh0ZXJuIGRybV9tbV9ub2RlX3QgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK3ZvaWQgZHJtX21tX3B1dF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBjdXIpOworZXh0ZXJuIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCSB1bnNpZ25lZCBhbGlnbm1lbnQsIGludCBiZXN0X21hdGNoKTsKLWV4dGVybiBpbnQgZHJtX21tX2luaXQoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgZHJtX21tX3Rha2Vkb3duKGRybV9tbV90ICptbSk7Ci1leHRlcm4gaW50IGRybV9tbV9jbGVhbihkcm1fbW1fdCAqbW0pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2UoZHJtX21tX3QgKm1tKTsKLWV4dGVybiBpbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIGludCBkcm1fbW1fYWRkX3NwYWNlX3RvX3RhaWwoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBkcm1fbW1faW5pdChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIGRybV9tbV90YWtlZG93bihzdHJ1Y3QgZHJtX21tICptbSk7CitleHRlcm4gaW50IGRybV9tbV9jbGVhbihzdHJ1Y3QgZHJtX21tICptbSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShzdHJ1Y3QgZHJtX21tICptbSk7CitleHRlcm4gaW50IGRybV9tbV9yZW1vdmVfc3BhY2VfZnJvbV90YWlsKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBkcm1fbW1fYWRkX3NwYWNlX3RvX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKIGV4dGVybiB2b2lkIGRybV9jb3JlX2lvcmVtYXAoc3RydWN0IGRybV9tYXAgKm1hcCwgc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBkcm1fY29yZV9pb3JlbWFwZnJlZShzdHJ1Y3QgZHJtX21hcCAqbWFwLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTEwODgsMTQgKzEwNzgsMTQgQEAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBkcm1fbWFwICpkcm1fY29yZV9maW5kbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgICB1bnNpZ25lZCBpbnQgdG9rZW4pCiB7Ci0JZHJtX21hcF9saXN0X3QgKl9lbnRyeTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCkKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpfZW50cnk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpCiAJICAgIGlmIChfZW50cnktPnVzZXJfdG9rZW4gPT0gdG9rZW4pCiAJCXJldHVybiBfZW50cnktPm1hcDsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBfX2lubGluZV9fIGludCBkcm1fZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWlmIChkZXYtPmRyaXZlci0+ZGV2aWNlX2lzX2FncCAhPSBOVUxMKSB7CiAJCWludCBlcnIgPSAoKmRldi0+ZHJpdmVyLT5kZXZpY2VfaXNfYWdwKSAoZGV2KTsKQEAgLTExMDgsNyArMTA5OCw3IEBACiAJcmV0dXJuIHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LT5wZGV2LCBQQ0lfQ0FQX0lEX0FHUCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBkcm1fZGV2aWNlX2lzX3BjaWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfcGNpZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXJldHVybiBwY2lfZmluZF9jYXBhYmlsaXR5KGRldi0+cGRldiwgUENJX0NBUF9JRF9FWFApOwogfQpAQCAtMTE0Myw3ICsxMTMzLDcgQEAKIAogLypAfSovCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKGRybV9tYXBfdCAqIG1hcCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhzdHJ1Y3QgZHJtX21hcCAqIG1hcCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfcmVnX29mcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYwppbmRleCA0MGJmZDliLi4zNTRmMGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCkBAIC00OCw3ICs0OCw3IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBpbml0aWFsaXplZCBhbmQgYWNxdWlyZWQgYW5kIGZpbGxzIGluIHRoZQogICogZHJtX2FncF9pbmZvIHN0cnVjdHVyZSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBpbiBkcm1fYWdwX2hlYWQ6OmFncF9pbmZvLgogICovCi1pbnQgZHJtX2FncF9pbmZvKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9pbmZvX3QgKiBpbmZvKQoraW50IGRybV9hZ3BfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9pbmZvICppbmZvKQogewogCURSTV9BR1BfS0VSTiAqa2VybjsKIApAQCAtNzQsMTYgKzc0LDE2IEBACiBpbnQgZHJtX2FncF9pbmZvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2luZm9fdCBpbmZvOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX2luZm8gaW5mbzsKIAlpbnQgZXJyOwogCiAJZXJyID0gZHJtX2FncF9pbmZvKGRldiwgJmluZm8pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoY29weV90b191c2VyKChkcm1fYWdwX2luZm9fdCBfX3VzZXIgKikgYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZHJtX2FncF9pbmZvIF9fdXNlciAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTk3LDcgKzk3LDcgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhc24ndCBiZWVuIGFjcXVpcmVkIGJlZm9yZSBhbmQgY2FsbHMKICAqIFxjIGFncF9iYWNrZW5kX2FjcXVpcmUuCiAgKi8KLWludCBkcm1fYWdwX2FjcXVpcmUoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9hZ3BfYWNxdWlyZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoIWRldi0+YWdwKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEyNiw5ICsxMjYsOSBAQAogaW50IGRybV9hZ3BfYWNxdWlyZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKLQlyZXR1cm4gZHJtX2FncF9hY3F1aXJlKChkcm1fZGV2aWNlX3QgKikgcHJpdi0+aGVhZC0+ZGV2KTsKKwlyZXR1cm4gZHJtX2FncF9hY3F1aXJlKChzdHJ1Y3QgZHJtX2RldmljZSAqKSBwcml2LT5oZWFkLT5kZXYpOwogfQogCiAvKioKQEAgLTEzOSw3ICsxMzksNyBAQAogICoKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhcyBiZWVuIGFjcXVpcmVkIGFuZCBjYWxscyBcYyBhZ3BfYmFja2VuZF9yZWxlYXNlLgogICovCi1pbnQgZHJtX2FncF9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fYWdwX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1Miw4ICsxNTIsOCBAQAogaW50IGRybV9hZ3BfcmVsZWFzZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCXJldHVybiBkcm1fYWdwX3JlbGVhc2UoZGV2KTsKIH0KQEAgLTE2OCw3ICsxNjgsNyBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgYnV0IG5vdCBlbmFibGVkLCBhbmQgY2FsbHMKICAqIFxjIGFncF9lbmFibGUuCiAgKi8KLWludCBkcm1fYWdwX2VuYWJsZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9hZ3BfbW9kZV90IG1vZGUpCitpbnQgZHJtX2FncF9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYWdwX21vZGUgbW9kZSkKIHsKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YWNxdWlyZWQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg1LDExICsxODUsMTEgQEAKIGludCBkcm1fYWdwX2VuYWJsZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfbW9kZV90IG1vZGU7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCAoZHJtX2FncF9tb2RlX3QgX191c2VyICopIGFyZywgc2l6ZW9mKG1vZGUpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIChzdHJ1Y3QgZHJtX2FncF9tb2RlIF9fdXNlciAqKSBhcmcsIHNpemVvZihtb2RlKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIGRybV9hZ3BfZW5hYmxlKGRldiwgbW9kZSk7CkBAIC0yMDcsOSArMjA3LDkgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGhhcyBiZWVuIGFjcXVpcmVkLCBhbGxvY2F0ZXMgdGhlCiAgKiBtZW1vcnkgdmlhIGFsbG9jX2FncCgpIGFuZCBjcmVhdGVzIGEgZHJtX2FncF9tZW0gZW50cnkgZm9yIGl0LgogICovCi1pbnQgZHJtX2FncF9hbGxvYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9idWZmZXJfdCAqcmVxdWVzdCkKK2ludCBkcm1fYWdwX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciAqcmVxdWVzdCkKIHsKLQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCURSTV9BR1BfTUVNICptZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1MzIgdHlwZTsKQEAgLTIzMiwxMSArMjMyLDcgQEAKIAllbnRyeS0+bWVtb3J5ID0gbWVtb3J5OwogCWVudHJ5LT5ib3VuZCA9IDA7CiAJZW50cnktPnBhZ2VzID0gcGFnZXM7Ci0JZW50cnktPnByZXYgPSBOVUxMOwotCWVudHJ5LT5uZXh0ID0gZGV2LT5hZ3AtPm1lbW9yeTsKLQlpZiAoZGV2LT5hZ3AtPm1lbW9yeSkKLQkJZGV2LT5hZ3AtPm1lbW9yeS0+cHJldiA9IGVudHJ5OwotCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeTsKKwlsaXN0X2FkZCgmZW50cnktPmhlYWQsICZkZXYtPmFncC0+bWVtb3J5KTsKIAogCXJlcXVlc3QtPmhhbmRsZSA9IGVudHJ5LT5oYW5kbGU7CiAJcmVxdWVzdC0+cGh5c2ljYWwgPSBtZW1vcnktPnBoeXNpY2FsOwpAQCAtMjQ4LDEwICsyNDQsMTAgQEAKIGludCBkcm1fYWdwX2FsbG9jX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7Ci0JZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIHJlcXVlc3Q7CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQpAQCAtMjYyLDEwICsyNTgsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSkpIHsKLQkJZHJtX2FncF9tZW1fdCAqZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OwotCi0JCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeS0+bmV4dDsKLQkJZGV2LT5hZ3AtPm1lbW9yeS0+cHJldiA9IE5VTEw7CisJCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKSB7CisJCQlpZiAoZW50cnktPmhhbmRsZSA9PSByZXF1ZXN0LmhhbmRsZSkKKwkJCQlicmVhazsKKwkJfQorCQlsaXN0X2RlbCgmZW50cnktPmhlYWQpOwogCQlkcm1fZnJlZV9hZ3AoZW50cnktPm1lbW9yeSwgZW50cnktPnBhZ2VzKTsKIAkJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yODMsMTIgKzI4MSwxMiBAQAogICoKICAqIFdhbGtzIHRocm91Z2ggZHJtX2FncF9oZWFkOjptZW1vcnkgdW50aWwgZmluZGluZyBhIG1hdGNoaW5nIGhhbmRsZS4KICAqLwotc3RhdGljIGRybV9hZ3BfbWVtX3QgKmRybV9hZ3BfbG9va3VwX2VudHJ5KGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBzdHJ1Y3QgZHJtX2FncF9tZW0gKmRybV9hZ3BfbG9va3VwX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgICB1bnNpZ25lZCBsb25nIGhhbmRsZSkKIHsKLQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCi0JZm9yIChlbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJaWYgKGVudHJ5LT5oYW5kbGUgPT0gaGFuZGxlKQogCQkJcmV0dXJuIGVudHJ5OwogCX0KQEAgLTMwNyw5ICszMDUsOSBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgYWNxdWlyZWQsIGxvb2tzLXVwIHRoZSBBR1AgbWVtb3J5CiAgKiBlbnRyeSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB1bmJpbmRfYWdwKCkgZnVuY3Rpb24uCiAgKi8KLWludCBkcm1fYWdwX3VuYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpCitpbnQgZHJtX2FncF91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYmluZGluZyAqcmVxdWVzdCkKIHsKLQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCWludCByZXQ7CiAKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YWNxdWlyZWQpCkBAIC0zMjgsMTIgKzMyNiwxMiBAQAogaW50IGRybV9hZ3BfdW5iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9iaW5kaW5nX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHJlcXVlc3Q7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkgICAgKCZyZXF1ZXN0LCAoc3RydWN0IGRybV9hZ3BfYmluZGluZyBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiBkcm1fYWdwX3VuYmluZChkZXYsICZyZXF1ZXN0KTsKQEAgLTM1Miw5ICszNTAsOSBAQAogICogaXMgY3VycmVudGx5IGJvdW5kIGludG8gdGhlIEdBVFQuIExvb2tzLXVwIHRoZSBBR1AgbWVtb3J5IGVudHJ5IGFuZCBwYXNzZXMKICAqIGl0IHRvIGJpbmRfYWdwKCkgZnVuY3Rpb24uCiAgKi8KLWludCBkcm1fYWdwX2JpbmQoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYmluZGluZ190ICpyZXF1ZXN0KQoraW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJaW50IHJldGNvZGU7CiAJaW50IHBhZ2U7CiAKQEAgLTM3NywxMiArMzc1LDEyIEBACiBpbnQgZHJtX2FncF9iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2JpbmRpbmdfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgcmVxdWVzdDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgotCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCSAgICAoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIGRybV9hZ3BfYmluZChkZXYsICZyZXF1ZXN0KTsKQEAgLTQwMiw5ICs0MDAsOSBAQAogICogdW5iaW5kX2FncCgpLiBGcmVlcyBpdCB2aWEgZnJlZV9hZ3AoKSBhcyB3ZWxsIGFzIHRoZSBlbnRyeSBpdHNlbGYKICAqIGFuZCB1bmxpbmtzIGZyb20gdGhlIGRvdWJseSBsaW5rZWQgbGlzdCBpdCdzIGluc2VydGVkIGluLgogICovCi1pbnQgZHJtX2FncF9mcmVlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KQoraW50IGRybV9hZ3BfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgKnJlcXVlc3QpCiB7Ci0JZHJtX2FncF9tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MTMsMTMgKzQxMSw3IEBACiAJaWYgKGVudHJ5LT5ib3VuZCkKIAkJZHJtX3VuYmluZF9hZ3AoZW50cnktPm1lbW9yeSk7CiAKLQlpZiAoZW50cnktPnByZXYpCi0JCWVudHJ5LT5wcmV2LT5uZXh0ID0gZW50cnktPm5leHQ7Ci0JZWxzZQotCQlkZXYtPmFncC0+bWVtb3J5ID0gZW50cnktPm5leHQ7Ci0KLQlpZiAoZW50cnktPm5leHQpCi0JCWVudHJ5LT5uZXh0LT5wcmV2ID0gZW50cnktPnByZXY7CisJbGlzdF9kZWwoJmVudHJ5LT5oZWFkKTsKIAogCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOwogCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CkBAIC00MzAsMTIgKzQyMiwxMiBAQAogaW50IGRybV9hZ3BfZnJlZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9idWZmZXJfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciByZXF1ZXN0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCi0JICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYnVmZmVyX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkgICAgKCZyZXF1ZXN0LCAoc3RydWN0IGRybV9hZ3BfYnVmZmVyIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIGRybV9hZ3BfZnJlZShkZXYsICZyZXF1ZXN0KTsKQEAgLTQ1MCw5ICs0NDIsOSBAQAogICogdmlhIHRoZSBpbnRlcl9tb2R1bGVfKiBmdW5jdGlvbnMuIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgZHJtX2FncF9oZWFkCiAgKiBzdHJ1Y3R1cmUuCiAgKi8KLWRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICogZGV2KQorc3RydWN0IGRybV9hZ3BfaGVhZCAqZHJtX2FncF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX2FncF9oZWFkX3QgKmhlYWQgPSBOVUxMOworCXN0cnVjdCBkcm1fYWdwX2hlYWQgKmhlYWQgPSBOVUxMOwogCiAJaWYgKCEoaGVhZCA9IGRybV9hbGxvYyhzaXplb2YoKmhlYWQpLCBEUk1fTUVNX0FHUExJU1RTKSkpCiAJCXJldHVybiBOVUxMOwpAQCAtNDcyLDcgKzQ2NCw3IEBACiAJCWRybV9mcmVlKGhlYWQsIHNpemVvZigqaGVhZCksIERSTV9NRU1fQUdQTElTVFMpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaGVhZC0+bWVtb3J5ID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmaGVhZC0+bWVtb3J5KTsKIAloZWFkLT5jYW50X3VzZV9hcGVydHVyZSA9IGhlYWQtPmFncF9pbmZvLmNhbnRfdXNlX2FwZXJ0dXJlOwogCWhlYWQtPnBhZ2VfbWFzayA9IGhlYWQtPmFncF9pbmZvLnBhZ2VfbWFzazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCmluZGV4IGM3YjE5ZDMuLjdmNzc3ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKQEAgLTQ1LDE1ICs0NSwxNSBAQAogICogdGhlIG9uZSB3aXRoIG1hdGNoaW5nIG1hZ2ljIG51bWJlciwgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4CiAgKiBsb2NrLgogICovCi1zdGF0aWMgZHJtX2ZpbGVfdCAqZHJtX2ZpbmRfZmlsZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tYWdpY190IG1hZ2ljKQorc3RhdGljIHN0cnVjdCBkcm1fZmlsZSAqZHJtX2ZpbmRfZmlsZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCiB7Ci0JZHJtX2ZpbGVfdCAqcmV0dmFsID0gTlVMTDsKLQlkcm1fbWFnaWNfZW50cnlfdCAqcHQ7Ci0JZHJtX2hhc2hfaXRlbV90ICpoYXNoOworCXN0cnVjdCBkcm1fZmlsZSAqcmV0dmFsID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpwdDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoIWRybV9odF9maW5kX2l0ZW0oJmRldi0+bWFnaWNsaXN0LCAodW5zaWduZWQgbG9uZyltYWdpYywgJmhhc2gpKSB7Ci0JCXB0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgZHJtX21hZ2ljX2VudHJ5X3QsIGhhc2hfaXRlbSk7CisJCXB0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IGRybV9tYWdpY19lbnRyeSwgaGFzaF9pdGVtKTsKIAkJcmV0dmFsID0gcHQtPnByaXY7CiAJfQogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtNzEsMTAgKzcxLDEwIEBACiAgKiBhc3NvY2lhdGVkIHRoZSBtYWdpYyBudW1iZXIgaGFzaCBrZXkgaW4gZHJtX2RldmljZTo6bWFnaWNsaXN0LCB3aGlsZSBob2xkaW5nCiAgKiB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2FkZF9tYWdpYyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBwcml2LAorc3RhdGljIGludCBkcm1fYWRkX21hZ2ljKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKiBwcml2LAogCQkJIGRybV9tYWdpY190IG1hZ2ljKQogewotCWRybV9tYWdpY19lbnRyeV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICplbnRyeTsKIAogCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKIApAQCAtMTAyLDEwICsxMDIsMTAgQEAKICAqIFNlYXJjaGVzIGFuZCB1bmxpbmtzIHRoZSBlbnRyeSBpbiBkcm1fZGV2aWNlOjptYWdpY2xpc3Qgd2l0aCB0aGUgbWFnaWMKICAqIG51bWJlciBoYXNoIGtleSwgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCiAgKi8KLXN0YXRpYyBpbnQgZHJtX3JlbW92ZV9tYWdpYyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tYWdpY190IG1hZ2ljKQorc3RhdGljIGludCBkcm1fcmVtb3ZlX21hZ2ljKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKIHsKLQlkcm1fbWFnaWNfZW50cnlfdCAqcHQ7Ci0JZHJtX2hhc2hfaXRlbV90ICpoYXNoOworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKnB0OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgbWFnaWMpOwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIGRybV9tYWdpY19lbnRyeV90LCBoYXNoX2l0ZW0pOworCXB0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IGRybV9tYWdpY19lbnRyeSwgaGFzaF9pdGVtKTsKIAlkcm1faHRfcmVtb3ZlX2l0ZW0oJmRldi0+bWFnaWNsaXN0LCBoYXNoKTsKIAlsaXN0X2RlbCgmcHQtPmhlYWQpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMTQyLDkgKzE0Miw5IEBACiB7CiAJc3RhdGljIGRybV9tYWdpY190IHNlcXVlbmNlID0gMDsKIAlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2F1dGhfdCBhdXRoOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYXV0aCBhdXRoOwogCiAJLyogRmluZCB1bmlxdWUgbWFnaWMgKi8KIAlpZiAocHJpdi0+bWFnaWMpIHsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCX0KIAogCURSTV9ERUJVRygiJXVcbiIsIGF1dGgubWFnaWMpOwotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9hdXRoX3QgX191c2VyICopIGFyZywgJmF1dGgsIHNpemVvZihhdXRoKSkpCisJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGRybV9hdXRoIF9fdXNlciAqKSBhcmcsICZhdXRoLCBzaXplb2YoYXV0aCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MSwxMiArMTgxLDEyIEBACiBpbnQgZHJtX2F1dGhtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hdXRoX3QgYXV0aDsKLQlkcm1fZmlsZV90ICpmaWxlOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYXV0aCBhdXRoOworCXN0cnVjdCBkcm1fZmlsZSAqZmlsZTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aCwgKGRybV9hdXRoX3QgX191c2VyICopIGFyZywgc2l6ZW9mKGF1dGgpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmF1dGgsIChzdHJ1Y3QgZHJtX2F1dGggX191c2VyICopIGFyZywgc2l6ZW9mKGF1dGgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC5tYWdpYyk7CiAJaWYgKChmaWxlID0gZHJtX2ZpbmRfZmlsZShkZXYsIGF1dGgubWFnaWMpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCmluZGV4IGMxMTM0NTguLjkyMzE3NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKQEAgLTM2LDI2ICszNiwyNCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAKLXVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9zdGFydChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQordW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKIHsKIAlyZXR1cm4gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgcmVzb3VyY2UpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KTsKIAotdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQordW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX2xlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCiB7CiAJcmV0dXJuIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCByZXNvdXJjZSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZHJtX2dldF9yZXNvdXJjZV9sZW4pOwogCi1zdGF0aWMgZHJtX21hcF9saXN0X3QgKmRybV9maW5kX21hdGNoaW5nX21hcChkcm1fZGV2aWNlX3QgKmRldiwKK3N0YXRpYyBzdHJ1Y3QgZHJtX21hcF9saXN0ICpkcm1fZmluZF9tYXRjaGluZ19tYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICAgICBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCWRybV9tYXBfbGlzdF90ICplbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmVudHJ5OworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKGVudHJ5LT5tYXAgJiYgbWFwLT50eXBlID09IGVudHJ5LT5tYXAtPnR5cGUgJiYKIAkJICAgICgoZW50cnktPm1hcC0+b2Zmc2V0ID09IG1hcC0+b2Zmc2V0KSB8fAogCQkgICAgIChtYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYgbWFwLT5mbGFncz09X0RSTV9DT05UQUlOU19MT0NLKSkpIHsKQEAgLTY2LDcgKzY0LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBkcm1fbWFwX2hhbmRsZShkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2hhc2hfaXRlbV90ICpoYXNoLAorc3RhdGljIGludCBkcm1fbWFwX2hhbmRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaCwKIAkJCSAgdW5zaWduZWQgbG9uZyB1c2VyX3Rva2VuLCBpbnQgaGFzaGVkX2hhbmRsZSkKIHsKIAlpbnQgdXNlX2hhc2hlZF9oYW5kbGU7CkBAIC0xMDMsMTIgKzEwMSwxMyBAQAogICogdHlwZS4gIEFkZHMgdGhlIG1hcCB0byB0aGUgbWFwIGxpc3QgZHJtX2RldmljZTo6bWFwbGlzdC4gQWRkcyBNVFJSJ3Mgd2hlcmUKICAqIGFwcGxpY2FibGUgYW5kIGlmIHN1cHBvcnRlZCBieSB0aGUga2VybmVsLgogICovCi1zdGF0aWMgaW50IGRybV9hZGRtYXBfY29yZShkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZHJtX21hcF90eXBlX3QgdHlwZSwKLQkJCSAgIGRybV9tYXBfZmxhZ3NfdCBmbGFncywgZHJtX21hcF9saXN0X3QgKiogbWFwbGlzdCkKK3N0YXRpYyBpbnQgZHJtX2FkZG1hcF9jb3JlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgdW5zaWduZWQgaW50IHNpemUsIGVudW0gZHJtX21hcF90eXBlIHR5cGUsCisJCQkgICBlbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3MsCisJCQkgICBzdHJ1Y3QgZHJtX21hcF9saXN0ICoqIG1hcGxpc3QpCiB7Ci0JZHJtX21hcF90ICptYXA7Ci0JZHJtX21hcF9saXN0X3QgKmxpc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0OwogCWRybV9kbWFfaGFuZGxlX3QgKmRtYWg7CiAJdW5zaWduZWQgbG9uZyB1c2VyX3Rva2VuOwogCWludCByZXQ7CkBAIC0yMTQsNyArMjEzLDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIF9EUk1fQUdQOiB7Ci0JCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCQlpbnQgdmFsaWQgPSAwOwogCiAJCWlmICghZHJtX2NvcmVfaGFzX0FHUChkZXYpKSB7CkBAIC0yMzcsMTQgKzIzNiwxNCBAQAogCQkgKiBza2lwcGVkIGFuZCB3ZSBkb3VibGUgY2hlY2sgdGhhdCBkZXYtPmFncC0+bWVtb3J5IGlzCiAJCSAqIGFjdHVhbGx5IHNldCBhcyB3ZWxsIGFzIGJlaW5nIGludmFsaWQgYmVmb3JlIEVQRVJNJ2luZwogCQkgKi8KLQkJZm9yIChlbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKSB7CiAJCQlpZiAoKG1hcC0+b2Zmc2V0ID49IGVudHJ5LT5ib3VuZCkgJiYKIAkJCSAgICAobWFwLT5vZmZzZXQgKyBtYXAtPnNpemUgPD0gZW50cnktPmJvdW5kICsgZW50cnktPnBhZ2VzICogUEFHRV9TSVpFKSkgewogCQkJCXZhbGlkID0gMTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlpZiAoZGV2LT5hZ3AtPm1lbW9yeSAmJiAhdmFsaWQpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmFncC0+bWVtb3J5KSAmJiAhdmFsaWQpIHsKIAkJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQpAQCAtMjg5LDcgKzI4OCw3IEBACiAJbGlzdC0+bWFwID0gbWFwOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWxpc3RfYWRkKCZsaXN0LT5oZWFkLCAmZGV2LT5tYXBsaXN0LT5oZWFkKTsKKwlsaXN0X2FkZCgmbGlzdC0+aGVhZCwgJmRldi0+bWFwbGlzdCk7CiAKIAkvKiBBc3NpZ24gYSAzMi1iaXQgaGFuZGxlICovCiAJLyogV2UgZG8gaXQgaGVyZSBzbyB0aGF0IGRldi0+c3RydWN0X211dGV4IHByb3RlY3RzIHRoZSBpbmNyZW1lbnQgKi8KQEAgLTMxMiwxMSArMzExLDExIEBACiAJcmV0dXJuIDA7CiAJfQogCi1pbnQgZHJtX2FkZG1hcChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JICAgICAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAotCSAgICAgICBkcm1fbWFwX2ZsYWdzX3QgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKiBtYXBfcHRyKQoraW50IGRybV9hZGRtYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJICAgICAgIHVuc2lnbmVkIGludCBzaXplLCBlbnVtIGRybV9tYXBfdHlwZSB0eXBlLAorCSAgICAgICBlbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKiBtYXBfcHRyKQogewotCWRybV9tYXBfbGlzdF90ICpsaXN0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7CiAJaW50IHJjOwogCiAJcmMgPSBkcm1fYWRkbWFwX2NvcmUoZGV2LCBvZmZzZXQsIHNpemUsIHR5cGUsIGZsYWdzLCAmbGlzdCk7CkBAIC0zMzAsMTEgKzMyOSwxMSBAQAogaW50IGRybV9hZGRtYXBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgbWFwOwotCWRybV9tYXBfbGlzdF90ICptYXBsaXN0OwotCWRybV9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKm1hcGxpc3Q7CisJc3RydWN0IGRybV9tYXAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBlcnI7CiAKIAlpZiAoIShmaWxwLT5mX21vZGUgJiAzKSkKQEAgLTM1Myw3ICszNTIsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoY29weV90b191c2VyKGFyZ3AsIG1hcGxpc3QtPm1hcCwgc2l6ZW9mKGRybV9tYXBfdCkpKQorCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbWFwbGlzdC0+bWFwLCBzaXplb2Yoc3RydWN0IGRybV9tYXApKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBhdm9pZCBhIHdhcm5pbmcgb24gNjQtYml0LCB0aGlzIGNhc3RpbmcgaXNuJ3QgdmVyeSBuaWNlLCBidXQgdGhlIEFQSSBpcyBzZXQgc28gdG9vIGxhdGUgKi8KQEAgLTM2OSw3ICszNjgsNyBAQAogICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KICAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KICAqIFxwYXJhbSBjbWQgY29tbWFuZC4KLSAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9tYXBfdCBzdHJ1Y3R1cmUuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX21hcCBzdHJ1Y3R1cmUuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgogICoKICAqIFNlYXJjaGVzIHRoZSBtYXAgb24gZHJtX2RldmljZTo6bWFwbGlzdCwgcmVtb3ZlcyBpdCBmcm9tIHRoZSBsaXN0LCBzZWUgaWYKQEAgLTM3OCwzMSArMzc3LDI2IEBACiAgKgogICogXHNhIGRybV9hZGRtYXAKICAqLwotaW50IGRybV9ybW1hcF9sb2NrZWQoZHJtX2RldmljZV90ICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQoraW50IGRybV9ybW1hcF9sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3QgPSBOVUxMLCAqbGlzdF90OwogCWRybV9kbWFfaGFuZGxlX3QgZG1haDsKKwlpbnQgZm91bmQgPSAwOwogCiAJLyogRmluZCB0aGUgbGlzdCBlbnRyeSBmb3IgdGhlIG1hcCBhbmQgcmVtb3ZlIGl0ICovCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfbGlzdCwgbGlzdF90LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcCA9PSBtYXApIHsKLQkJCWxpc3RfZGVsKGxpc3QpOworCQkJbGlzdF9kZWwoJnJfbGlzdC0+aGVhZCk7CiAJCQlkcm1faHRfcmVtb3ZlX2tleSgmZGV2LT5tYXBfaGFzaCwKIAkJCQkJICByX2xpc3QtPnVzZXJfdG9rZW4gPj4gUEFHRV9TSElGVCk7Ci0JCQlkcm1fZnJlZShsaXN0LCBzaXplb2YoKmxpc3QpLCBEUk1fTUVNX01BUFMpOworCQkJZHJtX2ZyZWUocl9saXN0LCBzaXplb2YoKnJfbGlzdCksIERSTV9NRU1fTUFQUyk7CisJCQlmb3VuZCA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCS8qIExpc3QgaGFzIHdyYXBwZWQgYXJvdW5kIHRvIHRoZSBoZWFkIHBvaW50ZXIsIG9yIGl0J3MgZW1wdHkgYW5kIHdlCi0JICogZGlkbid0IGZpbmQgYW55dGhpbmcuCi0JICovCi0JaWYgKGxpc3QgPT0gKCZkZXYtPm1hcGxpc3QtPmhlYWQpKSB7CisJaWYgKCFmb3VuZCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJc3dpdGNoIChtYXAtPnR5cGUpIHsKIAljYXNlIF9EUk1fUkVHSVNURVJTOgpAQCAtNDMzLDcgKzQyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkcm1fcm1tYXAoZHJtX2RldmljZV90ICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQoraW50IGRybV9ybW1hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKIAlpbnQgcmV0OwogCkBAIC00NTYsMjEgKzQ1MCwxOSBAQAogaW50IGRybV9ybW1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX21hcF90IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgcmVxdWVzdDsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAJaW50IHJldDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKGRybV9tYXBfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoc3RydWN0IGRybV9tYXAgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkgewogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcCAmJgogCQkgICAgcl9saXN0LT51c2VyX3Rva2VuID09ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QuaGFuZGxlICYmCiAJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX1JFTU9WQUJMRSkgewpAQCAtNDgyLDcgKzQ3NCw3IEBACiAJLyogTGlzdCBoYXMgd3JhcHBlZCBhcm91bmQgdG8gdGhlIGhlYWQgcG9pbnRlciwgb3IgaXRzIGVtcHR5IHdlIGRpZG4ndAogCSAqIGZpbmQgYW55dGhpbmcuCiAJICovCi0JaWYgKGxpc3QgPT0gKCZkZXYtPm1hcGxpc3QtPmhlYWQpKSB7CisJaWYgKGxpc3RfZW1wdHkoJmRldi0+bWFwbGlzdCkgfHwgIW1hcCkgewogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTEzLDcgKzUwNSw4IEBACiAgKgogICogRnJlZXMgYW55IHBhZ2VzIGFuZCBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZW50cnkuCiAgKi8KLXN0YXRpYyB2b2lkIGRybV9jbGVhbnVwX2J1Zl9lcnJvcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZW50cnlfdCAqIGVudHJ5KQorc3RhdGljIHZvaWQgZHJtX2NsZWFudXBfYnVmX2Vycm9yKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgc3RydWN0IGRybV9idWZfZW50cnkgKiBlbnRyeSkKIHsKIAlpbnQgaTsKIApAQCAtNTUwLDIwICs1NDMsMjAgQEAKIC8qKgogICogQWRkIEFHUCBidWZmZXJzIGZvciBETUEgdHJhbnNmZXJzLgogICoKLSAqIFxwYXJhbSBkZXYgZHJtX2RldmljZV90IHRvIHdoaWNoIHRoZSBidWZmZXJzIGFyZSB0byBiZSBhZGRlZC4KLSAqIFxwYXJhbSByZXF1ZXN0IHBvaW50ZXIgdG8gYSBkcm1fYnVmX2Rlc2NfdCBkZXNjcmliaW5nIHRoZSByZXF1ZXN0LgorICogXHBhcmFtIGRldiBzdHJ1Y3QgZHJtX2RldmljZSB0byB3aGljaCB0aGUgYnVmZmVycyBhcmUgdG8gYmUgYWRkZWQuCisgKiBccGFyYW0gcmVxdWVzdCBwb2ludGVyIHRvIGEgc3RydWN0IGRybV9idWZfZGVzYyBkZXNjcmliaW5nIHRoZSByZXF1ZXN0LgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCiAgKiBBZnRlciBzb21lIHNhbml0eSBjaGVja3MgY3JlYXRlcyBhIGRybV9idWYgc3RydWN0dXJlIGZvciBlYWNoIGJ1ZmZlciBhbmQKICAqIHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgbGlzdCBvZiB0aGUgc2FtZSBzaXplIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcKICAqIGJ1ZmZlcnMuCiAgKi8KLWludCBkcm1fYWRkYnVmc19hZ3AoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpCitpbnQgZHJtX2FkZGJ1ZnNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjICogcmVxdWVzdCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OwotCWRybV9hZ3BfbWVtX3QgKmFncF9lbnRyeTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmFncF9lbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgYWdwX29mZnNldDsKIAlpbnQgY291bnQ7CkBAIC01NzQsNyArNTY3LDcgQEAKIAlpbnQgdG90YWw7CiAJaW50IGJ5dGVfY291bnQ7CiAJaW50IGksIHZhbGlkOwotCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1ZiAqKnRlbXBfYnVmbGlzdDsKIAogCWlmICghZG1hKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwNiwxNCArNTk5LDE0IEBACiAKIAkvKiBNYWtlIHN1cmUgYnVmZmVycyBhcmUgbG9jYXRlZCBpbiBBR1AgbWVtb3J5IHRoYXQgd2Ugb3duICovCiAJdmFsaWQgPSAwOwotCWZvciAoYWdwX2VudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsgYWdwX2VudHJ5OyBhZ3BfZW50cnkgPSBhZ3BfZW50cnktPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFncF9lbnRyeSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJaWYgKChhZ3Bfb2Zmc2V0ID49IGFncF9lbnRyeS0+Ym91bmQpICYmCiAJCSAgICAoYWdwX29mZnNldCArIHRvdGFsICogY291bnQgPD0gYWdwX2VudHJ5LT5ib3VuZCArIGFncF9lbnRyeS0+cGFnZXMgKiBQQUdFX1NJWkUpKSB7CiAJCQl2YWxpZCA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoZGV2LT5hZ3AtPm1lbW9yeSAmJiAhdmFsaWQpIHsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+YWdwLT5tZW1vcnkpICYmICF2YWxpZCkgewogCQlEUk1fREVCVUcoInpvbmUgaW52YWxpZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTcyOCwyNCArNzIxLDI0IEBACiBFWFBPUlRfU1lNQk9MKGRybV9hZGRidWZzX2FncCk7CiAjZW5kaWYJCQkJLyogX19PU19IQVNfQUdQICovCiAKLWludCBkcm1fYWRkYnVmc19wY2koZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpCitpbnQgZHJtX2FkZGJ1ZnNfcGNpKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjICogcmVxdWVzdCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBjb3VudDsKIAlpbnQgb3JkZXI7CiAJaW50IHNpemU7CiAJaW50IHRvdGFsOwogCWludCBwYWdlX29yZGVyOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7CisJc3RydWN0IGRybV9idWZfZW50cnkgKmVudHJ5OwogCWRybV9kbWFfaGFuZGxlX3QgKmRtYWg7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgYWxpZ25tZW50OwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCWludCBpOwogCWludCBieXRlX2NvdW50OwogCWludCBwYWdlX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgKnRlbXBfcGFnZWxpc3Q7Ci0JZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCXN0cnVjdCBkcm1fYnVmICoqdGVtcF9idWZsaXN0OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1BDSV9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk1NCwxMSArOTQ3LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9hZGRidWZzX3BjaSk7CiAKLXN0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfc2coZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpCitzdGF0aWMgaW50IGRybV9hZGRidWZzX3NnKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjICogcmVxdWVzdCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZW50cnkgKmVudHJ5OworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OwogCWludCBjb3VudDsKQEAgLTk2OSw3ICs5NjIsNyBAQAogCWludCB0b3RhbDsKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgaTsKLQlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7CisJc3RydWN0IGRybV9idWYgKip0ZW1wX2J1Zmxpc3Q7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfU0cpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMTYsMTEgKzExMDksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcm1fYWRkYnVmc19mYihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfZmIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGFncF9vZmZzZXQ7CiAJaW50IGNvdW50OwpAQCAtMTEzMSw3ICsxMTI0LDcgQEAKIAlpbnQgdG90YWw7CiAJaW50IGJ5dGVfY291bnQ7CiAJaW50IGk7Ci0JZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCXN0cnVjdCBkcm1fYnVmICoqdGVtcF9idWZsaXN0OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0ZCX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTI4Myw3ICsxMjc2LDcgQEAKICAqIFxwYXJhbSBpbm9kZSBkZXZpY2UgaW5vZGUuCiAgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCiAgKiBccGFyYW0gY21kIGNvbW1hbmQuCi0gKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0LgorICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgc3RydWN0IGRybV9idWZfZGVzYyByZXF1ZXN0LgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCiAgKiBBY2NvcmRpbmcgd2l0aCB0aGUgbWVtb3J5IHR5cGUgc3BlY2lmaWVkIGluIGRybV9idWZfZGVzYzo6ZmxhZ3MgYW5kIHRoZQpAQCAtMTI5NCwxNSArMTI4NywxNSBAQAogaW50IGRybV9hZGRidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OwotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9idWZfZGVzYyByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXQ7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgKGRybV9idWZfZGVzY190IF9fdXNlciAqKSBhcmcsCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKikgYXJnLAogCQkJICAgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTEzNDYsMTEgKzEzMzksMTEgQEAKIGludCBkcm1faW5mb2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfaW5mb190IHJlcXVlc3Q7Ci0JZHJtX2J1Zl9pbmZvX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfaW5mbyByZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX2luZm8gX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBpOwogCWludCBjb3VudDsKIApAQCAtMTM4MSwxMCArMTM3NCwxMCBAQAogCWlmIChyZXF1ZXN0LmNvdW50ID49IGNvdW50KSB7CiAJCWZvciAoaSA9IDAsIGNvdW50ID0gMDsgaSA8IERSTV9NQVhfT1JERVIgKyAxOyBpKyspIHsKIAkJCWlmIChkbWEtPmJ1ZnNbaV0uYnVmX2NvdW50KSB7Ci0JCQkJZHJtX2J1Zl9kZXNjX3QgX191c2VyICp0byA9CisJCQkJc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKnRvID0KIAkJCQkgICAgJnJlcXVlc3QubGlzdFtjb3VudF07Ci0JCQkJZHJtX2J1Zl9lbnRyeV90ICpmcm9tID0gJmRtYS0+YnVmc1tpXTsKLQkJCQlkcm1fZnJlZWxpc3RfdCAqbGlzdCA9ICZkbWEtPmJ1ZnNbaV0uZnJlZWxpc3Q7CisJCQkJc3RydWN0IGRybV9idWZfZW50cnkgKmZyb20gPSAmZG1hLT5idWZzW2ldOworCQkJCXN0cnVjdCBkcm1fZnJlZWxpc3QgKmxpc3QgPSAmZG1hLT5idWZzW2ldLmZyZWVsaXN0OwogCQkJCWlmIChjb3B5X3RvX3VzZXIoJnRvLT5jb3VudCwKIAkJCQkJCSAmZnJvbS0+YnVmX2NvdW50LAogCQkJCQkJIHNpemVvZihmcm9tLT5idWZfY291bnQpKSB8fApAQCAtMTQzNCwxMiArMTQyNywxMiBAQAogaW50IGRybV9tYXJrYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9kZXNjX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgcmVxdWVzdDsKIAlpbnQgb3JkZXI7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0NDgsNyArMTQ0MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAotCQkJICAgKGRybV9idWZfZGVzY190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCQkgICAoc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWQsICVkLCAlZFxuIiwKQEAgLTE0ODQsMTMgKzE0NzcsMTMgQEAKIGludCBkcm1fZnJlZWJ1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZnJlZV90IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9mcmVlIHJlcXVlc3Q7CiAJaW50IGk7CiAJaW50IGlkeDsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDk5LDcgKzE0OTIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwKLQkJCSAgIChkcm1fYnVmX2ZyZWVfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCQkJICAgKHN0cnVjdCBkcm1fYnVmX2ZyZWUgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCByZXF1ZXN0LmNvdW50KTsKQEAgLTE1NDAsMTUgKzE1MzMsMTUgQEAKIGludCBkcm1fbWFwYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX21hcCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHJldGNvZGUgPSAwOwogCWNvbnN0IGludCB6ZXJvID0gMDsKIAl1bnNpZ25lZCBsb25nIHZpcnR1YWw7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCWRybV9idWZfbWFwX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9tYXAgcmVxdWVzdDsKIAlpbnQgaTsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCkBAIC0xNTc0LDcgKzE1NjcsNyBAQAogCQkJJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfU0cpKQogCQkgICAgfHwgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRkJfRE1BKQogCQkJJiYgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfRkIpKSkgewotCQkJZHJtX21hcF90ICptYXAgPSBkZXYtPmFncF9idWZmZXJfbWFwOworCQkJc3RydWN0IGRybV9tYXAgKm1hcCA9IGRldi0+YWdwX2J1ZmZlcl9tYXA7CiAJCQl1bnNpZ25lZCBsb25nIHRva2VuID0gZGV2LT5hZ3BfYnVmZmVyX3Rva2VuOwogCiAJCQlpZiAoIW1hcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCmluZGV4IDgzMDk0YzcuLjYxYWQ5ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKQEAgLTUzLDI2ICs1MywxNCBAQAogICogXHBhcmFtIGN0eF9oYW5kbGUgY29udGV4dCBoYW5kbGUuCiAgKgogICogQ2xlYXJzIHRoZSBiaXQgc3BlY2lmaWVkIGJ5IFxwIGN0eF9oYW5kbGUgaW4gZHJtX2RldmljZTo6Y3R4X2JpdG1hcCBhbmQgdGhlIGVudHJ5Ci0gKiBpbiBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4CisgKiBpbiBkcm1fZGV2aWNlOjpjdHhfaWRyLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXgKICAqIGxvY2suCiAgKi8KLXZvaWQgZHJtX2N0eGJpdG1hcF9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGN0eF9oYW5kbGUpCit2b2lkIGRybV9jdHhiaXRtYXBfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGN0eF9oYW5kbGUpCiB7Ci0JaWYgKGN0eF9oYW5kbGUgPCAwKQotCQlnb3RvIGZhaWxlZDsKLQlpZiAoIWRldi0+Y3R4X2JpdG1hcCkKLQkJZ290byBmYWlsZWQ7Ci0KLQlpZiAoY3R4X2hhbmRsZSA8IERSTV9NQVhfQ1RYQklUTUFQKSB7Ci0JCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJY2xlYXJfYml0KGN0eF9oYW5kbGUsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCWRldi0+Y29udGV4dF9zYXJlYXNbY3R4X2hhbmRsZV0gPSBOVUxMOwotCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJcmV0dXJuOwotCX0KLSAgICAgIGZhaWxlZDoKLQlEUk1fRVJST1IoIkF0dGVtcHQgdG8gZnJlZSBpbnZhbGlkIGNvbnRleHQgaGFuZGxlOiAlZFxuIiwgY3R4X2hhbmRsZSk7Ci0JcmV0dXJuOworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpZHJfcmVtb3ZlKCZkZXYtPmN0eF9pZHIsIGN0eF9oYW5kbGUpOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQogCiAvKioKQEAgLTgxLDYyICs2OSwyOCBAQAogICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgogICogXHJldHVybiAobm9uLW5lZ2F0aXZlKSBjb250ZXh0IGhhbmRsZSBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgotICogRmluZCB0aGUgZmlyc3QgemVybyBiaXQgaW4gZHJtX2RldmljZTo6Y3R4X2JpdG1hcCBhbmQgKHJlKWFsbG9jYXRlcwotICogZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMgdG8gYWNjb21tb2RhdGUgdGhlIG5ldyBlbnRyeSB3aGlsZSBob2xkaW5nIHRoZQorICogQWxsb2NhdGUgYSBuZXcgaWRyIGZyb20gZHJtX2RldmljZTo6Y3R4X2lkciB3aGlsZSBob2xkaW5nIHRoZQogICogZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2N0eGJpdG1hcF9uZXh0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgZHJtX2N0eGJpdG1hcF9uZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWludCBiaXQ7CisJaW50IG5ld19pZDsKKwlpbnQgcmV0OwogCi0JaWYgKCFkZXYtPmN0eF9iaXRtYXApCi0JCXJldHVybiAtMTsKLQorYWdhaW46CisJaWYgKGlkcl9wcmVfZ2V0KCZkZXYtPmN0eF9pZHIsIEdGUF9LRVJORUwpID09IDApIHsKKwkJRFJNX0VSUk9SKCJPdXQgb2YgbWVtb3J5IGV4cGFuZGluZyBkcmF3YWJsZSBpZHJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWJpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQoZGV2LT5jdHhfYml0bWFwLCBEUk1fTUFYX0NUWEJJVE1BUCk7Ci0JaWYgKGJpdCA8IERSTV9NQVhfQ1RYQklUTUFQKSB7Ci0JCXNldF9iaXQoYml0LCBkZXYtPmN0eF9iaXRtYXApOwotCQlEUk1fREVCVUcoImRybV9jdHhiaXRtYXBfbmV4dCBiaXQgOiAlZFxuIiwgYml0KTsKLQkJaWYgKChiaXQgKyAxKSA+IGRldi0+bWF4X2NvbnRleHQpIHsKLQkJCWRldi0+bWF4X2NvbnRleHQgPSAoYml0ICsgMSk7Ci0JCQlpZiAoZGV2LT5jb250ZXh0X3NhcmVhcykgewotCQkJCWRybV9tYXBfdCAqKmN0eF9zYXJlYXM7Ci0KLQkJCQljdHhfc2FyZWFzID0gZHJtX3JlYWxsb2MoZGV2LT5jb250ZXh0X3NhcmVhcywKLQkJCQkJCQkgKGRldi0+bWF4X2NvbnRleHQgLQotCQkJCQkJCSAgMSkgKgotCQkJCQkJCSBzaXplb2YoKmRldi0+Ci0JCQkJCQkJCWNvbnRleHRfc2FyZWFzKSwKLQkJCQkJCQkgZGV2LT5tYXhfY29udGV4dCAqCi0JCQkJCQkJIHNpemVvZigqZGV2LT4KLQkJCQkJCQkJY29udGV4dF9zYXJlYXMpLAotCQkJCQkJCSBEUk1fTUVNX01BUFMpOwotCQkJCWlmICghY3R4X3NhcmVhcykgewotCQkJCQljbGVhcl9iaXQoYml0LCBkZXYtPmN0eF9iaXRtYXApOwotCQkJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlkZXYtPmNvbnRleHRfc2FyZWFzID0gY3R4X3NhcmVhczsKLQkJCQlkZXYtPmNvbnRleHRfc2FyZWFzW2JpdF0gPSBOVUxMOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBtYXhfY29udGV4dCA9PSAxIGF0IHRoaXMgcG9pbnQgKi8KLQkJCQlkZXYtPmNvbnRleHRfc2FyZWFzID0KLQkJCQkgICAgZHJtX2FsbG9jKGRldi0+bWF4X2NvbnRleHQgKgotCQkJCQkgICAgICBzaXplb2YoKmRldi0+Y29udGV4dF9zYXJlYXMpLAotCQkJCQkgICAgICBEUk1fTUVNX01BUFMpOwotCQkJCWlmICghZGV2LT5jb250ZXh0X3NhcmVhcykgewotCQkJCQljbGVhcl9iaXQoYml0LCBkZXYtPmN0eF9iaXRtYXApOwotCQkJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlkZXYtPmNvbnRleHRfc2FyZWFzW2JpdF0gPSBOVUxMOwotCQkJfQotCQl9CisJcmV0ID0gaWRyX2dldF9uZXdfYWJvdmUoJmRldi0+Y3R4X2lkciwgTlVMTCwKKwkJCQlEUk1fUkVTRVJWRURfQ09OVEVYVFMsICZuZXdfaWQpOworCWlmIChyZXQgPT0gLUVBR0FJTikgewogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJcmV0dXJuIGJpdDsKKwkJZ290byBhZ2FpbjsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JcmV0dXJuIC0xOworCXJldHVybiBuZXdfaWQ7CiB9CiAKIC8qKgpAQCAtMTQ0LDMxICs5OCwxMSBAQAogICoKICAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KICAqCi0gKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemUgZHJtX2RldmljZTo6Y3R4X2JpdG1hcCBhbmQgZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMsIHdoaWxlIGhvbGRpbmcKLSAqIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KKyAqIEluaXRpYWxpc2UgdGhlIGRybV9kZXZpY2U6OmN0eF9pZHIKICAqLwotaW50IGRybV9jdHhiaXRtYXBfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2N0eGJpdG1hcF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWludCBpOwotCWludCB0ZW1wOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWRldi0+Y3R4X2JpdG1hcCA9ICh1bnNpZ25lZCBsb25nICopZHJtX2FsbG9jKFBBR0VfU0laRSwKLQkJCQkJCSAgICAgRFJNX01FTV9DVFhCSVRNQVApOwotCWlmIChkZXYtPmN0eF9iaXRtYXAgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbXNldCgodm9pZCAqKWRldi0+Y3R4X2JpdG1hcCwgMCwgUEFHRV9TSVpFKTsKLQlkZXYtPmNvbnRleHRfc2FyZWFzID0gTlVMTDsKLQlkZXYtPm1heF9jb250ZXh0ID0gLTE7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRFJNX1JFU0VSVkVEX0NPTlRFWFRTOyBpKyspIHsKLQkJdGVtcCA9IGRybV9jdHhiaXRtYXBfbmV4dChkZXYpOwotCQlEUk1fREVCVUcoImRybV9jdHhiaXRtYXBfaW5pdCA6ICVkXG4iLCB0ZW1wKTsKLQl9Ci0KKwlpZHJfaW5pdCgmZGV2LT5jdHhfaWRyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc3LDE3ICsxMTEsMTMgQEAKICAqCiAgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCiAgKgotICogRnJlZXMgZHJtX2RldmljZTo6Y3R4X2JpdG1hcCBhbmQgZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMsIHdoaWxlIGhvbGRpbmcKLSAqIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KKyAqIEZyZWUgYWxsIGlkciBtZW1iZXJzIHVzaW5nIGRybV9jdHhfc2FyZWFfZnJlZSBoZWxwZXIgZnVuY3Rpb24KKyAqIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgogICovCi12b2lkIGRybV9jdHhiaXRtYXBfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGRybV9jdHhiaXRtYXBfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKGRldi0+Y29udGV4dF9zYXJlYXMpCi0JCWRybV9mcmVlKGRldi0+Y29udGV4dF9zYXJlYXMsCi0JCQkgc2l6ZW9mKCpkZXYtPmNvbnRleHRfc2FyZWFzKSAqCi0JCQkgZGV2LT5tYXhfY29udGV4dCwgRFJNX01FTV9NQVBTKTsKLQlkcm1fZnJlZSgodm9pZCAqKWRldi0+Y3R4X2JpdG1hcCwgUEFHRV9TSVpFLCBEUk1fTUVNX0NUWEJJVE1BUCk7CisJaWRyX3JlbW92ZV9hbGwoJmRldi0+Y3R4X2lkcik7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKQEAgLTIwNiwzNCArMTM2LDM0IEBACiAgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQgcG9pbnRpbmcgdG8gYSBkcm1fY3R4X3ByaXZfbWFwIHN0cnVjdHVyZS4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgotICogR2V0cyB0aGUgbWFwIGZyb20gZHJtX2RldmljZTo6Y29udGV4dF9zYXJlYXMgd2l0aCB0aGUgaGFuZGxlIHNwZWNpZmllZCBhbmQKKyAqIEdldHMgdGhlIG1hcCBmcm9tIGRybV9kZXZpY2U6OmN0eF9pZHIgd2l0aCB0aGUgaGFuZGxlIHNwZWNpZmllZCBhbmQKICAqIHJldHVybnMgaXRzIGhhbmRsZS4KICAqLwogaW50IGRybV9nZXRzYXJlYWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKLQlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCByZXF1ZXN0OworCXN0cnVjdCBkcm1fbWFwICptYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqX2VudHJ5OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCBhcmdwLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoZGV2LT5tYXhfY29udGV4dCA8IDAKLQkgICAgfHwgcmVxdWVzdC5jdHhfaWQgPj0gKHVuc2lnbmVkKWRldi0+bWF4X2NvbnRleHQpIHsKKworCW1hcCA9IGlkcl9maW5kKCZkZXYtPmN0eF9pZHIsIHJlcXVlc3QuY3R4X2lkKTsKKwlpZiAoIW1hcCkgewogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWFwID0gZGV2LT5jb250ZXh0X3NhcmVhc1tyZXF1ZXN0LmN0eF9pZF07CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXF1ZXN0LmhhbmRsZSA9IE5VTEw7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAoX2VudHJ5LT5tYXAgPT0gbWFwKSB7CiAJCQlyZXF1ZXN0LmhhbmRsZSA9CiAJCQkgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZylfZW50cnktPnVzZXJfdG9rZW47CkBAIC0yNTgsMjUgKzE4OCwyNCBAQAogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCiAgKiBTZWFyY2hlcyB0aGUgbWFwcGluZyBzcGVjaWZpZWQgaW4gXHAgYXJnIGFuZCB1cGRhdGUgdGhlIGVudHJ5IGluCi0gKiBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB3aXRoIGl0LgorICogZHJtX2RldmljZTo6Y3R4X2lkciB3aXRoIGl0LgogICovCiBpbnQgZHJtX3NldHNhcmVhY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgcmVxdWVzdDsKLQlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCByZXF1ZXN0OworCXN0cnVjdCBkcm1fbWFwICptYXAgPSBOVUxMOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCA9IE5VTEw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCi0JCQkgICAoZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCQkgICAoc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgX191c2VyICopIGFyZywKKwkJCSAgIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAocl9saXN0LT5tYXAKIAkJICAgICYmIHJfbGlzdC0+dXNlcl90b2tlbiA9PSAodW5zaWduZWQgbG9uZylyZXF1ZXN0LmhhbmRsZSkKIAkJCWdvdG8gZm91bmQ7CkBAIC0yODksMTEgKzIxOCwxMCBAQAogCW1hcCA9IHJfbGlzdC0+bWFwOwogCWlmICghbWFwKQogCQlnb3RvIGJhZDsKLQlpZiAoZGV2LT5tYXhfY29udGV4dCA8IDApCisKKwlpZiAoSVNfRVJSKGlkcl9yZXBsYWNlKCZkZXYtPmN0eF9pZHIsIG1hcCwgcmVxdWVzdC5jdHhfaWQpKSkKIAkJZ290byBiYWQ7Ci0JaWYgKHJlcXVlc3QuY3R4X2lkID49ICh1bnNpZ25lZClkZXYtPm1heF9jb250ZXh0KQotCQlnb3RvIGJhZDsKLQlkZXYtPmNvbnRleHRfc2FyZWFzW3JlcXVlc3QuY3R4X2lkXSA9IG1hcDsKKwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiAwOwogfQpAQCAtMzE0LDcgKzI0Miw3IEBACiAgKgogICogQXR0ZW1wdCB0byBzZXQgZHJtX2RldmljZTo6Y29udGV4dF9mbGFnLgogICovCi1zdGF0aWMgaW50IGRybV9jb250ZXh0X3N3aXRjaChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBvbGQsIGludCBuZXcpCitzdGF0aWMgaW50IGRybV9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG9sZCwgaW50IG5ldykKIHsKIAlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5jb250ZXh0X2ZsYWcpKSB7CiAJCURSTV9FUlJPUigiUmVlbnRlcmluZyAtLSBGSVhNRVxuIik7CkBAIC0zNDIsNyArMjcwLDcgQEAKICAqIGhhcmR3YXJlIGxvY2sgaXMgaGVsZCwgY2xlYXJzIHRoZSBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcgYW5kIHdha2VzIHVwCiAgKiBkcm1fZGV2aWNlOjpjb250ZXh0X3dhaXQuCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG5ldykKK3N0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbmV3KQogewogCWRldi0+bGFzdF9jb250ZXh0ID0gbmV3OwkvKiBQUkUvUE9TVDogVGhpcyBpcyB0aGUgX29ubHlfIHdyaXRlci4gKi8KIAlkZXYtPmxhc3Rfc3dpdGNoID0gamlmZmllczsKQEAgLTM3Miw5ICszMDAsOSBAQAogaW50IGRybV9yZXNjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9jdHhfcmVzX3QgcmVzOwotCWRybV9jdHhfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2N0eF9yZXMgcmVzOworCXN0cnVjdCBkcm1fY3R4X3JlcyBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9jdHggY3R4OwogCWludCBpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXMsIGFyZ3AsIHNpemVvZihyZXMpKSkKQEAgLTQwOSwxMSArMzM3LDExIEBACiBpbnQgZHJtX2FkZGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X2xpc3RfdCAqY3R4X2VudHJ5OwotCWRybV9jdHhfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eF9saXN0ICpjdHhfZW50cnk7CisJc3RydWN0IGRybV9jdHggX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDQ5LDcgKzM3Nyw3IEBACiAJY3R4X2VudHJ5LT50YWcgPSBwcml2OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5jdHhsaXN0X211dGV4KTsKLQlsaXN0X2FkZCgmY3R4X2VudHJ5LT5oZWFkLCAmZGV2LT5jdHhsaXN0LT5oZWFkKTsKKwlsaXN0X2FkZCgmY3R4X2VudHJ5LT5oZWFkLCAmZGV2LT5jdHhsaXN0KTsKIAkrK2Rldi0+Y3R4X2NvdW50OwogCW11dGV4X3VubG9jaygmZGV2LT5jdHhsaXN0X211dGV4KTsKIApAQCAtNDc3LDggKzQwNSw4IEBACiBpbnQgZHJtX2dldGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fY3R4IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgYXJncCwgc2l6ZW9mKGN0eCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTUwNSwxMSArNDMzLDExIEBACiBpbnQgZHJtX3N3aXRjaGN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHggY3R4OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoc3RydWN0IGRybV9jdHggX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOwpAQCAtNTMwLDExICs0NTgsMTEgQEAKIGludCBkcm1fbmV3Y3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHggY3R4OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoc3RydWN0IGRybV9jdHggX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOwpAQCAtNTU3LDExICs0ODUsMTEgQEAKIGludCBkcm1fcm1jdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoZHJtX2N0eF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdHgpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKHN0cnVjdCBkcm1fY3R4IF9fdXNlciAqKSBhcmcsIHNpemVvZihjdHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBjdHguaGFuZGxlKTsKQEAgLTU3NSwxMCArNTAzLDEwIEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5jdHhsaXN0X211dGV4KTsKLQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdC0+aGVhZCkpIHsKLQkJZHJtX2N0eF9saXN0X3QgKnBvcywgKm47CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmN0eGxpc3QpKSB7CisJCXN0cnVjdCBkcm1fY3R4X2xpc3QgKnBvcywgKm47CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJmRldi0+Y3R4bGlzdC0+aGVhZCwgaGVhZCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCAmZGV2LT5jdHhsaXN0LCBoZWFkKSB7CiAJCQlpZiAocG9zLT5oYW5kbGUgPT0gY3R4LmhhbmRsZSkgewogCQkJCWxpc3RfZGVsKCZwb3MtPmhlYWQpOwogCQkJCWRybV9mcmVlKHBvcywgc2l6ZW9mKCpwb3MpLCBEUk1fTUVNX0NUWExJU1QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYwppbmRleCAzMmVkMTljLi44MDJmYmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYwpAQCAtNDMsNyArNDMsNyBAQAogICoKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgZHJtX2RldmljZV9kbWEgc3RydWN0dXJlLgogICovCi1pbnQgZHJtX2RtYV9zZXR1cChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2RtYV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWludCBpOwogCkBAIC02Nyw5ICs2Nyw5IEBACiAgKiBGcmVlIGFsbCBwYWdlcyBhc3NvY2lhdGVkIHdpdGggRE1BIGJ1ZmZlcnMsIHRoZSBidWZmZXJzIGFuZCBwYWdlcyBsaXN0cywgYW5kCiAgKiBmaW5hbGx5IHRoZSBkcm1fZGV2aWNlOjpkbWEgc3RydWN0dXJlIGl0c2VsZi4KICAqLwotdm9pZCBkcm1fZG1hX3Rha2Vkb3duKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgZHJtX2RtYV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGksIGo7CiAKIAlpZiAoIWRtYSkKQEAgLTEyOSw3ICsxMjksNyBAQAogICoKICAqIFJlc2V0cyB0aGUgZmllbGRzIG9mIFxwIGJ1Zi4KICAqLwotdm9pZCBkcm1fZnJlZV9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCit2b2lkIGRybV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuOwpAQCAtMTUyLDkgKzE1Miw5IEBACiAgKgogICogRnJlZXMgZWFjaCBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIFxwIGZpbHAgbm90IGFscmVhZHkgb24gdGhlIGhhcmR3YXJlLgogICovCi12b2lkIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAogCWlmICghZG1hKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKaW5kZXggYjMzMzEzYi4uZDZjZGJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jCkBAIC00NCw4MyArNDQsMzAgQEAKIHsKIAlEUk1fREVWSUNFOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JaW50IGksIGo7Ci0JdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGludCBiaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqKmluZm8gPSBkZXYtPmRyd19pbmZvOwotCXVuc2lnbmVkIGludCBpbmZvX2xlbmd0aCA9IGRldi0+ZHJ3X2luZm9fbGVuZ3RoOwotCWRybV9kcmF3X3QgZHJhdzsKKwlzdHJ1Y3QgZHJtX2RyYXcgZHJhdzsKKwlpbnQgbmV3X2lkID0gMDsKKwlpbnQgcmV0OwogCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBiaXRmaWVsZF9sZW5ndGg7IGkrKykgewotCQlpZiAoYml0ZmllbGRbaV0gPT0gfjApCi0JCQljb250aW51ZTsKLQotCQlmb3IgKDsgaiA8IDggKiBzaXplb2YoKmJpdGZpZWxkKTsgaisrKQotCQkJaWYgKCEoYml0ZmllbGRbaV0gJiAoMSA8PCBqKSkpCi0JCQkJZ290byBkb25lOworYWdhaW46CisJaWYgKGlkcl9wcmVfZ2V0KCZkZXYtPmRyd19pZHIsIEdGUF9LRVJORUwpID09IDApIHsKKwkJRFJNX0VSUk9SKCJPdXQgb2YgbWVtb3J5IGV4cGFuZGluZyBkcmF3YWJsZSBpZHJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci1kb25lOgotCi0JaWYgKGkgPT0gYml0ZmllbGRfbGVuZ3RoKSB7Ci0JCWJpdGZpZWxkX2xlbmd0aCsrOwotCi0JCWJpdGZpZWxkID0gZHJtX2FsbG9jKGJpdGZpZWxkX2xlbmd0aCAqIHNpemVvZigqYml0ZmllbGQpLAotCQkJCSAgICAgRFJNX01FTV9CVUZTKTsKLQotCQlpZiAoIWJpdGZpZWxkKSB7Ci0JCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgZHJhd2FibGUgYml0ZmllbGRcbiIpOwotCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKLQkJfQotCi0JCWlmICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkgKiBiaXRmaWVsZF9sZW5ndGggPiBpbmZvX2xlbmd0aCkgewotCQkJaW5mb19sZW5ndGggKz0gOCAqIHNpemVvZigqYml0ZmllbGQpOwotCi0JCQlpbmZvID0gZHJtX2FsbG9jKGluZm9fbGVuZ3RoICogc2l6ZW9mKCppbmZvKSwKLQkJCQkJIERSTV9NRU1fQlVGUyk7Ci0KLQkJCWlmICghaW5mbykgewotCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBkcmF3YWJsZSBpbmZvIgotCQkJCQkgICIgYXJyYXlcbiIpOwotCi0JCQkJZHJtX2ZyZWUoYml0ZmllbGQsCi0JCQkJCSBiaXRmaWVsZF9sZW5ndGggKiBzaXplb2YoKmJpdGZpZWxkKSwKLQkJCQkJIERSTV9NRU1fQlVGUyk7Ci0JCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKLQkJCX0KLQkJfQotCi0JCWJpdGZpZWxkW2ldID0gMDsKLQl9Ci0KLQlkcmF3LmhhbmRsZSA9IGkgKiA4ICogc2l6ZW9mKCpiaXRmaWVsZCkgKyBqICsgMTsKLQlEUk1fREVCVUcoIiVkXG4iLCBkcmF3LmhhbmRsZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwotCi0JYml0ZmllbGRbaV0gfD0gMSA8PCBqOwotCWluZm9bZHJhdy5oYW5kbGUgLSAxXSA9IE5VTEw7Ci0KLQlpZiAoYml0ZmllbGQgIT0gZGV2LT5kcndfYml0ZmllbGQpIHsKLQkJbWVtY3B5KGJpdGZpZWxkLCBkZXYtPmRyd19iaXRmaWVsZCwgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoICoKLQkJICAgICAgIHNpemVvZigqYml0ZmllbGQpKTsKLQkJZHJtX2ZyZWUoZGV2LT5kcndfYml0ZmllbGQsIHNpemVvZigqYml0ZmllbGQpICoKLQkJCSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGgsIERSTV9NRU1fQlVGUyk7Ci0JCWRldi0+ZHJ3X2JpdGZpZWxkID0gYml0ZmllbGQ7Ci0JCWRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCA9IGJpdGZpZWxkX2xlbmd0aDsKLQl9Ci0KLQlpZiAoaW5mbyAhPSBkZXYtPmRyd19pbmZvKSB7Ci0JCW1lbWNweShpbmZvLCBkZXYtPmRyd19pbmZvLCBkZXYtPmRyd19pbmZvX2xlbmd0aCAqCi0JCSAgICAgICBzaXplb2YoKmluZm8pKTsKLQkJZHJtX2ZyZWUoZGV2LT5kcndfaW5mbywgc2l6ZW9mKCppbmZvKSAqIGRldi0+ZHJ3X2luZm9fbGVuZ3RoLAotCQkJIERSTV9NRU1fQlVGUyk7Ci0JCWRldi0+ZHJ3X2luZm8gPSBpbmZvOwotCQlkZXYtPmRyd19pbmZvX2xlbmd0aCA9IGluZm9fbGVuZ3RoOworCXJldCA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZkZXYtPmRyd19pZHIsIE5VTEwsIDEsICZuZXdfaWQpOworCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7CisJCWdvdG8gYWdhaW47CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwogCi0JRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoZHJtX2RyYXdfdCBfX3VzZXIgKilkYXRhLCBkcmF3LCBzaXplb2YoZHJhdykpOworCWRyYXcuaGFuZGxlID0gbmV3X2lkOworCisJRFJNX0RFQlVHKCIlZFxuIiwgZHJhdy5oYW5kbGUpOworCisJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoc3RydWN0IGRybV9kcmF3IF9fdXNlciAqKWRhdGEsIGRyYXcsIHNpemVvZihkcmF3KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMSwxNDEgKzc4LDUyIEBACiBpbnQgZHJtX3JtZHJhdyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kcmF3X3QgZHJhdzsKLSAJaW50IGlkLCBpZHg7Ci0gCXVuc2lnbmVkIGludCBzaGlmdDsKKwlzdHJ1Y3QgZHJtX2RyYXcgZHJhdzsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCXUzMiAqYml0ZmllbGQgPSBkZXYtPmRyd19iaXRmaWVsZDsKLQl1bnNpZ25lZCBpbnQgYml0ZmllbGRfbGVuZ3RoID0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoOwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKippbmZvID0gZGV2LT5kcndfaW5mbzsKLQl1bnNpZ25lZCBpbnQgaW5mb19sZW5ndGggPSBkZXYtPmRyd19pbmZvX2xlbmd0aDsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkcmF3LCAoZHJtX2RyYXdfdCBfX3VzZXIgKikgZGF0YSwKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZHJhdywgKHN0cnVjdCBkcm1fZHJhdyBfX3VzZXIgKikgZGF0YSwKIAkJCQkgc2l6ZW9mKGRyYXcpKTsKIAotCWlkID0gZHJhdy5oYW5kbGUgLSAxOwotCWlkeCA9IGlkIC8gKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0Jc2hpZnQgPSBpZCAlICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCi0JaWYgKGlkeCA8IDAgfHwgaWR4ID49IGJpdGZpZWxkX2xlbmd0aCB8fAotCSAgICAhKGJpdGZpZWxkW2lkeF0gJiAoMSA8PCBzaGlmdCkpKSB7Ci0JCURSTV9ERUJVRygiTm8gc3VjaCBkcmF3YWJsZSAlZFxuIiwgZHJhdy5oYW5kbGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwogCi0JYml0ZmllbGRbaWR4XSAmPSB+KDEgPDwgc2hpZnQpOworCWRybV9mcmVlKGRybV9nZXRfZHJhd2FibGVfaW5mbyhkZXYsIGRyYXcuaGFuZGxlKSwKKwkJIHNpemVvZihzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8pLCBEUk1fTUVNX0JVRlMpOworCisJaWRyX3JlbW92ZSgmZGV2LT5kcndfaWRyLCBkcmF3LmhhbmRsZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0KLQlpZiAoaW5mb1tpZF0pIHsKLQkJZHJtX2ZyZWUoaW5mb1tpZF0tPnJlY3RzLCBpbmZvW2lkXS0+bnVtX3JlY3RzICoKLQkJCSBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwgRFJNX01FTV9CVUZTKTsKLQkJZHJtX2ZyZWUoaW5mb1tpZF0sIHNpemVvZigqKmluZm8pLCBEUk1fTUVNX0JVRlMpOwotCX0KLQotCS8qIENhbiB3ZSBzaHJpbmsgdGhlIGFycmF5cz8gKi8KLQlpZiAoaWR4ID09IGJpdGZpZWxkX2xlbmd0aCAtIDEpIHsKLQkJd2hpbGUgKGlkeCA+PSAwICYmICFiaXRmaWVsZFtpZHhdKQotCQkJLS1pZHg7Ci0KLQkJYml0ZmllbGRfbGVuZ3RoID0gaWR4ICsgMTsKLQotCQliaXRmaWVsZCA9IE5VTEw7Ci0KLQkJaWYgKGJpdGZpZWxkX2xlbmd0aCkgewotCQkJaWYgKGJpdGZpZWxkX2xlbmd0aCAhPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGgpCi0JCQkJYml0ZmllbGQgPSBkcm1fYWxsb2MoYml0ZmllbGRfbGVuZ3RoICoKLQkJCQkJCSAgICAgc2l6ZW9mKCpiaXRmaWVsZCksCi0JCQkJCQkgICAgIERSTV9NRU1fQlVGUyk7Ci0KLQkJCWlmICghYml0ZmllbGQpIHsKLQkJCQliaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOwotCQkJCWJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChiaXRmaWVsZCAhPSBkZXYtPmRyd19iaXRmaWVsZCkgewotCQlpbmZvX2xlbmd0aCA9IDggKiBzaXplb2YoKmJpdGZpZWxkKSAqIGJpdGZpZWxkX2xlbmd0aDsKLQotCQlpZiAoaW5mb19sZW5ndGgpIHsKLQkJCWluZm8gPSBkcm1fYWxsb2MoaW5mb19sZW5ndGggKiBzaXplb2YoKmluZm8pLAotCQkJCQkgRFJNX01FTV9CVUZTKTsKLQotCQkJaWYgKCFpbmZvKSB7Ci0JCQkJaW5mbyA9IGRldi0+ZHJ3X2luZm87Ci0JCQkJaW5mb19sZW5ndGggPSBkZXYtPmRyd19pbmZvX2xlbmd0aDsKLQkJCX0KLQkJfSBlbHNlCi0JCQlpbmZvID0gTlVMTDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwotCi0JCWlmIChiaXRmaWVsZCkKLQkJCW1lbWNweShiaXRmaWVsZCwgZGV2LT5kcndfYml0ZmllbGQsIGJpdGZpZWxkX2xlbmd0aCAqCi0JCQkgICAgICAgc2l6ZW9mKCpiaXRmaWVsZCkpOwotCQlkcm1fZnJlZShkZXYtPmRyd19iaXRmaWVsZCwgc2l6ZW9mKCpiaXRmaWVsZCkgKgotCQkJIGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCwgRFJNX01FTV9CVUZTKTsKLQkJZGV2LT5kcndfYml0ZmllbGQgPSBiaXRmaWVsZDsKLQkJZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoID0gYml0ZmllbGRfbGVuZ3RoOwotCi0JCWlmIChpbmZvICE9IGRldi0+ZHJ3X2luZm8pIHsKLQkJCWlmIChpbmZvKQotCQkJCW1lbWNweShpbmZvLCBkZXYtPmRyd19pbmZvLCBpbmZvX2xlbmd0aCAqCi0JCQkJICAgICAgIHNpemVvZigqaW5mbykpOwotCQkJZHJtX2ZyZWUoZGV2LT5kcndfaW5mbywgc2l6ZW9mKCppbmZvKSAqCi0JCQkJIGRldi0+ZHJ3X2luZm9fbGVuZ3RoLCBEUk1fTUVNX0JVRlMpOwotCQkJZGV2LT5kcndfaW5mbyA9IGluZm87Ci0JCQlkZXYtPmRyd19pbmZvX2xlbmd0aCA9IGluZm9fbGVuZ3RoOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOwotCX0KLQogCURSTV9ERUJVRygiJWRcbiIsIGRyYXcuaGFuZGxlKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV91cGRhdGVfZHJhd2FibGVfaW5mbyhEUk1fSU9DVExfQVJHUykgeworaW50IGRybV91cGRhdGVfZHJhd2FibGVfaW5mbyhEUk1fSU9DVExfQVJHUykKK3sKIAlEUk1fREVWSUNFOwotCWRybV91cGRhdGVfZHJhd190IHVwZGF0ZTsKLQl1bnNpZ25lZCBpbnQgaWQsIGlkeCwgc2hpZnQ7Ci0JdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKLQlkcm1fZHJhd2FibGVfaW5mb190ICppbmZvOwotCWRybV9jbGlwX3JlY3RfdCAqcmVjdHM7CisJc3RydWN0IGRybV91cGRhdGVfZHJhdyB1cGRhdGU7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcmVjdHM7CisJc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICppbmZvOwogCWludCBlcnI7CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwodXBkYXRlLCAoZHJtX3VwZGF0ZV9kcmF3X3QgX191c2VyICopIGRhdGEsCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHVwZGF0ZSwgKHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgX191c2VyICopIGRhdGEsCiAJCQkJIHNpemVvZih1cGRhdGUpKTsKIAotCWlkID0gdXBkYXRlLmhhbmRsZSAtIDE7Ci0JaWR4ID0gaWQgLyAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQlzaGlmdCA9IGlkICUgKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0KLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gYml0ZmllbGRfbGVuZ3RoIHx8Ci0JICAgICEoYml0ZmllbGRbaWR4XSAmICgxIDw8IHNoaWZ0KSkpIHsKLQkJRFJNX0VSUk9SKCJObyBzdWNoIGRyYXdhYmxlICVkXG4iLCB1cGRhdGUuaGFuZGxlKTsKLQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKLQl9Ci0KLQlpbmZvID0gZGV2LT5kcndfaW5mb1tpZF07Ci0KKwlpbmZvID0gaWRyX2ZpbmQoJmRldi0+ZHJ3X2lkciwgdXBkYXRlLmhhbmRsZSk7CiAJaWYgKCFpbmZvKSB7Ci0JCWluZm8gPSBkcm1fY2FsbG9jKDEsIHNpemVvZihkcm1fZHJhd2FibGVfaW5mb190KSwgRFJNX01FTV9CVUZTKTsKLQotCQlpZiAoIWluZm8pIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGRyYXdhYmxlIGluZm8gbWVtb3J5XG4iKTsKLQkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJCWluZm8gPSBkcm1fY2FsbG9jKDEsIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7CisJCWlmICghaW5mbykKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoSVNfRVJSKGlkcl9yZXBsYWNlKCZkZXYtPmRyd19pZHIsIGluZm8sIHVwZGF0ZS5oYW5kbGUpKSkgeworCQkJRFJNX0VSUk9SKCJObyBzdWNoIGRyYXdhYmxlICVkXG4iLCB1cGRhdGUuaGFuZGxlKTsKKwkJCWRybV9mcmVlKGluZm8sIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAogCXN3aXRjaCAodXBkYXRlLnR5cGUpIHsKIAljYXNlIERSTV9EUkFXQUJMRV9DTElQUkVDVFM6CiAJCWlmICh1cGRhdGUubnVtICE9IGluZm8tPm51bV9yZWN0cykgewotCQkJcmVjdHMgPSBkcm1fYWxsb2ModXBkYXRlLm51bSAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLAorCQkJcmVjdHMgPSBkcm1fYWxsb2ModXBkYXRlLm51bSAqIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksCiAJCQkJCSBEUk1fTUVNX0JVRlMpOwogCQl9IGVsc2UKIAkJCXJlY3RzID0gaW5mby0+cmVjdHM7CkBAIC0yNzcsNyArMTM1LDcgQEAKIAkJfQogCiAJCWlmICh1cGRhdGUubnVtICYmIERSTV9DT1BZX0ZST01fVVNFUihyZWN0cywKLQkJCQkJCSAgICAgKGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKikKKwkJCQkJCSAgICAgKHN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqKQogCQkJCQkJICAgICAodW5zaWduZWQgbG9uZyl1cGRhdGUuZGF0YSwKIAkJCQkJCSAgICAgdXBkYXRlLm51bSAqCiAJCQkJCQkgICAgIHNpemVvZigqcmVjdHMpKSkgewpAQCAtMjkwLDE3ICsxNDgsMTYgQEAKIAogCQlpZiAocmVjdHMgIT0gaW5mby0+cmVjdHMpIHsKIAkJCWRybV9mcmVlKGluZm8tPnJlY3RzLCBpbmZvLT5udW1fcmVjdHMgKgotCQkJCSBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwgRFJNX01FTV9CVUZTKTsKKwkJCQkgc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwgRFJNX01FTV9CVUZTKTsKIAkJfQogCiAJCWluZm8tPnJlY3RzID0gcmVjdHM7CiAJCWluZm8tPm51bV9yZWN0cyA9IHVwZGF0ZS5udW07Ci0JCWRldi0+ZHJ3X2luZm9baWRdID0gaW5mbzsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7CiAKIAkJRFJNX0RFQlVHKCJVcGRhdGVkICVkIGNsaXByZWN0cyBmb3IgZHJhd2FibGUgJWRcbiIsCi0JCQkgIGluZm8tPm51bV9yZWN0cywgaWQpOworCQkJICBpbmZvLT5udW1fcmVjdHMsIHVwZGF0ZS5oYW5kbGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fRVJST1IoIkludmFsaWQgdXBkYXRlIHR5cGUgJWRcbiIsIHVwZGF0ZS50eXBlKTsKQEAgLTMxMCwxMSArMTY3LDkgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0JaWYgKCFkZXYtPmRyd19pbmZvW2lkXSkKLQkJZHJtX2ZyZWUoaW5mbywgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKLQllbHNlIGlmIChyZWN0cyAhPSBkZXYtPmRyd19pbmZvW2lkXS0+cmVjdHMpCi0JCWRybV9mcmVlKHJlY3RzLCB1cGRhdGUubnVtICoKLQkJCSBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwgRFJNX01FTV9CVUZTKTsKKwlpZiAocmVjdHMgIT0gaW5mby0+cmVjdHMpCisJCWRybV9mcmVlKHJlY3RzLCB1cGRhdGUubnVtICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwKKwkJCSBEUk1fTUVNX0JVRlMpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTMyMiwyMCArMTc3LDI3IEBACiAvKioKICAqIENhbGxlciBtdXN0IGhvbGQgdGhlIGRyYXdhYmxlIHNwaW5sb2NrIQogICovCi1kcm1fZHJhd2FibGVfaW5mb190ICpkcm1fZ2V0X2RyYXdhYmxlX2luZm8oZHJtX2RldmljZV90ICpkZXYsIGRybV9kcmF3YWJsZV90IGlkKSB7Ci0JdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGludCBpZHgsIHNoaWZ0OwotCi0JaWQtLTsKLQlpZHggPSBpZCAvICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCXNoaWZ0ID0gaWQgJSAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQotCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggfHwKLQkgICAgIShiaXRmaWVsZFtpZHhdICYgKDEgPDwgc2hpZnQpKSkgewotCQlEUk1fREVCVUcoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIGlkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGRldi0+ZHJ3X2luZm9baWRdOworc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICpkcm1fZ2V0X2RyYXdhYmxlX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2RyYXdhYmxlX3QgaWQpCit7CisJcmV0dXJuIGlkcl9maW5kKCZkZXYtPmRyd19pZHIsIGlkKTsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2dldF9kcmF3YWJsZV9pbmZvKTsKKworc3RhdGljIGludCBkcm1fZHJhd2FibGVfZnJlZShpbnQgaWRyLCB2b2lkICpwLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqaW5mbyA9IHA7CisKKwlpZiAoaW5mbykgeworCQlkcm1fZnJlZShpbmZvLT5yZWN0cywgaW5mby0+bnVtX3JlY3RzICoKKwkJCSBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLCBEUk1fTUVNX0JVRlMpOworCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGRybV9kcmF3YWJsZV9mcmVlX2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWlkcl9mb3JfZWFjaCgmZGV2LT5kcndfaWRyLCBkcm1fZHJhd2FibGVfZnJlZSwgTlVMTCk7CisJaWRyX3JlbW92ZV9hbGwoJmRldi0+ZHJ3X2lkcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCmluZGV4IDhlNzdiN2UuLjE5OTk0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCkBAIC0xMjksMTEgKzEyOSwxMSBAQAogICoKICAqIFxzYSBkcm1fZGV2aWNlCiAgKi8KLWludCBkcm1fbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9tYWdpY19lbnRyeV90ICpwdCwgKm5leHQ7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlkcm1fdm1hX2VudHJ5X3QgKnZtYSwgKnZtYV9uZXh0OworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKnB0LCAqbmV4dDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3QsICpsaXN0X3Q7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnZtYSwgKnZtYV90ZW1wOwogCWludCBpOwogCiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtMTUxLDE5ICsxNTEsMTAgQEAKIAlpZiAoZGV2LT5pcnFfZW5hYmxlZCkKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAotCS8qIEZyZWUgZHJhd2FibGUgaW5mb3JtYXRpb24gbWVtb3J5ICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCAvIHNpemVvZigqZGV2LT5kcndfYml0ZmllbGQpOwotCSAgICAgaSsrKSB7Ci0JCWRybV9kcmF3YWJsZV9pbmZvX3QgKmluZm8gPSBkcm1fZ2V0X2RyYXdhYmxlX2luZm8oZGV2LCBpKTsKLQotCQlpZiAoaW5mbykgewotCQkJZHJtX2ZyZWUoaW5mby0+cmVjdHMsIGluZm8tPm51bV9yZWN0cyAqCi0JCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOwotCQkJZHJtX2ZyZWUoaW5mbywgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKLQkJfQotCX0KLQogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCS8qIEZyZWUgZHJhd2FibGUgaW5mb3JtYXRpb24gbWVtb3J5ICovCisJZHJtX2RyYXdhYmxlX2ZyZWVfYWxsKGRldik7CiAJZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKIAogCS8qIENsZWFyIHBpZCBsaXN0ICovCkBAIC0xNzgsMTkgKzE2OSwxNyBAQAogCiAJLyogQ2xlYXIgQUdQIGluZm9ybWF0aW9uICovCiAJaWYgKGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJiBkZXYtPmFncCkgewotCQlkcm1fYWdwX21lbV90ICplbnRyeTsKLQkJZHJtX2FncF9tZW1fdCAqbmV4dGU7CisJCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnksICp0ZW1wZTsKIAogCQkvKiBSZW1vdmUgQUdQIHJlc291cmNlcywgYnV0IGxlYXZlIGRldi0+YWdwCiAJCSAgIGludGFjdCB1bnRpbCBkcnZfY2xlYW51cCBpcyBjYWxsZWQuICovCi0JCWZvciAoZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBlbnRyeTsgZW50cnkgPSBuZXh0ZSkgewotCQkJbmV4dGUgPSBlbnRyeS0+bmV4dDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0ZW1wZSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJCWlmIChlbnRyeS0+Ym91bmQpCiAJCQkJZHJtX3VuYmluZF9hZ3AoZW50cnktPm1lbW9yeSk7CiAJCQlkcm1fZnJlZV9hZ3AoZW50cnktPm1lbW9yeSwgZW50cnktPnBhZ2VzKTsKIAkJCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCX0KLQkJZGV2LT5hZ3AtPm1lbW9yeSA9IE5VTEw7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPmFncC0+bWVtb3J5KTsKIAogCQlpZiAoZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQkJZHJtX2FncF9yZWxlYXNlKGRldik7CkBAIC0yMDQsMjAgKzE5MywxNCBAQAogCX0KIAogCS8qIENsZWFyIHZtYSBsaXN0IChvbmx5IGJ1aWx0IGZvciBkZWJ1Z2dpbmcpICovCi0JaWYgKGRldi0+dm1hbGlzdCkgewotCQlmb3IgKHZtYSA9IGRldi0+dm1hbGlzdDsgdm1hOyB2bWEgPSB2bWFfbmV4dCkgewotCQkJdm1hX25leHQgPSB2bWEtPm5leHQ7Ci0JCQlkcm1fZnJlZSh2bWEsIHNpemVvZigqdm1hKSwgRFJNX01FTV9WTUFTKTsKLQkJfQotCQlkZXYtPnZtYWxpc3QgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bWEsIHZtYV90ZW1wLCAmZGV2LT52bWFsaXN0LCBoZWFkKSB7CisJCWxpc3RfZGVsKCZ2bWEtPmhlYWQpOworCQlkcm1fZnJlZSh2bWEsIHNpemVvZigqdm1hKSwgRFJNX01FTV9WTUFTKTsKIAl9CiAKLQlpZiAoZGV2LT5tYXBsaXN0KSB7Ci0JCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2LT5tYXBsaXN0LT5oZWFkKSkgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9IGRldi0+bWFwbGlzdC0+aGVhZC5uZXh0OwotCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7Ci0JCQlkcm1fcm1tYXBfbG9ja2VkKGRldiwgcl9saXN0LT5tYXApOwotCQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfbGlzdCwgbGlzdF90LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CisJCWRybV9ybW1hcF9sb2NrZWQoZGV2LCByX2xpc3QtPm1hcCk7CisJCXJfbGlzdCA9IE5VTEw7CiAJfQogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSAmJiBkZXYtPnF1ZXVlbGlzdCkgewpAQCAtMjk4LDcgKzI4MSw3IEBACiAgKgogICogXHNhIGRybV9pbml0CiAgKi8KLXN0YXRpYyB2b2lkIGRybV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGRybV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCURSTV9ERUJVRygiXG4iKTsKIApAQCAtMzA5LDExICsyOTIsNyBAQAogCiAJZHJtX2xhc3RjbG9zZShkZXYpOwogCi0JaWYgKGRldi0+bWFwbGlzdCkgewotCQlkcm1fZnJlZShkZXYtPm1hcGxpc3QsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKLQkJZGV2LT5tYXBsaXN0ID0gTlVMTDsKLQkJZHJtX2h0X3JlbW92ZSgmZGV2LT5tYXBfaGFzaCk7Ci0JfQorCWRybV9odF9yZW1vdmUoJmRldi0+bWFwX2hhc2gpOwogCiAJZHJtX2N0eGJpdG1hcF9jbGVhbnVwKGRldik7CiAKQEAgLTM0Miw4ICszMjEsOCBAQAogdm9pZCBkcm1fZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQogewogCWludCBpOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gTlVMTDsKLQlkcm1faGVhZF90ICpoZWFkOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBkcm1faGVhZCAqaGVhZDsKIAogCURSTV9ERUJVRygiXG4iKTsKIApAQCAtNDQyLDEwICs0MjEsMTAgQEAKIHN0YXRpYyBpbnQgZHJtX3ZlcnNpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV92ZXJzaW9uX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV92ZXJzaW9uX3QgdmVyc2lvbjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3ZlcnNpb24gX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fdmVyc2lvbiB2ZXJzaW9uOwogCWludCBsZW47CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnZlcnNpb24sIGFyZ3AsIHNpemVvZih2ZXJzaW9uKSkpCkBAIC00NzgsOCArNDU3LDggQEAKIGludCBkcm1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faW9jdGxfZGVzY190ICppb2N0bDsKIAlkcm1faW9jdGxfdCAqZnVuYzsKIAl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKQEAgLTUyOSwzICs1MDgsMTcgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1faW9jdGwpOworCitkcm1fbG9jYWxfbWFwX3QgKmRybV9nZXRzYXJlYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgeworCQlpZiAoZW50cnktPm1hcCAmJiBlbnRyeS0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCisJCSAgICAoZW50cnktPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0spKSB7CisJCQlyZXR1cm4gZW50cnktPm1hcDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dldHNhcmVhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwppbmRleCAzYjE1OWNhLi43YmM1MWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCkBAIC0zOSw5ICszOSw5IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCiBzdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgIGRybV9kZXZpY2VfdCAqIGRldik7CisJCQkgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKLXN0YXRpYyBpbnQgZHJtX3NldHVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgZHJtX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9sb2NhbF9tYXBfdCAqbWFwOwogCWludCBpOwpAQCAtNzksMTMgKzc5LDYgQEAKIAlkcm1faHRfY3JlYXRlKCZkZXYtPm1hZ2ljbGlzdCwgRFJNX01BR0lDX0hBU0hfT1JERVIpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1hZ2ljZnJlZSk7CiAKLQlkZXYtPmN0eGxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpkZXYtPmN0eGxpc3QpLCBEUk1fTUVNX0NUWExJU1QpOwotCWlmIChkZXYtPmN0eGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGRldi0+Y3R4bGlzdCwgMCwgc2l6ZW9mKCpkZXYtPmN0eGxpc3QpKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5jdHhsaXN0LT5oZWFkKTsKLQotCWRldi0+dm1hbGlzdCA9IE5VTEw7CiAJZGV2LT5zaWdkYXRhLmxvY2sgPSBOVUxMOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+bG9jay5sb2NrX3F1ZXVlKTsKIAlkZXYtPnF1ZXVlX2NvdW50ID0gMDsKQEAgLTEzNSw3ICsxMjgsNyBAQAogICovCiBpbnQgZHJtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBOVUxMOwogCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CiAJaW50IHJldGNvZGUgPSAwOwogCkBAIC0xNzQsNyArMTY3LDcgQEAKICAqLwogaW50IGRybV9zdHViX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBOVUxMOwogCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CkBAIC0yMzAsMTAgKzIyMywxMCBAQAogICogZmlscCBhbmQgYWRkIGl0IGludG8gdGhlIGRvdWJsZSBsaW5rZWQgbGlzdCBpbiBccCBkZXYuCiAgKi8KIHN0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgZHJtX2RldmljZV90ICogZGV2KQorCQkJICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlkcm1fZmlsZV90ICpwcml2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdjsKIAlpbnQgcmV0OwogCiAJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0VYQ0wpCkBAIC0yNTgsNiArMjUxLDggQEAKIAlwcml2LT5hdXRoZW50aWNhdGVkID0gY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKIAlwcml2LT5sb2NrX2NvdW50ID0gMDsKIAorCUlOSVRfTElTVF9IRUFEKCZwcml2LT5saGVhZCk7CisKIAlpZiAoZGV2LT5kcml2ZXItPm9wZW4pIHsKIAkJcmV0ID0gZGV2LT5kcml2ZXItPm9wZW4oZGV2LCBwcml2KTsKIAkJaWYgKHJldCA8IDApCkBAIC0yNjUsMTkgKzI2MCwxMCBAQAogCX0KIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoIWRldi0+ZmlsZV9sYXN0KSB7Ci0JCXByaXYtPm5leHQgPSBOVUxMOwotCQlwcml2LT5wcmV2ID0gTlVMTDsKLQkJZGV2LT5maWxlX2ZpcnN0ID0gcHJpdjsKLQkJZGV2LT5maWxlX2xhc3QgPSBwcml2OwotCQkvKiBmaXJzdCBvcGVuZXIgYXV0b21hdGljYWxseSBiZWNvbWVzIG1hc3RlciAqLworCWlmIChsaXN0X2VtcHR5KCZkZXYtPmZpbGVsaXN0KSkKIAkJcHJpdi0+bWFzdGVyID0gMTsKLQl9IGVsc2UgewotCQlwcml2LT5uZXh0ID0gTlVMTDsKLQkJcHJpdi0+cHJldiA9IGRldi0+ZmlsZV9sYXN0OwotCQlkZXYtPmZpbGVfbGFzdC0+bmV4dCA9IHByaXY7Ci0JCWRldi0+ZmlsZV9sYXN0ID0gcHJpdjsKLQl9CisKKwlsaXN0X2FkZCgmcHJpdi0+bGhlYWQsICZkZXYtPmZpbGVsaXN0KTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogI2lmZGVmIF9fYWxwaGFfXwpAQCAtMzA5LDggKzI5NSw4IEBACiAvKiogTm8tb3AuICovCiBpbnQgZHJtX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlpbnQgcmV0Y29kZTsKIAogCURSTV9ERUJVRygiZmQgPSAlZCwgZGV2aWNlID0gMHglbHhcbiIsIGZkLApAQCAtMzM2LDggKzMyMiw4IEBACiAgKi8KIGludCBkcm1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWludCByZXRjb2RlID0gMDsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC00MTQsMTAgKzQwMCwxMCBAQAogCWRybV9mYXN5bmMoLTEsIGZpbHAsIDApOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5jdHhsaXN0X211dGV4KTsKLQlpZiAoZGV2LT5jdHhsaXN0ICYmICghbGlzdF9lbXB0eSgmZGV2LT5jdHhsaXN0LT5oZWFkKSkpIHsKLQkJZHJtX2N0eF9saXN0X3QgKnBvcywgKm47CisJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmN0eGxpc3QpKSB7CisJCXN0cnVjdCBkcm1fY3R4X2xpc3QgKnBvcywgKm47CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbiwgJmRldi0+Y3R4bGlzdC0+aGVhZCwgaGVhZCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCAmZGV2LT5jdHhsaXN0LCBoZWFkKSB7CiAJCQlpZiAocG9zLT50YWcgPT0gcHJpdiAmJgogCQkJICAgIHBvcy0+aGFuZGxlICE9IERSTV9LRVJORUxfQ09OVEVYVCkgewogCQkJCWlmIChkZXYtPmRyaXZlci0+Y29udGV4dF9kdG9yKQpAQCAtNDM2LDIyICs0MjIsMTIgQEAKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocHJpdi0+cmVtb3ZlX2F1dGhfb25fY2xvc2UgPT0gMSkgewotCQlkcm1fZmlsZV90ICp0ZW1wID0gZGV2LT5maWxlX2ZpcnN0OwotCQl3aGlsZSAodGVtcCkgeworCQlzdHJ1Y3QgZHJtX2ZpbGUgKnRlbXA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wLCAmZGV2LT5maWxlbGlzdCwgbGhlYWQpCiAJCQl0ZW1wLT5hdXRoZW50aWNhdGVkID0gMDsKLQkJCXRlbXAgPSB0ZW1wLT5uZXh0OwotCQl9CiAJfQotCWlmIChwcml2LT5wcmV2KSB7Ci0JCXByaXYtPnByZXYtPm5leHQgPSBwcml2LT5uZXh0OwotCX0gZWxzZSB7Ci0JCWRldi0+ZmlsZV9maXJzdCA9IHByaXYtPm5leHQ7Ci0JfQotCWlmIChwcml2LT5uZXh0KSB7Ci0JCXByaXYtPm5leHQtPnByZXYgPSBwcml2LT5wcmV2OwotCX0gZWxzZSB7Ci0JCWRldi0+ZmlsZV9sYXN0ID0gcHJpdi0+cHJldjsKLQl9CisJbGlzdF9kZWwoJnByaXYtPmxoZWFkKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCWlmIChkZXYtPmRyaXZlci0+cG9zdGNsb3NlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jCmluZGV4IDMxYWNiNjIuLjNhZDMxOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICJkcm1faGFzaHRhYi5oIgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KIAotaW50IGRybV9odF9jcmVhdGUoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgaW50IG9yZGVyKQoraW50IGRybV9odF9jcmVhdGUoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBpbnQgb3JkZXIpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTYzLDkgKzYzLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcm1faHRfdmVyYm9zZV9saXN0KGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KQordm9pZCBkcm1faHRfdmVyYm9zZV9saXN0KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXkpCiB7Ci0JZHJtX2hhc2hfaXRlbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqZW50cnk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhfbGlzdDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGlzdDsKIAl1bnNpZ25lZCBpbnQgaGFzaGVkX2tleTsKQEAgLTc1LDE1ICs3NSwxNSBAQAogCURSTV9ERUJVRygiS2V5IGlzIDB4JTA4bHgsIEhhc2hlZCBrZXkgaXMgMHglMDh4XG4iLCBrZXksIGhhc2hlZF9rZXkpOwogCWhfbGlzdCA9ICZodC0+dGFibGVbaGFzaGVkX2tleV07CiAJaGxpc3RfZm9yX2VhY2gobGlzdCwgaF9saXN0KSB7Ci0JCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSwgaGVhZCk7CiAJCURSTV9ERUJVRygiY291bnQgJWQsIGtleTogMHglMDhseFxuIiwgY291bnQrKywgZW50cnktPmtleSk7CiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmRybV9odF9maW5kX2tleShkcm1fb3Blbl9oYXNoX3QgKmh0LCAKK3N0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZHJtX2h0X2ZpbmRfa2V5KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgCiAJCQkJCSAgdW5zaWduZWQgbG9uZyBrZXkpCiB7Ci0JZHJtX2hhc2hfaXRlbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqZW50cnk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhfbGlzdDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGlzdDsKIAl1bnNpZ25lZCBpbnQgaGFzaGVkX2tleTsKQEAgLTkxLDcgKzkxLDcgQEAKIAloYXNoZWRfa2V5ID0gaGFzaF9sb25nKGtleSwgaHQtPm9yZGVyKTsKIAloX2xpc3QgPSAmaHQtPnRhYmxlW2hhc2hlZF9rZXldOwogCWhsaXN0X2Zvcl9lYWNoKGxpc3QsIGhfbGlzdCkgewotCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIGRybV9oYXNoX2l0ZW1fdCwgaGVhZCk7CisJCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRybV9oYXNoX2l0ZW0sIGhlYWQpOwogCQlpZiAoZW50cnktPmtleSA9PSBrZXkpCiAJCQlyZXR1cm4gbGlzdDsKIAkJaWYgKGVudHJ5LT5rZXkgPiBrZXkpCkBAIC0xMDEsOSArMTAxLDkgQEAKIH0KIAogCi1pbnQgZHJtX2h0X2luc2VydF9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSkKK2ludCBkcm1faHRfaW5zZXJ0X2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaF9saXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0LCAqcGFyZW50OwogCXVuc2lnbmVkIGludCBoYXNoZWRfa2V5OwpAQCAtMTEzLDcgKzExMyw3IEBACiAJaF9saXN0ID0gJmh0LT50YWJsZVtoYXNoZWRfa2V5XTsKIAlwYXJlbnQgPSBOVUxMOwogCWhsaXN0X2Zvcl9lYWNoKGxpc3QsIGhfbGlzdCkgewotCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIGRybV9oYXNoX2l0ZW1fdCwgaGVhZCk7CisJCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRybV9oYXNoX2l0ZW0sIGhlYWQpOwogCQlpZiAoZW50cnktPmtleSA9PSBrZXkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGVudHJ5LT5rZXkgPiBrZXkpCkBAIC0xMzIsNyArMTMyLDcgQEAKICAqIEp1c3QgaW5zZXJ0IGFuIGl0ZW0gYW5kIHJldHVybiBhbnkgImJpdHMiIGJpdCBrZXkgdGhhdCBoYXNuJ3QgYmVlbiAKICAqIHVzZWQgYmVmb3JlLgogICovCi1pbnQgZHJtX2h0X2p1c3RfaW5zZXJ0X3BsZWFzZShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0sCitpbnQgZHJtX2h0X2p1c3RfaW5zZXJ0X3BsZWFzZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBzZWVkLCBpbnQgYml0cywgaW50IHNoaWZ0LAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGQpCiB7CkBAIC0xNTYsOCArMTU2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV9odF9maW5kX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXksCi0JCSAgICAgZHJtX2hhc2hfaXRlbV90ICoqaXRlbSkKK2ludCBkcm1faHRfZmluZF9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXksCisJCSAgICAgc3RydWN0IGRybV9oYXNoX2l0ZW0gKippdGVtKQogewogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0OwogCkBAIC0xNjUsMTEgKzE2NSwxMSBAQAogCWlmICghbGlzdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqaXRlbSA9IGhsaXN0X2VudHJ5KGxpc3QsIGRybV9oYXNoX2l0ZW1fdCwgaGVhZCk7CisJKml0ZW0gPSBobGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSwgaGVhZCk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBkcm1faHRfcmVtb3ZlX2tleShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSkKK2ludCBkcm1faHRfcmVtb3ZlX2tleShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KQogewogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0OwogCkBAIC0xODIsMTQgKzE4MiwxNCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1pbnQgZHJtX2h0X3JlbW92ZV9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSkKK2ludCBkcm1faHRfcmVtb3ZlX2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSkKIHsKIAlobGlzdF9kZWxfaW5pdCgmaXRlbS0+aGVhZCk7CiAJaHQtPmZpbGwtLTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkcm1faHRfcmVtb3ZlKGRybV9vcGVuX2hhc2hfdCAqaHQpCit2b2lkIGRybV9odF9yZW1vdmUoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0KQogewogCWlmIChodC0+dGFibGUpIHsKIAkJaWYgKGh0LT51c2Vfdm1hbGxvYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuaAppbmRleCA2MTMwOTFjLi4wZjEzNzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oCkBAIC0zNywzMSArMzcsMzEgQEAKIAogI2RlZmluZSBkcm1faGFzaF9lbnRyeShfcHRyLCBfdHlwZSwgX21lbWJlcikgY29udGFpbmVyX29mKF9wdHIsIF90eXBlLCBfbWVtYmVyKQogCi10eXBlZGVmIHN0cnVjdCBkcm1faGFzaF9pdGVteworc3RydWN0IGRybV9oYXNoX2l0ZW0gewogCXN0cnVjdCBobGlzdF9ub2RlIGhlYWQ7CiAJdW5zaWduZWQgbG9uZyBrZXk7Ci19IGRybV9oYXNoX2l0ZW1fdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9vcGVuX2hhc2h7CitzdHJ1Y3QgZHJtX29wZW5faGFzaCB7CiAJdW5zaWduZWQgaW50IHNpemU7CiAJdW5zaWduZWQgaW50IG9yZGVyOwogCXVuc2lnbmVkIGludCBmaWxsOwogCXN0cnVjdCBobGlzdF9oZWFkICp0YWJsZTsKIAlpbnQgdXNlX3ZtYWxsb2M7Ci19IGRybV9vcGVuX2hhc2hfdDsKK307CiAKIAotZXh0ZXJuIGludCBkcm1faHRfY3JlYXRlKGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcik7Ci1leHRlcm4gaW50IGRybV9odF9pbnNlcnRfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0pOwotZXh0ZXJuIGludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSwKK2V4dGVybiBpbnQgZHJtX2h0X2NyZWF0ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcik7CitleHRlcm4gaW50IGRybV9odF9pbnNlcnRfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtKTsKK2V4dGVybiBpbnQgZHJtX2h0X2p1c3RfaW5zZXJ0X3BsZWFzZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzZWVkLCBpbnQgYml0cywgaW50IHNoaWZ0LAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGQpOwotZXh0ZXJuIGludCBkcm1faHRfZmluZF9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5LCBkcm1faGFzaF9pdGVtX3QgKippdGVtKTsKK2V4dGVybiBpbnQgZHJtX2h0X2ZpbmRfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqKml0ZW0pOwogCi1leHRlcm4gdm9pZCBkcm1faHRfdmVyYm9zZV9saXN0KGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KTsKLWV4dGVybiBpbnQgZHJtX2h0X3JlbW92ZV9rZXkoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOwotZXh0ZXJuIGludCBkcm1faHRfcmVtb3ZlX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtKTsKLWV4dGVybiB2b2lkIGRybV9odF9yZW1vdmUoZHJtX29wZW5faGFzaF90ICpodCk7CitleHRlcm4gdm9pZCBkcm1faHRfdmVyYm9zZV9saXN0KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOworZXh0ZXJuIGludCBkcm1faHRfcmVtb3ZlX2tleShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KTsKK2V4dGVybiBpbnQgZHJtX2h0X3JlbW92ZV9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0pOworZXh0ZXJuIHZvaWQgZHJtX2h0X3JlbW92ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQpOwogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKaW5kZXggZmFmZWIzNC4uNDYyZjQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCkBAIC04Miw3ICs4Miw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fdmVyc2lvbjMyX3QgdjMyOwotCWRybV92ZXJzaW9uX3QgX191c2VyICp2ZXJzaW9uOworCXN0cnVjdCBkcm1fdmVyc2lvbiBfX3VzZXIgKnZlcnNpb247CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdjMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2MzIpKSkKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV91bmlxdWUzMl90IHVxMzI7Ci0JZHJtX3VuaXF1ZV90IF9fdXNlciAqdTsKKwlzdHJ1Y3QgZHJtX3VuaXF1ZSBfX3VzZXIgKnU7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdXEzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodXEzMikpKQpAQCAtMTU5LDcgKzE1OSw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX3VuaXF1ZTMyX3QgdXEzMjsKLQlkcm1fdW5pcXVlX3QgX191c2VyICp1OworCXN0cnVjdCBkcm1fdW5pcXVlIF9fdXNlciAqdTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdXEzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodXEzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE3OSw4ICsxNzksOCBAQAogdHlwZWRlZiBzdHJ1Y3QgZHJtX21hcDMyIHsKIAl1MzIgb2Zmc2V0OwkJLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgYWRkcmVzcyAoMCBmb3IgU0FSRUEpKi8KIAl1MzIgc2l6ZTsJCS8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIHNpemUgKGJ5dGVzKSAqLwotCWRybV9tYXBfdHlwZV90IHR5cGU7CS8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gbWFwICovCi0JZHJtX21hcF9mbGFnc190IGZsYWdzOwkvKio8IEZsYWdzICovCisJZW51bSBkcm1fbWFwX3R5cGUgdHlwZTsJLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwllbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3M7CS8qKjwgRmxhZ3MgKi8KIAl1MzIgaGFuZGxlOwkJLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLwogCWludCBtdHJyOwkJLyoqPCBNVFJSIHNsb3QgdXNlZCAqLwogfSBkcm1fbWFwMzJfdDsKQEAgLTE5MCw3ICsxOTAsNyBAQAogewogCWRybV9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fbWFwMzJfdCBtMzI7Ci0JZHJtX21hcF90IF9fdXNlciAqbWFwOworCXN0cnVjdCBkcm1fbWFwIF9fdXNlciAqbWFwOwogCWludCBpZHgsIGVycjsKIAl2b2lkICpoYW5kbGU7CiAKQEAgLTIyOCw3ICsyMjgsNyBAQAogewogCWRybV9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fbWFwMzJfdCBtMzI7Ci0JZHJtX21hcF90IF9fdXNlciAqbWFwOworCXN0cnVjdCBkcm1fbWFwIF9fdXNlciAqbWFwOwogCWludCBlcnI7CiAJdm9pZCAqaGFuZGxlOwogCkBAIC0yNzAsNyArMjcwLDcgQEAKIAkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX21hcF90IF9fdXNlciAqbWFwOworCXN0cnVjdCBkcm1fbWFwIF9fdXNlciAqbWFwOwogCXUzMiBoYW5kbGU7CiAKIAlpZiAoZ2V0X3VzZXIoaGFuZGxlLCAmYXJncC0+aGFuZGxlKSkKQEAgLTMwMCw3ICszMDAsNyBAQAogewogCWRybV9jbGllbnQzMl90IGMzMjsKIAlkcm1fY2xpZW50MzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2NsaWVudF90IF9fdXNlciAqY2xpZW50OworCXN0cnVjdCBkcm1fY2xpZW50IF9fdXNlciAqY2xpZW50OwogCWludCBpZHgsIGVycjsKIAogCWlmIChnZXRfdXNlcihpZHgsICZhcmdwLT5pZHgpKQpAQCAtMzMzLDcgKzMzMyw3IEBACiAJdTMyIGNvdW50OwogCXN0cnVjdCB7CiAJCXUzMiB2YWx1ZTsKLQkJZHJtX3N0YXRfdHlwZV90IHR5cGU7CisJCWVudW0gZHJtX3N0YXRfdHlwZSB0eXBlOwogCX0gZGF0YVsxNV07CiB9IGRybV9zdGF0czMyX3Q7CiAKQEAgLTM0Miw3ICszNDIsNyBAQAogewogCWRybV9zdGF0czMyX3QgczMyOwogCWRybV9zdGF0czMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9zdGF0c190IF9fdXNlciAqc3RhdHM7CisJc3RydWN0IGRybV9zdGF0cyBfX3VzZXIgKnN0YXRzOwogCWludCBpLCBlcnI7CiAKIAlzdGF0cyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqc3RhdHMpKTsKQEAgLTM3OSw3ICszNzksNyBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICpidWY7CisJc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKmJ1ZjsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgYWdwX3N0YXJ0OwogCkBAIC00MTEsNyArNDExLDcgQEAKIHsKIAlkcm1fYnVmX2Rlc2MzMl90IGIzMjsKIAlkcm1fYnVmX2Rlc2MzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqYnVmOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZiMzIsIGFyZ3AsIHNpemVvZihiMzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00NDAsOCArNDQwLDggQEAKIAlkcm1fYnVmX2luZm8zMl90IHJlcTMyOwogCWRybV9idWZfaW5mbzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9idWZfZGVzYzMyX3QgX191c2VyICp0bzsKLQlkcm1fYnVmX2luZm9fdCBfX3VzZXIgKnJlcXVlc3Q7Ci0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICpsaXN0OworCXN0cnVjdCBkcm1fYnVmX2luZm8gX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICpsaXN0OwogCXNpemVfdCBuYnl0ZXM7CiAJaW50IGksIGVycjsKIAlpbnQgY291bnQsIGFjdHVhbDsKQEAgLTQ1NywxMSArNDU3LDExIEBACiAJICAgICYmICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgY291bnQgKiBzaXplb2YoZHJtX2J1Zl9kZXNjMzJfdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCW5ieXRlcyA9IHNpemVvZigqcmVxdWVzdCkgKyBjb3VudCAqIHNpemVvZihkcm1fYnVmX2Rlc2NfdCk7CisJbmJ5dGVzID0gc2l6ZW9mKCpyZXF1ZXN0KSArIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBkcm1fYnVmX2Rlc2MpOwogCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShuYnl0ZXMpOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgbmJ5dGVzKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JbGlzdCA9IChkcm1fYnVmX2Rlc2NfdCAqKSAocmVxdWVzdCArIDEpOworCWxpc3QgPSAoc3RydWN0IGRybV9idWZfZGVzYyAqKSAocmVxdWVzdCArIDEpOwogCiAJaWYgKF9fcHV0X3VzZXIoY291bnQsICZyZXF1ZXN0LT5jb3VudCkKIAkgICAgfHwgX19wdXRfdXNlcihsaXN0LCAmcmVxdWVzdC0+bGlzdCkpCkBAIC00NzcsNyArNDc3LDcgQEAKIAlpZiAoY291bnQgPj0gYWN0dWFsKQogCQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsOyArK2kpCiAJCQlpZiAoX19jb3B5X2luX3VzZXIoJnRvW2ldLCAmbGlzdFtpXSwKLQkJCQkJICAgb2Zmc2V0b2YoZHJtX2J1Zl9kZXNjX3QsIGZsYWdzKSkpCisJCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBkcm1fYnVmX2Rlc2MsIGZsYWdzKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoX19wdXRfdXNlcihhY3R1YWwsICZhcmdwLT5jb3VudCkpCkBAIC01MDUsOCArNTA1LDggQEAKIAlkcm1fYnVmX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9idWZfbWFwMzJfdCByZXEzMjsKIAlkcm1fYnVmX3B1YjMyX3QgX191c2VyICpsaXN0MzI7Ci0JZHJtX2J1Zl9tYXBfdCBfX3VzZXIgKnJlcXVlc3Q7Ci0JZHJtX2J1Zl9wdWJfdCBfX3VzZXIgKmxpc3Q7CisJc3RydWN0IGRybV9idWZfbWFwIF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9wdWIgX191c2VyICpsaXN0OwogCWludCBpLCBlcnI7CiAJaW50IGNvdW50LCBhY3R1YWw7CiAJc2l6ZV90IG5ieXRlczsKQEAgLTUxOSwxMSArNTE5LDExIEBACiAKIAlpZiAoY291bnQgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2YoZHJtX2J1Zl9wdWJfdCk7CisJbmJ5dGVzID0gc2l6ZW9mKCpyZXF1ZXN0KSArIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBkcm1fYnVmX3B1Yik7CiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5ieXRlcyk7CiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBuYnl0ZXMpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlsaXN0ID0gKGRybV9idWZfcHViX3QgKikgKHJlcXVlc3QgKyAxKTsKKwlsaXN0ID0gKHN0cnVjdCBkcm1fYnVmX3B1YiAqKSAocmVxdWVzdCArIDEpOwogCiAJaWYgKF9fcHV0X3VzZXIoY291bnQsICZyZXF1ZXN0LT5jb3VudCkKIAkgICAgfHwgX19wdXRfdXNlcihsaXN0LCAmcmVxdWVzdC0+bGlzdCkpCkBAIC01MzksNyArNTM5LDcgQEAKIAlpZiAoY291bnQgPj0gYWN0dWFsKQogCQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsOyArK2kpCiAJCQlpZiAoX19jb3B5X2luX3VzZXIoJmxpc3QzMltpXSwgJmxpc3RbaV0sCi0JCQkJCSAgIG9mZnNldG9mKGRybV9idWZfcHViX3QsIGFkZHJlc3MpKQorCQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgZHJtX2J1Zl9wdWIsIGFkZHJlc3MpKQogCQkJICAgIHx8IF9fZ2V0X3VzZXIoYWRkciwgJmxpc3RbaV0uYWRkcmVzcykKIAkJCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKWFkZHIsCiAJCQkJCSAgJmxpc3QzMltpXS5hZGRyZXNzKSkKQEAgLTU2Miw3ICs1NjIsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9idWZfZnJlZTMyX3QgcmVxMzI7Ci0JZHJtX2J1Zl9mcmVlX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX2ZyZWUgX191c2VyICpyZXF1ZXN0OwogCWRybV9idWZfZnJlZTMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCkBAIC01ODksNyArNTg5LDcgQEAKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9jdHhfcHJpdl9tYXAzMl90IHJlcTMyOwotCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgX191c2VyICpyZXF1ZXN0OwogCWRybV9jdHhfcHJpdl9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQpAQCAtNjEwLDcgKzYxMCw3IEBACiBzdGF0aWMgaW50IGNvbXBhdF9kcm1fZ2V0c2FyZWFjdHgoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIF9fdXNlciAqcmVxdWVzdDsKIAlkcm1fY3R4X3ByaXZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgY3R4X2lkOwpAQCAtNjQ4LDcgKzY0OCw3IEBACiB7CiAJZHJtX2N0eF9yZXMzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fY3R4X3JlczMyX3QgcmVzMzI7Ci0JZHJtX2N0eF9yZXNfdCBfX3VzZXIgKnJlczsKKwlzdHJ1Y3QgZHJtX2N0eF9yZXMgX191c2VyICpyZXM7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVzMzIsIGFyZ3AsIHNpemVvZihyZXMzMikpKQpAQCAtNjU4LDcgKzY1OCw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXMsIHNpemVvZigqcmVzKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCWlmIChfX3B1dF91c2VyKHJlczMyLmNvdW50LCAmcmVzLT5jb3VudCkKLQkgICAgfHwgX19wdXRfdXNlcigoZHJtX2N0eF90IF9fdXNlciAqKSAodW5zaWduZWQgbG9uZylyZXMzMi5jb250ZXh0cywKKwkgICAgfHwgX19wdXRfdXNlcigoc3RydWN0IGRybV9jdHggX191c2VyICopICh1bnNpZ25lZCBsb25nKXJlczMyLmNvbnRleHRzLAogCQkJICAmcmVzLT5jb250ZXh0cykpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC02NzksNyArNjc5LDcgQEAKIAlpbnQgc2VuZF9jb3VudDsJCSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCiAJdTMyIHNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCiAJdTMyIHNlbmRfc2l6ZXM7CQkgIC8qKjwgTGVuZ3RocyBvZiBkYXRhIHRvIHNlbmQgKi8KLQlkcm1fZG1hX2ZsYWdzX3QgZmxhZ3M7CQkgIC8qKjwgRmxhZ3MgKi8KKwllbnVtIGRybV9kbWFfZmxhZ3MgZmxhZ3M7CQkgIC8qKjwgRmxhZ3MgKi8KIAlpbnQgcmVxdWVzdF9jb3VudDsJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCAqLwogCWludCByZXF1ZXN0X3NpemU7CSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KIAl1MzIgcmVxdWVzdF9pbmRpY2VzOwkgIC8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCkBAIC02OTIsNyArNjkyLDcgQEAKIHsKIAlkcm1fZG1hMzJfdCBkMzI7CiAJZHJtX2RtYTMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9kbWFfdCBfX3VzZXIgKmQ7CisJc3RydWN0IGRybV9kbWEgX191c2VyICpkOwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmQzMiwgYXJncCwgc2l6ZW9mKGQzMikpKQpAQCAtNzQwLDcgKzc0MCw3IEBACiB7CiAJZHJtX2FncF9tb2RlMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2FncF9tb2RlMzJfdCBtMzI7Ci0JZHJtX2FncF9tb2RlX3QgX191c2VyICptb2RlOworCXN0cnVjdCBkcm1fYWdwX21vZGUgX191c2VyICptb2RlOwogCiAJaWYgKGdldF91c2VyKG0zMi5tb2RlLCAmYXJncC0+bW9kZSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNzcyLDcgKzc3Miw3IEBACiB7CiAJZHJtX2FncF9pbmZvMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2FncF9pbmZvMzJfdCBpMzI7Ci0JZHJtX2FncF9pbmZvX3QgX191c2VyICppbmZvOworCXN0cnVjdCBkcm1fYWdwX2luZm8gX191c2VyICppbmZvOwogCWludCBlcnI7CiAKIAlpbmZvID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCppbmZvKSk7CkBAIC04MTMsNyArODEzLDcgQEAKIHsKIAlkcm1fYWdwX2J1ZmZlcjMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9hZ3BfYnVmZmVyMzJfdCByZXEzMjsKLQlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICpyZXF1ZXN0OwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKQEAgLTg0NSw3ICs4NDUsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9hZ3BfYnVmZmVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIF9fdXNlciAqcmVxdWVzdDsKIAl1MzIgaGFuZGxlOwogCiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOwpAQCAtODY4LDcgKzg2OCw3IEBACiB7CiAJZHJtX2FncF9iaW5kaW5nMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2FncF9iaW5kaW5nMzJfdCByZXEzMjsKLQlkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyBfX3VzZXIgKnJlcXVlc3Q7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC04ODcsNyArODg3LDcgQEAKIAkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2FncF9iaW5kaW5nMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2FncF9iaW5kaW5nX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgX191c2VyICpyZXF1ZXN0OwogCXUzMiBoYW5kbGU7CiAKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CkBAIC05MTAsNyArOTEwLDcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fc2NhdHRlcl9nYXRoZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBfX3VzZXIgKnJlcXVlc3Q7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIHg7CiAKQEAgLTkzOCw3ICs5MzgsNyBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX3NjYXR0ZXJfZ2F0aGVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgX191c2VyICpyZXF1ZXN0OwogCXVuc2lnbmVkIGxvbmcgeDsKIAogCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKQEAgLTk1MywxMyArOTUzLDEzIEBACiB9CiAKIHN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdDMyIHsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJdTMyIHNpZ25hbDsKIH07CiAKIHN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkzMiB7Ci0JZHJtX3ZibGFua19zZXFfdHlwZV90IHR5cGU7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHR5cGU7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCXMzMiB0dmFsX3NlYzsKIAlzMzIgdHZhbF91c2VjOwpAQCAtOTc1LDcgKzk3NSw3IEBACiB7CiAJZHJtX3dhaXRfdmJsYW5rMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX3dhaXRfdmJsYW5rMzJfdCByZXEzMjsKLQlkcm1fd2FpdF92YmxhbmtfdCBfX3VzZXIgKnJlcXVlc3Q7CisJdW5pb24gZHJtX3dhaXRfdmJsYW5rIF9fdXNlciAqcmVxdWVzdDsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwppbmRleCA1NjU4OTU1Li5iMTk1ZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKQEAgLTUyLDEwICs1MiwxMCBAQAogaW50IGRybV9nZXR1bmlxdWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdW5pcXVlX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV91bmlxdWVfdCB1OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdW5pcXVlIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX3VuaXF1ZSB1OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCBhcmdwLCBzaXplb2YodSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTg2LDE1ICs4NiwxNSBAQAogaW50IGRybV9zZXR1bmlxdWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdW5pcXVlX3QgdTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3VuaXF1ZSB1OwogCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYywgcmV0OwogCiAJaWYgKGRldi0+dW5pcXVlX2xlbiB8fCBkZXYtPnVuaXF1ZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmdSwgKGRybV91bmlxdWVfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YodSkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmdSwgKHN0cnVjdCBkcm1fdW5pcXVlIF9fdXNlciAqKSBhcmcsIHNpemVvZih1KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKCF1LnVuaXF1ZV9sZW4gfHwgdS51bmlxdWVfbGVuID4gMTAyNCkKQEAgLTEzNiw3ICsxMzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRybV9zZXRfYnVzaWQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1fc2V0X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWludCBsZW47CiAKQEAgLTE4NCwxMSArMTg0LDExIEBACiBpbnQgZHJtX2dldG1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9tYXBfdCBtYXA7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IE5VTEw7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fbWFwIG1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3QgPSBOVUxMOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJaW50IGlkeDsKIAlpbnQgaTsKQEAgLTIwNCw5ICsyMDQsOSBAQAogCX0KIAogCWkgPSAwOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgeworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdCkgewogCQlpZiAoaSA9PSBpZHgpIHsKLQkJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX21hcF9saXN0LCBoZWFkKTsKIAkJCWJyZWFrOwogCQl9CiAJCWkrKzsKQEAgLTI0NSwxMSArMjQ1LDExIEBACiBpbnQgZHJtX2dldGNsaWVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jbGllbnRfdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX2NsaWVudF90IF9fdXNlciAqKWFyZzsKLQlkcm1fY2xpZW50X3QgY2xpZW50OwotCWRybV9maWxlX3QgKnB0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY2xpZW50IF9fdXNlciAqYXJncCA9IChzdHJ1Y3QgZHJtX2NsaWVudCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9jbGllbnQgY2xpZW50OworCXN0cnVjdCBkcm1fZmlsZSAqcHQ7CiAJaW50IGlkeDsKIAlpbnQgaTsKIApAQCAtMjU3LDEyICsyNTcsMTggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWR4ID0gY2xpZW50LmlkeDsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZm9yIChpID0gMCwgcHQgPSBkZXYtPmZpbGVfZmlyc3Q7IGkgPCBpZHggJiYgcHQ7IGkrKywgcHQgPSBwdC0+bmV4dCkgOwotCi0JaWYgKCFwdCkgeworCQorCWlmIChsaXN0X2VtcHR5KCZkZXYtPmZpbGVsaXN0KSkgewogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCisJaSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdCwgJmRldi0+ZmlsZWxpc3QsIGxoZWFkKSB7CisJCWlmIChpKysgPj0gaWR4KQorCQkJYnJlYWs7CisJfQorCiAJY2xpZW50LmF1dGggPSBwdC0+YXV0aGVudGljYXRlZDsKIAljbGllbnQucGlkID0gcHQtPnBpZDsKIAljbGllbnQudWlkID0gcHQtPnVpZDsKQEAgLTI4OCw5ICsyOTQsOSBAQAogaW50IGRybV9nZXRzdGF0cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3N0YXRzX3Qgc3RhdHM7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9zdGF0cyBzdGF0czsKIAlpbnQgaTsKIAogCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwpAQCAtMzEwLDcgKzMxNiw3IEBACiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9zdGF0c190IF9fdXNlciAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGRybV9zdGF0cyBfX3VzZXIgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTMyOSwxMCArMzM1LDEwIEBACiBpbnQgZHJtX3NldHZlcnNpb24oRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fc2V0X3ZlcnNpb25fdCBzdjsKLQlkcm1fc2V0X3ZlcnNpb25fdCByZXR2OworCXN0cnVjdCBkcm1fc2V0X3ZlcnNpb24gc3Y7CisJc3RydWN0IGRybV9zZXRfdmVyc2lvbiByZXR2OwogCWludCBpZl92ZXJzaW9uOwotCWRybV9zZXRfdmVyc2lvbl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJc3RydWN0IGRybV9zZXRfdmVyc2lvbiBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwogCWludCByZXQ7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnN2LCBhcmdwLCBzaXplb2Yoc3YpKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKaW5kZXggMmU3NTMzMS4uODcxZDJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKQEAgLTUzLDEwICs1MywxMCBAQAogaW50IGRybV9pcnFfYnlfYnVzaWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1faXJxX2J1c2lkX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9pcnFfYnVzaWRfdCBwOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1faXJxX2J1c2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2lycV9idXNpZCBwOwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04Nyw3ICs4Nyw3IEBACiAgKiBcYyBkcm1fZHJpdmVyX2lycV9wcmVpbnN0YWxsKCkgYW5kIFxjIGRybV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCkgZnVuY3Rpb25zCiAgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2lycV9pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgZHJtX2lycV9pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBzaF9mbGFncyA9IDA7CkBAIC0xMjAsOCArMTIwLDggQEAKIAogCQlzcGluX2xvY2tfaW5pdCgmZGV2LT52YmxfbG9jayk7CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJsX3NpZ3MuaGVhZCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibF9zaWdzMi5oZWFkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJsX3NpZ3MpOworCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52Ymxfc2lnczIpOwogCiAJCWRldi0+dmJsX3BlbmRpbmcgPSAwOwogCX0KQEAgLTE1NSw3ICsxNTUsNyBAQAogICoKICAqIENhbGxzIHRoZSBkcml2ZXIncyBcYyBkcm1fZHJpdmVyX2lycV91bmluc3RhbGwoKSBmdW5jdGlvbiwgYW5kIHN0b3BzIHRoZSBpcnEuCiAgKi8KLWludCBkcm1faXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaW50IGlycV9lbmFibGVkOwogCkBAIC0xOTcsMTMgKzE5NywxMyBAQAogaW50IGRybV9jb250cm9sKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jb250cm9sX3QgY3RsOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY29udHJvbCBjdGw7CiAKIAkvKiBpZiB3ZSBoYXZlbid0IGlycSB3ZSBmYWxsYmFjayBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIC0gdGhpcyB1c2VkIHRvIGJlIGEgc2VwYXJhdGUgZnVuY3Rpb24gaW4gZHJtX2RtYS5oICovCiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0bCwgKGRybV9jb250cm9sX3QgX191c2VyICopIGFyZywgc2l6ZW9mKGN0bCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCAoc3RydWN0IGRybV9jb250cm9sIF9fdXNlciAqKSBhcmcsIHNpemVvZihjdGwpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlzd2l0Y2ggKGN0bC5mdW5jKSB7CkBAIC0yNDQsMTAgKzI0NCwxMCBAQAogICovCiBpbnQgZHJtX3dhaXRfdmJsYW5rKERSTV9JT0NUTF9BUkdTKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3dhaXRfdmJsYW5rX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKLQlkcm1fd2FpdF92YmxhbmtfdCB2Ymx3YWl0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXVuaW9uIGRybV93YWl0X3ZibGFuayBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCXVuaW9uIGRybV93YWl0X3ZibGFuayB2Ymx3YWl0OwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MsIHNlcTsKQEAgLTI5Miw5ICsyOTIsOSBAQAogCiAJaWYgKGZsYWdzICYgX0RSTV9WQkxBTktfU0lHTkFMKSB7CiAJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JCWRybV92Ymxfc2lnX3QgKnZibF9zaWdzID0gKGZsYWdzICYgX0RSTV9WQkxBTktfU0VDT05EQVJZKQorCQlzdHJ1Y3QgbGlzdF9oZWFkICp2Ymxfc2lncyA9IChmbGFncyAmIF9EUk1fVkJMQU5LX1NFQ09OREFSWSkKIAkJCQkgICAgICA/ICZkZXYtPnZibF9zaWdzMiA6ICZkZXYtPnZibF9zaWdzOwotCQlkcm1fdmJsX3NpZ190ICp2Ymxfc2lnOworCQlzdHJ1Y3QgZHJtX3ZibF9zaWcgKnZibF9zaWc7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIApAQCAtMzAyLDcgKzMwMiw3IEBACiAJCSAqIGZvciB0aGUgc2FtZSB2Ymxhbmsgc2VxdWVuY2UgbnVtYmVyOyBub3RoaW5nIHRvIGJlIGRvbmUgaW4KIAkJICogdGhhdCBjYXNlCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZibF9zaWcsICZ2Ymxfc2lncy0+aGVhZCwgaGVhZCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZibF9zaWcsIHZibF9zaWdzLCBoZWFkKSB7CiAJCQlpZiAodmJsX3NpZy0+c2VxdWVuY2UgPT0gdmJsd2FpdC5yZXF1ZXN0LnNlcXVlbmNlCiAJCQkgICAgJiYgdmJsX3NpZy0+aW5mby5zaV9zaWdubyA9PSB2Ymx3YWl0LnJlcXVlc3Quc2lnbmFsCiAJCQkgICAgJiYgdmJsX3NpZy0+dGFzayA9PSBjdXJyZW50KSB7CkBAIC0zMjQsNyArMzI0LDcgQEAKIAogCQlpZiAoIQogCQkgICAgKHZibF9zaWcgPQotCQkgICAgIGRybV9hbGxvYyhzaXplb2YoZHJtX3ZibF9zaWdfdCksIERSTV9NRU1fRFJJVkVSKSkpIHsKKwkJICAgICBkcm1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fdmJsX3NpZyksIERSTV9NRU1fRFJJVkVSKSkpIHsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTMzNiw3ICszMzYsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAKLQkJbGlzdF9hZGRfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKXZibF9zaWcsICZ2Ymxfc2lncy0+aGVhZCk7CisJCWxpc3RfYWRkX3RhaWwoJnZibF9zaWctPmhlYWQsIHZibF9zaWdzKTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAKQEAgLTM3MSw3ICszNzEsNyBAQAogICoKICAqIElmIGEgc2lnbmFsIGlzIG5vdCByZXF1ZXN0ZWQsIHRoZW4gY2FsbHMgdmJsYW5rX3dhaXQoKS4KICAqLwotdm9pZCBkcm1fdmJsX3NlbmRfc2lnbmFscyhkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CkBAIC0zNzksMjAgKzM3OSwxOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0bXA7Ci0JCWRybV92Ymxfc2lnX3QgKnZibF9zaWc7Ci0JCWRybV92Ymxfc2lnX3QgKnZibF9zaWdzID0gaSA/ICZkZXYtPnZibF9zaWdzMiA6ICZkZXYtPnZibF9zaWdzOworCQlzdHJ1Y3QgZHJtX3ZibF9zaWcgKnZibF9zaWcsICp0bXA7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnZibF9zaWdzID0gaSA/ICZkZXYtPnZibF9zaWdzMiA6ICZkZXYtPnZibF9zaWdzOwogCQl1bnNpZ25lZCBpbnQgdmJsX3NlcSA9IGF0b21pY19yZWFkKGkgPyAmZGV2LT52YmxfcmVjZWl2ZWQyIDoKIAkJCQkJCSAgICZkZXYtPnZibF9yZWNlaXZlZCk7CiAKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRtcCwgJnZibF9zaWdzLT5oZWFkKSB7Ci0JCQl2Ymxfc2lnID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fdmJsX3NpZ190LCBoZWFkKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZibF9zaWcsIHRtcCwgdmJsX3NpZ3MsIGhlYWQpIHsKIAkJCWlmICgodmJsX3NlcSAtIHZibF9zaWctPnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpIHsKIAkJCQl2Ymxfc2lnLT5pbmZvLnNpX2NvZGUgPSB2Ymxfc2VxOwogCQkJCXNlbmRfc2lnX2luZm8odmJsX3NpZy0+aW5mby5zaV9zaWdubywKIAkJCQkJICAgICAgJnZibF9zaWctPmluZm8sIHZibF9zaWctPnRhc2spOwogCi0JCQkJbGlzdF9kZWwobGlzdCk7CisJCQkJbGlzdF9kZWwoJnZibF9zaWctPmhlYWQpOwogCiAJCQkJZHJtX2ZyZWUodmJsX3NpZywgc2l6ZW9mKCp2Ymxfc2lnKSwKIAkJCQkJIERSTV9NRU1fRFJJVkVSKTsKQEAgLTQxOCw3ICs0MTYsNyBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90KilkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilkYXRhOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50YXNrbGV0X2xvY2ssIGlycWZsYWdzKTsKQEAgLTQ1NSw3ICs0NTMsNyBAQAogICogY29udGV4dCwgaXQgbXVzdCBub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhpcy4gQWxzbywgdGhlIEhXIGxvY2sgd2lsbAogICogYmUgaGVsZCB3aXRoIHRoZSBrZXJuZWwgY29udGV4dCBvciBhbnkgY2xpZW50IGNvbnRleHQuCiAgKi8KLXZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KGRybV9kZXZpY2VfdCAqZGV2LCB2b2lkICgqZnVuYykoZHJtX2RldmljZV90KikpCit2b2lkIGRybV9sb2NrZWRfdGFza2xldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICgqZnVuYykoc3RydWN0IGRybV9kZXZpY2UgKikpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAlzdGF0aWMgREVDTEFSRV9UQVNLTEVUKGRybV90YXNrbGV0LCBkcm1fbG9ja2VkX3Rhc2tsZXRfZnVuYywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKaW5kZXggYmVmZDFhZi4uYzA1MzRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwpAQCAtNTEsMTUgKzUxLDE1IEBACiBpbnQgZHJtX2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKLQlkcm1fbG9ja190IGxvY2s7CisJc3RydWN0IGRybV9sb2NrIGxvY2s7CiAJaW50IHJldCA9IDA7CiAKIAkrK3ByaXYtPmxvY2tfY291bnQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKSBhcmcsIHNpemVvZihsb2NrKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2NrLCAoc3RydWN0IGRybV9sb2NrIF9fdXNlciAqKSBhcmcsIHNpemVvZihsb2NrKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGxvY2suY29udGV4dCA9PSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKQEAgLTE1MiwxMiArMTUyLDEyIEBACiBpbnQgZHJtX3VubG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbG9ja190IGxvY2s7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9sb2NrIGxvY2s7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopIGFyZywgc2l6ZW9mKGxvY2spKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChzdHJ1Y3QgZHJtX2xvY2sgX191c2VyICopIGFyZywgc2l6ZW9mKGxvY2spKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAobG9jay5jb250ZXh0ID09IERSTV9LRVJORUxfQ09OVEVYVCkgewpAQCAtMjAyLDcgKzIwMiw3IEBACiAgKgogICogQXR0ZW1wdCB0byBtYXJrIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KICAqLwotaW50IGRybV9sb2NrX3Rha2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEsCitpbnQgZHJtX2xvY2tfdGFrZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLAogCQkgIHVuc2lnbmVkIGludCBjb250ZXh0KQogewogCXVuc2lnbmVkIGludCBvbGQsIG5ldywgcHJldjsKQEAgLTI1MSw3ICsyNTEsNyBAQAogICogUmVzZXRzIHRoZSBsb2NrIGZpbGUgcG9pbnRlci4KICAqIE1hcmtzIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KICAqLwotc3RhdGljIGludCBkcm1fbG9ja190cmFuc2Zlcihkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwKK3N0YXRpYyBpbnQgZHJtX2xvY2tfdHJhbnNmZXIoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSwKIAkJCSAgICAgdW5zaWduZWQgaW50IGNvbnRleHQpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAgKiBNYXJrcyB0aGUgbG9jayBhcyBub3QgaGVsZCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLiBXYWtlcyBhbnkgdGFzawogICogd2FpdGluZyBvbiB0aGUgbG9jayBxdWV1ZS4KICAqLwotaW50IGRybV9sb2NrX2ZyZWUoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KQoraW50IGRybV9sb2NrX2ZyZWUoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqbG9jayA9ICZsb2NrX2RhdGEtPmh3X2xvY2stPmxvY2s7CkBAIC0zMTksNyArMzE5LDcgQEAKICAqLwogc3RhdGljIGludCBkcm1fbm90aWZpZXIodm9pZCAqcHJpdikKIHsKLQlkcm1fc2lnZGF0YV90ICpzID0gKGRybV9zaWdkYXRhX3QgKikgcHJpdjsKKwlzdHJ1Y3QgZHJtX3NpZ2RhdGEgKnMgPSAoc3RydWN0IGRybV9zaWdkYXRhICopIHByaXY7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OwogCiAJLyogQWxsb3cgc2lnbmFsIGRlbGl2ZXJ5IGlmIGxvY2sgaXNuJ3QgaGVsZCAqLwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgKiBoYXZpbmcgdG8gd29ycnkgYWJvdXQgc3RhcnZhdGlvbi4KICAqLwogCi12b2lkIGRybV9pZGxlbG9ja190YWtlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhKQordm9pZCBkcm1faWRsZWxvY2tfdGFrZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhKQogewogCWludCByZXQgPSAwOwogCkBAIC0zNjksNyArMzY5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2lkbGVsb2NrX3Rha2UpOwogCi12b2lkIGRybV9pZGxlbG9ja19yZWxlYXNlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhKQordm9pZCBkcm1faWRsZWxvY2tfcmVsZWFzZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhKQogewogCXVuc2lnbmVkIGludCBvbGQsIHByZXY7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpsb2NrID0gJmxvY2tfZGF0YS0+aHdfbG9jay0+bG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKaW5kZXggOTJhODY3MC4uOTMwMTk5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogI2lmIF9fT1NfSEFTX0FHUAogc3RhdGljIHZvaWQgKmFncF9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkgICAgICAgZHJtX2RldmljZV90ICogZGV2KQorCQkgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyAqcGh5c19hZGRyX21hcCwgaSwgbnVtX3BhZ2VzID0KIAkgICAgUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKQEAgLTk0LDcgKzk0LDcgQEAKIAlvZmZzZXQgLT0gZGV2LT5ob3NlLT5tZW1fc3BhY2UtPnN0YXJ0OwogI2VuZGlmCiAKLQlmb3IgKGFncG1lbSA9IGRldi0+YWdwLT5tZW1vcnk7IGFncG1lbTsgYWdwbWVtID0gYWdwbWVtLT5uZXh0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYWdwbWVtLCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkKIAkJaWYgKGFncG1lbS0+Ym91bmQgPD0gb2Zmc2V0CiAJCSAgICAmJiAoYWdwbWVtLT5ib3VuZCArIChhZ3BtZW0tPnBhZ2VzIDw8IFBBR0VfU0hJRlQpKSA+PQogCQkgICAgKG9mZnNldCArIHNpemUpKQpAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIC8qKiBXcmFwcGVyIGFyb3VuZCBhZ3BfYWxsb2NhdGVfbWVtb3J5KCkgKi8KLURSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IHBhZ2VzLCB1MzIgdHlwZSkKK0RSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgcGFnZXMsIHUzMiB0eXBlKQogewogCXJldHVybiBkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShkZXYtPmFncC0+YnJpZGdlLCBwYWdlcywgdHlwZSk7CiB9CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogI2Vsc2UgIC8qICBfX09TX0hBU19BR1AgICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKmFncF9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJICAgICAgZHJtX2RldmljZV90ICogZGV2KQorCQkJICAgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tbS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbW0uYwppbmRleCAyZWMxZDlmLi4zZTZiYzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMKQEAgLTQ0LDI2ICs0NCwyNiBAQAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLXVuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2UoZHJtX21tX3QgKm1tKQordW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShzdHJ1Y3QgZHJtX21tICptbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7CisJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAogCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwotCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAlpZiAoIWVudHJ5LT5mcmVlKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBlbnRyeS0+c2l6ZTsKIH0KIAotaW50IGRybV9tbV9yZW1vdmVfc3BhY2VfZnJvbV90YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQoraW50IGRybV9tbV9yZW1vdmVfc3BhY2VfZnJvbV90YWlsKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdGFpbF9ub2RlOwotCWRybV9tbV9ub2RlX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CiAKIAl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKLQllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CisJZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CiAJaWYgKCFlbnRyeS0+ZnJlZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTc1LDEzICs3NSwxMyBAQAogfQogCiAKLXN0YXRpYyBpbnQgZHJtX21tX2NyZWF0ZV90YWlsX25vZGUoZHJtX21tX3QgKm1tLAorc3RhdGljIGludCBkcm1fbW1fY3JlYXRlX3RhaWxfbm9kZShzdHJ1Y3QgZHJtX21tICptbSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlkcm1fbW1fbm9kZV90ICpjaGlsZDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmNoaWxkOwogCi0JY2hpbGQgPSAoZHJtX21tX25vZGVfdCAqKQorCWNoaWxkID0gKHN0cnVjdCBkcm1fbW1fbm9kZSAqKQogCQlkcm1fYWxsb2Moc2l6ZW9mKCpjaGlsZCksIERSTV9NRU1fTU0pOwogCWlmICghY2hpbGQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTgsMTMgKzk4LDEzIEBACiB9CiAKIAotaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBkcm1fbW1fYWRkX3NwYWNlX3RvX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7CisJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAogCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwotCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAlpZiAoIWVudHJ5LT5mcmVlKSB7CiAJCXJldHVybiBkcm1fbW1fY3JlYXRlX3RhaWxfbm9kZShtbSwgZW50cnktPnN0YXJ0ICsgZW50cnktPnNpemUsIHNpemUpOwogCX0KQEAgLTExMiwxMiArMTEyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBkcm1fbW1fbm9kZV90ICpkcm1fbW1fc3BsaXRfYXRfc3RhcnQoZHJtX21tX25vZGVfdCAqcGFyZW50LAorc3RhdGljIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NwbGl0X2F0X3N0YXJ0KHN0cnVjdCBkcm1fbW1fbm9kZSAqcGFyZW50LAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWRybV9tbV9ub2RlX3QgKmNoaWxkOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqY2hpbGQ7CiAKLQljaGlsZCA9IChkcm1fbW1fbm9kZV90ICopCisJY2hpbGQgPSAoc3RydWN0IGRybV9tbV9ub2RlICopCiAJCWRybV9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CiAJaWYgKCFjaGlsZCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzksMTIgKzEzOSwxMiBAQAogCiAKIAotZHJtX21tX25vZGVfdCAqZHJtX21tX2dldF9ibG9jayhkcm1fbW1fbm9kZV90ICogcGFyZW50LAorc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fZ2V0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqIHBhcmVudCwKIAkJCQl1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGFsaWdubWVudCkKIHsKIAotCWRybV9tbV9ub2RlX3QgKmFsaWduX3NwbGl0b2ZmID0gTlVMTDsKLQlkcm1fbW1fbm9kZV90ICpjaGlsZDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmFsaWduX3NwbGl0b2ZmID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmNoaWxkOwogCXVuc2lnbmVkIHRtcCA9IDA7CiAKIAlpZiAoYWxpZ25tZW50KQpAQCAtMTc1LDI2ICsxNzUsMjYgQEAKICAqIE90aGVyd2lzZSBhZGQgdG8gdGhlIGZyZWUgc3RhY2suCiAgKi8KIAotdm9pZCBkcm1fbW1fcHV0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBjdXIpCit2b2lkIGRybV9tbV9wdXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogY3VyKQogewogCi0JZHJtX21tX3QgKm1tID0gY3VyLT5tbTsKKwlzdHJ1Y3QgZHJtX21tICptbSA9IGN1ci0+bW07CiAJc3RydWN0IGxpc3RfaGVhZCAqY3VyX2hlYWQgPSAmY3VyLT5tbF9lbnRyeTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpyb290X2hlYWQgPSAmbW0tPm1sX2VudHJ5OwotCWRybV9tbV9ub2RlX3QgKnByZXZfbm9kZSA9IE5VTEw7Ci0JZHJtX21tX25vZGVfdCAqbmV4dF9ub2RlOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqcHJldl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm5leHRfbm9kZTsKIAogCWludCBtZXJnZWQgPSAwOwogCiAJaWYgKGN1cl9oZWFkLT5wcmV2ICE9IHJvb3RfaGVhZCkgewotCQlwcmV2X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5wcmV2LCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CisJCXByZXZfbm9kZSA9IGxpc3RfZW50cnkoY3VyX2hlYWQtPnByZXYsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCQlpZiAocHJldl9ub2RlLT5mcmVlKSB7CiAJCQlwcmV2X25vZGUtPnNpemUgKz0gY3VyLT5zaXplOwogCQkJbWVyZ2VkID0gMTsKIAkJfQogCX0KIAlpZiAoY3VyX2hlYWQtPm5leHQgIT0gcm9vdF9oZWFkKSB7Ci0JCW5leHRfbm9kZSA9IGxpc3RfZW50cnkoY3VyX2hlYWQtPm5leHQsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwkJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+bmV4dCwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CiAJCWlmIChuZXh0X25vZGUtPmZyZWUpIHsKIAkJCWlmIChtZXJnZWQpIHsKIAkJCQlwcmV2X25vZGUtPnNpemUgKz0gbmV4dF9ub2RlLT5zaXplOwpAQCAtMjE4LDE0ICsyMTgsMTQgQEAKIAl9CiB9CiAKLWRybV9tbV9ub2RlX3QgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBkcm1fbW1fdCAqIG1tLAorc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3Qgc3RydWN0IGRybV9tbSAqIG1tLAogCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgdW5zaWduZWQgYWxpZ25tZW50LCBpbnQgYmVzdF9tYXRjaCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCWNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmZyZWVfc3RhY2sgPSAmbW0tPmZsX2VudHJ5OwotCWRybV9tbV9ub2RlX3QgKmVudHJ5OwotCWRybV9tbV9ub2RlX3QgKmJlc3Q7CisJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmJlc3Q7CiAJdW5zaWduZWQgbG9uZyBiZXN0X3NpemU7CiAJdW5zaWduZWQgd2FzdGVkOwogCkBAIC0yMzMsNyArMjMzLDcgQEAKIAliZXN0X3NpemUgPSB+MFVMOwogCiAJbGlzdF9mb3JfZWFjaChsaXN0LCBmcmVlX3N0YWNrKSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbW1fbm9kZV90LCBmbF9lbnRyeSk7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZsX2VudHJ5KTsKIAkJd2FzdGVkID0gMDsKIAogCQlpZiAoZW50cnktPnNpemUgPCBzaXplKQpAQCAtMjU5LDE0ICsyNTksMTQgQEAKIAlyZXR1cm4gYmVzdDsKIH0KIAotaW50IGRybV9tbV9jbGVhbihkcm1fbW1fdCAqIG1tKQoraW50IGRybV9tbV9jbGVhbihzdHJ1Y3QgZHJtX21tICogbW0pCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZtbS0+bWxfZW50cnk7CiAKIAlyZXR1cm4gKGhlYWQtPm5leHQtPm5leHQgPT0gaGVhZCk7CiB9CiAKLWludCBkcm1fbW1faW5pdChkcm1fbW1fdCAqIG1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCitpbnQgZHJtX21tX2luaXQoc3RydWN0IGRybV9tbSAqIG1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbF9lbnRyeSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5mbF9lbnRyeSk7CkBAIC0yNzUsMTIgKzI3NSwxMiBAQAogfQogCiAKLXZvaWQgZHJtX21tX3Rha2Vkb3duKGRybV9tbV90ICogbW0pCit2b2lkIGRybV9tbV90YWtlZG93bihzdHJ1Y3QgZHJtX21tICogbW0pCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqYm5vZGUgPSBtbS0+ZmxfZW50cnkubmV4dDsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCi0JZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBkcm1fbW1fbm9kZV90LCBmbF9lbnRyeSk7CisJZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZsX2VudHJ5KTsKIAogCWlmIChlbnRyeS0+bWxfZW50cnkubmV4dCAhPSAmbW0tPm1sX2VudHJ5IHx8CiAJICAgIGVudHJ5LT5mbF9lbnRyeS5uZXh0ICE9ICZtbS0+ZmxfZW50cnkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCmluZGV4IDBmZTdiNDQuLjBiOGQzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaApAQCAtMzQsOCArMzQsOCBAQAogLyoqIFJlYWQvd3JpdGUgbWVtb3J5IGJhcnJpZXIgKi8KICNkZWZpbmUgRFJNX01FTU9SWUJBUlJJRVIoKQkJbWIoKQogLyoqIERSTSBkZXZpY2UgbG9jYWwgZGVjbGFyYXRpb24gKi8KLSNkZWZpbmUgRFJNX0RFVklDRQlkcm1fZmlsZV90CSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOyBcCi0JCQlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldgorI2RlZmluZSBEUk1fREVWSUNFCXN0cnVjdCBkcm1fZmlsZQkqcHJpdgk9IGZpbHAtPnByaXZhdGVfZGF0YTsgXAorCQkJc3RydWN0IGRybV9kZXZpY2UgKmRldgk9IHByaXYtPmhlYWQtPmRldgogCiAvKiogSVJRIGhhbmRsZXIgYXJndW1lbnRzIGFuZCByZXR1cm4gdHlwZSBhbmQgdmFsdWVzICovCiAjZGVmaW5lIERSTV9JUlFfQVJHUwkJaW50IGlycSwgdm9pZCAqYXJnCkBAIC05NiwyNCArOTYsNiBAQAogCiAjZGVmaW5lIERSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihfcHJpdiwgX2ZpbHApIF9wcml2ID0gX2ZpbHAtPnByaXZhdGVfZGF0YQogCi0vKioKLSAqIEdldCB0aGUgcG9pbnRlciB0byB0aGUgU0FSRUEuCi0gKgotICogU2VhcmNoZXMgdGhlIFNBUkVBIG9uIHRoZSBtYXBwaW5nIGxpc3RzIGFuZCBwb2ludHMgZHJtX2RldmljZTo6c2FyZWEgdG8gaXQuCi0gKi8KLSNkZWZpbmUgRFJNX0dFVFNBUkVBKCkJCQkJCQkJIFwKLWRvIHsgCQkJCQkJCQkJIFwKLQlkcm1fbWFwX2xpc3RfdCAqZW50cnk7CQkJCQkJIFwKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KCBlbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCApIHsJIFwKLQkJaWYgKCBlbnRyeS0+bWFwICYmCQkJCQkgXAotCQkgICAgIGVudHJ5LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYJCQkgXAotCQkgICAgIChlbnRyeS0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSykgKSB7CSBcCi0JCQlkZXZfcHJpdi0+c2FyZWEgPSBlbnRyeS0+bWFwOwkJCSBcCi0gCQkJYnJlYWs7CQkJCQkJIFwKLSAJCX0JCQkJCQkJIFwKLSAJfQkJCQkJCQkJIFwKLX0gd2hpbGUgKDApCi0KICNkZWZpbmUgRFJNX0haIEhaCiAKICNkZWZpbmUgRFJNX1dBSVRfT04oIHJldCwgcXVldWUsIHRpbWVvdXQsIGNvbmRpdGlvbiApCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2kuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaS5jCmluZGV4IDg2YTBmMWMuLmUyOTJiYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAvKioKICAqIFxicmllZiBBbGxvY2F0ZSBhIFBDSSBjb25zaXN0ZW50IG1lbW9yeSBibG9jaywgZm9yIERNQS4KICAqLwotZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCitkcm1fZG1hX2hhbmRsZV90ICpkcm1fcGNpX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAogCQkJCWRtYV9hZGRyX3QgbWF4YWRkcikKIHsKIAlkcm1fZG1hX2hhbmRsZV90ICpkbWFoOwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNlIGluIHRoZSBMaW51eC1zcGVjaWZpYyBEUk0gY29yZSBjb2RlLgogICovCi12b2lkIF9fZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpCit2b2lkIF9fZHJtX3BjaV9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKIHsKICNpZiAxCiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtMTcyLDcgKzE3Miw3IEBACiAvKioKICAqIFxicmllZiBGcmVlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrCiAgKi8KLXZvaWQgZHJtX3BjaV9mcmVlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpCit2b2lkIGRybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpCiB7CiAJX19kcm1fcGNpX2ZyZWUoZGV2LCBkbWFoKTsKIAlrZnJlZShkbWFoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwppbmRleCBiMjA0NDk4Li4xMmRmZWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCkBAIC04Nyw3ICs4Nyw3IEBACiAgKiAiL3Byb2MvZHJpLyVtaW5vciUvIiwgYW5kIGVhY2ggZW50cnkgaW4gcHJvY19saXN0IGFzCiAgKiAiL3Byb2MvZHJpLyVtaW5vciUvJW5hbWUlIi4KICAqLwotaW50IGRybV9wcm9jX2luaXQoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbWlub3IsCitpbnQgZHJtX3Byb2NfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG1pbm9yLAogCQkgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcm9vdCwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqZGV2X3Jvb3QpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CkBAIC0xNjMsNyArMTYzLDcgQEAKIHN0YXRpYyBpbnQgZHJtX25hbWVfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7CiAKIAlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKQEAgLTIwNSwxMSArMjA1LDEwIEBACiBzdGF0aWMgaW50IGRybV9fdm1faW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCWludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKLQlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAKIAkvKiBIYXJkY29kZWQgZnJvbSBfRFJNX0ZSQU1FX0JVRkZFUiwKIAkgICBfRFJNX1JFR0lTVEVSUywgX0RSTV9TSE0sIF9EUk1fQUdQLCBhbmQKQEAgLTIyOSw5ICsyMjgsNyBAQAogCURSTV9QUk9DX1BSSU5UKCJzbG90CSBvZmZzZXQJICAgICAgc2l6ZSB0eXBlIGZsYWdzCSAiCiAJCSAgICAgICAiYWRkcmVzcyBtdHJyXG5cbiIpOwogCWkgPSAwOwotCWlmIChkZXYtPm1hcGxpc3QgIT0gTlVMTCkKLQkJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCW1hcCA9IHJfbGlzdC0+bWFwOwogCQlpZiAoIW1hcCkKIAkJCWNvbnRpbnVlOwpAQCAtMjQyLDE0ICsyMzksMTUgQEAKIAkJRFJNX1BST0NfUFJJTlQoIiU0ZCAweCUwOGx4IDB4JTA4bHggJTQuNHMgIDB4JTAyeCAweCUwOHggIiwKIAkJCSAgICAgICBpLAogCQkJICAgICAgIG1hcC0+b2Zmc2V0LAotCQkJICAgICAgIG1hcC0+c2l6ZSwgdHlwZSwgbWFwLT5mbGFncywgcl9saXN0LT51c2VyX3Rva2VuKTsKKwkJCSAgICAgICBtYXAtPnNpemUsIHR5cGUsIG1hcC0+ZmxhZ3MsCisJCQkgICAgICAgcl9saXN0LT51c2VyX3Rva2VuKTsKIAkJaWYgKG1hcC0+bXRyciA8IDApIHsKIAkJCURSTV9QUk9DX1BSSU5UKCJub25lXG4iKTsKIAkJfSBlbHNlIHsKIAkJCURSTV9QUk9DX1BSSU5UKCIlNGRcbiIsIG1hcC0+bXRycik7CiAJCX0KIAkJaSsrOwotCQl9CisJfQogCiAJaWYgKGxlbiA+IHJlcXVlc3QgKyBvZmZzZXQpCiAJCXJldHVybiByZXF1ZXN0OwpAQCAtMjYzLDcgKzI2MSw3IEBACiBzdGF0aWMgaW50IGRybV92bV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0yODYsMTAgKzI4NCwxMCBAQAogc3RhdGljIGludCBkcm1fX3F1ZXVlc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgICAgaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKIAlpbnQgaTsKLQlkcm1fcXVldWVfdCAqcTsKKwlzdHJ1Y3QgZHJtX3F1ZXVlICpxOwogCiAJaWYgKG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CiAJCSplb2YgPSAxOwpAQCAtMzM2LDcgKzMzNCw3IEBACiBzdGF0aWMgaW50IGRybV9xdWV1ZXNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCSAgIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMzU5LDkgKzM1Nyw5IEBACiBzdGF0aWMgaW50IGRybV9fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAogCWlmICghZG1hIHx8IG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CkBAIC00MDgsNyArNDA2LDcgQEAKIHN0YXRpYyBpbnQgZHJtX2J1ZnNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTQzMSw5ICs0MjksOSBAQAogc3RhdGljIGludCBkcm1fX2NsaWVudHNfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJICAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwotCWRybV9maWxlX3QgKnByaXY7CisJc3RydWN0IGRybV9maWxlICpwcml2OwogCiAJaWYgKG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CiAJCSplb2YgPSAxOwpAQCAtNDQ0LDcgKzQ0Miw3IEBACiAJKmVvZiA9IDA7CiAKIAlEUk1fUFJPQ19QUklOVCgiYSBkZXYJcGlkICAgIHVpZAltYWdpYwkgIGlvY3Rsc1xuXG4iKTsKLQlmb3IgKHByaXYgPSBkZXYtPmZpbGVfZmlyc3Q7IHByaXY7IHByaXYgPSBwcml2LT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmZGV2LT5maWxlbGlzdCwgbGhlYWQpIHsKIAkJRFJNX1BST0NfUFJJTlQoIiVjICUzZCAlNWQgJTVkICUxMHUgJTEwbHVcbiIsCiAJCQkgICAgICAgcHJpdi0+YXV0aGVudGljYXRlZCA/ICd5JyA6ICduJywKIAkJCSAgICAgICBwcml2LT5taW5vciwKQEAgLTQ2NCw3ICs0NjIsNyBAQAogc3RhdGljIGludCBkcm1fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgICAgaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtNDc4LDkgKzQ3Niw5IEBACiBzdGF0aWMgaW50IGRybV9fdm1hX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwotCWRybV92bWFfZW50cnlfdCAqcHQ7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnB0OwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogI2lmIGRlZmluZWQoX19pMzg2X18pCiAJdW5zaWduZWQgaW50IHBncHJvdDsKQEAgLTQ5Nyw3ICs0OTUsNyBAQAogCURSTV9QUk9DX1BSSU5UKCJ2bWEgdXNlIGNvdW50OiAlZCwgaGlnaF9tZW1vcnkgPSAlcCwgMHglMDhseFxuIiwKIAkJICAgICAgIGF0b21pY19yZWFkKCZkZXYtPnZtYV9jb3VudCksCiAJCSAgICAgICBoaWdoX21lbW9yeSwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSk7Ci0JZm9yIChwdCA9IGRldi0+dm1hbGlzdDsgcHQ7IHB0ID0gcHQtPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0LCAmZGV2LT52bWFsaXN0LCBoZWFkKSB7CiAJCWlmICghKHZtYSA9IHB0LT52bWEpKQogCQkJY29udGludWU7CiAJCURSTV9QUk9DX1BSSU5UKCJcbiU1ZCAweCUwOGx4LTB4JTA4bHggJWMlYyVjJWMlYyVjIDB4JTA4bHgwMDAiLApAQCAtNTM3LDcgKzUzNSw3IEBACiBzdGF0aWMgaW50IGRybV92bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCWludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc2FyZWEuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmgKaW5kZXggZTk0Mjk3Yi4uZjU0NjY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc2FyZWEuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCkBAIC01MCwyOSArNTAsMzUgQEAKICNkZWZpbmUgU0FSRUFfRFJBV0FCTEVfQ0xBSU1FRF9FTlRSWSAgICAweDgwMDAwMDAwCiAKIC8qKiBTQVJFQSBkcmF3YWJsZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIHsKK3N0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgewogCXVuc2lnbmVkIGludCBzdGFtcDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci19IGRybV9zYXJlYV9kcmF3YWJsZV90OworfTsKIAogLyoqIFNBUkVBIGZyYW1lICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWFfZnJhbWUgeworc3RydWN0IGRybV9zYXJlYV9mcmFtZSB7CiAJdW5zaWduZWQgaW50IHg7CiAJdW5zaWduZWQgaW50IHk7CiAJdW5zaWduZWQgaW50IHdpZHRoOwogCXVuc2lnbmVkIGludCBoZWlnaHQ7CiAJdW5zaWduZWQgaW50IGZ1bGxzY3JlZW47Ci19IGRybV9zYXJlYV9mcmFtZV90OworfTsKIAogLyoqIFNBUkVBICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWEgeworc3RydWN0IGRybV9zYXJlYSB7CiAgICAgLyoqIGZpcnN0IHRoaW5nIGlzIGFsd2F5cyB0aGUgRFJNIGxvY2tpbmcgc3RydWN0dXJlICovCi0JZHJtX2h3X2xvY2tfdCBsb2NrOworCXN0cnVjdCBkcm1faHdfbG9jayBsb2NrOwogICAgIC8qKiBcdG9kbyBVc2UgcmVhZGVycy93cml0ZXIgbG9jayBmb3IgZHJtX3NhcmVhOjpkcmF3YWJsZV9sb2NrICovCi0JZHJtX2h3X2xvY2tfdCBkcmF3YWJsZV9sb2NrOwotCWRybV9zYXJlYV9kcmF3YWJsZV90IGRyYXdhYmxlVGFibGVbU0FSRUFfTUFYX0RSQVdBQkxFU107CS8qKjwgZHJhd2FibGVzICovCi0JZHJtX3NhcmVhX2ZyYW1lX3QgZnJhbWU7CS8qKjwgZnJhbWUgKi8KKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgZHJhd2FibGVfbG9jazsKKwlzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIGRyYXdhYmxlVGFibGVbU0FSRUFfTUFYX0RSQVdBQkxFU107CS8qKjwgZHJhd2FibGVzICovCisJc3RydWN0IGRybV9zYXJlYV9mcmFtZSBmcmFtZTsJLyoqPCBmcmFtZSAqLwogCWRybV9jb250ZXh0X3QgZHVtbXlfY29udGV4dDsKLX0gZHJtX3NhcmVhX3Q7Cit9OworCisjaWZuZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSBkcm1fc2FyZWFfZHJhd2FibGVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9mcmFtZSBkcm1fc2FyZWFfZnJhbWVfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zYXJlYSBkcm1fc2FyZWFfdDsKKyNlbmRpZgogCiAjZW5kaWYJCQkJLyogX0RSTV9TQVJFQV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jCmluZGV4IDA2ZWY3ZGQuLjA2N2QyNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogI2RlZmluZSBERUJVR19TQ0FUVEVSIDAKIAotdm9pZCBkcm1fc2dfY2xlYW51cChkcm1fc2dfbWVtX3QgKiBlbnRyeSkKK3ZvaWQgZHJtX3NnX2NsZWFudXAoc3RydWN0IGRybV9zZ19tZW0gKiBlbnRyeSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgaTsKQEAgLTY1LDExICs2NSwxMSBAQAogaW50IGRybV9zZ19hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9zY2F0dGVyX2dhdGhlcl90IHJlcXVlc3Q7Ci0JZHJtX3NnX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHJlcXVlc3Q7CisJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgcGFnZXMsIGksIGo7CiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjAxLDE2ICsyMDEsMTYgQEAKIGludCBkcm1fc2dfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCByZXF1ZXN0OwotCWRybV9zZ19tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciByZXF1ZXN0OworCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeTsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAotCQkJICAgKGRybV9zY2F0dGVyX2dhdGhlcl90IF9fdXNlciAqKSBhcmcsCisJCQkgICAoc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBfX3VzZXIgKikgYXJnLAogCQkJICAgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYwppbmRleCBlMTVkYjZkLi44NDIxYTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jCkBAIC0zOCwxMyArMzgsMTMgQEAKIAogI2luY2x1ZGUgImRybV9zbWFuLmgiCiAKLXR5cGVkZWYgc3RydWN0IGRybV9vd25lcl9pdGVtIHsKLQlkcm1faGFzaF9pdGVtX3Qgb3duZXJfaGFzaDsKK3N0cnVjdCBkcm1fb3duZXJfaXRlbSB7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gb3duZXJfaGFzaDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNtYW5fbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1lbV9ibG9ja3M7Ci19IGRybV9vd25lcl9pdGVtX3Q7Cit9OwogCi12b2lkIGRybV9zbWFuX3Rha2Vkb3duKGRybV9zbWFuX3QgKiBzbWFuKQordm9pZCBkcm1fc21hbl90YWtlZG93bihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuKQogewogCWRybV9odF9yZW1vdmUoJnNtYW4tPnVzZXJfaGFzaF90YWIpOwogCWRybV9odF9yZW1vdmUoJnNtYW4tPm93bmVyX2hhc2hfdGFiKTsKQEAgLTU2LDEyICs1NiwxMiBAQAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl90YWtlZG93bik7CiAKIGludAotZHJtX3NtYW5faW5pdChkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG51bV9tYW5hZ2VycywKK2RybV9zbWFuX2luaXQoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG51bV9tYW5hZ2VycywKIAkgICAgICB1bnNpZ25lZCBpbnQgdXNlcl9vcmRlciwgdW5zaWduZWQgaW50IG93bmVyX29yZGVyKQogewogCWludCByZXQgPSAwOwogCi0Jc21hbi0+bW0gPSAoZHJtX3NtYW5fbW1fdCAqKSBkcm1fY2FsbG9jKG51bV9tYW5hZ2Vycywgc2l6ZW9mKCpzbWFuLT5tbSksCisJc21hbi0+bW0gPSAoc3RydWN0IGRybV9zbWFuX21tICopIGRybV9jYWxsb2MobnVtX21hbmFnZXJzLCBzaXplb2YoKnNtYW4tPm1tKSwKIAkJCQkJCURSTV9NRU1fTU0pOwogCWlmICghc21hbi0+bW0pIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTg4LDggKzg4LDggQEAKIHN0YXRpYyB2b2lkICpkcm1fc21hbl9tbV9hbGxvY2F0ZSh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQpCiB7Ci0JZHJtX21tX3QgKm1tID0gKGRybV9tbV90ICopIHByaXZhdGU7Ci0JZHJtX21tX25vZGVfdCAqdG1wOworCXN0cnVjdCBkcm1fbW0gKm1tID0gKHN0cnVjdCBkcm1fbW0gKikgcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKnRtcDsKIAogCXRtcCA9IGRybV9tbV9zZWFyY2hfZnJlZShtbSwgc2l6ZSwgYWxpZ25tZW50LCAxKTsKIAlpZiAoIXRtcCkgewpAQCAtMTAxLDMwICsxMDEsMzAgQEAKIAogc3RhdGljIHZvaWQgZHJtX3NtYW5fbW1fZnJlZSh2b2lkICpwcml2YXRlLCB2b2lkICpyZWYpCiB7Ci0JZHJtX21tX25vZGVfdCAqbm9kZSA9IChkcm1fbW1fbm9kZV90ICopIHJlZjsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9tbV9ub2RlICopIHJlZjsKIAogCWRybV9tbV9wdXRfYmxvY2sobm9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRybV9zbWFuX21tX2Rlc3Ryb3kodm9pZCAqcHJpdmF0ZSkKIHsKLQlkcm1fbW1fdCAqbW0gPSAoZHJtX21tX3QgKikgcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21tICptbSA9IChzdHJ1Y3QgZHJtX21tICopIHByaXZhdGU7CiAJZHJtX21tX3Rha2Vkb3duKG1tKTsKIAlkcm1fZnJlZShtbSwgc2l6ZW9mKCptbSksIERSTV9NRU1fTU0pOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkcm1fc21hbl9tbV9vZmZzZXQodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKQogewotCWRybV9tbV9ub2RlX3QgKm5vZGUgPSAoZHJtX21tX25vZGVfdCAqKSByZWY7CisJc3RydWN0IGRybV9tbV9ub2RlICpub2RlID0gKHN0cnVjdCBkcm1fbW1fbm9kZSAqKSByZWY7CiAJcmV0dXJuIG5vZGUtPnN0YXJ0OwogfQogCiBpbnQKLWRybV9zbWFuX3NldF9yYW5nZShkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCitkcm1fc21hbl9zZXRfcmFuZ2Uoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCiAJCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlkcm1fc21hbl9tbV90ICpzbWFuX21tOwotCWRybV9tbV90ICptbTsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKnNtYW5fbW07CisJc3RydWN0IGRybV9tbSAqbW07CiAJaW50IHJldDsKIAogCUJVR19PTihtYW5hZ2VyID49IHNtYW4tPm51bV9tYW5hZ2Vycyk7CkBAIC0xNTMsOCArMTUzLDggQEAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fc2V0X3JhbmdlKTsKIAogaW50Ci1kcm1fc21hbl9zZXRfbWFuYWdlcihkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCi0JCSAgICAgZHJtX3NtYW5fbW1fdCAqIGFsbG9jYXRvcikKK2RybV9zbWFuX3NldF9tYW5hZ2VyKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAorCQkgICAgIHN0cnVjdCBkcm1fc21hbl9tbSAqIGFsbG9jYXRvcikKIHsKIAlCVUdfT04obWFuYWdlciA+PSBzbWFuLT5udW1fbWFuYWdlcnMpOwogCXNtYW4tPm1tW21hbmFnZXJdID0gKmFsbG9jYXRvcjsKQEAgLTE2MywxNiArMTYzLDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX3NldF9tYW5hZ2VyKTsKIAotc3RhdGljIGRybV9vd25lcl9pdGVtX3QgKmRybV9zbWFuX2dldF9vd25lcl9pdGVtKGRybV9zbWFuX3QgKiBzbWFuLAorc3RhdGljIHN0cnVjdCBkcm1fb3duZXJfaXRlbSAqZHJtX3NtYW5fZ2V0X293bmVyX2l0ZW0oc3RydWN0IGRybV9zbWFuICogc21hbiwKIAkJCQkJCSB1bnNpZ25lZCBsb25nIG93bmVyKQogewogCWludCByZXQ7Ci0JZHJtX2hhc2hfaXRlbV90ICpvd25lcl9oYXNoX2l0ZW07Ci0JZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqb3duZXJfaGFzaF9pdGVtOworCXN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbTsKIAogCXJldCA9IGRybV9odF9maW5kX2l0ZW0oJnNtYW4tPm93bmVyX2hhc2hfdGFiLCBvd25lciwgJm93bmVyX2hhc2hfaXRlbSk7CiAJaWYgKCFyZXQpIHsKLQkJcmV0dXJuIGRybV9oYXNoX2VudHJ5KG93bmVyX2hhc2hfaXRlbSwgZHJtX293bmVyX2l0ZW1fdCwKKwkJcmV0dXJuIGRybV9oYXNoX2VudHJ5KG93bmVyX2hhc2hfaXRlbSwgc3RydWN0IGRybV9vd25lcl9pdGVtLAogCQkJCSAgICAgIG93bmVyX2hhc2gpOwogCX0KIApAQCAtMTk0LDE0ICsxOTQsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotZHJtX21lbWJsb2NrX2l0ZW1fdCAqZHJtX3NtYW5fYWxsb2MoZHJtX3NtYW5fdCAqc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCitzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKmRybV9zbWFuX2FsbG9jKHN0cnVjdCBkcm1fc21hbiAqc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50LAogCQkJCSAgICB1bnNpZ25lZCBsb25nIG93bmVyKQogewogCXZvaWQgKnRtcDsKLQlkcm1fc21hbl9tbV90ICpzbWFuX21tOwotCWRybV9vd25lcl9pdGVtX3QgKm93bmVyX2l0ZW07Ci0JZHJtX21lbWJsb2NrX2l0ZW1fdCAqbWVtYmxvY2s7CisJc3RydWN0IGRybV9zbWFuX21tICpzbWFuX21tOworCXN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbTsKKwlzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKm1lbWJsb2NrOwogCiAJQlVHX09OKG1hbmFnZXIgPj0gc21hbi0+bnVtX21hbmFnZXJzKTsKIApAQCAtMjQ2LDkgKzI0Niw5IEBACiAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fYWxsb2MpOwogCi1zdGF0aWMgdm9pZCBkcm1fc21hbl9mcmVlKGRybV9tZW1ibG9ja19pdGVtX3QgKml0ZW0pCitzdGF0aWMgdm9pZCBkcm1fc21hbl9mcmVlKHN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqaXRlbSkKIHsKLQlkcm1fc21hbl90ICpzbWFuID0gaXRlbS0+c21hbjsKKwlzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4gPSBpdGVtLT5zbWFuOwogCiAJbGlzdF9kZWwoJml0ZW0tPm93bmVyX2xpc3QpOwogCWRybV9odF9yZW1vdmVfaXRlbSgmc21hbi0+dXNlcl9oYXNoX3RhYiwgJml0ZW0tPnVzZXJfaGFzaCk7CkBAIC0yNTYsNDAgKzI1Niw0MSBAQAogCWRybV9mcmVlKGl0ZW0sIHNpemVvZigqaXRlbSksIERSTV9NRU1fTU0pOwogfQogCi1pbnQgZHJtX3NtYW5fZnJlZV9rZXkoZHJtX3NtYW5fdCAqc21hbiwgdW5zaWduZWQgaW50IGtleSkKK2ludCBkcm1fc21hbl9mcmVlX2tleShzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sIHVuc2lnbmVkIGludCBrZXkpCiB7Ci0JZHJtX2hhc2hfaXRlbV90ICpoYXNoX2l0ZW07Ci0JZHJtX21lbWJsb2NrX2l0ZW1fdCAqbWVtYmxvY2tfaXRlbTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaF9pdGVtOworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqbWVtYmxvY2tfaXRlbTsKIAogCWlmIChkcm1faHRfZmluZF9pdGVtKCZzbWFuLT51c2VyX2hhc2hfdGFiLCBrZXksICZoYXNoX2l0ZW0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbWJsb2NrX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIGRybV9tZW1ibG9ja19pdGVtX3QsIHVzZXJfaGFzaCk7CisJbWVtYmxvY2tfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgc3RydWN0IGRybV9tZW1ibG9ja19pdGVtLAorCQkJCSAgICAgICB1c2VyX2hhc2gpOwogCWRybV9zbWFuX2ZyZWUobWVtYmxvY2tfaXRlbSk7CiAJcmV0dXJuIDA7CiB9CiAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fZnJlZV9rZXkpOwogCi1zdGF0aWMgdm9pZCBkcm1fc21hbl9yZW1vdmVfb3duZXIoZHJtX3NtYW5fdCAqc21hbiwKLQkJCQkgIGRybV9vd25lcl9pdGVtX3QgKm93bmVyX2l0ZW0pCitzdGF0aWMgdm9pZCBkcm1fc21hbl9yZW1vdmVfb3duZXIoc3RydWN0IGRybV9zbWFuICpzbWFuLAorCQkJCSAgc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtKQogewogCWxpc3RfZGVsKCZvd25lcl9pdGVtLT5zbWFuX2xpc3QpOwogCWRybV9odF9yZW1vdmVfaXRlbSgmc21hbi0+b3duZXJfaGFzaF90YWIsICZvd25lcl9pdGVtLT5vd25lcl9oYXNoKTsKIAlkcm1fZnJlZShvd25lcl9pdGVtLCBzaXplb2YoKm93bmVyX2l0ZW0pLCBEUk1fTUVNX01NKTsKIH0KIAotaW50IGRybV9zbWFuX293bmVyX2NsZWFuKGRybV9zbWFuX3QgKnNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpCitpbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oc3RydWN0IGRybV9zbWFuICpzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKQogewogCi0JZHJtX2hhc2hfaXRlbV90ICpoYXNoX2l0ZW07Ci0JZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaF9pdGVtOworCXN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbTsKIAogCWlmIChkcm1faHRfZmluZF9pdGVtKCZzbWFuLT5vd25lcl9oYXNoX3RhYiwgb3duZXIsICZoYXNoX2l0ZW0pKSB7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlvd25lcl9pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBkcm1fb3duZXJfaXRlbV90LCBvd25lcl9oYXNoKTsKKwlvd25lcl9pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0sIG93bmVyX2hhc2gpOwogCWlmIChvd25lcl9pdGVtLT5tZW1fYmxvY2tzLm5leHQgPT0gJm93bmVyX2l0ZW0tPm1lbV9ibG9ja3MpIHsKIAkJZHJtX3NtYW5fcmVtb3ZlX293bmVyKHNtYW4sIG93bmVyX2l0ZW0pOwogCQlyZXR1cm4gLTE7CkBAIC0zMDAsMTAgKzMwMSwxMCBAQAogCiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX293bmVyX2NsZWFuKTsKIAotc3RhdGljIHZvaWQgZHJtX3NtYW5fZG9fb3duZXJfY2xlYW51cChkcm1fc21hbl90ICpzbWFuLAotCQkJCSAgICAgIGRybV9vd25lcl9pdGVtX3QgKm93bmVyX2l0ZW0pCitzdGF0aWMgdm9pZCBkcm1fc21hbl9kb19vd25lcl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqc21hbiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW0pCiB7Ci0JZHJtX21lbWJsb2NrX2l0ZW1fdCAqZW50cnksICpuZXh0OworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqZW50cnksICpuZXh0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmb3duZXJfaXRlbS0+bWVtX2Jsb2NrcywKIAkJCQkgb3duZXJfbGlzdCkgewpAQCAtMzEyLDI4ICszMTMsMjggQEAKIAlkcm1fc21hbl9yZW1vdmVfb3duZXIoc21hbiwgb3duZXJfaXRlbSk7CiB9CiAKLXZvaWQgZHJtX3NtYW5fb3duZXJfY2xlYW51cChkcm1fc21hbl90ICpzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKQordm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcikKIHsKIAotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaF9pdGVtOwotCWRybV9vd25lcl9pdGVtX3QgKm93bmVyX2l0ZW07CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2hfaXRlbTsKKwlzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW07CiAKIAlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmc21hbi0+b3duZXJfaGFzaF90YWIsIG93bmVyLCAmaGFzaF9pdGVtKSkgewogCiAJCXJldHVybjsKIAl9CiAKLQlvd25lcl9pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBkcm1fb3duZXJfaXRlbV90LCBvd25lcl9oYXNoKTsKKwlvd25lcl9pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0sIG93bmVyX2hhc2gpOwogCWRybV9zbWFuX2RvX293bmVyX2NsZWFudXAoc21hbiwgb3duZXJfaXRlbSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fb3duZXJfY2xlYW51cCk7CiAKLXZvaWQgZHJtX3NtYW5fY2xlYW51cChkcm1fc21hbl90ICpzbWFuKQordm9pZCBkcm1fc21hbl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqc21hbikKIHsKLQlkcm1fb3duZXJfaXRlbV90ICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGRybV9vd25lcl9pdGVtICplbnRyeSwgKm5leHQ7CiAJdW5zaWduZWQgaW50IGk7Ci0JZHJtX3NtYW5fbW1fdCAqc21hbl9tbTsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKnNtYW5fbW07CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZzbWFuLT5vd25lcl9pdGVtcywgc21hbl9saXN0KSB7CiAJCWRybV9zbWFuX2RvX293bmVyX2NsZWFudXAoc21hbiwgZW50cnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5oCmluZGV4IGRkYzczMmEuLjM5YTM5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmgKQEAgLTUwLDcgKzUwLDcgQEAKICAqIGZvciBtZW1vcnkgbWFuYWdlbWVudC4KICAqLwogCi10eXBlZGVmIHN0cnVjdCBkcm1fc21hbl9tbSB7CitzdHJ1Y3QgZHJtX3NtYW5fbW0gewogCS8qIHByaXZhdGUgaW5mby4gSWYgYWxsb2NhdGVkLCBuZWVkcyB0byBiZSBkZXN0cm95ZWQgYnkgdGhlIGRlc3Ryb3kKIAkgICBmdW5jdGlvbiAqLwogCXZvaWQgKnByaXZhdGU7CkBAIC03NCwzMCArNzQsMzAgQEAKIAkgICAiYWxsb2MiIGZ1bmN0aW9uICovCiAKIAl1bnNpZ25lZCBsb25nICgqb2Zmc2V0KSAodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKTsKLX0gZHJtX3NtYW5fbW1fdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9tZW1ibG9ja19pdGVtIHsKK3N0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSB7CiAJc3RydWN0IGxpc3RfaGVhZCBvd25lcl9saXN0OwotCWRybV9oYXNoX2l0ZW1fdCB1c2VyX2hhc2g7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gdXNlcl9oYXNoOwogCXZvaWQgKm1tX2luZm87Ci0JZHJtX3NtYW5fbW1fdCAqbW07CisJc3RydWN0IGRybV9zbWFuX21tICptbTsKIAlzdHJ1Y3QgZHJtX3NtYW4gKnNtYW47Ci19IGRybV9tZW1ibG9ja19pdGVtX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fc21hbiB7Ci0JZHJtX3NtYW5fbW1fdCAqbW07CitzdHJ1Y3QgZHJtX3NtYW4geworCXN0cnVjdCBkcm1fc21hbl9tbSAqbW07CiAJaW50IG51bV9tYW5hZ2VyczsKLQlkcm1fb3Blbl9oYXNoX3Qgb3duZXJfaGFzaF90YWI7Ci0JZHJtX29wZW5faGFzaF90IHVzZXJfaGFzaF90YWI7CisJc3RydWN0IGRybV9vcGVuX2hhc2ggb3duZXJfaGFzaF90YWI7CisJc3RydWN0IGRybV9vcGVuX2hhc2ggdXNlcl9oYXNoX3RhYjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG93bmVyX2l0ZW1zOwotfSBkcm1fc21hbl90OworfTsKIAogLyoKICAqIFRha2UgZG93biBhIG1lbW9yeSBtYW5hZ2VyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBhCiAgKiBzdWNjZXNzZnVsIGluaXQgYW5kIGFmdGVyIGEgY2FsbCB0byBkcm1fc21hbl9jbGVhbnVwLgogICovCiAKLWV4dGVybiB2b2lkIGRybV9zbWFuX3Rha2Vkb3duKGRybV9zbWFuX3QgKiBzbWFuKTsKK2V4dGVybiB2b2lkIGRybV9zbWFuX3Rha2Vkb3duKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4pOwogCiAvKgogICogQWxsb2NhdGUgc3RydWN0dXJlcyBmb3IgYSBtYW5hZ2VyLgpAQCAtMTEyLDcgKzExMiw3IEBACiAgKgogICovCiAKLWV4dGVybiBpbnQgZHJtX3NtYW5faW5pdChkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG51bV9tYW5hZ2VycywKK2V4dGVybiBpbnQgZHJtX3NtYW5faW5pdChzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAogCQkJIHVuc2lnbmVkIGludCB1c2VyX29yZGVyLCB1bnNpZ25lZCBpbnQgb3duZXJfb3JkZXIpOwogCiAvKgpAQCAtMTIwLDcgKzEyMCw3IEBACiAgKiBtYW5hZ2VyIHVubGVzcyBhIGN1c3RvbWl6ZWQgYWxsb2dhdG9yIGlzIHVzZWQuCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfcmFuZ2UoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAorZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfcmFuZ2Uoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiAvKgpAQCAtMTI5LDIzICsxMjksMjMgQEAKICAqIHNvIGl0IGNhbiBiZSBkZXN0cm95ZWQgYWZ0ZXIgdGhpcyBjYWxsLgogICovCiAKLWV4dGVybiBpbnQgZHJtX3NtYW5fc2V0X21hbmFnZXIoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hbmdlciwKLQkJCQlkcm1fc21hbl9tbV90ICogYWxsb2NhdG9yKTsKK2V4dGVybiBpbnQgZHJtX3NtYW5fc2V0X21hbmFnZXIoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFuZ2VyLAorCQkJCXN0cnVjdCBkcm1fc21hbl9tbSAqIGFsbG9jYXRvcik7CiAKIC8qCiAgKiBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jay4gQWxpZ21lbnQgaXMgbm90IGltcGxlbWVudGVkIHlldC4KICAqLwogCi1leHRlcm4gZHJtX21lbWJsb2NrX2l0ZW1fdCAqZHJtX3NtYW5fYWxsb2MoZHJtX3NtYW5fdCAqIHNtYW4sCi0JCQkJCSAgIHVuc2lnbmVkIGludCBtYW5hZ2VyLAotCQkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCSAgIHVuc2lnbmVkIGFsaWdubWVudCwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBvd25lcik7CitleHRlcm4gc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICpkcm1fc21hbl9hbGxvYyhzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLAorCQkJCQkJdW5zaWduZWQgaW50IG1hbmFnZXIsCisJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCQl1bnNpZ25lZCBhbGlnbm1lbnQsCisJCQkJCQl1bnNpZ25lZCBsb25nIG93bmVyKTsKIC8qCiAgKiBGcmVlIGEgbWVtb3J5IGJsb2NrIGlkZW50aWZpZWQgYnkgaXRzIHVzZXIgaGFzaCBrZXkuCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9mcmVlX2tleShkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IGtleSk7CitleHRlcm4gaW50IGRybV9zbWFuX2ZyZWVfa2V5KHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBrZXkpOwogCiAvKgogICogcmV0dXJucyAxIGlmZiB0aGVyZSBhcmUgbm8gc3RhbGUgbWVtb3J5IGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvd25lci4KQEAgLTE1NCw3ICsxNTQsNyBAQAogICogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBvd25lci4KICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX293bmVyX2NsZWFuKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKTsKK2V4dGVybiBpbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CiAKIC8qCiAgKiBGcmVlcyBhbGwgc3RhbGUgbWVtb3J5IGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvd25lci4gTm90ZSB0aGF0IHRoaXMKQEAgLTE2NCwxMyArMTY0LDEzIEBACiAgKiBpcyBub3QgZ29pbmcgdG8gYmUgcmVmZXJlbmNlZCBhbnltb3JlLgogICovCiAKLWV4dGVybiB2b2lkIGRybV9zbWFuX293bmVyX2NsZWFudXAoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOworZXh0ZXJuIHZvaWQgZHJtX3NtYW5fb3duZXJfY2xlYW51cChzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKTsKIAogLyoKICAqIEZyZWVzIGFsbCBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5IG1hbmFnZXIuCiAgKiBTZWUgaWRsaW5nIGFib3ZlLgogICovCiAKLWV4dGVybiB2b2lkIGRybV9zbWFuX2NsZWFudXAoZHJtX3NtYW5fdCAqIHNtYW4pOworZXh0ZXJuIHZvaWQgZHJtX3NtYW5fY2xlYW51cChzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKaW5kZXggMTk0MDhhZC4uZWU4M2ZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwpAQCAtNDksMTYgKzQ5LDIxIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoY2FyZHNfbGltaXQsIGRybV9jYXJkc19saW1pdCwgaW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHJtX2RlYnVnLCBpbnQsIDA2MDApOwogCi1kcm1faGVhZF90ICoqZHJtX2hlYWRzOworc3RydWN0IGRybV9oZWFkICoqZHJtX2hlYWRzOwogc3RydWN0IGNsYXNzICpkcm1fY2xhc3M7CiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRybV9wcm9jX3Jvb3Q7CiAKLXN0YXRpYyBpbnQgZHJtX2ZpbGxfaW5fZGV2KGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCitzdGF0aWMgaW50IGRybV9maWxsX2luX2RldihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQkJICAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgcmV0Y29kZTsKIAorCUlOSVRfTElTVF9IRUFEKCZkZXYtPmZpbGVsaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5jdHhsaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52bWFsaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tYXBsaXN0KTsKKwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmNvdW50X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmRyd19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT50YXNrbGV0X2xvY2spOwpAQCAtNjcsNiArNzIsOCBAQAogCW11dGV4X2luaXQoJmRldi0+c3RydWN0X211dGV4KTsKIAltdXRleF9pbml0KCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwogCisJaWRyX2luaXQoJmRldi0+ZHJ3X2lkcik7CisKIAlkZXYtPnBkZXYgPSBwZGV2OwogCWRldi0+cGNpX2RldmljZSA9IHBkZXYtPmRldmljZTsKIAlkZXYtPnBjaV92ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CkBAIC03NiwxMiArODMsNyBAQAogI2VuZGlmCiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAKLQlkZXYtPm1hcGxpc3QgPSBkcm1fY2FsbG9jKDEsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKLQlpZiAoZGV2LT5tYXBsaXN0ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1hcGxpc3QtPmhlYWQpOwogCWlmIChkcm1faHRfY3JlYXRlKCZkZXYtPm1hcF9oYXNoLCAxMikpIHsKLQkJZHJtX2ZyZWUoZGV2LT5tYXBsaXN0LCBzaXplb2YoKmRldi0+bWFwbGlzdCksIERSTV9NRU1fTUFQUyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTQzLDkgKzE0NSw5IEBACiAgKiBjcmVhdGUgdGhlIHByb2MgaW5pdCBlbnRyeSB2aWEgcHJvY19pbml0KCkuIFRoaXMgcm91dGluZXMgYXNzaWducwogICogbWlub3IgbnVtYmVycyB0byBzZWNvbmRhcnkgaGVhZHMgb2YgbXVsdGktaGVhZGVkIGNhcmRzCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2dldF9oZWFkKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2hlYWRfdCAqIGhlYWQpCitzdGF0aWMgaW50IGRybV9nZXRfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9oZWFkICogaGVhZCkKIHsKLQlkcm1faGVhZF90ICoqaGVhZHMgPSBkcm1faGVhZHM7CisJc3RydWN0IGRybV9oZWFkICoqaGVhZHMgPSBkcm1faGVhZHM7CiAJaW50IHJldDsKIAlpbnQgbWlub3I7CiAKQEAgLTE1NCw3ICsxNTYsNyBAQAogCWZvciAobWlub3IgPSAwOyBtaW5vciA8IGRybV9jYXJkc19saW1pdDsgbWlub3IrKywgaGVhZHMrKykgewogCQlpZiAoISpoZWFkcykgewogCi0JCQkqaGVhZCA9IChkcm1faGVhZF90KSB7CisJCQkqaGVhZCA9IChzdHJ1Y3QgZHJtX2hlYWQpIHsKIAkJCS5kZXYgPSBkZXYsLmRldmljZSA9CiAJCQkJICAgIE1LREVWKERSTV9NQUpPUiwgbWlub3IpLC5taW5vciA9IG1pbm9yLH07CiAKQEAgLTE4NCw3ICsxODYsNyBAQAogICAgICAgZXJyX2cyOgogCWRybV9wcm9jX2NsZWFudXAobWlub3IsIGRybV9wcm9jX3Jvb3QsIGhlYWQtPmRldl9yb290KTsKICAgICAgIGVycl9nMToKLQkqaGVhZCA9IChkcm1faGVhZF90KSB7CisJKmhlYWQgPSAoc3RydWN0IGRybV9oZWFkKSB7CiAJLmRldiA9IE5VTEx9OwogCXJldHVybiByZXQ7CiB9CkBAIC0yMDMsNyArMjA1LDcgQEAKIGludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKIAkJc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKIHsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWludCByZXQ7CiAKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0yNDYsNyArMjQ4LDcgQEAKICAqICJkcm0iIGRhdGEsIG90aGVyd2lzZSB1bnJlZ2lzdGVycyB0aGUgImRybSIgZGF0YSwgZnJlZXMgdGhlIGRldiBsaXN0IGFuZAogICogdW5yZWdpc3RlcnMgdGhlIGNoYXJhY3RlciBkZXZpY2UuCiAgKi8KLWludCBkcm1fcHV0X2Rldihkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX3B1dF9kZXYoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJRFJNX0RFQlVHKCJyZWxlYXNlIHByaW1hcnkgJXNcbiIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpOwogCkBAIC0yNzQsNyArMjc2LDcgQEAKICAqIGxhc3QgbWlub3IgcmVsZWFzZWQuCiAgKgogICovCi1pbnQgZHJtX3B1dF9oZWFkKGRybV9oZWFkX3QgKiBoZWFkKQoraW50IGRybV9wdXRfaGVhZChzdHJ1Y3QgZHJtX2hlYWQgKiBoZWFkKQogewogCWludCBtaW5vciA9IGhlYWQtPm1pbm9yOwogCkBAIC0yODMsNyArMjg1LDcgQEAKIAlkcm1fcHJvY19jbGVhbnVwKG1pbm9yLCBkcm1fcHJvY19yb290LCBoZWFkLT5kZXZfcm9vdCk7CiAJZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoaGVhZC0+ZGV2X2NsYXNzKTsKIAotCSpoZWFkID0gKGRybV9oZWFkX3QpIHsuZGV2ID0gTlVMTH07CisJKmhlYWQgPSAoc3RydWN0IGRybV9oZWFkKSB7LmRldiA9IE5VTEx9OwogCiAJZHJtX2hlYWRzW21pbm9yXSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCmluZGV4IGNjOGUyZWIuLmNmNDM0OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYwpAQCAtODAsNyArODAsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBzaG93X2RyaShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKIHsKLQlkcm1fZGV2aWNlX3QgKiBkZXYgPSAoKGRybV9oZWFkX3QgKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpKS0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICogZGV2ID0gKChzdHJ1Y3QgZHJtX2hlYWQgKiljbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpKS0+ZGV2OwogCWlmIChkZXYtPmRyaXZlci0+ZHJpX2xpYnJhcnlfbmFtZSkKIAkJcmV0dXJuIGRldi0+ZHJpdmVyLT5kcmlfbGlicmFyeV9uYW1lKGRldiwgYnVmKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSk7CkBAIC0xMDQsNyArMTA0LDcgQEAKICAqIE5vdGU6IHRoZSBzdHJ1Y3QgY2xhc3MgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbgogICogY3JlYXRlZCB3aXRoIGEgY2FsbCB0byBkcm1fc3lzZnNfY3JlYXRlKCkuCiAgKi8KLXN0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsIGRybV9oZWFkX3QgKmhlYWQpCitzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgY2xhc3MgKmNzLCBzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCWludCBpLCBqLCBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwppbmRleCBiNWM1YjlmLi42OGUzNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKQEAgLTc5LDExICs3OSwxMSBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OwotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fbWFwICptYXAgPSBOVUxMOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKIAogCS8qCiAJICogRmluZCB0aGUgcmlnaHQgbWFwCkBAIC05Nyw3ICs5Nyw3IEBACiAJaWYgKGRybV9odF9maW5kX2l0ZW0oJmRldi0+bWFwX2hhc2gsIHZtYS0+dm1fcGdvZmYsICZoYXNoKSkKIAkJZ290byB2bV9ub3BhZ2VfZXJyb3I7CiAKLQlyX2xpc3QgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBkcm1fbWFwX2xpc3RfdCwgaGFzaCk7CisJcl9saXN0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgc3RydWN0IGRybV9tYXBfbGlzdCwgaGFzaCk7CiAJbWFwID0gcl9saXN0LT5tYXA7CiAKIAlpZiAobWFwICYmIG1hcC0+dHlwZSA9PSBfRFJNX0FHUCkgewpAQCAtMTE2LDcgKzExNiw3IEBACiAJCS8qCiAJCSAqIEl0J3MgQUdQIG1lbW9yeSAtIGZpbmQgdGhlIHJlYWwgcGh5c2ljYWwgcGFnZSB0byBtYXAKIAkJICovCi0JCWZvciAoYWdwbWVtID0gZGV2LT5hZ3AtPm1lbW9yeTsgYWdwbWVtOyBhZ3BtZW0gPSBhZ3BtZW0tPm5leHQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShhZ3BtZW0sICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKSB7CiAJCQlpZiAoYWdwbWVtLT5ib3VuZCA8PSBiYWRkciAmJgogCQkJICAgIGFncG1lbS0+Ym91bmQgKyBhZ3BtZW0tPnBhZ2VzICogUEFHRV9TSVpFID4gYmFkZHIpCiAJCQkJYnJlYWs7CkBAIC0xNjMsNyArMTYzLDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fc2htX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JZHJtX21hcF90ICptYXAgPSAoZHJtX21hcF90ICopIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fbWFwICptYXAgPSAoc3RydWN0IGRybV9tYXAgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBpOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMTk0LDEyICsxOTQsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgZHJtX3ZtX3NobV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3ZtYV9lbnRyeV90ICpwdCwgKnByZXYsICpuZXh0OwotCWRybV9tYXBfdCAqbWFwOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICpwdCwgKnRlbXA7CisJc3RydWN0IGRybV9tYXAgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAJaW50IGZvdW5kX21hcHMgPSAwOwogCiAJRFJNX0RFQlVHKCIweCUwOGx4LDB4JTA4bHhcbiIsCkBAIC0yMDksMzAgKzIwOCwyMiBAQAogCW1hcCA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWZvciAocHQgPSBkZXYtPnZtYWxpc3QsIHByZXYgPSBOVUxMOyBwdDsgcHQgPSBuZXh0KSB7Ci0JCW5leHQgPSBwdC0+bmV4dDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIHRlbXAsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKIAkJaWYgKHB0LT52bWEtPnZtX3ByaXZhdGVfZGF0YSA9PSBtYXApCiAJCQlmb3VuZF9tYXBzKys7CiAJCWlmIChwdC0+dm1hID09IHZtYSkgewotCQkJaWYgKHByZXYpIHsKLQkJCQlwcmV2LT5uZXh0ID0gcHQtPm5leHQ7Ci0JCQl9IGVsc2UgewotCQkJCWRldi0+dm1hbGlzdCA9IHB0LT5uZXh0OwotCQkJfQorCQkJbGlzdF9kZWwoJnB0LT5oZWFkKTsKIAkJCWRybV9mcmVlKHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9WTUFTKTsKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSBwdDsKIAkJfQogCX0KKwogCS8qIFdlIHdlcmUgdGhlIG9ubHkgbWFwIHRoYXQgd2FzIGZvdW5kICovCiAJaWYgKGZvdW5kX21hcHMgPT0gMSAmJiBtYXAtPmZsYWdzICYgX0RSTV9SRU1PVkFCTEUpIHsKIAkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiB0aGUgbWFwbGlzdCwgaWYgd2UgYXJlIG5vdCwgdGhlbgogCQkgKiB3ZSBkZWxldGUgdGhpcyBtYXBwaW5ncyBpbmZvcm1hdGlvbi4KIAkJICovCiAJCWZvdW5kX21hcHMgPSAwOwotCQlsaXN0ID0gJmRldi0+bWFwbGlzdC0+aGVhZDsKLQkJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJCWlmIChyX2xpc3QtPm1hcCA9PSBtYXApCiAJCQkJZm91bmRfbWFwcysrOwogCQl9CkBAIC0yODMsOSArMjc0LDkgQEAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpkcm1fZG9fdm1fZG1hX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIHBhZ2VfbnI7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0zMTksMTAgKzMxMCwxMCBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9zZ19ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JZHJtX21hcF90ICptYXAgPSAoZHJtX21hcF90ICopIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gKHN0cnVjdCBkcm1fbWFwICopIHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5ID0gZGV2LT5zZzsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIG1hcF9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldDsKQEAgLTQxNCw5ICs0MDUsOSBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdm1fb3Blbl9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV92bWFfZW50cnlfdCAqdm1hX2VudHJ5OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnZtYV9lbnRyeTsKIAogCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAogCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CkBAIC00MjUsMTYgKzQxNiwxNSBAQAogCXZtYV9lbnRyeSA9IGRybV9hbGxvYyhzaXplb2YoKnZtYV9lbnRyeSksIERSTV9NRU1fVk1BUyk7CiAJaWYgKHZtYV9lbnRyeSkgewogCQl2bWFfZW50cnktPnZtYSA9IHZtYTsKLQkJdm1hX2VudHJ5LT5uZXh0ID0gZGV2LT52bWFsaXN0OwogCQl2bWFfZW50cnktPnBpZCA9IGN1cnJlbnQtPnBpZDsKLQkJZGV2LT52bWFsaXN0ID0gdm1hX2VudHJ5OworCQlsaXN0X2FkZCgmdm1hX2VudHJ5LT5oZWFkLCAmZGV2LT52bWFsaXN0KTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWRybV92bV9vcGVuX2xvY2tlZCh2bWEpOwpAQCAtNDUxLDIyICs0NDEsMTggQEAKICAqLwogc3RhdGljIHZvaWQgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdm1hX2VudHJ5X3QgKnB0LCAqcHJldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICpwdCwgKnRlbXA7CiAKIAlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKIAkJICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwogCWF0b21pY19kZWMoJmRldi0+dm1hX2NvdW50KTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlmb3IgKHB0ID0gZGV2LT52bWFsaXN0LCBwcmV2ID0gTlVMTDsgcHQ7IHByZXYgPSBwdCwgcHQgPSBwdC0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgdGVtcCwgJmRldi0+dm1hbGlzdCwgaGVhZCkgewogCQlpZiAocHQtPnZtYSA9PSB2bWEpIHsKLQkJCWlmIChwcmV2KSB7Ci0JCQkJcHJldi0+bmV4dCA9IHB0LT5uZXh0OwotCQkJfSBlbHNlIHsKLQkJCQlkZXYtPnZtYWxpc3QgPSBwdC0+bmV4dDsKLQkJCX0KKwkJCWxpc3RfZGVsKCZwdC0+aGVhZCk7CiAJCQlkcm1fZnJlZShwdCwgc2l6ZW9mKCpwdCksIERSTV9NRU1fVk1BUyk7CiAJCQlicmVhazsKIAkJfQpAQCAtNDg2LDkgKzQ3Miw5IEBACiAgKi8KIHN0YXRpYyBpbnQgZHJtX21tYXBfZG1hKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYTsKIAl1bnNpZ25lZCBsb25nIGxlbmd0aCA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKIAogCWRldiA9IHByaXYtPmhlYWQtPmRldjsKQEAgLTUyNiw3ICs1MTIsNyBAQAogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKGRybV9tYXBfdCAqIG1hcCkKK3Vuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoc3RydWN0IGRybV9tYXAgKiBtYXApCiB7CiAJcmV0dXJuIG1hcC0+b2Zmc2V0OwogfQpAQCAtNTU5LDExICs1NDUsMTEgQEAKICAqLwogc3RhdGljIGludCBkcm1fbW1hcF9sb2NrZWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX21hcF90ICptYXAgPSBOVUxMOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fbWFwICptYXAgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2g7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CiAKIAlEUk1fREVCVUcoInN0YXJ0ID0gMHglbHgsIGVuZCA9IDB4JWx4LCBwYWdlIG9mZnNldCA9IDB4JWx4XG4iLAogCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCB2bWEtPnZtX3Bnb2ZmKTsKQEAgLTU4OCw3ICs1NzQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltYXAgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBkcm1fbWFwX2xpc3RfdCwgaGFzaCktPm1hcDsKKwltYXAgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hcF9saXN0LCBoYXNoKS0+bWFwOwogCWlmICghbWFwIHx8ICgobWFwLT5mbGFncyAmIF9EUk1fUkVTVFJJQ1RFRCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC02NzcsOCArNjYzLDggQEAKIAogaW50IGRybV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKaW5kZXggNjAzZDE3Zi4uY2I0NDk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpAQCAtNDUsMTYgKzQ1LDE2IEBACiAjZGVmaW5lIEk4MTBfQlVGX1VOTUFQUEVEIDAKICNkZWZpbmUgSTgxMF9CVUZfTUFQUEVEICAgMQogCi1zdGF0aWMgZHJtX2J1Zl90ICppODEwX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKmk4MTBfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAJaW50IHVzZWQ7CiAKIAkvKiBMaW5lYXIgc2VhcmNoIG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCBzb2x1dGlvbiAqLwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCiAJCXVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0ZSRUUsCkBAIC03MCw3ICs3MCw3IEBACiAgKiB5ZXQsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIGluIHVzZSBmb3IgdXMgb25jZSBpdHMgb24gdGhlIHJpbmcgYnVmZmVyLgogICovCiAKLXN0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHVzZWQ7CkBAIC04NywxMCArODcsMTAgQEAKIAogc3RhdGljIGludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtMTIwLDEwICsxMjAsMTAgQEAKIAkuZmFzeW5jID0gZHJtX2Zhc3luYywKIH07CiAKLXN0YXRpYyBpbnQgaTgxMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IGk4MTBfbWFwX2J1ZmZlcihzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODEwX3VubWFwX2J1ZmZlcihkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgaW50IGk4MTBfdW5tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0Y29kZSA9IDA7CkBAIC0xNzIsMTAgKzE3MiwxMCBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZG1hX2dldF9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1faTgxMF9kbWFfdCAqIGQsCitzdGF0aWMgaW50IGk4MTBfZG1hX2dldF9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODEwX2RtYV90ICogZCwKIAkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWludCByZXRjb2RlID0gMDsKIApAQCAtMjAyLDkgKzIwMiw5IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MTBfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCQlpZiAoYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsICYmIGJ1Zi0+dG90YWwpCkBAIC0yNDMsNyArMjQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpODEwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuKQorc3RhdGljIGludCBpODEwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4pCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJcmV0dXJuIGl0ZXJzOwogfQogCi1zdGF0aWMgdm9pZCBpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTI4OCw5ICsyODgsOSBAQAogCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODEwX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODEwX3ByaXZhdGVfdCAqIGRldl9wcml2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IG15X2lkeCA9IDI0OwogCXUzMiAqaHdfc3RhdHVzID0gKHUzMiAqKSAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKIAlpbnQgaTsKQEAgLTMwMSw3ICszMDEsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJYnVmX3ByaXYtPmluX3VzZSA9IGh3X3N0YXR1cysrOwpAQCAtMzIzLDE2ICszMjMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpODEwX2RtYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgICAgICBkcm1faTgxMF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgICAgICBkcm1faTgxMF9pbml0X3QgKiBpbml0KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0KKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k4MTBfcHJpdmF0ZV90KSk7CiAKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcCAmJgogCQkgICAgcl9saXN0LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYKIAkJICAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSykgewpAQCAtNDc4LDggKzQ3Niw4IEBACiBzdGF0aWMgaW50IGk4MTBfZG1hX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2OwogCWRybV9pODEwX2luaXRfdCBpbml0OwogCWludCByZXRjb2RlID0gMDsKQEAgLTUzNiw3ICs1MzQsNyBAQAogICogVXNlICd2b2xhdGlsZScgJiBsb2NhbCB2YXIgdG1wIHRvIGZvcmNlIHRoZSBlbWl0dGVkIHZhbHVlcyB0byBiZQogICogaWRlbnRpY2FsIHRvIHRoZSB2ZXJpZmllZCBvbmVzLgogICovCi1zdGF0aWMgdm9pZCBpODEwRW1pdENvbnRleHRWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCBpODEwRW1pdENvbnRleHRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTY5LDcgKzU2Nyw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBFbWl0VGV4VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODEwRW1pdFRleFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIGogPSAwOwpAQCAtNjAyLDcgKzYwMCw3IEBACiAKIC8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBFbWl0RGVzdFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MTBFbWl0RGVzdFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02MzcsNyArNjM1LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgxMEVtaXRTdGF0ZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwRW1pdFN0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTY2OCwxNCArNjY2LDE0IEBACiAKIC8qIG5lZWQgdG8gdmVyaWZ5CiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGZsYWdzLAorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBmbGFncywKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfenZhbCkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwogCWludCBjcHAgPSAyOwogCWludCBpOwpAQCAtNzQzLDEyICs3NDEsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwogCWludCBjcHAgPSAyOwogCWludCBpOwpAQCAtNzg5LDEzICs3ODcsMTMgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICBkcm1fYnVmX3QgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgIHN0cnVjdCBkcm1fYnVmICogYnVmLCBpbnQgZGlzY2FyZCwgaW50IHVzZWQpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fY2xpcF9yZWN0X3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOwpAQCAtODY5LDcgKzg2Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwpAQCAtOTE2LDcgKzkxNCw3IEBACiAKIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTkzNSwxMCArOTMzLDEwIEBACiAJaTgxMF93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCk7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9mbHVzaF9xdWV1ZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MTBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaSwgcmV0ID0gMDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtOTU0LDcgKzk1Miw3IEBACiAJaTgxMF93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWludCB1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODEwX0JVRl9IQVJEV0FSRSwKQEAgLTk3MCw5ICs5NjgsOSBAQAogfQogCiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIGk4MTBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBpODEwX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAogCWlmICghZG1hKQpAQCAtOTg1LDcgKzk4Myw3IEBACiAJaTgxMF9mbHVzaF9xdWV1ZShkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYpIHsKQEAgLTEwMDMsOCArMTAwMSw4IEBACiBzdGF0aWMgaW50IGk4MTBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCkBAIC0xMDE1LDkgKzEwMTMsOSBAQAogc3RhdGljIGludCBpODEwX2RtYV92ZXJ0ZXgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKQEAgLTEwNTEsOCArMTA0OSw4IEBACiBzdGF0aWMgaW50IGk4MTBfY2xlYXJfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfY2xlYXJfdCBjbGVhcjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgpAQCAtMTA3NCw4ICsxMDcyLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9zd2FwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAlEUk1fREVCVUcoImk4MTBfc3dhcF9idWZzXG4iKTsKIApAQCAtMTA4OCw4ICsxMDg2LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9nZXRhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgxMF9zYXJlYV90ICopCkBAIC0xMTAyLDggKzExMDAsOCBAQAogc3RhdGljIGludCBpODEwX2dldGJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldGNvZGUgPSAwOwogCWRybV9pODEwX2RtYV90IGQ7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExMjMsNyArMTEyMSw3IEBACiAJRFJNX0RFQlVHKCJpODEwX2RtYTogJWQgcmV0dXJuaW5nICVkLCBncmFudGVkID0gJWRcbiIsCiAJCSAgY3VycmVudC0+cGlkLCByZXRjb2RlLCBkLmdyYW50ZWQpOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2RtYV90IF9fdXNlciAqKSBhcmcsICZkLCBzaXplb2YoZCkpKQorCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgJmQsIHNpemVvZihkKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KWh3X3N0YXR1c1s1XTsKIApAQCAtMTE0NCw3ICsxMTQyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfbWMoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYsIGludCB1c2VkLAorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfbWMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmLCBpbnQgdXNlZCwKIAkJCQkgdW5zaWduZWQgaW50IGxhc3RfcmVuZGVyKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTIwNyw5ICsxMjA1LDkgQEAKIHN0YXRpYyBpbnQgaTgxMF9kbWFfbWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKQEAgLTEyMzgsOCArMTIzNiw4IEBACiBzdGF0aWMgaW50IGk4MTBfcnN0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCXJldHVybiAoaW50KSgoKHUzMiAqKSAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlKSlbNF0pOwpAQCAtMTI0OCw4ICsxMjQ2LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9vdjBfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfb3ZlcmxheV90IGRhdGE7CiAKQEAgLTEyNjQsOCArMTI2Miw4IEBACiBzdGF0aWMgaW50IGk4MTBfZnN0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwpAQCAtMTI3Niw4ICsxMjc0LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9vdjBfZmxpcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MTBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKQEAgLTEyOTAsNyArMTI4OCw3IEBACiAKIC8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2RvX2luaXRfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzMDAsNyArMTI5OCw3IEBACiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgxMF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzE1LDggKzEzMTMsOCBAQAogc3RhdGljIGludCBpODEwX2ZsaXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xMzMwLDcgKzEzMjgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTgxMF9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBpODEwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJLyogaTgxMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwpAQCAtMTM0MiwxMiArMTM0MCwxMiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODEwX2RtYV9jbGVhbnVwKGRldik7CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMzU3LDEyICsxMzU1LDEyIEBACiAJfQogfQogCi12b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaTgxMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKIH0KIAotaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaTgxMF9kbWFfcXVpZXNjZW50KGRldik7CiAJcmV0dXJuIDA7CkBAIC0xMzk5LDcgKzEzOTcsNyBAQAogICogXHJldHVybnMKICAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTgxMCBpcyBBR1AuCiAgKi8KLWludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCmluZGV4IDJkZWI5MjUuLjYxNDk3N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogCXVuc2lnbmVkIGludCBkaXJ0eTsKIAogCXVuc2lnbmVkIGludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tJODEwX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbSTgxMF9OUl9TQVJFQV9DTElQUkVDVFNdOwogCiAJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKIAkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCmluZGV4IGU2ZGY0OWY0Li42NDg4MzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCkBAIC03Nyw4ICs3Nyw4IEBACiB9IGRybV9pODEwX3JpbmdfYnVmZmVyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9pODEwX3ByaXZhdGUgewotCWRybV9tYXBfdCAqc2FyZWFfbWFwOwotCWRybV9tYXBfdCAqbW1pb19tYXA7CisJc3RydWN0IGRybV9tYXAgKnNhcmVhX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqbW1pb19tYXA7CiAKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2OwogCWRybV9pODEwX3JpbmdfYnVmZmVyX3QgcmluZzsKQEAgLTg4LDcgKzg4LDcgQEAKIAogCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOwogCi0JZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqbW1hcF9idWZmZXI7CiAKIAl1MzIgZnJvbnRfZGkxLCBiYWNrX2RpMSwgemkxOwogCkBAIC0xMTUsMTUgKzExNSwxNSBAQAogfSBkcm1faTgxMF9wcml2YXRlX3Q7CiAKIAkJCQkvKiBpODEwX2RtYS5jICovCi1leHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IGk4MTBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTgxMF9pb2N0bHNbXTsKIGV4dGVybiBpbnQgaTgxMF9tYXhfaW9jdGw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKaW5kZXggMzMxNGE5Zi4uZGMyMGMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwpAQCAtNDcsMTYgKzQ3LDE2IEBACiAjZGVmaW5lIEk4MzBfQlVGX1VOTUFQUEVEIDAKICNkZWZpbmUgSTgzMF9CVUZfTUFQUEVEICAgMQogCi1zdGF0aWMgZHJtX2J1Zl90ICppODMwX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKmk4MzBfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAJaW50IHVzZWQ7CiAKIAkvKiBMaW5lYXIgc2VhcmNoIG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCBzb2x1dGlvbiAqLwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJLyogSW4gdXNlIGlzIGFscmVhZHkgYSBwb2ludGVyICovCiAJCXVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0ZSRUUsCkBAIC03Miw3ICs3Miw3IEBACiAgKiB5ZXQsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIGluIHVzZSBmb3IgdXMgb25jZSBpdHMgb24gdGhlIHJpbmcgYnVmZmVyLgogICovCiAKLXN0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHVzZWQ7CkBAIC04OSwxMCArODksMTAgQEAKIAogc3RhdGljIGludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtMTIyLDEwICsxMjIsMTAgQEAKIAkuZmFzeW5jID0gZHJtX2Zhc3luYywKIH07CiAKLXN0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IGk4MzBfbWFwX2J1ZmZlcihzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Ziwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb2xkX2ZvcHM7CkBAIC0xNTYsNyArMTU2LDcgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODMwX3VubWFwX2J1ZmZlcihkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgaW50IGk4MzBfdW5tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0Y29kZSA9IDA7CkBAIC0xNzYsMTAgKzE3NiwxMCBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1faTgzMF9kbWFfdCAqIGQsCitzdGF0aWMgaW50IGk4MzBfZG1hX2dldF9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODMwX2RtYV90ICogZCwKIAkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWludCByZXRjb2RlID0gMDsKIApAQCAtMjA2LDkgKzIwNiw5IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQlkZXYtPmRldl9wcml2YXRlID0gTlVMTDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQkJaWYgKGJ1Zl9wcml2LT5rZXJuZWxfdmlydHVhbCAmJiBidWYtPnRvdGFsKQogCQkJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZidWZfcHJpdi0+bWFwLCBkZXYpOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpODMwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCitpbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJcmV0dXJuIGl0ZXJzOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTI5Niw5ICsyOTYsOSBAQAogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJODMwX0JPWF9SSU5HX0VNUFRZOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IG15X2lkeCA9IDM2OwogCXUzMiAqaHdfc3RhdHVzID0gKHUzMiAqKSAoZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlICsgbXlfaWR4KTsKIAlpbnQgaTsKQEAgLTMwOSw3ICszMDksNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJYnVmX3ByaXYtPmluX3VzZSA9IGh3X3N0YXR1cysrOwpAQCAtMzMwLDE2ICszMzAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpODMwX2RtYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgICAgICBkcm1faTgzMF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgICAgICBkcm1faTgzMF9pbml0X3QgKiBpbml0KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OwogCiAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k4MzBfcHJpdmF0ZV90KSk7CiAKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcCAmJgogCQkgICAgcl9saXN0LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYKIAkJICAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSykgewpAQCAtNDU1LDggKzQ1NCw4IEBACiBzdGF0aWMgaW50IGk4MzBfZG1hX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2OwogCWRybV9pODMwX2luaXRfdCBpbml0OwogCWludCByZXRjb2RlID0gMDsKQEAgLTQ5MCw3ICs0ODksNyBAQAogLyogTW9zdCBlZmZpY2llbnQgd2F5IHRvIHZlcmlmeSBzdGF0ZSBmb3IgdGhlIGk4MzAgaXMgYXMgaXQgaXMKICAqIGVtaXR0ZWQuICBOb24tY29uZm9ybWFudCBzdGF0ZSBpcyBzaWxlbnRseSBkcm9wcGVkLgogICovCi1zdGF0aWMgdm9pZCBpODMwRW1pdENvbnRleHRWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIGogPSAwOwpAQCAtNTM1LDcgKzUzNCw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIGogPSAwOwpAQCAtNTY5LDcgKzU2OCw3IEBACiAJCXByaW50aygicmVqZWN0ZWQgcGFja2V0ICV4XG4iLCBjb2RlWzBdKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqY29kZSwgdW5zaWduZWQgaW50IG51bSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTU5NCw3ICs1OTMsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFRleFBhbGV0dGUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhQYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICAgIHVuc2lnbmVkIGludCAqcGFsZXR0ZSwgaW50IG51bWJlciwgaW50IGlzX3NoYXJlZCkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYyMSw3ICs2MjAsNyBAQAogCiAvKiBOZWVkIHRvIGRvIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZyB3aGVuIHNldHRpbmcgdGhlIGRlc3QgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCBpODMwRW1pdERlc3RWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0RGVzdFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IHRtcDsKQEAgLTY4Miw3ICs2ODEsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFN0aXBwbGVWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RpcHBsZVZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC02OTMsNyArNjkyLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRTdGF0ZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwRW1pdFN0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTc5Niw3ICs3OTUsNyBAQAogICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCBpODMwX2ZpbGxfYm94KGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBfZmlsbF9ib3goc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgciwgaW50IGcsIGludCBiKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtODM0LDcgKzgzMyw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfY3BfcGVyZm9ybWFuY2VfYm94ZXMoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9jcF9wZXJmb3JtYW5jZV9ib3hlcyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtODc5LDcgKzg3OCw3IEBACiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9jbGVhcihkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBmbGFncywKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgZmxhZ3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9jb2xvciwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX3p2YWwsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl9kZXB0aG1hc2spCkBAIC04ODcsNyArODg2LDcgQEAKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwogCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOwogCWludCBpOwpAQCAtOTc0LDEyICs5NzMsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IHBpdGNoID0gZGV2X3ByaXYtPnBpdGNoOwogCWludCBjcHAgPSBkZXZfcHJpdi0+Y3BwOwogCWludCBpOwpAQCAtMTA0NCw3ICsxMDQzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTEwODcsMTMgKzEwODYsMTMgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgIGRybV9idWZfdCAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylidWYtPmJ1c19hZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyZXNzIC0gZGV2LT5hZ3AtPmJhc2U7CkBAIC0xMTk5LDcgKzExOTgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTEyMTYsMTAgKzEyMTUsMTAgQEAKIAlpODMwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4LCBfX0ZVTkNUSU9OX18pOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2ZsdXNoX3F1ZXVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGksIHJldCA9IDA7CiAJUklOR19MT0NBTFM7CiAKQEAgLTEyMzMsNyArMTIzMiw3IEBACiAJaTgzMF93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MzBfQlVGX0hBUkRXQVJFLApAQCAtMTI0OSw5ICsxMjQ4LDkgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkICovCi1zdGF0aWMgdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGk7CiAKIAlpZiAoIWRtYSkKQEAgLTEyNjQsNyArMTI2Myw3IEBACiAJaTgzMF9mbHVzaF9xdWV1ZShkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYpIHsKQEAgLTEyODIsOCArMTI4MSw4IEBACiBzdGF0aWMgaW50IGk4MzBfZmx1c2hfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCkBAIC0xMjk0LDkgKzEyOTMsOSBAQAogc3RhdGljIGludCBpODMwX2RtYV92ZXJ0ZXgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODMwX3NhcmVhX3QgKikKQEAgLTEzMjgsOCArMTMyNyw4IEBACiBzdGF0aWMgaW50IGk4MzBfY2xlYXJfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfY2xlYXJfdCBjbGVhcjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgpAQCAtMTM1Miw4ICsxMzUxLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9zd2FwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAlEUk1fREVCVUcoImk4MzBfc3dhcF9idWZzXG4iKTsKIApAQCAtMTM2NSw3ICsxMzY0LDcgQEAKIAogLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKICAqLwotc3RhdGljIHZvaWQgaTgzMF9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTM3NSw3ICsxMzc0LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIH0KIAotc3RhdGljIGludCBpODMwX2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2RvX2NsZWFudXBfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzOTAsOCArMTM4OSw4IEBACiBzdGF0aWMgaW50IGk4MzBfZmxpcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTE0MDgsOCArMTQwNyw4IEBACiBzdGF0aWMgaW50IGk4MzBfZ2V0YWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MzBfc2FyZWFfdCAqKQpAQCAtMTQyMiw4ICsxNDIxLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9nZXRidWYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXRjb2RlID0gMDsKIAlkcm1faTgzMF9kbWFfdCBkOwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNDQ0LDcgKzE0NDMsNyBAQAogCURSTV9ERUJVRygiaTgzMF9kbWE6ICVkIHJldHVybmluZyAlZCwgZ3JhbnRlZCA9ICVkXG4iLAogCQkgIGN1cnJlbnQtPnBpZCwgcmV0Y29kZSwgZC5ncmFudGVkKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9kbWFfdCBfX3VzZXIgKikgYXJnLCAmZCwgc2l6ZW9mKGQpKSkKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZkLCBzaXplb2YoZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlzYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0gKGludClod19zdGF0dXNbNV07CiAKQEAgLTE0NjcsOCArMTQ2Niw4IEBACiBzdGF0aWMgaW50IGk4MzBfZ2V0cGFyYW0oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9nZXRwYXJhbV90IHBhcmFtOwogCWludCB2YWx1ZTsKQEAgLTE1MDEsOCArMTUwMCw4IEBACiBzdGF0aWMgaW50IGk4MzBfc2V0cGFyYW0oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zZXRwYXJhbV90IHBhcmFtOwogCkBAIC0xNTI2LDcgKzE1MjUsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTgzMF9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBpODMwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJLyogaTgzMCBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwpAQCAtMTUzOCwxMiArMTUzNywxMiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODMwX2RtYV9jbGVhbnVwKGRldik7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNTUzLDEyICsxNTUyLDEyIEBACiAJfQogfQogCi12b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaTgzMF9yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxwKTsKIH0KIAotaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaTgzMF9kbWFfcXVpZXNjZW50KGRldik7CiAJcmV0dXJuIDA7CkBAIC0xNTk0LDcgKzE1OTMsNyBAQAogICogXHJldHVybnMKICAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTh4eCBpcyBBR1AuCiAgKi8KLWludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCmluZGV4IDY2ZGQ3NTAuLjk2OGE2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXVuc2lnbmVkIGludCBkaXJ0eTsKIAogCXVuc2lnbmVkIGludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tJODMwX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbSTgzMF9OUl9TQVJFQV9DTElQUkVDVFNdOwogCiAJLyogTWFpbnRhaW4gYW4gTFJVIG9mIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiB0ZXh0dXJlIHNwYWNlLiAgSWYKIAkgKiB5b3UgdGhpbmsgeW91IG93biBhIHJlZ2lvbiBvZiB0ZXh0dXJlIG1lbW9yeSwgYW5kIGl0IGhhcyBhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCmluZGV4IGU5MWY5NGEuLmRkZGE2NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKQEAgLTg0LDggKzg0LDggQEAKIH0gZHJtX2k4MzBfcmluZ19idWZmZXJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MzBfcHJpdmF0ZSB7Ci0JZHJtX21hcF90ICpzYXJlYV9tYXA7Ci0JZHJtX21hcF90ICptbWlvX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqc2FyZWFfbWFwOworCXN0cnVjdCBkcm1fbWFwICptbWlvX21hcDsKIAogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCByaW5nOwpAQCAtOTUsNyArOTUsNyBAQAogCiAJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CiAKLQlkcm1fYnVmX3QgKm1tYXBfYnVmZmVyOworCXN0cnVjdCBkcm1fYnVmICptbWFwX2J1ZmZlcjsKIAogCXUzMiBmcm9udF9kaTEsIGJhY2tfZGkxLCB6aTE7CiAKQEAgLTEzMiwxNiArMTMyLDE2IEBACiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgaTgzMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiAjZGVmaW5lIEk4MzBfUkVBRChyZWcpICAgICAgICAgIERSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcpCiAjZGVmaW5lIEk4MzBfV1JJVEUocmVnLHZhbCkgICAgIERSTV9XUklURTMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnLCB2YWwpCkBAIC0xODAsNyArMTgwLDcgQEAKIAlJODMwX1dSSVRFKExQX1JJTkcgKyBSSU5HX1RBSUwsIG91dHJpbmcpOwkJCVwKIH0gd2hpbGUoMCkKIAotZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOworZXh0ZXJuIGludCBpODMwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CiAKICNkZWZpbmUgR0ZYX09QX1VTRVJfSU5URVJSVVBUIAkJKCgwPDwyOSl8KDI8PDIzKSkKICNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKaW5kZXggNTg0MWY3Ni4uYTFiNWM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiB0ZW1wOwogCkBAIC01Myw3ICs1Myw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2VtaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNzAsNyArNzAsNyBAQAogCXJldHVybiBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmlycV9lbWl0dGVkKTsKIH0KIAotc3RhdGljIGludCBpODMwX3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTgzMF93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCURFQ0xBUkVfV0FJVFFVRVVFKGVudHJ5LCBjdXJyZW50KTsKQEAgLTExNyw4ICsxMTcsOCBAQAogaW50IGk4MzBfaXJxX2VtaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9pcnFfZW1pdF90IGVtaXQ7CiAJaW50IHJlc3VsdDsKQEAgLTE0OSw4ICsxNDksOCBAQAogaW50IGk4MzBfaXJxX3dhaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9pcnFfd2FpdF90IGlycXdhaXQ7CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAvKiBkcm1fZG1hLmggaG9va3MKICovCi12b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTgwLDE0ICsxODAsMTQgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCUk4MzBfV1JJVEUxNihJODMwUkVHX0lOVF9FTkFCTEVfUiwgMHgyKTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWlmICghZGV2X3ByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKaW5kZXggZWE1Mjc0MGEuLjMzNTljYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIHRoZSBoZWFkIHBvaW50ZXIgY2hhbmdlcywgc28gdGhhdCBFQlVTWSBvbmx5IGhhcHBlbnMgaWYgdGhlIHJpbmcKICAqIGFjdHVhbGx5IHN0YWxscyBmb3IgKGVnKSAzIHNlY29uZHMuCiAgKi8KLWludCBpOTE1X3dhaXRfcmluZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCitpbnQgaTkxNV93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtNzMsNyArNzMsNyBAQAogCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKIH0KIAotdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtODgsNyArODgsNyBAQAogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9SSU5HX0VNUFRZOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTkxNV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgZHJtX2k5MTVfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkgICBkcm1faTkxNV9pbml0X3QgKiBpbml0KQogewogCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCkpOwogCi0JRFJNX0dFVFNBUkVBKCk7CisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMzU3LDcgKzM1Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpOTE1X2VtaXRfY21kcyhkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBfX3VzZXIgKiBidWZmZXIsIGludCBkd29yZHMpCitzdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgX191c2VyICogYnVmZmVyLCBpbnQgZHdvcmRzKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwpAQCAtMzk2LDEyICszOTYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2VtaXRfYm94KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCSBkcm1fY2xpcF9yZWN0X3QgX191c2VyICogYm94ZXMsCitzdGF0aWMgaW50IGk5MTVfZW1pdF9ib3goc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICogYm94ZXMsCiAJCQkgaW50IGksIGludCBEUjEsIGludCBEUjQpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2NsaXBfcmVjdF90IGJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3g7CiAJUklOR19MT0NBTFM7CiAKIAlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSX1VOQ0hFQ0tFRCgmYm94LCAmYm94ZXNbaV0sIHNpemVvZihib3gpKSkgewpAQCAtNDM5LDcgKzQzOSw3IEBACiAgKiBlbWl0LiBGb3Igbm93LCBkbyBpdCBpbiBib3RoIHBsYWNlczoKICAqLwogCi1zdGF0aWMgdm9pZCBpOTE1X2VtaXRfYnJlYWRjcnVtYihkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyB2b2lkIGk5MTVfZW1pdF9icmVhZGNydW1iKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC00NTcsNyArNDU3LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgIGRybV9pOTE1X2NtZGJ1ZmZlcl90ICogY21kKQogewogCWludCBuYm94ID0gY21kLT5udW1fY2xpcHJlY3RzOwpAQCAtNDg5LDExICs0ODksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9iYXRjaGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgIGRybV9pOTE1X2JhdGNoYnVmZmVyX3QgKiBiYXRjaCkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGJhdGNoLT5jbGlwcmVjdHM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hlcyA9IGJhdGNoLT5jbGlwcmVjdHM7CiAJaW50IG5ib3ggPSBiYXRjaC0+bnVtX2NsaXByZWN0czsKIAlpbnQgaSA9IDAsIGNvdW50OwogCVJJTkdfTE9DQUxTOwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNTgzLDcgKzU4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNjI1LDcgKzYyNSw3IEBACiAKIAlpZiAoYmF0Y2gubnVtX2NsaXByZWN0cyAmJiBEUk1fVkVSSUZZQVJFQV9SRUFEKGJhdGNoLmNsaXByZWN0cywKIAkJCQkJCSAgICAgICBiYXRjaC5udW1fY2xpcHJlY3RzICoKLQkJCQkJCSAgICAgICBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSkpCisJCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSkpCiAJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAKIAlyZXQgPSBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKGRldiwgJmJhdGNoKTsKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWlmIChjbWRidWYubnVtX2NsaXByZWN0cyAmJgogCSAgICBEUk1fVkVSSUZZQVJFQV9SRUFEKGNtZGJ1Zi5jbGlwcmVjdHMsCiAJCQkJY21kYnVmLm51bV9jbGlwcmVjdHMgKgotCQkJCXNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkgeworCQkJCXNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCkpKSB7CiAJCURSTV9FUlJPUigiRmF1bHQgYWNjZXNzaW5nIGNsaXByZWN0c1xuIik7CiAJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAJfQpAQCAtNzkyLDcgKzc5Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpOTE1X2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAkvKiBpOTE1IGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CkBAIC04MDQsNyArODA0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04MTMsNyArODEzLDcgQEAKIAlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04NTQsNyArODU0LDcgQEAKICAqIFxyZXR1cm5zCiAgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk5eDUgaXMgQUdQLgogICovCi1pbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAppbmRleCA3YjdiNjhiOS4uMDVjNjZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaApAQCAtNjQsNyArNjQsNyBAQAogfSBkcm1faTkxNV9pbml0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9zYXJlYSB7Ci0JZHJtX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k5MTVfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtJOTE1X05SX1RFWF9SRUdJT05TICsgMV07CiAJaW50IGxhc3RfdXBsb2FkOwkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KIAlpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCiAJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/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+YmRfZGlzaywgY21kLCBwKTsKLQogCQljYXNlIEhESU9fR0VUX0JVU1NUQVRFOgogCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJCXJldHVybiAtRUFDQ0VTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYwppbmRleCAwZmM4YzZlLi5lZTQ1MjU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KQEAgLTExMjgsOCArMTEyOSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCB0bXA7CiAJaW50IG1heV9zY2hlZHVsZTsKIAotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAogCQlJTklUX0xJU1RfSEVBRCgmdG1wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKaW5kZXggNTFhMTIwNi4uMmZmZDUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKQEAgLTE2OTksNiArMTY5OSw3IEBACiAJdW5zaWduZWQgaW50IGcsIGdlbmVyYXRpb24gPSAwOwogCWludCBpLCByZXNldF9jeWNsZXMgPSAwOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCS8qIFNldHVwIG91ciBkZXZpY2UtbW9kZWwgZW50cmllcyAqLwogCW5vZGVtZ3JfY3JlYXRlX2hvc3RfZGV2X2ZpbGVzKGhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggYmQ2ODZhMi4uMjA4OTZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwpAQCAtNDQ1LDYgKzQ0NSw3IEBACiAKIHN0YXRpYyBpbnQgZ2FtZXBvcnRfdGhyZWFkKHZvaWQgKm5vdGhpbmcpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWRvIHsKIAkJZ2FtZXBvcnRfaGFuZGxlX2V2ZW50KCk7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShnYW1lcG9ydF93YWl0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCmluZGV4IGE4ZjNiYzEuLjM3MmNhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKQEAgLTM4NCw2ICszODQsNyBAQAogCiBzdGF0aWMgaW50IHNlcmlvX3RocmVhZCh2b2lkICpub3RoaW5nKQogeworCXNldF9mcmVlemFibGUoKTsKIAlkbyB7CiAJCXNlcmlvX2hhbmRsZV9ldmVudCgpOwogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VyaW9fd2FpdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKaW5kZXggZjBjYmNkYi4uMzZmOTQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKQEAgLTI5Miw2ICsyOTIsNyBAQAogCiAJc2NoZWRfc2V0c2NoZWR1bGVyKHRzaywgU0NIRURfRklGTywgJnBhcmFtKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQl1bnNpZ25lZCBpbnQgeCwgeSwgcDsKIAkJbG9uZyB0aW1lb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vS2NvbmZpZwppbmRleCAzZTA4OGM0Li5jZjkwNmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vS2NvbmZpZwpAQCAtMiwxMiArMiwxMCBAQAogIyBJU0ROIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIklTRE4gc3Vic3lzdGVtIgotCWRlcGVuZHMgb24gIVMzOTAKLQotY29uZmlnIElTRE4KK21lbnVjb25maWcgSVNETgogCXRyaXN0YXRlICJJU0ROIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQKKwlkZXBlbmRzIG9uICFTMzkwCiAJLS0taGVscC0tLQogCSAgSVNETiAoIkludGVncmF0ZWQgU2VydmljZXMgRGlnaXRhbCBOZXR3b3JrcyIsIGNhbGxlZCBSTklTIGluIEZyYW5jZSkKIAkgIGlzIGEgc3BlY2lhbCB0eXBlIG9mIGZ1bGx5IGRpZ2l0YWwgdGVsZXBob25lIHNlcnZpY2U7IGl0J3MgbW9zdGx5CkBAIC0yMSw5ICsxOSw5IEBACiAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IElTRE4uCiAKK2lmIElTRE4KIAogbWVudSAiT2xkIElTRE40TGludXgiCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETgogCiBjb25maWcgSVNETl9JNEwKIAl0cmlzdGF0ZSAiT2xkIElTRE40TGludXggKGRlcHJlY2F0ZWQpIgpAQCAtNTAsMjAgKzQ4LDIxIEBACiBlbmRtZW51CiAKIGNvbW1lbnQgIkNBUEkgc3Vic3lzdGVtIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4KIAogY29uZmlnIElTRE5fQ0FQSQogCXRyaXN0YXRlICJDQVBJMi4wIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyB0aGUgQ0FQSSAoQ29tbW9uIElTRE4gQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcKIAkgIEludGVyZmFjZSwgYSBzdGFuZGFyZCBtYWtpbmcgaXQgZWFzeSBmb3IgcHJvZ3JhbXMgdG8gYWNjZXNzIElTRE4KIAkgIGhhcmR3YXJlLCBzZWUgPGh0dHA6Ly93d3cuY2FwaS5vcmcvPi4gIFRoaXMgaXMgbmVlZGVkIGZvciBBVk0ncyBzZXQKIAkgIG9mIGFjdGl2ZSBJU0ROIGNvbnRyb2xsZXJzIGxpa2UgQjEsIFQxLCBNMS4KIAoraWYgSVNETl9DQVBJCisKIHNvdXJjZSAiZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vaGFyZHdhcmUvS2NvbmZpZyIKIAotZW5kbWVudQorZW5kaWYgIyBJU0ROX0NBUEkKIAorZW5kaWYgIyBJU0ROCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZwppbmRleCBjOTJmOWQ3Li5lMWFmZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKQEAgLTMsNyArMyw2IEBACiAjCiBjb25maWcgSVNETl9EUlZfQVZNQjFfVkVSQk9TRV9SRUFTT04KIAlib29sICJWZXJib3NlIHJlYXNvbiBjb2RlIHJlcG9ydGluZyIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgQ0FQSSBkcml2ZXJzIHdpbGwgZ2l2ZSB2ZXJib3NlIHJlYXNvbnMgZm9yCkBAIC0xMiw3ICsxMSw2IEBACiAKIGNvbmZpZyBDQVBJX1RSQUNFCiAJYm9vbCAiQ0FQSSB0cmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9DQVBJCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBrZXJuZWxjYXBpIGRyaXZlciBjYW4gbWFrZSB2ZXJib3NlIHRyYWNlcwpAQCAtMjMsNyArMjEsNyBAQAogCiBjb25maWcgSVNETl9DQVBJX01JRERMRVdBUkUKIAlib29sICJDQVBJMi4wIE1pZGRsZXdhcmUgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHdpbGwgZW5oYW5jZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSAvZGV2L2NhcGkyMAogCSAgaW50ZXJmYWNlLiAgSXQgd2lsbCBwcm92aWRlIGEgbWVhbnMgb2YgbW92aW5nIGEgZGF0YSBjb25uZWN0aW9uLApAQCAtMzMsNyArMzEsNiBAQAogCiBjb25maWcgSVNETl9DQVBJX0NBUEkyMAogCXRyaXN0YXRlICJDQVBJMi4wIC9kZXYvY2FwaSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9DQVBJCiAJaGVscAogCSAgVGhpcyBvcHRpb24gd2lsbCBwcm92aWRlIHRoZSBDQVBJIDIuMCBpbnRlcmZhY2UgdG8gdXNlcnNwYWNlCiAJICBhcHBsaWNhdGlvbnMgdmlhIC9kZXYvY2FwaTIwLiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUKQEAgLTU2LDcgKzUzLDcgQEAKIAogY29uZmlnIElTRE5fQ0FQSV9DQVBJRFJWCiAJdHJpc3RhdGUgIkNBUEkyLjAgY2FwaWRydiBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSSAmJiBJU0ROX0k0TAorCWRlcGVuZHMgb24gSVNETl9JNEwKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBwcm92aWRlcyB0aGUgZ2x1ZSBjb2RlIHRvIGhvb2sgdXAgQ0FQSSBkcml2ZW4gY2FyZHMgdG8KIAkgIHRoZSBsZWdhY3kgaXNkbjRsaW51eCBsaW5rIGxheWVyLiAgSWYgeW91IGhhdmUgYSBjYXJkIHdoaWNoIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKaW5kZXggODE2NjFiOC4uZjQ0OWRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJCWNhcGltc2dfc2V0dTggKHNrYi0+ZGF0YSwgNSwgQ0FQSV9SRVEpOwogCQljYXBpbXNnX3NldHUxNihza2ItPmRhdGEsIDYsIG1wLT5tc2dpZCsrKTsKIAkJY2FwaW1zZ19zZXR1MzIoc2tiLT5kYXRhLCA4LCBtcC0+bmNjaSk7CS8qIE5DQ0kgKi8KLQkJY2FwaW1zZ19zZXR1MzIoc2tiLT5kYXRhLCAxMiwgKHUzMikgc2tiLT5kYXRhKTsgLyogRGF0YTMyICovCisJCWNhcGltc2dfc2V0dTMyKHNrYi0+ZGF0YSwgMTIsICh1MzIpKGxvbmcpc2tiLT5kYXRhKTsvKiBEYXRhMzIgKi8KIAkJY2FwaW1zZ19zZXR1MTYoc2tiLT5kYXRhLCAxNiwgbGVuKTsJLyogRGF0YSBsZW5ndGggKi8KIAkJY2FwaW1zZ19zZXR1MTYoc2tiLT5kYXRhLCAxOCwgZGF0YWhhbmRsZSk7CiAJCWNhcGltc2dfc2V0dTE2KHNrYi0+ZGF0YSwgMjAsIDApOwkvKiBGbGFncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKaW5kZXggM2VkMzRmNy4uOWY3M2JjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAlpZiAoKCFhcCkgfHwgKGFwLT5yZWxlYXNlX2luX3Byb2dyZXNzKSkKIAkJcmV0dXJuOwogCi0JZG93bigmYXAtPnJlY3Zfc2VtKTsKKwltdXRleF9sb2NrKCZhcC0+cmVjdl9tdHgpOwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFwLT5yZWN2X3F1ZXVlKSkpIHsKIAkJaWYgKENBUElNU0dfQ01EKHNrYi0+ZGF0YSkgPT0gQ0FQSV9EQVRBX0IzX0lORCkKIAkJCWFwLT5ucmVjdmRhdGFwa3QrKzsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiAJCWFwLT5yZWN2X21lc3NhZ2UoYXAsIHNrYik7CiAJfQotCXVwKCZhcC0+cmVjdl9zZW0pOworCW11dGV4X3VubG9jaygmYXAtPnJlY3ZfbXR4KTsKIH0KIAogdm9pZCBjYXBpX2N0cl9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgY2FwaV9jdHIgKiBjYXJkLCB1MTYgYXBwbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTU0Nyw3ICs1NDcsNyBAQAogCWFwLT5uc2VudGN0bHBrdCA9IDA7CiAJYXAtPm5zZW50ZGF0YXBrdCA9IDA7CiAJYXAtPmNhbGxiYWNrID0gTlVMTDsKLQlpbml0X01VVEVYKCZhcC0+cmVjdl9zZW0pOworCW11dGV4X2luaXQoJmFwLT5yZWN2X210eCk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXAtPnJlY3ZfcXVldWUpOwogCUlOSVRfV09SSygmYXAtPnJlY3Zfd29yaywgcmVjdl9oYW5kbGVyKTsKIAlhcC0+cmVsZWFzZV9pbl9wcm9ncmVzcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMKaW5kZXggMzFmNGZkOC4uODQ1YTc5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYwpAQCAtMjQzLDM2ICsyNDMsMTUgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQotc3RhdGljIF9faW5saW5lX18gc3RydWN0IGNhcGlfZHJpdmVyICpjYXBpX2RyaXZlcl9nZXRfaWR4KGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGNhcGlfZHJpdmVyICpkcnYgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7Ci0JbG9mZl90IGk7Ci0KLQlpID0gMDsKLQlsaXN0X2Zvcl9lYWNoKGwsICZjYXBpX2RyaXZlcnMpIHsKLQkJZHJ2ID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgY2FwaV9kcml2ZXIsIGxpc3QpOwotCQlpZiAoaSsrID09IHBvcykKLQkJCXJldHVybiBkcnY7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCAqY2FwaV9kcml2ZXJfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBjYXBpX2RyaXZlciAqZHJ2OwogCXJlYWRfbG9jaygmY2FwaV9kcml2ZXJzX2xpc3RfbG9jayk7Ci0JZHJ2ID0gY2FwaV9kcml2ZXJfZ2V0X2lkeCgqcG9zKTsKLQlyZXR1cm4gZHJ2OworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY2FwaV9kcml2ZXJzLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKmNhcGlfZHJpdmVyX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBjYXBpX2RyaXZlciAqZHJ2ID0gKHN0cnVjdCBjYXBpX2RyaXZlciAqKXY7Ci0JKysqcG9zOwotCWlmIChkcnYtPmxpc3QubmV4dCA9PSAmY2FwaV9kcml2ZXJzKSByZXR1cm4gTlVMTDsKLQlyZXR1cm4gbGlzdF9lbnRyeShkcnYtPmxpc3QubmV4dCwgc3RydWN0IGNhcGlfZHJpdmVyLCBsaXN0KTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmY2FwaV9kcml2ZXJzLCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBjYXBpX2RyaXZlcl9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQpAQCAtMjgyLDcgKzI2MSw4IEBACiAKIHN0YXRpYyBpbnQgY2FwaV9kcml2ZXJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydiA9IChzdHJ1Y3QgY2FwaV9kcml2ZXIgKil2OworCXN0cnVjdCBjYXBpX2RyaXZlciAqZHJ2ID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY2FwaV9kcml2ZXIsIGxpc3QpOworCiAJc2VxX3ByaW50ZihzZXEsICIlLTMycyAlc1xuIiwgZHJ2LT5uYW1lLCBkcnYtPnJldmlzaW9uKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL0tjb25maWcKaW5kZXggMTM5ZjE5Ny4uMzBkMDI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL0tjb25maWcKQEAgLTIsNyArMiw2IEBACiAjIElTRE4gaGFyZHdhcmUgZHJpdmVycwogIwogY29tbWVudCAiQ0FQSSBoYXJkd2FyZSBkcml2ZXJzIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4gJiYgSVNETl9DQVBJCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL0tjb25maWcKaW5kZXggMjlhMzJhOC4uNWRiY2JlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZwpAQCAtMiwyMyArMiwyMiBAQAogIyBJU0ROIEFWTSBkcml2ZXJzCiAjCiAKLW1lbnUgIkFjdGl2ZSBBVk0gY2FyZHMiCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETiAmJiBJU0ROX0NBUEkhPW4KLQotY29uZmlnIENBUElfQVZNCi0JYm9vbCAiU3VwcG9ydCBBVk0gY2FyZHMiCittZW51Y29uZmlnIENBUElfQVZNCisJYm9vbCAiQWN0aXZlIEFWTSBjYXJkcyIKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQVZNIGFjdGl2ZSBJU0ROIGNhcmRzLgogCitpZiBDQVBJX0FWTQorCiBjb25maWcgSVNETl9EUlZfQVZNQjFfQjFJU0EKIAl0cmlzdGF0ZSAiQVZNIEIxIElTQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIElTQQorCWRlcGVuZHMgb24gSVNBCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBJU0EgdmVyc2lvbiBvZiB0aGUgQVZNIEIxIGNhcmQuCiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9CMVBDSQogCXRyaXN0YXRlICJBVk0gQjEgUENJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkgJiYgUENJCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFBDSSB2ZXJzaW9uIG9mIHRoZSBBVk0gQjEgY2FyZC4KIApAQCAtMzAsMTQgKzI5LDEzIEBACiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9UMUlTQQogCXRyaXN0YXRlICJBVk0gVDEvVDEtQiBJU0Egc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBJU0EKKwlkZXBlbmRzIG9uIElTQQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQVZNIFQxIFQxQiBjYXJkLgogCSAgTm90ZTogVGhpcyBpcyBhIFBSSSBjYXJkIGFuZCBoYW5kbGUgMzAgQi1jaGFubmVscy4KIAogY29uZmlnIElTRE5fRFJWX0FWTUIxX0IxUENNQ0lBCiAJdHJpc3RhdGUgIkFWTSBCMS9NMS9NMiBQQ01DSUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgUENNQ0lBIHZlcnNpb24gb2YgdGhlIEFWTSBCMSBjYXJkLgogCkBAIC01MCwxNyArNDgsMTYgQEAKIAogY29uZmlnIElTRE5fRFJWX0FWTUIxX1QxUENJCiAJdHJpc3RhdGUgIkFWTSBUMS9UMS1CIFBDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIFBDSQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBBVk0gVDEgVDFCIGNhcmQuCiAJICBOb3RlOiBUaGlzIGlzIGEgUFJJIGNhcmQgYW5kIGhhbmRsZSAzMCBCLWNoYW5uZWxzLgogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfQzQKIAl0cmlzdGF0ZSAiQVZNIEM0L0MyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkgJiYgUENJCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEFWTSBDNC9DMiBQQ0kgY2FyZHMuCiAJICBUaGVzZSBjYXJkcyBoYW5kbGUgNC8yIEJSSSBJU0ROIGxpbmVzICg4LzQgY2hhbm5lbHMpLgogCi1lbmRtZW51Ci0KK2VuZGlmICMgQ0FQSV9BVk0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL0tjb25maWcKaW5kZXggMDFkNGFmZC4uNjA4MmI2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL0tjb25maWcKQEAgLTIsNTIgKzIsNTAgQEAKICMgSVNETiBESVZBUyBFaWNvbiBkcml2ZXIKICMKIAotbWVudSAiQWN0aXZlIEVpY29uIERJVkEgU2VydmVyIGNhcmRzIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4gJiYgSVNETl9DQVBJIT1uCi0KLWNvbmZpZyBDQVBJX0VJQ09OCi0JYm9vbCAiU3VwcG9ydCBFaWNvbiBjYXJkcyIKK21lbnVjb25maWcgQ0FQSV9FSUNPTgorCWJvb2wgIkFjdGl2ZSBFaWNvbiBESVZBIFNlcnZlciBjYXJkcyIKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgRWljb24gTmV0d29ya3MgYWN0aXZlIElTRE4gY2FyZHMuCiAKK2lmIENBUElfRUlDT04KKwogY29uZmlnIElTRE5fRElWQVMKIAl0cmlzdGF0ZSAiU3VwcG9ydCBFaWNvbiBESVZBIFNlcnZlciBjYXJkcyIKLQlkZXBlbmRzIG9uIENBUElfRUlDT04gJiYgUFJPQ19GUyAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBST0NfRlMgJiYgUENJCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBFaWNvbiBOZXR3b3JrcyBESVZBIFNlcnZlciBQQ0kgSVNETiBjYXJkLgogCSAgSW4gb3JkZXIgdG8gdXNlIHRoaXMgY2FyZCwgYWRkaXRpb25hbCBmaXJtd2FyZSBpcyBuZWNlc3NhcnksIHdoaWNoCiAJICBoYXMgdG8gYmUgZG93bmxvYWRlZCBpbnRvIHRoZSBjYXJkIHVzaW5nIHRoZSBkaXZhY3RybCB1dGlsaXR5LgogCitpZiBJU0ROX0RJVkFTCisKIGNvbmZpZyBJU0ROX0RJVkFTX0JSSVBDSQogCWJvb2wgIkRJVkEgU2VydmVyIEJSSS9QQ0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgRElWQSBTZXJ2ZXIgQlJJLVBDSS4KIAogY29uZmlnIElTRE5fRElWQVNfUFJJUENJCiAJYm9vbCAiRElWQSBTZXJ2ZXIgUFJJL1BDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9ESVZBUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBESVZBIFNlcnZlciBQUkktUENJLgogCiBjb25maWcgSVNETl9ESVZBU19ESVZBQ0FQSQogCXRyaXN0YXRlICJESVZBIENBUEkyLjAgaW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTICYmIElTRE5fQ0FQSQogCWhlbHAKIAkgIFlvdSBuZWVkIHRoaXMgdG8gcHJvdmlkZSB0aGUgQ0FQSSBpbnRlcmZhY2UKIAkgIGZvciBESVZBIFNlcnZlciBjYXJkcy4KIAogY29uZmlnIElTRE5fRElWQVNfVVNFUklESQogCXRyaXN0YXRlICJESVZBIFVzZXItSURJIGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9ESVZBUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB1c2VyLW1vZGUgSURJIGludGVyZmFjZS4KIAogY29uZmlnIElTRE5fRElWQVNfTUFJTlQKIAl0cmlzdGF0ZSAiRElWQSBNYWludCBkcml2ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMgJiYgbQorCWRlcGVuZHMgb24gbQogCWhlbHAKIAkgIEVuYWJsZSBEaXZhcyBNYWludGVuYW5jZSBkcml2ZXIuCiAKLWVuZG1lbnUKK2VuZGlmICMgSVNETl9ESVZBUwogCitlbmRpZiAjIENBUElfRUlDT04KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pZGlmdW5jLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaWRpZnVuYy5jCmluZGV4IDRjYmM2OGMuLmRiODdkNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pZGlmdW5jLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lkaWZ1bmMuYwpAQCAtMTA2LDYgKzEwNiw3IEBACiAJfSBlbHNlIHsKIAkJREJHX0VSUigoImNvdWxkIG5vdCBjcmVhdGUgdXNlciBtb2RlIGlkaSBjYXJkICVkIiwKIAkJCSBhZGFwdGVyX25yKSk7CisJCWRpdmFfb3NfZnJlZSgwLCBjYXJkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYwppbmRleCA4ZDUzYTdmLi5hNDMxNjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jCkBAIC0zNjEsMTEgKzM2MSwxMSBAQAogCiBpbnQgbnJjYXJkczsKIAotZXh0ZXJuIGNoYXIgKmwxX3JldmlzaW9uOwotZXh0ZXJuIGNoYXIgKmwyX3JldmlzaW9uOwotZXh0ZXJuIGNoYXIgKmwzX3JldmlzaW9uOwotZXh0ZXJuIGNoYXIgKmxsaV9yZXZpc2lvbjsKLWV4dGVybiBjaGFyICp0ZWlfcmV2aXNpb247CitleHRlcm4gY29uc3QgY2hhciAqbDFfcmV2aXNpb247CitleHRlcm4gY29uc3QgY2hhciAqbDJfcmV2aXNpb247CitleHRlcm4gY29uc3QgY2hhciAqbDNfcmV2aXNpb247CitleHRlcm4gY29uc3QgY2hhciAqbGxpX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKnRlaV9yZXZpc2lvbjsKIAogY2hhciAqSGlTYXhfZ2V0cmV2KGNvbnN0IGNoYXIgKnJldmlzaW9uKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jCmluZGV4IDAzMGQxNjIuLmFkMDZmM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMKQEAgLTQ1MSw2ICs0NTEsOSBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybigwKTsKIAkJY2FzZSBDQVJEX1JFTEVBU0U6CisJCQlpZiAoY3MtPmh3LnNlZGwuYnVzID09IFNFRExfQlVTX1BDSSkKKwkJCQkvKiBkaXNhYmxlIGFsbCBJUlEgKi8KKwkJCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcrIDUsIDApOwogCQkJaWYgKGNzLT5ody5zZWRsLmNoaXAgPT0gU0VETF9DSElQX0lTQUNfSVNBUikgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwogCQkJCXdyaXRlcmVnKGNzLT5ody5zZWRsLmFkciwgY3MtPmh3LnNlZGwuaHNjeCwKQEAgLTQ2OCw2ICs0NzEsOSBAQAogCQkJcmV0dXJuKDApOwogCQljYXNlIENBUkRfSU5JVDoKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGNzLT5ody5zZWRsLmJ1cyA9PSBTRURMX0JVU19QQ0kpCisJCQkJLyogZW5hYmxlIGFsbCBJUlEgKi8KKwkJCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcrIDUsIDB4MDIpOwogCQkJcmVzZXRfc2VkbGJhdWVyKGNzKTsKIAkJCWlmIChjcy0+aHcuc2VkbC5jaGlwID09IFNFRExfQ0hJUF9JU0FDX0lTQVIpIHsKIAkJCQljbGVhcl9wZW5kaW5nX2lzYWNfaW50cyhjcyk7CkBAIC02NjcsNyArNjczLDcgQEAKIAkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnLCAweGZmKTsKIAkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnLCAweDAwKTsKIAkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyAyLCAweGRkKTsKLQkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyA1LCAweDAyKTsKKwkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyA1LCAwKTsgLyogZGlzYWJsZSBhbGwgSVJRICovCiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZyArMywgY3MtPmh3LnNlZGwucmVzZXRfb24pOwogCQltZGVsYXkoMik7CiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZyArMywgY3MtPmh3LnNlZGwucmVzZXRfb2ZmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZwppbmRleCAzZWY1NjdiLi5lOTFjMTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnCkBAIC04Niw3ICs4Niw2IEBACiAKIAogbWVudSAiSVNETiBmZWF0dXJlIHN1Ym1vZHVsZXMiCi0JZGVwZW5kcyBvbiBJU0ROCiAKIGNvbmZpZyBJU0ROX0RSVl9MT09QCiAJdHJpc3RhdGUgImlzZG5sb29wIHN1cHBvcnQiCkBAIC0xMDAsNyArOTksNyBAQAogCiBjb25maWcgSVNETl9ESVZFUlNJT04KIAl0cmlzdGF0ZSAiU3VwcG9ydCBpc2RuIGRpdmVyc2lvbiBzZXJ2aWNlcyIKLQlkZXBlbmRzIG9uIElTRE4gJiYgSVNETl9JNEwKKwlkZXBlbmRzIG9uIElTRE5fSTRMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byB1c2Ugc29tZSBzdXBwbGVtZW50YXJ5IGRpdmVyc2lvbgogCSAgc2VydmljZXMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgSGlTYXggZHJpdmVyIG9uIGFuIEVVUk8vRFNTMQpAQCAtMTIwLDEzICsxMTksMTMgQEAKIGVuZG1lbnUKIAogY29tbWVudCAiSVNETjRMaW51eCBoYXJkd2FyZSBkcml2ZXJzIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4gJiYgSVNETl9JNEwKKwlkZXBlbmRzIG9uIElTRE5fSTRMCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWciCiAKIAogbWVudSAiQWN0aXZlIGNhcmRzIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4gJiYgSVNETl9JNEwhPW4KKwlkZXBlbmRzIG9uIElTRE5fSTRMIT1uCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL2ljbi9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCmluZGV4IGFkZmVhM2MuLmJjNzdjNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCkBAIC0yNDgsMjEgKzI0OCwxNSBAQAogc3RhdGljIGludAogYWRiX3Byb2JlX3Rhc2sodm9pZCAqeCkKIHsKLQlzaWdzZXRfdCBibG9ja2VkOwotCiAJc3RyY3B5KGN1cnJlbnQtPmNvbW0sICJrYWRicHJvYmUiKTsKIAotCXNpZ2ZpbGxzZXQoJmJsb2NrZWQpOwotCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmJsb2NrZWQsIE5VTEwpOwotCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7Ci0KIAlwcmludGsoS0VSTl9JTkZPICJhZGI6IHN0YXJ0aW5nIHByb2JlIHRhc2suLi5cbiIpOwogCWRvX2FkYl9yZXNldF9idXMoKTsKIAlwcmludGsoS0VSTl9JTkZPICJhZGI6IGZpbmlzaGVkIHByb2JlIHRhc2suLi5cbiIpOwotCQorCiAJYWRiX3Byb2JlX3Rhc2tfcGlkID0gMDsKIAl1cCgmYWRiX3Byb2JlX211dGV4KTsKLQkKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKaW5kZXggYmQ1NWU2YS4uZjI1Njg1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwpAQCAtMzM1LDYgKzMzNSw3IEBACiB7CiAJc3RydWN0IHRoZXJtb3N0YXQqIHRoID0gYXJnOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYwppbmRleCA0ZmNiMjQ1Li5lMThkMjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fY29yZS5jCkBAIC05Miw2ICs5Miw3IEBACiAKIAlEQkcoIndmOiB0aHJlYWQgc3RhcnRlZFxuIik7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBuZXh0KSkgewogCQkJd2Zfbm90aWZ5KFdGX0VWRU5UX1RJQ0ssIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9LY29uZmlnIGIvZHJpdmVycy9tZC9LY29uZmlnCmluZGV4IDY0YmYzYTguLjUzMWQ0ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvS2NvbmZpZworKysgYi9kcml2ZXJzL21kL0tjb25maWcKQEAgLTIsMTkgKzIsMTcgQEAKICMgQmxvY2sgZGV2aWNlIGRyaXZlciBjb25maWd1cmF0aW9uCiAjCiAKLWlmIEJMT0NLCi0KLW1lbnUgIk11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pIgotCi1jb25maWcgTUQKK21lbnVjb25maWcgTUQKIAlib29sICJNdWx0aXBsZSBkZXZpY2VzIGRyaXZlciBzdXBwb3J0IChSQUlEIGFuZCBMVk0pIgorCWRlcGVuZHMgb24gQkxPQ0sKIAloZWxwCiAJICBTdXBwb3J0IG11bHRpcGxlIHBoeXNpY2FsIHNwaW5kbGVzIHRocm91Z2ggYSBzaW5nbGUgbG9naWNhbCBkZXZpY2UuCiAJICBSZXF1aXJlZCBmb3IgUkFJRCBhbmQgbG9naWNhbCB2b2x1bWUgbWFuYWdlbWVudC4KIAoraWYgTUQKKwogY29uZmlnIEJMS19ERVZfTUQKIAl0cmlzdGF0ZSAiUkFJRCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUQKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBsZXRzIHlvdSBjb21iaW5lIHNldmVyYWwgaGFyZCBkaXNrIHBhcnRpdGlvbnMgaW50byBvbmUKIAkgIGxvZ2ljYWwgYmxvY2sgZGV2aWNlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNpbXBseSBhcHBlbmQgb25lCkBAIC0xOTEsNyArMTg5LDYgQEAKIAogY29uZmlnIEJMS19ERVZfRE0KIAl0cmlzdGF0ZSAiRGV2aWNlIG1hcHBlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUQKIAktLS1oZWxwLS0tCiAJICBEZXZpY2UtbWFwcGVyIGlzIGEgbG93IGxldmVsIHZvbHVtZSBtYW5hZ2VyLiAgSXQgd29ya3MgYnkgYWxsb3dpbmcKIAkgIHBlb3BsZSB0byBzcGVjaWZ5IG1hcHBpbmdzIGZvciByYW5nZXMgb2YgbG9naWNhbCBzZWN0b3JzLiAgVmFyaW91cwpAQCAtMjc5LDYgKzI3Niw0IEBACiAKIAlJZiB1bnN1cmUsIHNheSBOLgogCi1lbmRtZW51Ci0KLWVuZGlmCitlbmRpZiAjIE1ECmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJpdmVycy9tZC9iaXRtYXAuYwppbmRleCA5NjIwZDQ1Li45MjdjYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKQEAgLTI2OCw2ICsyNjgsMzEgQEAKIAkJCWlmIChwYWdlLT5pbmRleCA9PSBiaXRtYXAtPmZpbGVfcGFnZXMtMSkKIAkJCQlzaXplID0gcm91bmR1cChiaXRtYXAtPmxhc3RfcGFnZV9zaXplLAogCQkJCQkgICAgICAgYmRldl9oYXJkc2VjdF9zaXplKHJkZXYtPmJkZXYpKTsKKwkJCS8qIEp1c3QgbWFrZSBzdXJlIHdlIGFyZW4ndCBjb3JydXB0aW5nIGRhdGEgb3IKKwkJCSAqIG1ldGFkYXRhCisJCQkgKi8KKwkJCWlmIChiaXRtYXAtPm9mZnNldCA8IDApIHsKKwkJCQkvKiBEQVRBICBCSVRNQVAgTUVUQURBVEEgICovCisJCQkJaWYgKGJpdG1hcC0+b2Zmc2V0CisJCQkJICAgICsgcGFnZS0+aW5kZXggKiAoUEFHRV9TSVpFLzUxMikKKwkJCQkgICAgKyBzaXplLzUxMiA+IDApCisJCQkJCS8qIGJpdG1hcCBydW5zIGluIHRvIG1ldGFkYXRhICovCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChyZGV2LT5kYXRhX29mZnNldCArIG1kZGV2LT5zaXplKjIKKwkJCQkgICAgPiByZGV2LT5zYl9vZmZzZXQqMiArIGJpdG1hcC0+b2Zmc2V0KQorCQkJCQkvKiBkYXRhIHJ1bnMgaW4gdG8gYml0bWFwICovCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmIChyZGV2LT5zYl9vZmZzZXQqMiA8IHJkZXYtPmRhdGFfb2Zmc2V0KSB7CisJCQkJLyogTUVUQURBVEEgQklUTUFQIERBVEEgKi8KKwkJCQlpZiAocmRldi0+c2Jfb2Zmc2V0KjIKKwkJCQkgICAgKyBiaXRtYXAtPm9mZnNldAorCQkJCSAgICArIHBhZ2UtPmluZGV4KihQQUdFX1NJWkUvNTEyKSArIHNpemUvNTEyCisJCQkJICAgID4gcmRldi0+ZGF0YV9vZmZzZXQpCisJCQkJCS8qIGJpdG1hcCBydW5zIGluIHRvIGRhdGEgKi8KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCS8qIERBVEEgTUVUQURBVEEgQklUTUFQIC0gbm8gcHJvYmxlbXMgKi8KKwkJCX0KIAkJCW1kX3N1cGVyX3dyaXRlKG1kZGV2LCByZGV2LAogCQkJCSAgICAgICAocmRldi0+c2Jfb2Zmc2V0PDwxKSArIGJpdG1hcC0+b2Zmc2V0CiAJCQkJICAgICAgICsgcGFnZS0+aW5kZXggKiAoUEFHRV9TSVpFLzUxMiksCkBAIC0yODAsMzIgKzMwNSwzOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBiaXRtYXBfZmlsZV9raWNrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAvKgogICogd3JpdGUgb3V0IGEgcGFnZSB0byBhIGZpbGUKICAqLwotc3RhdGljIGludCB3cml0ZV9wYWdlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB3YWl0KQorc3RhdGljIHZvaWQgd3JpdGVfcGFnZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCi0JaWYgKGJpdG1hcC0+ZmlsZSA9PSBOVUxMKQotCQlyZXR1cm4gd3JpdGVfc2JfcGFnZShiaXRtYXAsIHBhZ2UsIHdhaXQpOworCWlmIChiaXRtYXAtPmZpbGUgPT0gTlVMTCkgeworCQlzd2l0Y2ggKHdyaXRlX3NiX3BhZ2UoYml0bWFwLCBwYWdlLCB3YWl0KSkgeworCQljYXNlIC1FSU5WQUw6CisJCQliaXRtYXAtPmZsYWdzIHw9IEJJVE1BUF9XUklURV9FUlJPUjsKKwkJfQorCX0gZWxzZSB7CiAKLQliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAKLQl3aGlsZSAoYmggJiYgYmgtPmJfYmxvY2tucikgewotCQlhdG9taWNfaW5jKCZiaXRtYXAtPnBlbmRpbmdfd3JpdGVzKTsKLQkJc2V0X2J1ZmZlcl9sb2NrZWQoYmgpOwotCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7Ci0JCXN1Ym1pdF9iaChXUklURSwgYmgpOwotCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJd2hpbGUgKGJoICYmIGJoLT5iX2Jsb2NrbnIpIHsKKwkJCWF0b21pY19pbmMoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpOworCQkJc2V0X2J1ZmZlcl9sb2NrZWQoYmgpOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfQorCisJCWlmICh3YWl0KSB7CisJCQl3YWl0X2V2ZW50KGJpdG1hcC0+d3JpdGVfd2FpdCwKKwkJCQkgICBhdG9taWNfcmVhZCgmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk9PTApOworCQl9CiAJfQotCi0JaWYgKHdhaXQpIHsKLQkJd2FpdF9ldmVudChiaXRtYXAtPndyaXRlX3dhaXQsCi0JCQkgICBhdG9taWNfcmVhZCgmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk9PTApOwotCQlyZXR1cm4gKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfV1JJVEVfRVJST1IpID8gLUVJTyA6IDA7Ci0JfQotCXJldHVybiAwOworCWlmIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKQorCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuZF9iaXRtYXBfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQpAQCAtNDI1LDE3ICs0NTYsMTcgQEAKICAqLwogCiAvKiB1cGRhdGUgdGhlIGV2ZW50IGNvdW50ZXIgYW5kIHN5bmMgdGhlIHN1cGVyYmxvY2sgdG8gZGlzayAqLwotaW50IGJpdG1hcF91cGRhdGVfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKQordm9pZCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKIHsKIAliaXRtYXBfc3VwZXJfdCAqc2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghYml0bWFwIHx8ICFiaXRtYXAtPm1kZGV2KSAvKiBubyBiaXRtYXAgZm9yIHRoaXMgYXJyYXkgKi8KLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFiaXRtYXAtPnNiX3BhZ2UpIHsgLyogbm8gc3VwZXJibG9jayAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJc2IgPSAoYml0bWFwX3N1cGVyX3QgKilrbWFwX2F0b21pYyhiaXRtYXAtPnNiX3BhZ2UsIEtNX1VTRVIwKTsKQEAgLTQ0Myw3ICs0NzQsNyBAQAogCWlmICghYml0bWFwLT5tZGRldi0+ZGVncmFkZWQpCiAJCXNiLT5ldmVudHNfY2xlYXJlZCA9IGNwdV90b19sZTY0KGJpdG1hcC0+bWRkZXYtPmV2ZW50cyk7CiAJa3VubWFwX2F0b21pYyhzYiwgS01fVVNFUjApOwotCXJldHVybiB3cml0ZV9wYWdlKGJpdG1hcCwgYml0bWFwLT5zYl9wYWdlLCAxKTsKKwl3cml0ZV9wYWdlKGJpdG1hcCwgYml0bWFwLT5zYl9wYWdlLCAxKTsKIH0KIAogLyogcHJpbnQgb3V0IHRoZSBiaXRtYXAgZmlsZSBzdXBlcmJsb2NrICovCkBAIC01NzIsMjAgKzYwMywyMiBAQAogCU1BU0tfVU5TRVQKIH07CiAKLS8qIHJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIGJpdG1hcCBpbiB0aGUgc3VwZXJibG9jayAqLwotc3RhdGljIHZvaWQgYml0bWFwX21hc2tfc3RhdGUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBlbnVtIGJpdG1hcF9zdGF0ZSBiaXRzLAotCQkJCWVudW0gYml0bWFwX21hc2tfb3Agb3ApCisvKiByZWNvcmQgdGhlIHN0YXRlIG9mIHRoZSBiaXRtYXAgaW4gdGhlIHN1cGVyYmxvY2suICBSZXR1cm4gdGhlIG9sZCB2YWx1ZSAqLworc3RhdGljIGludCBiaXRtYXBfbWFza19zdGF0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIGVudW0gYml0bWFwX3N0YXRlIGJpdHMsCisJCQkgICAgIGVudW0gYml0bWFwX21hc2tfb3Agb3ApCiB7CiAJYml0bWFwX3N1cGVyX3QgKnNiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9sZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlpZiAoIWJpdG1hcC0+c2JfcGFnZSkgeyAvKiBjYW4ndCBzZXQgdGhlIHN0YXRlICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlzYiA9IChiaXRtYXBfc3VwZXJfdCAqKWttYXBfYXRvbWljKGJpdG1hcC0+c2JfcGFnZSwgS01fVVNFUjApOworCW9sZCA9IGxlMzJfdG9fY3B1KHNiLT5zdGF0ZSkgJiBiaXRzOwogCXN3aXRjaCAob3ApIHsKIAkJY2FzZSBNQVNLX1NFVDogc2ItPnN0YXRlIHw9IGNwdV90b19sZTMyKGJpdHMpOwogCQkJCWJyZWFrOwpAQCAtNTk0LDYgKzYyNyw3IEBACiAJCWRlZmF1bHQ6IEJVRygpOwogCX0KIAlrdW5tYXBfYXRvbWljKHNiLCBLTV9VU0VSMCk7CisJcmV0dXJuIG9sZDsKIH0KIAogLyoKQEAgLTY4NywxOCArNzIxLDIzIEBACiB7CiAJY2hhciAqcGF0aCwgKnB0ciA9IE5VTEw7CiAKLQliaXRtYXBfbWFza19zdGF0ZShiaXRtYXAsIEJJVE1BUF9TVEFMRSwgTUFTS19TRVQpOwotCWJpdG1hcF91cGRhdGVfc2IoYml0bWFwKTsKKwlpZiAoYml0bWFwX21hc2tfc3RhdGUoYml0bWFwLCBCSVRNQVBfU1RBTEUsIE1BU0tfU0VUKSA9PSAwKSB7CisJCWJpdG1hcF91cGRhdGVfc2IoYml0bWFwKTsKIAotCWlmIChiaXRtYXAtPmZpbGUpIHsKLQkJcGF0aCA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHBhdGgpCi0JCQlwdHIgPSBmaWxlX3BhdGgoYml0bWFwLT5maWxlLCBwYXRoLCBQQUdFX1NJWkUpOworCQlpZiAoYml0bWFwLT5maWxlKSB7CisJCQlwYXRoID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCQkJaWYgKHBhdGgpCisJCQkJcHRyID0gZmlsZV9wYXRoKGJpdG1hcC0+ZmlsZSwgcGF0aCwgUEFHRV9TSVpFKTsKIAotCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGtpY2tpbmcgZmFpbGVkIGJpdG1hcCBmaWxlICVzIGZyb20gYXJyYXkhXG4iLAotCQkgICAgICAgYm1uYW1lKGJpdG1hcCksIHB0ciA/IHB0ciA6ICIiKTsKKwkJCXByaW50ayhLRVJOX0FMRVJUCisJCQkgICAgICAiJXM6IGtpY2tpbmcgZmFpbGVkIGJpdG1hcCBmaWxlICVzIGZyb20gYXJyYXkhXG4iLAorCQkJICAgICAgYm1uYW1lKGJpdG1hcCksIHB0ciA/IHB0ciA6ICIiKTsKIAotCQlrZnJlZShwYXRoKTsKKwkJCWtmcmVlKHBhdGgpOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0FMRVJUCisJCQkgICAgICAgIiVzOiBkaXNhYmxpbmcgaW50ZXJuYWwgYml0bWFwIGR1ZSB0byBlcnJvcnNcbiIsCisJCQkgICAgICAgYm1uYW1lKGJpdG1hcCkpOwogCX0KIAogCWJpdG1hcF9maWxlX3B1dChiaXRtYXApOwpAQCAtNzY5LDE2ICs4MDgsMTUgQEAKIC8qIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgbWQgZGV2aWNlIGlzIHJlYWR5IHRvIHVucGx1ZyBpdHMgdW5kZXJseWluZwogICogKHNsYXZlKSBkZXZpY2UgcXVldWVzIC0tIGJlZm9yZSB3ZSBsZXQgYW55IHdyaXRlcyBnbyBkb3duLCB3ZSBuZWVkIHRvCiAgKiBzeW5jIHRoZSBkaXJ0eSBwYWdlcyBvZiB0aGUgYml0bWFwIGZpbGUgdG8gZGlzayAqLwotaW50IGJpdG1hcF91bnBsdWcoc3RydWN0IGJpdG1hcCAqYml0bWFwKQordm9pZCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKIHsKIAl1bnNpZ25lZCBsb25nIGksIGZsYWdzOwogCWludCBkaXJ0eSwgbmVlZF93cml0ZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgd2FpdCA9IDA7Ci0JaW50IGVycjsKIAogCWlmICghYml0bWFwKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJLyogbG9vayBhdCBlYWNoIHBhZ2UgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc2V0IGJpdHMgdGhhdCBuZWVkIHRvIGJlCiAJICogZmx1c2hlZCBvdXQgdG8gZGlzayAqLwpAQCAtNzg2LDcgKzgyNCw3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKCFiaXRtYXAtPmZpbGVtYXApIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm47CiAJCX0KIAkJcGFnZSA9IGJpdG1hcC0+ZmlsZW1hcFtpXTsKIAkJZGlydHkgPSB0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX0RJUlRZKTsKQEAgLTc5OCw3ICs4MzYsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAogCQlpZiAoZGlydHkgfCBuZWVkX3dyaXRlKQotCQkJZXJyID0gd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDApOworCQkJd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDApOwogCX0KIAlpZiAod2FpdCkgeyAvKiBpZiBhbnkgd3JpdGVzIHdlcmUgcGVyZm9ybWVkLCB3ZSBuZWVkIHRvIHdhaXQgb24gdGhlbSAqLwogCQlpZiAoYml0bWFwLT5maWxlKQpAQCAtODA5LDcgKzg0Nyw2IEBACiAJfQogCWlmIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKQogCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJpdG1hcF9zZXRfbWVtb3J5X2JpdHMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIGludCBuZWVkZWQpOwpAQCAtODU4LDIxICs4OTUsMjEgQEAKIAkJCWJtbmFtZShiaXRtYXApLAogCQkJKHVuc2lnbmVkIGxvbmcpIGlfc2l6ZV9yZWFkKGZpbGUtPmZfbWFwcGluZy0+aG9zdCksCiAJCQlieXRlcyArIHNpemVvZihiaXRtYXBfc3VwZXJfdCkpOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gLUVOT01FTTsKIAogCWJpdG1hcC0+ZmlsZW1hcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnVtX3BhZ2VzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJpdG1hcC0+ZmlsZW1hcCkKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyOwogCiAJLyogV2UgbmVlZCA0IGJpdHMgcGVyIHBhZ2UsIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBzaXplb2YodW5zaWduZWQgbG9uZykgKi8KIAliaXRtYXAtPmZpbGVtYXBfYXR0ciA9IGt6YWxsb2MoCiAJCXJvdW5kdXAoIERJVl9ST1VORF9VUChudW1fcGFnZXMqNCwgOCksIHNpemVvZih1bnNpZ25lZCBsb25nKSksCiAJCUdGUF9LRVJORUwpOwogCWlmICghYml0bWFwLT5maWxlbWFwX2F0dHIpCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycjsKIAogCW9sZGluZGV4ID0gfjBMOwogCkBAIC05MDUsNyArOTQyLDcgQEAKIAkJCX0KIAkJCWlmIChJU19FUlIocGFnZSkpIHsgLyogcmVhZCBlcnJvciAqLwogCQkJCXJldCA9IFBUUl9FUlIocGFnZSk7Ci0JCQkJZ290byBvdXQ7CisJCQkJZ290byBlcnI7CiAJCQl9CiAKIAkJCW9sZGluZGV4ID0gaW5kZXg7CkBAIC05MjAsMTEgKzk1NywxMyBAQAogCQkJCW1lbXNldChwYWRkciArIG9mZnNldCwgMHhmZiwKIAkJCQkgICAgICAgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKIAkJCQlrdW5tYXBfYXRvbWljKHBhZGRyLCBLTV9VU0VSMCk7Ci0JCQkJcmV0ID0gd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDEpOwotCQkJCWlmIChyZXQpIHsKKwkJCQl3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMSk7CisKKwkJCQlyZXQgPSAtRUlPOworCQkJCWlmIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKSB7CiAJCQkJCS8qIHJlbGVhc2UsIHBhZ2Ugbm90IGluIGZpbGVtYXAgeWV0ICovCiAJCQkJCXB1dF9wYWdlKHBhZ2UpOwotCQkJCQlnb3RvIG91dDsKKwkJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJfQogCkBAIC05NTYsMTEgKzk5NSwxNSBAQAogCQltZF93YWtldXBfdGhyZWFkKGJpdG1hcC0+bWRkZXYtPnRocmVhZCk7CiAJfQogCi1vdXQ6CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJpdG1hcCBpbml0aWFsaXplZCBmcm9tIGRpc2s6ICIKLQkJInJlYWQgJWx1LyVsdSBwYWdlcywgc2V0ICVsdSBiaXRzLCBzdGF0dXM6ICVkXG4iLAotCQlibW5hbWUoYml0bWFwKSwgYml0bWFwLT5maWxlX3BhZ2VzLCBudW1fcGFnZXMsIGJpdF9jbnQsIHJldCk7CisJCSJyZWFkICVsdS8lbHUgcGFnZXMsIHNldCAlbHUgYml0c1xuIiwKKwkJYm1uYW1lKGJpdG1hcCksIGJpdG1hcC0+ZmlsZV9wYWdlcywgbnVtX3BhZ2VzLCBiaXRfY250KTsKIAorCXJldHVybiAwOworCisgZXJyOgorCXByaW50ayhLRVJOX0lORk8gIiVzOiBiaXRtYXAgaW5pdGlhbGlzYXRpb24gZmFpbGVkOiAlZFxuIiwKKwkgICAgICAgYm1uYW1lKGJpdG1hcCksIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTk3LDE5ICsxMDQwLDE4IEBACiAgKgkJCW91dCB0byBkaXNrCiAgKi8KIAotaW50IGJpdG1hcF9kYWVtb25fd29yayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApCit2b2lkIGJpdG1hcF9kYWVtb25fd29yayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApCiB7CiAJdW5zaWduZWQgbG9uZyBqOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMLCAqbGFzdHBhZ2UgPSBOVUxMOwotCWludCBlcnIgPSAwOwogCWludCBibG9ja3M7CiAJdm9pZCAqcGFkZHI7CiAKIAlpZiAoYml0bWFwID09IE5VTEwpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gKyBiaXRtYXAtPmRhZW1vbl9zbGVlcCpIWikpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAJYml0bWFwLT5kYWVtb25fbGFzdHJ1biA9IGppZmZpZXM7CiAKIAlmb3IgKGogPSAwOyBqIDwgYml0bWFwLT5jaHVua3M7IGorKykgewpAQCAtMTAzMiwxNCArMTA3NCw4IEBACiAJCQkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCQlpZiAobmVlZF93cml0ZSkgewotCQkJCQlzd2l0Y2ggKHdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKSkgewotCQkJCQljYXNlIDA6Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKLQkJCQkJfQotCQkJCX0KKwkJCQlpZiAobmVlZF93cml0ZSkKKwkJCQkJd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDApOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCkBAIC0xMDQ4LDEzICsxMDg0LDExIEBACiAJCQkJaWYgKHRlc3RfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSkpIHsKIAkJCQkJY2xlYXJfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQkJCQllcnIgPSB3cml0ZV9wYWdlKGJpdG1hcCwgbGFzdHBhZ2UsIDApOworCQkJCQl3cml0ZV9wYWdlKGJpdG1hcCwgbGFzdHBhZ2UsIDApOwogCQkJCX0gZWxzZSB7CiAJCQkJCXNldF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJCQkJfQotCQkJCWlmIChlcnIpCi0JCQkJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKIAkJCX0gZWxzZQogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQkJbGFzdHBhZ2UgPSBwYWdlOwpAQCAtMTA5NywxNCArMTEzMSwxMyBAQAogCQlpZiAodGVzdF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKSkgewogCQkJY2xlYXJfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCWVyciA9IHdyaXRlX3BhZ2UoYml0bWFwLCBsYXN0cGFnZSwgMCk7CisJCQl3cml0ZV9wYWdlKGJpdG1hcCwgbGFzdHBhZ2UsIDApOwogCQl9IGVsc2UgewogCQkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJCX0KIAl9CiAKLQlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgYml0bWFwX2NvdW50ZXJfdCAqYml0bWFwX2dldF9jb3VudGVyKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwKQEAgLTE1MTcsNyArMTU1MCw5IEBACiAKIAltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gYml0bWFwLT5kYWVtb25fc2xlZXAgKiBIWjsKIAotCXJldHVybiBiaXRtYXBfdXBkYXRlX3NiKGJpdG1hcCk7CisJYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOworCisJcmV0dXJuIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKSA/IC1FSU8gOiAwOwogCiAgZXJyb3I6CiAJYml0bWFwX2ZyZWUoYml0bWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCBmNGY3ZDM1Li44NDY2MTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0xNjEsOSArMTYxLDcgQEAKIHsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koX3Rpb19jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KF9pb19jYWNoZSk7Ci0KLQlpZiAodW5yZWdpc3Rlcl9ibGtkZXYoX21ham9yLCBfbmFtZSkgPCAwKQotCQlETUVSUigidW5yZWdpc3Rlcl9ibGtkZXYgZmFpbGVkIik7CisJdW5yZWdpc3Rlcl9ibGtkZXYoX21ham9yLCBfbmFtZSk7CiAKIAlfbWFqb3IgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggMzNiZWFhNy4uNjVkZGM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMTY0MCw3ICsxNjQwLDYgQEAKIAogc3RhdGljIHZvaWQgbWRfdXBkYXRlX3NiKG1kZGV2X3QgKiBtZGRldiwgaW50IGZvcmNlX2NoYW5nZSkKIHsKLQlpbnQgZXJyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2OwogCWludCBzeW5jX3JlcTsKQEAgLTE3MjcsNyArMTcyNiw3IEBACiAJCSJtZDogdXBkYXRpbmcgJXMgUkFJRCBzdXBlcmJsb2NrIG9uIGRldmljZSAoaW4gc3luYyAlZClcbiIsCiAJCW1kbmFtZShtZGRldiksbWRkZXYtPmluX3N5bmMpOwogCi0JZXJyID0gYml0bWFwX3VwZGF0ZV9zYihtZGRldi0+Yml0bWFwKTsKKwliaXRtYXBfdXBkYXRlX3NiKG1kZGV2LT5iaXRtYXApOwogCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHRtcCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCWRwcmludGsoS0VSTl9JTkZPICJtZDogIik7CkBAIC0yMDczLDkgKzIwNzIsMTEgQEAKIAkJZXJyID0gc3VwZXJfdHlwZXNbc3VwZXJfZm9ybWF0XS4KIAkJCWxvYWRfc3VwZXIocmRldiwgTlVMTCwgc3VwZXJfbWlub3IpOwogCQlpZiAoZXJyID09IC1FSU5WQUwpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJIm1kOiAlcyBoYXMgaW52YWxpZCBzYiwgbm90IGltcG9ydGluZyFcbiIsCi0JCQkJYmRldm5hbWUocmRldi0+YmRldixiKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIm1kOiAlcyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdiVkLiVkICIKKwkJCSAgICAgICAic3VwZXJibG9jaywgbm90IGltcG9ydGluZyFcbiIsCisJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwKKwkJCSAgICAgICBzdXBlcl9mb3JtYXQsIHN1cGVyX21pbm9yKTsKIAkJCWdvdG8gYWJvcnRfZnJlZTsKIAkJfQogCQlpZiAoZXJyIDwgMCkgewpAQCAtMzE3NCwxMyArMzE3NSwzMyBAQAogCSAqIERyb3AgYWxsIGNvbnRhaW5lciBkZXZpY2UgYnVmZmVycywgZnJvbSBub3cgb24KIAkgKiB0aGUgb25seSB2YWxpZCBleHRlcm5hbCBpbnRlcmZhY2UgaXMgdGhyb3VnaCB0aGUgbWQKIAkgKiBkZXZpY2UuCi0JICogQWxzbyBmaW5kIGxhcmdlc3QgaGFyZHNlY3RvciBzaXplCiAJICovCiAJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKSB7CiAJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQljb250aW51ZTsKIAkJc3luY19ibG9ja2RldihyZGV2LT5iZGV2KTsKIAkJaW52YWxpZGF0ZV9iZGV2KHJkZXYtPmJkZXYpOworCisJCS8qIHBlcmZvcm0gc29tZSBjb25zaXN0ZW5jeSB0ZXN0cyBvbiB0aGUgZGV2aWNlLgorCQkgKiBXZSBkb24ndCB3YW50IHRoZSBkYXRhIHRvIG92ZXJsYXAgdGhlIG1ldGFkYXRhLAorCQkgKiBJbnRlcm5hbCBCaXRtYXAgaXNzdWVzIGhhcyBoYW5kbGVkIGVsc2V3aGVyZS4KKwkJICovCisJCWlmIChyZGV2LT5kYXRhX29mZnNldCA8IHJkZXYtPnNiX29mZnNldCkgeworCQkJaWYgKG1kZGV2LT5zaXplICYmCisJCQkgICAgcmRldi0+ZGF0YV9vZmZzZXQgKyBtZGRldi0+c2l6ZSoyCisJCQkgICAgPiByZGV2LT5zYl9vZmZzZXQqMikgeworCQkJCXByaW50aygibWQ6ICVzOiBkYXRhIG92ZXJsYXBzIG1ldGFkYXRhXG4iLAorCQkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyZGV2LT5zYl9vZmZzZXQqMiArIHJkZXYtPnNiX3NpemUvNTEyCisJCQkgICAgPiByZGV2LT5kYXRhX29mZnNldCkgeworCQkJCXByaW50aygibWQ6ICVzOiBtZXRhZGF0YSBvdmVybGFwcyBkYXRhXG4iLAorCQkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQogCX0KIAogCW1kX3Byb2JlKG1kZGV2LT51bml0LCBOVUxMLCBOVUxMKTsKQEAgLTQ2NDIsNyArNDY2Myw2IEBACiAJICogbWFueSBkaXJ0eSBSQUlENSBibG9ja3MuCiAJICovCiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIApAQCAtNTA5MCw3ICs1MTEwLDcgQEAKIAltZGtfcmRldl90ICogcmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJaW50IGlkbGU7Ci0JdW5zaWduZWQgbG9uZyBjdXJyX2V2ZW50czsKKwlsb25nIGN1cnJfZXZlbnRzOwogCiAJaWRsZSA9IDE7CiAJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKSB7CkBAIC01MDk4LDIwICs1MTE4LDI5IEBACiAJCWN1cnJfZXZlbnRzID0gZGlza19zdGF0X3JlYWQoZGlzaywgc2VjdG9yc1swXSkgKyAKIAkJCQlkaXNrX3N0YXRfcmVhZChkaXNrLCBzZWN0b3JzWzFdKSAtIAogCQkJCWF0b21pY19yZWFkKCZkaXNrLT5zeW5jX2lvKTsKLQkJLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyX2V2ZW50cyBhbmQgbGFzdF9ldmVudHMKLQkJICogd2lsbCBiZSBhZmZlY3RlZCBieSBhbnkgbmV3IG5vbi1zeW5jIElPIChtYWtpbmcKLQkJICogY3Vycl9ldmVudHMgYmlnZ2VyKSBhbmQgYW55IGRpZmZlcmVuY2UgaW4gdGhlIGFtb3VudCBvZgotCQkgKiBpbi1mbGlnaHQgc3luY2lvIChtYWtpbmcgY3VycmVudF9ldmVudHMgYmlnZ2VyIG9yIHNtYWxsZXIpCi0JCSAqIFRoZSBhbW91bnQgaW4tZmxpZ2h0IGlzIGN1cnJlbnRseSBsaW1pdGVkIHRvCi0JCSAqIDMyKjY0SyBpbiByYWlkMS8xMCBhbmQgMjU2KlBBR0VfU0laRSBpbiByYWlkNS82Ci0JCSAqIHdoaWNoIGlzIGF0IG1vc3QgNDA5NiBzZWN0b3JzLgotCQkgKiBUaGVzZSBudW1iZXJzIGFyZSBmYWlybHkgZnJhZ2lsZSBhbmQgc2hvdWxkIGJlIG1hZGUKLQkJICogbW9yZSByb2J1c3QsIHByb2JhYmx5IGJ5IGVuZm9yY2luZyB0aGUKLQkJICogJ3dpbmRvdyBzaXplJyB0aGF0IG1kX2RvX3N5bmMgc29ydC1vZiB1c2VzLgorCQkvKiBzeW5jIElPIHdpbGwgY2F1c2Ugc3luY19pbyB0byBpbmNyZWFzZSBiZWZvcmUgdGhlIGRpc2tfc3RhdHMKKwkJICogYXMgc3luY19pbyBpcyBjb3VudGVkIHdoZW4gYSByZXF1ZXN0IHN0YXJ0cywgYW5kCisJCSAqIGRpc2tfc3RhdHMgaXMgY291bnRlZCB3aGVuIGl0IGNvbXBsZXRlcy4KKwkJICogU28gcmVzeW5jIGFjdGl2aXR5IHdpbGwgY2F1c2UgY3Vycl9ldmVudHMgdG8gYmUgc21hbGxlciB0aGFuCisJCSAqIHdoZW4gdGhlcmUgd2FzIG5vIHN1Y2ggYWN0aXZpdHkuCisJCSAqIG5vbi1zeW5jIElPIHdpbGwgY2F1c2UgZGlza19zdGF0IHRvIGluY3JlYXNlIHdpdGhvdXQKKwkJICogaW5jcmVhc2luZyBzeW5jX2lvIHNvIGN1cnJfZXZlbnRzIHdpbGwgKGV2ZW50dWFsbHkpCisJCSAqIGJlIGxhcmdlciB0aGFuIGl0IHdhcyBiZWZvcmUuICBPbmNlIGl0IGJlY29tZXMKKwkJICogc3Vic3RhbnRpYWxseSBsYXJnZXIsIHRoZSB0ZXN0IGJlbG93IHdpbGwgY2F1c2UKKwkJICogdGhlIGFycmF5IHRvIGFwcGVhciBub24taWRsZSwgYW5kIHJlc3luYyB3aWxsIHNsb3cKKwkJICogZG93bi4KKwkJICogSWYgdGhlcmUgaXMgYSBsb3Qgb2Ygb3V0c3RhbmRpbmcgcmVzeW5jIGFjdGl2aXR5IHdoZW4KKwkJICogd2Ugc2V0IGxhc3RfZXZlbnQgdG8gY3Vycl9ldmVudHMsIHRoZW4gYWxsIHRoYXQgYWN0aXZpdHkKKwkJICogY29tcGxldGluZyBtaWdodCBjYXVzZSB0aGUgYXJyYXkgdG8gYXBwZWFyIG5vbi1pZGxlCisJCSAqIGFuZCByZXN5bmMgd2lsbCBiZSBzbG93ZWQgZG93biBldmVuIHRob3VnaCB0aGVyZSBtaWdodAorCQkgKiBub3QgaGF2ZSBiZWVuIG5vbi1yZXN5bmMgYWN0aXZpdHkuICBUaGlzIHdpbGwgb25seQorCQkgKiBoYXBwZW4gb25jZSB0aG91Z2guICAnbGFzdF9ldmVudHMnIHdpbGwgc29vbiByZWZsZWN0CisJCSAqIHRoZSBzdGF0ZSB3aGVyZSB0aGVyZSBpcyBsaXR0bGUgb3Igbm8gb3V0c3RhbmRpbmcKKwkJICogcmVzeW5jIHJlcXVlc3RzLCBhbmQgZnVydGhlciByZXN5bmMgYWN0aXZpdHkgd2lsbAorCQkgKiBhbHdheXMgbWFrZSBjdXJyX2V2ZW50cyBsZXNzIHRoYW4gbGFzdF9ldmVudHMuCiAJCSAqCi0JCSAqIE5vdGU6IHRoZSBmb2xsb3dpbmcgaXMgYW4gdW5zaWduZWQgY29tcGFyaXNvbi4KIAkJICovCi0JCWlmICgobG9uZyljdXJyX2V2ZW50cyAtIChsb25nKXJkZXYtPmxhc3RfZXZlbnRzID4gNDA5NikgeworCQlpZiAoY3Vycl9ldmVudHMgLSByZGV2LT5sYXN0X2V2ZW50cyA+IDQwOTYpIHsKIAkJCXJkZXYtPmxhc3RfZXZlbnRzID0gY3Vycl9ldmVudHM7CiAJCQlpZGxlID0gMDsKIAkJfQpAQCAtNTc3Miw3ICs1ODAxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2X2NudDsgaSsrKSB7CiAJCWRldl90IGRldiA9IGRldGVjdGVkX2RldmljZXNbaV07CiAKLQkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LDAsIDApOworCQlyZGV2ID0gbWRfaW1wb3J0X2RldmljZShkZXYsMCwgOTApOwogCQlpZiAoSVNfRVJSKHJkZXYpKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCA0NjY3N2Q3Li4wMGM3OGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0xNTI2LDggKzE1MjYsNyBAQAogCQkJYmxrX3JlbW92ZV9wbHVnKG1kZGV2LT5xdWV1ZSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCQkJLyogZmx1c2ggYW55IHBlbmRpbmcgYml0bWFwIHdyaXRlcyB0byBkaXNrIGJlZm9yZSBwcm9jZWVkaW5nIHcvIEkvTyAqLwotCQkJaWYgKGJpdG1hcF91bnBsdWcobWRkZXYtPmJpdG1hcCkgIT0gMCkKLQkJCQlwcmludGsoIiVzOiBiaXRtYXAgZmlsZSB3cml0ZSBmYWlsZWQhXG4iLCBtZG5hbWUobWRkZXYpKTsKKwkJCWJpdG1hcF91bnBsdWcobWRkZXYtPmJpdG1hcCk7CiAKIAkJCXdoaWxlIChiaW8pIHsgLyogc3VibWl0IHBlbmRpbmcgd3JpdGVzICovCiAJCQkJc3RydWN0IGJpbyAqbmV4dCA9IGJpby0+YmlfbmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDllYjY2YzEuLmE5NWFkYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMTUxMCw4ICsxNTEwLDcgQEAKIAkJCWJsa19yZW1vdmVfcGx1ZyhtZGRldi0+cXVldWUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAkJCS8qIGZsdXNoIGFueSBwZW5kaW5nIGJpdG1hcCB3cml0ZXMgdG8gZGlzayBiZWZvcmUgcHJvY2VlZGluZyB3LyBJL08gKi8KLQkJCWlmIChiaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApICE9IDApCi0JCQkJcHJpbnRrKCIlczogYml0bWFwIGZpbGUgd3JpdGUgZmFpbGVkIVxuIiwgbWRuYW1lKG1kZGV2KSk7CisJCQliaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApOwogCiAJCQl3aGlsZSAoYmlvKSB7IC8qIHN1Ym1pdCBwZW5kaW5nIHdyaXRlcyAqLwogCQkJCXN0cnVjdCBiaW8gKm5leHQgPSBiaW8tPmJpX25leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGY0ZTRjYTIuLmI2YzdmNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC01MjMsNiArNTIzLDcgQEAKIAogCWR2Yl9mcm9udGVuZF9pbml0KGZlKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoMSkgewogCQl1cCgmZmVwcml2LT5zZW0pOwkgICAgLyogaXMgbG9ja2VkIHdoZW4gd2UgZW50ZXIgdGhlIHRocmVhZC4uLiAqLwogcmVzdGFydDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwppbmRleCAyNTllYTA4Li4xY2MyZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCkBAIC05MDYsNiArOTA2LDcgQEAKIAl1MzIgbW9kZSA9IDA7CiAKIAlkcHJpbnRrKCJjeDg4OiB0dmF1ZGlvIHRocmVhZCBzdGFydGVkXG4iKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKaW5kZXggZTE4MjFlYi4uZDVlZTI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTQ2OCw2ICs0NjksNyBAQAogCiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQwMCBkYWVtb24gc3RhcnRlZFxuIik7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgdGhyZWFkOiBzbGVlcFxuIik7CiAJCW1zcF9zbGVlcChzdGF0ZSwgLTEpOwpAQCAtNjQ2LDcgKzY0OCw3IEBACiAJaW50IHZhbCwgaSwgc3RkLCBjb3VudDsKIAogCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDEwIGRhZW1vbiBzdGFydGVkXG4iKTsKLQorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDEwIHRocmVhZDogc2xlZXBcbiIpOwogCQltc3Bfc2xlZXAoc3RhdGUsLTEpOwpAQCAtOTQwLDcgKzk0Miw3IEBACiAJaW50IHZhbCwgaTsKIAogCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyBkYWVtb24gc3RhcnRlZFxuIik7Ci0KKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzR4eGcgdGhyZWFkOiBzbGVlcFxuIik7CiAJCW1zcF9zbGVlcChzdGF0ZSwgLTEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwppbmRleCBjOWJmOWRiLi45ZGEzMzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJc3RydWN0IENISVBERVNDICAqZGVzYyA9IGNoaXBsaXN0ICsgY2hpcC0+dHlwZTsKIAogCXY0bF9kYmcoMSwgZGVidWcsICZjaGlwLT5jLCAiJXM6IHRocmVhZCBzdGFydGVkXG4iLCBjaGlwLT5jLm5hbWUpOwotCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jCmluZGV4IGZjYzU0NjcuLmU2MTc5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJaW50IGVycjsKIAogCWRwcmludGsoImR2YiB0aHJlYWQgc3RhcnRlZFxuIik7CisJc2V0X2ZyZWV6YWJsZSgpOwogCXZpZGVvYnVmX3JlYWRfc3RhcnQoJmR2Yi0+ZHZicSk7CiAKIAlmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCmluZGV4IGY3ZTFkMTkuLjNlZjRkMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCkBAIC01NzMsNiArNTczLDcgQEAKIAlkcHJpbnRrKDEsInRocmVhZCBzdGFydGVkXG4iKTsKIAogCW1vZF90aW1lcigmZG1hX3EtPnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOworCXNldF9mcmVlemFibGUoKTsKIAogCWZvciAoOzspIHsKIAkJdml2aV9zbGVlcChkbWFfcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcKaW5kZXggZjRhYzIxZS4uNWFmYTBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZwpAQCAtMSw5ICsxLDYgQEAKIAotbWVudSAiSTJPIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJCi0KLWNvbmZpZyBJMk8KLQl0cmlzdGF0ZSAiSTJPIHN1cHBvcnQiCittZW51Y29uZmlnIEkyTworCXRyaXN0YXRlICJJMk8gZGV2aWNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAktLS1oZWxwLS0tCiAJICBUaGUgSW50ZWxsaWdlbnQgSW5wdXQvT3V0cHV0IChJMk8pIGFyY2hpdGVjdHVyZSBhbGxvd3MgaGFyZHdhcmUKQEAgLTI1LDkgKzIyLDEwIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2lmIEkyTworCiBjb25maWcgSTJPX0xDVF9OT1RJRllfT05fQ0hBTkdFUwogCWJvb2wgIkVuYWJsZSBMQ1Qgbm90aWZpY2F0aW9uIgotCWRlcGVuZHMgb24gSTJPCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgT25seSBzYXkgTiBoZXJlIGlmIHlvdSBoYXZlIGEgSTJPIGNvbnRyb2xsZXIgZnJvbSBTVU4uIFRoZSBTVU4KQEAgLTM5LDcgKzM3LDYgQEAKIAogY29uZmlnIEkyT19FWFRfQURBUFRFQwogCWJvb2wgIkVuYWJsZSBBZGFwdGVjIGV4dGVuc2lvbnMiCi0JZGVwZW5kcyBvbiBJMk8KIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBmb3Igc3VwcG9ydCBvZiByYWlkdXRpbHMgZm9yIEFkYXB0ZWMgSTJPIGNvbnRyb2xsZXJzLiBZb3UgYWxzbwpAQCAtNTcsNyArNTQsNyBAQAogCiBjb25maWcgSTJPX0NPTkZJRwogCXRyaXN0YXRlICJJMk8gQ29uZmlndXJhdGlvbiBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJPCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGZvciBzdXBwb3J0IG9mIHRoZSBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIEkyTyBhZGFwdGVycy4KIAkgIElmIHlvdSBoYXZlIGEgUkFJRCBjb250cm9sbGVyIGZyb20gQWRhcHRlYyBhbmQgeW91IHdhbnQgdG8gdXNlIHRoZQpAQCAtNzgsNyArNzUsNiBAQAogCiBjb25maWcgSTJPX0JVUwogCXRyaXN0YXRlICJJMk8gQnVzIEFkYXB0ZXIgT1NNIgotCWRlcGVuZHMgb24gSTJPCiAJLS0taGVscC0tLQogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgSTJPIEJ1cyBBZGFwdGVyIE9TTS4gVGhlIEJ1cyBBZGFwdGVyIE9TTQogCSAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBidXNzZXMgb24gdGhlIEkyTyBjb250cm9sbGVyLiBUaGUgbWFpbiBwdXJwb3NlCkBAIC04OSw3ICs4NSw3IEBACiAKIGNvbmZpZyBJMk9fQkxPQ0sKIAl0cmlzdGF0ZSAiSTJPIEJsb2NrIE9TTSIKLQlkZXBlbmRzIG9uIEkyTyAmJiBCTE9DSworCWRlcGVuZHMgb24gQkxPQ0sKIAktLS1oZWxwLS0tCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBJMk8gQmxvY2sgT1NNLiBUaGUgQmxvY2sgT1NNIHByZXNlbnRzIGRpc2sKIAkgIGFuZCBvdGhlciBzdHJ1Y3R1cmVkIGJsb2NrIGRldmljZXMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIElmIHlvdQpAQCAtMTAyLDcgKzk4LDcgQEAKIAogY29uZmlnIEkyT19TQ1NJCiAJdHJpc3RhdGUgIkkyTyBTQ1NJIE9TTSIKLQlkZXBlbmRzIG9uIEkyTyAmJiBTQ1NJCisJZGVwZW5kcyBvbiBTQ1NJCiAJLS0taGVscC0tLQogCSAgQWxsb3dzIGRpcmVjdCBTQ1NJIGFjY2VzcyB0byBTQ1NJIGRldmljZXMgb24gYSBTQ1NJIG9yIEZpYnJlQ2hhbm5lbAogCSAgSTJPIGNvbnRyb2xsZXIuIFlvdSBjYW4gdXNlIGJvdGggdGhlIFNDU0kgYW5kIEJsb2NrIE9TTSB0b2dldGhlciBpZgpAQCAtMTE0LDcgKzExMCw2IEBACiAKIGNvbmZpZyBJMk9fUFJPQwogCXRyaXN0YXRlICJJMk8gL3Byb2Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyTwogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCB0byAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIsIHlvdSB3aWxsIGJlCiAJICBhYmxlIHRvIHJlYWQgSTJPIHJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgdmlydHVhbCBkaXJlY3RvcnkKQEAgLTEyMyw1ICsxMTgsNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGkyb19wcm9jLgogCi1lbmRtZW51Ci0KK2VuZGlmICMgSTJPCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMKaW5kZXggOGFiZTQ1ZS4uY2U2MmQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYwpAQCAtMjQsNyArMjQsNyBAQAogCWlmIChjbWQgPT0gSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUikKIAkJcmV0dXJuOwkJLy8gTm8gc3RhdHVzIGluIHRoaXMgcmVwbHkKIAotCXByaW50ayhLRVJOX0RFQlVHICIlcyVzOiAiLCBzZXZlcml0eSwgc3RyKTsKKwlwcmludGsoIiVzJXM6ICIsIHNldmVyaXR5LCBzdHIpOwogCiAJaWYgKGNtZCA8IDB4MUYpCQkvLyBVdGlsaXR5IGNtZAogCQlpMm9fcmVwb3J0X3V0aWxfY21kKGNtZCk7CkBAIC0zMiw3ICszMiw3IEBACiAJZWxzZSBpZiAoY21kID49IDB4QTAgJiYgY21kIDw9IDB4RUYpCS8vIEV4ZWN1dGl2ZSBjbWQKIAkJaTJvX3JlcG9ydF9leGVjX2NtZChjbWQpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOwkvLyBPdGhlciBjbWRzCisJCXByaW50aygiQ21kID0gJTAjMngsICIsIGNtZCk7CS8vIE90aGVyIGNtZHMKIAogCWlmIChtc2dbMF0gJiBNU0dfRkFJTCkgewogCQlpMm9fcmVwb3J0X2ZhaWxfc3RhdHVzKHJlcV9zdGF0dXMsIG1zZyk7CkBAIC00NCw3ICs0NCw3IEBACiAJaWYgKGNtZCA8IDB4MUYgfHwgKGNtZCA+PSAweEEwICYmIGNtZCA8PSAweEVGKSkKIAkJaTJvX3JlcG9ydF9jb21tb25fZHNjKGRldGFpbGVkX3N0YXR1cyk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiIC8gRGV0YWlsZWRTdGF0dXMgPSAlMCM0eC5cbiIsCisJCXByaW50aygiIC8gRGV0YWlsZWRTdGF0dXMgPSAlMCM0eC5cbiIsCiAJCSAgICAgICBkZXRhaWxlZF9zdGF0dXMpOwogfQogCkBAIC04OSwxMCArODksMTAgQEAKIAl9OwogCiAJaWYgKHJlcV9zdGF0dXMgPT0gSTJPX0ZTQ19UUkFOU1BPUlRfVU5LTk9XTl9GQUlMVVJFKQotCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNQT1JUX1VOS05PV05fRkFJTFVSRSAoJTAjMngpLlxuIiwKKwkJcHJpbnRrKCJUUkFOU1BPUlRfVU5LTk9XTl9GQUlMVVJFICglMCMyeCkuXG4iLAogCQkgICAgICAgcmVxX3N0YXR1cyk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNQT1JUXyVzLlxuIiwKKwkJcHJpbnRrKCJUUkFOU1BPUlRfJXMuXG4iLAogCQkgICAgICAgRkFJTF9TVEFUVVNbcmVxX3N0YXR1cyAmIDB4MEZdKTsKIAogCS8qIER1bXAgc29tZSBkZXRhaWxzICovCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlwcmludGsoS0VSTl9FUlIgIiAgRmFpbGluZ0hvc3RVbml0ID0gMHglMDRYLCAgRmFpbGluZ0lPUCA9IDB4JTAzWFxuIiwKIAkgICAgICAgbXNnWzVdID4+IDE2LCBtc2dbNV0gJiAweEZGRik7CiAKLQlwcmludGsoS0VSTl9FUlIgIiAgU2V2ZXJpdHk6ICAweCUwMlggIiwgKG1zZ1s0XSA+PiAxNikgJiAweEZGKTsKKwlwcmludGsoS0VSTl9FUlIgIiAgU2V2ZXJpdHk6ICAweCUwMlhcbiIsIChtc2dbNF0gPj4gMTYpICYgMHhGRik7CiAJaWYgKG1zZ1s0XSAmICgxIDw8IDE2KSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIihGb3JtYXRFcnJvciksICIKIAkJICAgICAgICJ0aGlzIG1zZyBjYW4gbmV2ZXIgYmUgZGVsaXZlcmVkL3Byb2Nlc3NlZC5cbiIpOwpAQCAtMTQyLDkgKzE0Miw5IEBACiAJfTsKIAogCWlmIChyZXFfc3RhdHVzID49IEFSUkFZX1NJWkUoUkVQTFlfU1RBVFVTKSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlJlcXVlc3RTdGF0dXMgPSAlMCMyeCIsIHJlcV9zdGF0dXMpOworCQlwcmludGsoIlJlcXVlc3RTdGF0dXMgPSAlMCMyeCIsIHJlcV9zdGF0dXMpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgUkVQTFlfU1RBVFVTW3JlcV9zdGF0dXNdKTsKKwkJcHJpbnRrKCIlcyIsIFJFUExZX1NUQVRVU1tyZXFfc3RhdHVzXSk7CiB9CiAKIC8qCkBAIC0xODcsMTAgKzE4NywxMCBAQAogCX07CiAKIAlpZiAoZGV0YWlsZWRfc3RhdHVzID4gSTJPX0RTQ19ERVZJQ0VfTk9UX0FWQUlMQUJMRSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAorCQlwcmludGsoIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAogCQkgICAgICAgZGV0YWlsZWRfc3RhdHVzKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICIgLyAlcy5cbiIsIENPTU1PTl9EU0NbZGV0YWlsZWRfc3RhdHVzXSk7CisJCXByaW50aygiIC8gJXMuXG4iLCBDT01NT05fRFNDW2RldGFpbGVkX3N0YXR1c10pOwogfQogCiAvKgpAQCAtMjAwLDQ5ICsyMDAsNDkgQEAKIHsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSTJPX0NNRF9VVElMX05PUDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfTk9QLCAiKTsKKwkJcHJpbnRrKCJVVElMX05PUCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0FCT1JUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9BQk9SVCwgIik7CisJCXByaW50aygiVVRJTF9BQk9SVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0NMQUlNOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9DTEFJTSwgIik7CisJCXByaW50aygiVVRJTF9DTEFJTSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0NMQUlNX1JFTEVBU0UsICIpOworCQlwcmludGsoIlVUSUxfQ0xBSU1fUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0NPTkZJR19ESUFMT0c6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0NPTkZJR19ESUFMT0csICIpOworCQlwcmludGsoIlVUSUxfQ09ORklHX0RJQUxPRywgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0RFVklDRV9SRVNFUlZFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9ERVZJQ0VfUkVTRVJWRSwgIik7CisJCXByaW50aygiVVRJTF9ERVZJQ0VfUkVTRVJWRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0RFVklDRV9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9ERVZJQ0VfUkVMRUFTRSwgIik7CisJCXByaW50aygiVVRJTF9ERVZJQ0VfUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0VWVF9BQ0s6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0VWRU5UX0FDS05PV0xFREdFLCAiKTsKKwkJcHJpbnRrKCJVVElMX0VWRU5UX0FDS05PV0xFREdFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9FVkVOVF9SRUdJU1RFUiwgIik7CisJCXByaW50aygiVVRJTF9FVkVOVF9SRUdJU1RFUiwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0xPQ0s6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0xPQ0ssICIpOworCQlwcmludGsoIlVUSUxfTE9DSywgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0xPQ0tfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfTE9DS19SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJVVElMX0xPQ0tfUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX1BBUkFNU19HRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX1BBUkFNU19HRVQsICIpOworCQlwcmludGsoIlVUSUxfUEFSQU1TX0dFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX1BBUkFNU19TRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX1BBUkFNU19TRVQsICIpOworCQlwcmludGsoIlVUSUxfUEFSQU1TX1NFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX1JFUExZX0ZBVUxUX05PVElGWToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfUkVQTFlfRkFVTFRfTk9USUZZLCAiKTsKKwkJcHJpbnRrKCJVVElMX1JFUExZX0ZBVUxUX05PVElGWSwgIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJDbWQgPSAlMCMyeCwgIiwgY21kKTsKKwkJcHJpbnRrKCJDbWQgPSAlMCMyeCwgIiwgY21kKTsKIAl9CiB9CiAKQEAgLTI1MywxMDYgKzI1MywxMDYgQEAKIHsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSTJPX0NNRF9BREFQVEVSX0FTU0lHTjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9BU1NJR04sICIpOworCQlwcmludGsoIkVYRUNfQURBUFRFUl9BU1NJR04sICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQURBUFRFUl9SRUFEOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19BREFQVEVSX1JFQUQsICIpOworCQlwcmludGsoIkVYRUNfQURBUFRFUl9SRUFELCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0FEQVBURVJfUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9CSU9TX0lORk9fU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19CSU9TX0lORk9fU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0JJT1NfSU5GT19TRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQk9PVF9ERVZJQ0VfU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19CT09UX0RFVklDRV9TRVQsICIpOworCQlwcmludGsoIkVYRUNfQk9PVF9ERVZJQ0VfU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0NPTkZJR19WQUxJREFURToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQ09ORklHX1ZBTElEQVRFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0NPTkZJR19WQUxJREFURSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9DT05OX1NFVFVQOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19DT05OX1NFVFVQLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0NPTk5fU0VUVVAsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfRERNX0RFU1RST1k6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9ERVNUUk9ZLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9ERVNUUk9ZLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9FTkFCTEU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9FTkFCTEUsICIpOworCQlwcmludGsoIkVYRUNfRERNX0VOQUJMRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fUVVJRVNDRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1FVSUVTQ0UsICIpOworCQlwcmludGsoIkVYRUNfRERNX1FVSUVTQ0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfRERNX1JFU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fUkVTRVQsICIpOworCQlwcmludGsoIkVYRUNfRERNX1JFU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9TVVNQRU5EOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fU1VTUEVORCwgIik7CisJCXByaW50aygiRVhFQ19ERE1fU1VTUEVORCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERVZJQ0VfQVNTSUdOOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERVZJQ0VfQVNTSUdOLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RFVklDRV9BU1NJR04sICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfREVWSUNFX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RFVklDRV9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RFVklDRV9SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0hSVF9HRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0hSVF9HRVQsICIpOworCQlwcmludGsoIkVYRUNfSFJUX0dFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX0NMRUFSOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19JT1BfQ0xFQVIsICIpOworCQlwcmludGsoIkVYRUNfSU9QX0NMRUFSLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfQ09OTkVDVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX0NPTk5FQ1QsICIpOworCQlwcmludGsoIkVYRUNfSU9QX0NPTk5FQ1QsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQURBUFRFUl9SRVNFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX1JFU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0lPUF9SRVNFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9MQ1RfTk9USUZZOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19MQ1RfTk9USUZZLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0xDVF9OT1RJRlksICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfT1VUQk9VTkRfSU5JVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfT1VUQk9VTkRfSU5JVCwgIik7CisJCXByaW50aygiRVhFQ19PVVRCT1VORF9JTklULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1BBVEhfRU5BQkxFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX0VOQUJMRSwgIik7CisJCXByaW50aygiRVhFQ19QQVRIX0VOQUJMRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9QQVRIX1FVSUVTQ0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1BBVEhfUVVJRVNDRSwgIik7CisJCXByaW50aygiRVhFQ19QQVRIX1FVSUVTQ0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfUEFUSF9SRVNFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfUEFUSF9SRVNFVCwgIik7CisJCXByaW50aygiRVhFQ19QQVRIX1JFU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NUQVRJQ19NRl9DUkVBVEU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRJQ19NRl9DUkVBVEUsICIpOworCQlwcmludGsoIkVYRUNfU1RBVElDX01GX0NSRUFURSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TVEFUSUNfTUZfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1RBVElDX01GX1JFTEVBU0UsICIpOworCQlwcmludGsoIkVYRUNfU1RBVElDX01GX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1RBVFVTX0dFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1RBVFVTX0dFVCwgIik7CisJCXByaW50aygiRVhFQ19TVEFUVVNfR0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NXX0RPV05MT0FEOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TV19ET1dOTE9BRCwgIik7CisJCXByaW50aygiRVhFQ19TV19ET1dOTE9BRCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TV19VUExPQUQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NXX1VQTE9BRCwgIik7CisJCXByaW50aygiRVhFQ19TV19VUExPQUQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1dfUkVNT1ZFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TV19SRU1PVkUsICIpOworCQlwcmludGsoIkVYRUNfU1dfUkVNT1ZFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NZU19FTkFCTEU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19FTkFCTEUsICIpOworCQlwcmludGsoIkVYRUNfU1lTX0VOQUJMRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TWVNfTU9ESUZZOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfTU9ESUZZLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NZU19NT0RJRlksICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1lTX1FVSUVTQ0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19RVUlFU0NFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NZU19RVUlFU0NFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NZU19UQUJfU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfVEFCX1NFVCwgIik7CisJCXByaW50aygiRVhFQ19TWVNfVEFCX1NFVCwgIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJDbWQgPSAlIzAyeCwgIiwgY21kKTsKKwkJcHJpbnRrKCJDbWQgPSAlIzAyeCwgIiwgY21kKTsKIAl9CiB9CiAKQEAgLTM2MSwyOCArMzYxLDI4IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXRlID0gIiwgYy0+bmFtZSk7CiAJc3dpdGNoICgoKGkyb19zdGF0dXNfYmxvY2sgKikgYy0+c3RhdHVzX2Jsb2NrLnZpcnQpLT5pb3Bfc3RhdGUpIHsKIAljYXNlIDB4MDE6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJJTklUXG4iKTsKKwkJcHJpbnRrKCJJTklUXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDAyOgotCQlwcmludGsoS0VSTl9ERUJVRyAiUkVTRVRcbiIpOworCQlwcmludGsoIlJFU0VUXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiSE9MRFxuIik7CisJCXByaW50aygiSE9MRFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwNToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlJFQURZXG4iKTsKKwkJcHJpbnRrKCJSRUFEWVxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwODoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIk9QRVJBVElPTkFMXG4iKTsKKwkJcHJpbnRrKCJPUEVSQVRJT05BTFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgxMDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkZBSUxFRFxuIik7CisJCXByaW50aygiRkFJTEVEXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDExOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRkFVTFRFRFxuIik7CisJCXByaW50aygiRkFVTFRFRFxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICIleCAodW5rbm93biAhISlcbiIsCisJCXByaW50aygiJXggKHVua25vd24gISEpXG4iLAogCQkgICAgICAgKChpMm9fc3RhdHVzX2Jsb2NrICopIGMtPnN0YXR1c19ibG9jay52aXJ0KS0+aW9wX3N0YXRlKTsKIAl9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKaW5kZXggNjExYWRjMy4uNDg5ZDdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCkBAIC02Miw3ICs2Miw3IEBACiB7CiAJaW50IHJjID0gMDsKIAotCWRvd24oJmRldi0+bG9jayk7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAogCXJjID0gaTJvX2RldmljZV9pc3N1ZV9jbGFpbShkZXYsIEkyT19DTURfVVRJTF9DTEFJTSwgSTJPX0NMQUlNX1BSSU1BUlkpOwogCWlmICghcmMpCkBAIC03Miw3ICs3Miw3IEBACiAJCXByX2RlYnVnKCJpMm86IGNsYWltIG9mIGRldmljZSAlZCBmYWlsZWQgJWRcbiIsCiAJCQkgZGV2LT5sY3RfZGF0YS50aWQsIHJjKTsKIAotCXVwKCZkZXYtPmxvY2spOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTk2LDcgKzk2LDcgQEAKIAlpbnQgdHJpZXM7CiAJaW50IHJjID0gMDsKIAotCWRvd24oJmRldi0+bG9jayk7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAogCS8qCiAJICogICAgICBJZiB0aGUgY29udHJvbGxlciB0YWtlcyBhIG5vbmJsb2NraW5nIGFwcHJvYWNoIHRvCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJcHJfZGVidWcoImkybzogY2xhaW0gcmVsZWFzZSBvZiBkZXZpY2UgJWQgZmFpbGVkICVkXG4iLAogCQkJIGRldi0+bGN0X2RhdGEudGlkLCByYyk7CiAKLQl1cCgmZGV2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xOTgsNyArMTk4LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5saXN0KTsKLQlpbml0X01VVEVYKCZkZXYtPmxvY2spOworCW11dGV4X2luaXQoJmRldi0+bG9jayk7CiAKIAlkZXYtPmRldmljZS5idXMgPSAmaTJvX2J1c190eXBlOwogCWRldi0+ZGV2aWNlLnJlbGVhc2UgPSAmaTJvX2RldmljZV9yZWxlYXNlOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAJdTE2IHRhYmxlX3NpemU7CiAJdTMyIGJ1ZjsKIAotCWRvd24oJmMtPmxjdF9sb2NrKTsKKwltdXRleF9sb2NrKCZjLT5sY3RfbG9jayk7CiAKIAlrZnJlZShjLT5sY3QpOwogCkBAIC0zMzUsNyArMzM1LDcgQEAKIAogCWxjdCA9IGMtPmxjdCA9IGttYWxsb2ModGFibGVfc2l6ZSAqIDQsIEdGUF9LRVJORUwpOwogCWlmICghbGN0KSB7Ci0JCXVwKCZjLT5sY3RfbG9jayk7CisJCW11dGV4X3VubG9jaygmYy0+bGN0X2xvY2spOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQwOCw3ICs0MDgsNyBAQAogCQkJaTJvX2RldmljZV9yZW1vdmUoZGV2KTsKIAl9CiAKLQl1cCgmYy0+bGN0X2xvY2spOworCW11dGV4X3VubG9jaygmYy0+bGN0X2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKaW5kZXggNTI3OGFhZC4uOGM4M2VlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwpAQCAtMTMxLDggKzEzMSwxMCBAQAogCWludCByYyA9IDA7CiAKIAl3YWl0ID0gaTJvX2V4ZWNfd2FpdF9hbGxvYygpOwotCWlmICghd2FpdCkKKwlpZiAoIXdhaXQpIHsKKwkJaTJvX21zZ19ub3AoYywgbXNnKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJaWYgKHRjbnR4dCA9PSAweGZmZmZmZmZmKQogCQl0Y250eHQgPSAweDgwMDAwMDAwOwpAQCAtMzM3LDYgKzMzOSw4IEBACiAJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJvZHVjdF9pZCk7CiAJaWYgKHJjKSBnb3RvIGVycl92aWQ7CiAKKwlpMm9fZGV2LT5pb3AtPmV4ZWMgPSBpMm9fZGV2OworCiAJcmV0dXJuIDA7CiAKIGVycl92aWQ6CkBAIC01MzcsNyArNTQxLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CiAKLQlkb3duKCZjLT5sY3RfbG9jayk7CisJbXV0ZXhfbG9jaygmYy0+bGN0X2xvY2spOwogCiAJZGV2ID0gJmMtPnBkZXYtPmRldjsKIApAQCAtNTYxLDcgKzU2NSw3IEBACiAKIAlpMm9fbXNnX3Bvc3QoYywgbXNnKTsKIAotCXVwKCZjLT5sY3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjLT5sY3RfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwppbmRleCBiMTdjNGIyLi42NGE1MmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCXN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnOwogCiAJbXNnID0gaTJvX21zZ19nZXRfd2FpdChkZXYtPmlvcCwgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwotCWlmIChJU19FUlIobXNnKSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJaWYgKElTX0VSUihtc2cpKQogCQlyZXR1cm4gUFRSX0VSUihtc2cpOwogCiAJbXNnLT51LmhlYWRbMF0gPSBjcHVfdG9fbGUzMihGSVZFX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwppbmRleCA4YmEyNzVhLi44NGUwNDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwpAQCAtNTU0LDggKzU1NCw2IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JbXNnID0gaTJvX21zZ19nZXRfd2FpdChjLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7Ci0KIAlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OwogCiAJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKQEAgLTU3MywyNCArNTcxLDMwIEBACiAKIAlzaXplIDw8PSAyOwkJLy8gQ29udmVydCB0byBieXRlcwogCisJbXNnID0gaTJvX21zZ19nZXRfd2FpdChjLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKElTX0VSUihtc2cpKQorCQlyZXR1cm4gUFRSX0VSUihtc2cpOworCisJcmNvZGUgPSAtRUZBVUxUOwogCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwogCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkgewogCQlvc21fd2FybigidW5hYmxlIHRvIGNvcHkgdXNlciBtZXNzYWdlXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCX0KIAlpMm9fZHVtcF9tZXNzYWdlKG1zZyk7CiAKIAlpZiAoZ2V0X3VzZXIocmVwbHlfc2l6ZSwgJnVzZXJfcmVwbHlbMF0pIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCiAJcmVwbHlfc2l6ZSA+Pj0gMTY7CiAJcmVwbHlfc2l6ZSA8PD0gMjsKIAorCXJjb2RlID0gLUVOT01FTTsKIAlyZXBseSA9IGt6YWxsb2MocmVwbHlfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZXBseSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IGJ1ZmZlclxuIiwKIAkJICAgICAgIGMtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQogCiAJc2dfb2Zmc2V0ID0gKG1zZy0+dS5oZWFkWzBdID4+IDQpICYgMHgwZjsKQEAgLTY2MSwxMyArNjY1LDE0IEBACiAJfQogCiAJcmNvZGUgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtc2csIDYwKTsKKwltc2cgPSBOVUxMOwogCWlmIChyY29kZSkgewogCQlyZXBseVs0XSA9ICgodTMyKSByY29kZSkgPDwgMjQ7CiAJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCX0KIAogCWlmIChzZ19vZmZzZXQpIHsKLQkJdTMyIG1zZ1tJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkVdOworCQl1MzIgcm1zZ1tJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkVdOwogCQkvKiBDb3B5IGJhY2sgdGhlIFNjYXR0ZXIgR2F0aGVyIGJ1ZmZlcnMgYmFjayB0byB1c2VyIHNwYWNlICovCiAJCXUzMiBqOwogCQkvLyBUT0RPIDY0Yml0IGZpeApAQCAtNjc1LDcgKzY4MCw3IEBACiAJCWludCBzZ19zaXplOwogCiAJCS8vIHJlLWFjcXVpcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgc2cgY29weSBvcGVyYXRpb24KLQkJbWVtc2V0KCZtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOworCQltZW1zZXQoJnJtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOwogCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzCiAJCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CkBAIC02ODQsNyArNjg5LDcgQEAKIAkJc2l6ZSA9IHNpemUgPj4gMTY7CiAJCXNpemUgKj0gNDsKIAkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIocm1zZywgdXNlcl9tc2csIHNpemUpKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CiAJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQpAQCAtNjkyLDcgKzY5Nyw3IEBACiAJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CiAKIAkJLy8gVE9ETyA2NGJpdCBmaXgKLQkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKG1zZyArIHNnX29mZnNldCk7CisJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShybXNnICsgc2dfb2Zmc2V0KTsKIAkJZm9yIChqID0gMDsgaiA8IHNnX2NvdW50OyBqKyspIHsKIAkJCS8qIENvcHkgb3V0IHRoZSBTRyBsaXN0IHRvIHVzZXIncyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCiAJCQlpZiAoIQpAQCAtNzE0LDcgKzcxOSw3IEBACiAJCX0KIAl9CiAKLSAgICAgIHNnX2xpc3RfY2xlYW51cDoKK3NnX2xpc3RfY2xlYW51cDoKIAkvKiBDb3B5IGJhY2sgdGhlIHJlcGx5IHRvIHVzZXIgc3BhY2UgKi8KIAlpZiAocmVwbHlfc2l6ZSkgewogCQkvLyB3ZSB3cm90ZSBvdXIgb3duIHZhbHVlcyBmb3IgY29udGV4dCAtIG5vdyByZXN0b3JlIHRoZSB1c2VyIHN1cHBsaWVkIG9uZXMKQEAgLTcyMyw3ICs3MjgsNiBAQAogCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgbWVzc2FnZSBjb250ZXh0IEZST00gdXNlclxuIiwKIAkJCSAgICAgICBjLT5uYW1lKTsKIAkJCXJjb2RlID0gLUVGQVVMVDsKLQkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQl9CiAJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9yZXBseSwgcmVwbHksIHJlcGx5X3NpemUpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCkBAIC03MzEsMTIgKzczNSwxNCBAQAogCQkJcmNvZGUgPSAtRUZBVUxUOwogCQl9CiAJfQotCiAJZm9yIChpID0gMDsgaSA8IHNnX2luZGV4OyBpKyspCiAJCWkyb19kbWFfZnJlZSgmYy0+cGRldi0+ZGV2LCAmc2dfbGlzdFtpXSk7CiAKLSAgICAgIGNsZWFudXA6CitjbGVhbnVwOgogCWtmcmVlKHJlcGx5KTsKK291dDoKKwlpZiAobXNnKQorCQlpMm9fbXNnX25vcChjLCBtc2cpOwogCXJldHVybiByY29kZTsKIH0KIApAQCAtNzkzLDggKzc5OSw2IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JbXNnID0gaTJvX21zZ19nZXRfd2FpdChjLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7Ci0KIAlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OwogCiAJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpCkBAIC04MTAsMTIgKzgxNCwxNyBAQAogCiAJc2l6ZSA8PD0gMjsJCS8vIENvbnZlcnQgdG8gYnl0ZXMKIAorCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChJU19FUlIobXNnKSkKKwkJcmV0dXJuIFBUUl9FUlIobXNnKTsKKworCXJjb2RlID0gLUVGQVVMVDsKIAkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKIAogCWlmIChnZXRfdXNlcihyZXBseV9zaXplLCAmdXNlcl9yZXBseVswXSkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAKIAlyZXBseV9zaXplID4+PSAxNjsKIAlyZXBseV9zaXplIDw8PSAyOwpAQCAtODI0LDcgKzgzMyw4IEBACiAJaWYgKCFyZXBseSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IGJ1ZmZlclxuIiwKIAkJICAgICAgIGMtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmNvZGUgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKIAl9CiAKIAlzZ19vZmZzZXQgPSAobXNnLT51LmhlYWRbMF0gPj4gNCkgJiAweDBmOwpAQCAtODkxLDEzICs5MDEsMTQgQEAKIAl9CiAKIAlyY29kZSA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG1zZywgNjApOworCW1zZyA9IE5VTEw7CiAJaWYgKHJjb2RlKSB7CiAJCXJlcGx5WzRdID0gKCh1MzIpIHJjb2RlKSA8PCAyNDsKIAkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJfQogCiAJaWYgKHNnX29mZnNldCkgewotCQl1MzIgbXNnWzEyOF07CisJCXUzMiBybXNnWzEyOF07CiAJCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KIAkJdTMyIGo7CiAJCS8vIFRPRE8gNjRiaXQgZml4CkBAIC05MDUsNyArOTE2LDcgQEAKIAkJaW50IHNnX3NpemU7CiAKIAkJLy8gcmUtYWNxdWlyZSB0aGUgb3JpZ2luYWwgbWVzc2FnZSB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSBzZyBjb3B5IG9wZXJhdGlvbgotCQltZW1zZXQoJm1zZywgMCwgSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFICogNCk7CisJCW1lbXNldCgmcm1zZywgMCwgSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFICogNCk7CiAJCS8vIGdldCB1c2VyIG1zZyBzaXplIGluIHUzMnMKIAkJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKQEAgLTkxNCw3ICs5MjUsNyBAQAogCQlzaXplID0gc2l6ZSA+PiAxNjsKIAkJc2l6ZSAqPSA0OwogCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihybXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKIAkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQl9CkBAIC05MjIsNyArOTMzLDcgQEAKIAkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKIAogCQkvLyBUT0RPIDY0Yml0IGZpeAotCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikobXNnICsgc2dfb2Zmc2V0KTsKKwkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKHJtc2cgKyBzZ19vZmZzZXQpOwogCQlmb3IgKGogPSAwOyBqIDwgc2dfY291bnQ7IGorKykgewogCQkJLyogQ29weSBvdXQgdGhlIFNHIGxpc3QgdG8gdXNlcidzIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KIAkJCWlmICghCkBAIC05NDQsNyArOTU1LDcgQEAKIAkJfQogCX0KIAotICAgICAgc2dfbGlzdF9jbGVhbnVwOgorc2dfbGlzdF9jbGVhbnVwOgogCS8qIENvcHkgYmFjayB0aGUgcmVwbHkgdG8gdXNlciBzcGFjZSAqLwogCWlmIChyZXBseV9zaXplKSB7CiAJCS8vIHdlIHdyb3RlIG91ciBvd24gdmFsdWVzIGZvciBjb250ZXh0IC0gbm93IHJlc3RvcmUgdGhlIHVzZXIgc3VwcGxpZWQgb25lcwpAQCAtOTY0LDggKzk3NSwxMSBAQAogCWZvciAoaSA9IDA7IGkgPCBzZ19pbmRleDsgaSsrKQogCQlrZnJlZShzZ19saXN0W2ldKTsKIAotICAgICAgY2xlYW51cDoKK2NsZWFudXA6CiAJa2ZyZWUocmVwbHkpOworb3V0OgorCWlmIChtc2cpCisJCWkyb19tc2dfbm9wKGMsIG1zZyk7CiAJcmV0dXJuIHJjb2RlOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwppbmRleCAzMzA1YzEyLi5hMWVjMTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmYy0+ZGV2aWNlcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmxvY2spOwotCWluaXRfTVVURVgoJmMtPmxjdF9sb2NrKTsKKwltdXRleF9pbml0KCZjLT5sY3RfbG9jayk7CiAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmYy0+ZGV2aWNlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jIGIvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCmluZGV4IDM4ZTgxNWEuLmZkYmFhNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYworKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKQEAgLTIwOSw2ICsyMDksNyBAQAogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CiAJaW50IHZhbGlkID0gMDsKIAorCXNldF9mcmVlemFibGUoKTsKIAlhZGRfd2FpdF9xdWV1ZSgmdHMtPmlycV93YWl0LCAmd2FpdCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdW5zaWduZWQgaW50IHgsIHksIHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IGJkNjAxZWYuLjFkNTE2ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC0yLDExICsyLDE1IEBACiAjIE1pc2Mgc3RyYW5nZSBkZXZpY2VzCiAjCiAKLW1lbnUgIk1pc2MgZGV2aWNlcyIKK21lbnVjb25maWcgTUlTQ19ERVZJQ0VTCisJYm9vbCAiTWlzYyBkZXZpY2VzIgorCWRlZmF1bHQgeQorCitpZiBNSVNDX0RFVklDRVMKIAogY29uZmlnIElCTV9BU00KIAl0cmlzdGF0ZSAiRGV2aWNlIGRyaXZlciBmb3IgSUJNIFJTQSBzZXJ2aWNlIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBYODYgJiYgUENJICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV2aWNlIGRyaXZlciBzdXBwb3J0IGZvciBpbi1iYW5kIGFjY2VzcyB0byB0aGUKIAkgIElCTSBSU0EgKENvbmRvcikgc2VydmljZSBwcm9jZXNzb3IgaW4gZVNlcnZlciB4U2VyaWVzIHN5c3RlbXMuCkBAIC0xOTIsNCArMTk2LDQgQEAKIAogCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IFkgaGVyZS4KIAotZW5kbWVudQorZW5kaWYgIyBNSVNDX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKaW5kZXggMDdhMDg1Yy4uYjVkZjM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC03Miw3ICs3Miw3IEBACiBzdGF0aWMgdm9pZCBmcmVlX2NvbW1hbmQoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IGNvbW1hbmQgKmNtZCA9IHRvX2NvbW1hbmQoa29iaik7Ci0gCisKIAlsaXN0X2RlbCgmY21kLT5xdWV1ZV9ub2RlKTsKIAlhdG9taWNfZGVjKCZjb21tYW5kX2NvdW50KTsKIAlkYmcoImNvbW1hbmQgY291bnQ6ICVkXG4iLCBhdG9taWNfcmVhZCgmY29tbWFuZF9jb3VudCkpOwpAQCAtMTEzLDE0ICsxMTMsMTQgQEAKIAkJZXhlY19uZXh0X2NvbW1hbmQoc3ApOwogCX0KIH0KLQkKKwogLyoqCiAgKiBleGVjX2NvbW1hbmQKICAqIHNlbmQgYSBjb21tYW5kIHRvIGEgc2VydmljZSBwcm9jZXNzb3IKICAqIENvbW1hbmRzIGFyZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkuIE9uZSBjb21tYW5kIChzcC0+Y3VycmVudF9jb21tYW5kKQogICogaXMgc2VudCB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IuIE9uY2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMgYQogICogbWVzc2FnZSBvZiB0eXBlIGNvbW1hbmRfcmVzcG9uc2UsIHRoZSBtZXNzYWdlIGlzIGNvcGllZCBpbnRvCi0gKiB0aGUgY3VycmVudCBjb21tYW5kcyBidWZmZXIsIAorICogdGhlIGN1cnJlbnQgY29tbWFuZHMgYnVmZmVyLAogICovCiB2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCkKIHsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCX0KIH0KIAotLyoqIAorLyoqCiAgKiBTbGVlcCB1bnRpbCBhIGNvbW1hbmQgaGFzIGZhaWxlZCBvciBhIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkCiAgKiBhbmQgdGhlIGNvbW1hbmQgc3RhdHVzIGJlZW4gdXBkYXRlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCiAgKiAoc2VlIHJlY2VpdmVfcmVzcG9uc2UpLgpAQCAtMTgyLDggKzE4Miw4IEBACiB7CiAJc3RydWN0IGNvbW1hbmQgKmNtZCA9IHNwLT5jdXJyZW50X2NvbW1hbmQ7CiAKLQlpZiAoIXNwLT5jdXJyZW50X2NvbW1hbmQpIAotCQlyZXR1cm47IAorCWlmICghc3AtPmN1cnJlbnRfY29tbWFuZCkKKwkJcmV0dXJuOwogCiAJbWVtY3B5X2Zyb21pbyhjbWQtPmJ1ZmZlciwgcmVzcG9uc2UsIG1pbihzaXplLCBjbWQtPmJ1ZmZlcl9zaXplKSk7CiAJY21kLT5zdGF0dXMgPSBJQk1BU01fQ01EX0NPTVBMRVRFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jCmluZGV4IDEzYzUyZjguLjNkZDJkZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC00NCwxMSArNDQsMTEgQEAKIAkJc2l6ZSA9IG1lc3NhZ2Vfc2l6ZTsKIAogCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7Ci0JY2FzZSBzcF9ldmVudDogCisJY2FzZSBzcF9ldmVudDoKIAkJaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3AsIG1lc3NhZ2UsIHNpemUpOwogCQlicmVhazsKIAljYXNlIHNwX2NvbW1hbmRfcmVzcG9uc2U6Ci0JCWlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3AsIG1lc3NhZ2UsIHNpemUpOyAKKwkJaWJtYXNtX3JlY2VpdmVfY29tbWFuZF9yZXNwb25zZShzcCwgbWVzc2FnZSwgc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2Ugc3BfaGVhcnRiZWF0OgogCQlpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3AsIG1lc3NhZ2UsIHNpemUpOwpAQCAtOTUsNyArOTUsNyBAQAogCXN0cmNhdCh2cGRfZGF0YSwgSUJNQVNNX0RSSVZFUl9WUEQpOwogCXZwZF9kYXRhWzEwXSA9IDA7CiAJdnBkX2RhdGFbMTVdID0gMDsKLQkKKwogCWlibWFzbV9leGVjX2NvbW1hbmQoc3AsIGNvbW1hbmQpOwogCWlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShjb21tYW5kLCBJQk1BU01fQ01EX1RJTUVPVVRfTk9STUFMKTsKIApAQCAtMTE4LDcgKzExOCw3IEBACiAgKiBEdXJpbmcgZHJpdmVyIGluaXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvcyBzdGF0ZSAidXAiLgogICogVGhpcyBjYXVzZXMgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIHRvIHN0YXJ0IHNlbmRpbmcgaGVhcnRiZWF0cyB0aGUKICAqIGRyaXZlci4KLSAqIER1cmluZyBkcml2ZXIgZXhpdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb3Mgc3RhdGUgImRvd24iLCAKKyAqIER1cmluZyBkcml2ZXIgZXhpdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb3Mgc3RhdGUgImRvd24iLAogICogY2F1c2luZyB0aGUgc2VydmljZSBwcm9jZXNzb3IgdG8gc3RvcCB0aGUgaGVhcnRiZWF0cy4KICAqLwogaW50IGlibWFzbV9zZW5kX29zX3N0YXRlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIGludCBvc19zdGF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuaCBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuaAppbmRleCAyZDIxYzI3Li42Y2JiYTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmgKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCmluZGV4IGZlMWU4MTkuLmZkYTZhNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC01MSw3ICs1MSw3IEBACiAgKiBldmVudCByZWFkZXJzLgogICogVGhlcmUgaXMgbm8gcmVhZGVyIG1hcmtlciBpbiB0aGUgYnVmZmVyLCB0aGVyZWZvcmUgcmVhZGVycyBhcmUKICAqIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHVwIHdpdGggdGhlIHdyaXRlciwgb3IgdGhleSB3aWxsIGxvb3NlIGV2ZW50cy4KLSAqLyAKKyAqLwogdm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQogewogCXN0cnVjdCBldmVudF9idWZmZXIgKmJ1ZmZlciA9IHNwLT5ldmVudF9idWZmZXI7CkBAIC03NywxMyArNzcsMTMgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZXZlbnRfYXZhaWxhYmxlKHN0cnVjdCBldmVudF9idWZmZXIgKmIsIHN0cnVjdCBldmVudF9yZWFkZXIgKnIpCiB7Ci0JcmV0dXJuIAkoci0+bmV4dF9zZXJpYWxfbnVtYmVyIDwgYi0+bmV4dF9zZXJpYWxfbnVtYmVyKTsKKwlyZXR1cm4gKHItPm5leHRfc2VyaWFsX251bWJlciA8IGItPm5leHRfc2VyaWFsX251bWJlcik7CiB9CiAKIC8qKgogICogZ2V0X25leHRfZXZlbnQKICAqIENhbGxlZCBieSBldmVudCByZWFkZXJzIChpbml0aWF0ZWQgZnJvbSB1c2VyIHNwYWNlIHRocm91Z2ggdGhlIGZpbGUKLSAqIHN5c3RlbSkuIAorICogc3lzdGVtKS4KICAqIFNsZWVwcyB1bnRpbCBhIG5ldyBldmVudCBpcyBhdmFpbGFibGUuCiAgKi8KIGludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9oZWFydGJlYXQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaGVhcnRiZWF0LmMKaW5kZXggN2ZkN2E0My4uMzAzNmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9oZWFydGJlYXQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2hlYXJ0YmVhdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaCBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaTJvLmgKaW5kZXggOTU4Yzk1Ny4uYmYyYzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaAorKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2kyby5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtMjYsOSArMjYsOSBAQAogCXU4CXZlcnNpb247CiAJdTgJbWVzc2FnZV9mbGFnczsKIAl1MTYJbWVzc2FnZV9zaXplOwotCXU4CXRhcmdldDsgICAgICAgICAgIAorCXU4CXRhcmdldDsKIAl1OAlpbml0aWF0b3JfYW5kX3RhcmdldDsKLQl1OAlpbml0aWF0b3I7ICAgICAgICAKKwl1OAlpbml0aWF0b3I7CiAJdTgJZnVuY3Rpb247CiAJdTMyCWluaXRpYXRvcl9jb250ZXh0OwogfTsKQEAgLTY0LDEyICs2NCwxMiBAQAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGkyb19oZWFkZXIpICsgZGF0YV9zaXplOwogCiAJaTJvX3NpemUgPSBzaXplIC8gc2l6ZW9mKHUzMik7Ci0JCisKIAlpZiAoc2l6ZSAlIHNpemVvZih1MzIpKQogCSAgICAgICBpMm9fc2l6ZSsrOwogCiAJcmV0dXJuIGkyb19zaXplOwotfQkKK30KIAogc3RhdGljIGlubGluZSB1MzIgaW5jb21pbmdfZGF0YV9zaXplKHN0cnVjdCBpMm9fbWVzc2FnZSAqaTJvX21lc3NhZ2UpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc20uaAppbmRleCA0OGQ1YWJlLi5kZTg2MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC01OCw4ICs1OCw4IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotI2RlZmluZSBJQk1BU01fQ01EX1BFTkRJTkcJMAkKLSNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQorI2RlZmluZSBJQk1BU01fQ01EX1BFTkRJTkcJMAorI2RlZmluZSBJQk1BU01fQ01EX0NPTVBMRVRFCTEKICNkZWZpbmUgSUJNQVNNX0NNRF9GQUlMRUQJMgogCiAjZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwJNDUKQEAgLTE2Myw1NSArMTYzLDU1IEBACiB9OwogCiAvKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KLWV4dGVybiBzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7Ci1leHRlcm4gdm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CitzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7Cit2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCk7Cit2b2lkIGlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgY29tbWFuZCAqY21kLCBpbnQgdGltZW91dCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CiAKIC8qIGV2ZW50IHByb2Nlc3NpbmcgKi8KLWV4dGVybiBpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl91bnJlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7Ci1leHRlcm4gaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CitpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwordm9pZCBpYm1hc21fZXZlbnRfYnVmZmVyX2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKTsKK3ZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwordm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3VucmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK2ludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK3ZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CiAKIC8qIGhlYXJ0YmVhdCAtIGZyb20gU1AgdG8gT1MgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKLWV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwotZXh0ZXJuIGludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gdm9pZCBpYm1hc21faGVhcnRiZWF0X2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKTsKK3ZvaWQgaWJtYXNtX3JlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwordm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKK2ludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsICB2b2lkICptZXNzYWdlLCBzaXplX3Qgc2l6ZSk7CiAKIC8qIHJldmVyc2UgaGVhcnRiZWF0IC0gZnJvbSBPUyB0byBTUCAqLwotZXh0ZXJuIHZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwotZXh0ZXJuIGludCBpYm1hc21fc3RhcnRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwordm9pZCBpYm1hc21faW5pdF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CitpbnQgaWJtYXNtX3N0YXJ0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKK3ZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwogCiAvKiBkb3QgY29tbWFuZHMgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7Ci1leHRlcm4gaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gaW50IGlibWFzbV9zZW5kX29zX3N0YXRlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIGludCBvc19zdGF0ZSk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7CitpbnQgaWJtYXNtX3NlbmRfZHJpdmVyX3ZwZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2ludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwogCiAvKiBsb3cgbGV2ZWwgbWVzc2FnZSBwcm9jZXNzaW5nICovCi1leHRlcm4gaW50IGlibWFzbV9zZW5kX2kyb19tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKK2ludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2lycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKIAogLyogcmVtb3RlIGNvbnNvbGUgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGludCBpYm1hc21faW5pdF9yZW1vdGVfaW5wdXRfZGV2KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CitpbnQgaWJtYXNtX2luaXRfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKIAogLyogZmlsZSBzeXN0ZW0gKi8KLWV4dGVybiBpbnQgaWJtYXNtZnNfcmVnaXN0ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtZnNfYWRkX3NwKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOworaW50IGlibWFzbWZzX3JlZ2lzdGVyKHZvaWQpOwordm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwordm9pZCBpYm1hc21mc19hZGRfc3Aoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAKIC8qIHVhcnQgKi8KICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKLWV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3VucmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAjZWxzZQogI2RlZmluZSBpYm1hc21fcmVnaXN0ZXJfdWFydChzcCkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCmluZGV4IGM0MzZkM2QuLmViN2IwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKQEAgLTE3LDEyICsxNywxMiBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+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+bmVxKTsKIAllaGVhX3JlbW92ZV9hZGFwdGVyX21yKGFkYXB0ZXIpOworCWxpc3RfZGVsKCZhZGFwdGVyLT5saXN0KTsKKwogCWtmcmVlKGFkYXB0ZXIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5MzksOSArMzA0NSwxOCBAQAogCXByaW50ayhLRVJOX0lORk8gIklCTSBlSEVBIGV0aGVybmV0IGRldmljZSBkcml2ZXIgKFJlbGVhc2UgJXMpXG4iLAogCSAgICAgICBEUlZfVkVSU0lPTik7CiAKKwllaGVhX2RyaXZlcl93cSA9IGNyZWF0ZV93b3JrcXVldWUoImVoZWFfZHJpdmVyX3dxIik7CisKKwlJTklUX1dPUksoJmVoZWFfcmVyZWdfbXJfdGFzaywgZWhlYV9yZXJlZ19tcnMpOworCiAJcmV0ID0gY2hlY2tfbW9kdWxlX3Bhcm0oKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKKworCXJldCA9IGVoZWFfY3JlYXRlX2J1c21hcCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCiAJcmV0ID0gaWJtZWJ1c19yZWdpc3Rlcl9kcml2ZXIoJmVoZWFfZHJpdmVyKTsKIAlpZiAocmV0KSB7CiAJCWVoZWFfZXJyb3IoImZhaWxlZCByZWdpc3RlcmluZyBlSEVBIGRldmljZSBkcml2ZXIgb24gZWJ1cyIpOwpAQCAtMjk2NSw2ICszMDgwLDcgQEAKIHsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmVoZWFfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2NhcGFiaWxpdGllcyk7CiAJaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcigmZWhlYV9kcml2ZXIpOworCWVoZWFfZGVzdHJveV9idXNtYXAoKTsKIH0KIAogbW9kdWxlX2luaXQoZWhlYV9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaAppbmRleCBkMTdhNDVhLi44OWI2MzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKQEAgLTYwLDYgKzYwLDkgQEAKIAl9CiB9CiAKKy8qIE51bWJlciBvZiBwYWdlcyB3aGljaCBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBvbmNlIGJ5IEhfUkVHSVNURVJfSEVBX1JQQUdFUyAqLworI2RlZmluZSBFSEVBX01BWF9SUEFHRSA1MTIKKwogLyogTm90aWZpY2F0aW9uIEV2ZW50IFF1ZXVlIChORVEpIEVudHJ5IGJpdCBtYXNrcyAqLwogI2RlZmluZSBORVFFX0VWRU5UX0NPREUJCUVIRUFfQk1BU0tfSUJNKDIsIDcpCiAjZGVmaW5lIE5FUUVfUE9SVE5VTSAgCQlFSEVBX0JNQVNLX0lCTSgzMiwgNDcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKaW5kZXggMjllYWE0Ni4uYTM2ZmE2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKQEAgLTMxLDYgKzMxLDEzIEBACiAjaW5jbHVkZSAiZWhlYV9waHlwLmgiCiAjaW5jbHVkZSAiZWhlYV9xbXIuaCIKIAorCitzdHJ1Y3QgZWhlYV9idXNtYXAgZWhlYV9ibWFwID0geyAwLCAwLCBOVUxMIH07CitleHRlcm4gdTY0IGVoZWFfZHJpdmVyX2ZsYWdzOworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplaGVhX2RyaXZlcl93cTsKK2V4dGVybiBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZWhlYV9yZXJlZ19tcl90YXNrOworCisKIHN0YXRpYyB2b2lkICpod19xcGFnZWl0X2dldF9pbmMoc3RydWN0IGh3X3F1ZXVlICpxdWV1ZSkKIHsKIAl2b2lkICpyZXR2YWx1ZSA9IGh3X3FlaXRfZ2V0KHF1ZXVlKTsKQEAgLTU0NywxOCArNTU0LDg0IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBlaGVhX2NyZWF0ZV9idXNtYXAoIHZvaWQgKQoreworCXU2NCB2YWRkciA9IEVIRUFfQlVTTUFQX1NUQVJUOworCXVuc2lnbmVkIGxvbmcgYWJzX21heF9wZm4gPSAwOworCXVuc2lnbmVkIGxvbmcgc2VjX21heF9wZm47CisJaW50IGk7CisKKwkvKgorCSAqIFNlY3Rpb25zIGFyZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIC0+IExvb3Agb3ZlciBhbGwgc2VjdGlvbnMgYW5kCisJICogZmluZCB0aGUgaGlnaGVzdCBQRk4gdG8gY29tcHV0ZSB0aGUgcmVxdWlyZWQgbWFwIHNpemUuCisJKi8KKwllaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5SX01FTV9TRUNUSU9OUzsgaSsrKQorCQlpZiAodmFsaWRfc2VjdGlvbl9ucihpKSkgeworCQkJc2VjX21heF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihpKTsKKwkJCWlmIChzZWNfbWF4X3BmbiA+IGFic19tYXhfcGZuKQorCQkJCWFic19tYXhfcGZuID0gc2VjX21heF9wZm47CisJCQllaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMrKzsKKwkJfQorCisJZWhlYV9ibWFwLmVudHJpZXMgPSBhYnNfbWF4X3BmbiAvIEVIRUFfUEFHRVNfUEVSX1NFQ1RJT04gKyAxOworCWVoZWFfYm1hcC52YWRkciA9IHZtYWxsb2MoZWhlYV9ibWFwLmVudHJpZXMgKiBzaXplb2YoKmVoZWFfYm1hcC52YWRkcikpOworCisJaWYgKCFlaGVhX2JtYXAudmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMCA7IGkgPCBlaGVhX2JtYXAuZW50cmllczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gc2VjdGlvbl9ucl90b19wZm4oaSk7CisKKwkJaWYgKHBmbl92YWxpZChwZm4pKSB7CisJCQllaGVhX2JtYXAudmFkZHJbaV0gPSB2YWRkcjsKKwkJCXZhZGRyICs9IEVIRUFfU0VDVFNJWkU7CisJCX0gZWxzZQorCQkJZWhlYV9ibWFwLnZhZGRyW2ldID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlaGVhX2Rlc3Ryb3lfYnVzbWFwKCB2b2lkICkKK3sKKwl2ZnJlZShlaGVhX2JtYXAudmFkZHIpOworfQorCit1NjQgZWhlYV9tYXBfdmFkZHIodm9pZCAqY2FkZHIpCit7CisJdTY0IG1hcHBlZF9hZGRyOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBfX3BhKGNhZGRyKSA+PiBTRUNUSU9OX1NJWkVfQklUUzsKKworCWlmIChsaWtlbHkoaW5kZXggPCBlaGVhX2JtYXAuZW50cmllcykpIHsKKwkJbWFwcGVkX2FkZHIgPSBlaGVhX2JtYXAudmFkZHJbaW5kZXhdOworCQlpZiAobGlrZWx5KG1hcHBlZF9hZGRyKSkKKwkJCW1hcHBlZF9hZGRyIHw9ICgoKHVuc2lnbmVkIGxvbmcpY2FkZHIpCisJCQkJCSYgKEVIRUFfU0VDVFNJWkUgLSAxKSk7CisJCWVsc2UKKwkJCW1hcHBlZF9hZGRyID0gLTE7CisJfSBlbHNlCisJCW1hcHBlZF9hZGRyID0gLTE7CisKKwlpZiAodW5saWtlbHkobWFwcGVkX2FkZHIgPT0gLTEpKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoX19FSEVBX1NUT1BfWEZFUiwgJmVoZWFfZHJpdmVyX2ZsYWdzKSkKKwkJCXF1ZXVlX3dvcmsoZWhlYV9kcml2ZXJfd3EsICZlaGVhX3JlcmVnX21yX3Rhc2spOworCisJcmV0dXJuIG1hcHBlZF9hZGRyOworfQorCiBpbnQgZWhlYV9yZWdfa2VybmVsX21yKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBlaGVhX21yICptcikKIHsKLQlpbnQgaSwgaywgcmV0OwotCXU2NCBocmV0LCBwdF9hYnMsIHN0YXJ0LCBlbmQsIG5yX3BhZ2VzOwotCXUzMiBhY2NfY3RybCA9IEVIRUFfTVJfQUNDX0NUUkw7CisJaW50IHJldDsKIAl1NjQgKnB0OworCXZvaWQgKnBnOworCXU2NCBocmV0LCBwdF9hYnMsIGksIGosIG0sIG1yX2xlbjsKKwl1MzIgYWNjX2N0cmwgPSBFSEVBX01SX0FDQ19DVFJMOwogCi0Jc3RhcnQgPSBLRVJORUxCQVNFOwotCWVuZCA9ICh1NjQpaGlnaF9tZW1vcnk7Ci0JbnJfcGFnZXMgPSAoZW5kIC0gc3RhcnQpIC8gRUhFQV9QQUdFU0laRTsKKwltcl9sZW4gPSBlaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMgKiBFSEVBX1NFQ1RTSVpFOwogCi0JcHQgPSAga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCXB0ID0gIGt6YWxsb2MoRUhFQV9NQVhfUlBBR0UgKiBzaXplb2YodTY0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwdCkgewogCQllaGVhX2Vycm9yKCJubyBtZW0iKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTU2Niw3ICs2MzksOCBAQAogCX0KIAlwdF9hYnMgPSB2aXJ0X3RvX2FicyhwdCk7CiAKLQlocmV0ID0gZWhlYV9oX2FsbG9jX3Jlc291cmNlX21yKGFkYXB0ZXItPmhhbmRsZSwgc3RhcnQsIGVuZCAtIHN0YXJ0LAorCWhyZXQgPSBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfbXIoYWRhcHRlci0+aGFuZGxlLAorCQkJCQlFSEVBX0JVU01BUF9TVEFSVCwgbXJfbGVuLAogCQkJCQlhY2NfY3RybCwgYWRhcHRlci0+cGQsCiAJCQkJCSZtci0+aGFuZGxlLCAmbXItPmxrZXkpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewpAQCAtNTc1LDQ5ICs2NDksNDMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbXItPnZhZGRyID0gS0VSTkVMQkFTRTsKLQlrID0gMDsKKwlmb3IgKGkgPSAwIDsgaSA8IGVoZWFfYm1hcC5lbnRyaWVzOyBpKyspCisJCWlmIChlaGVhX2JtYXAudmFkZHJbaV0pIHsKKwkJCXZvaWQgKnNlY3RiYXNlID0gX192YShpIDw8IFNFQ1RJT05fU0laRV9CSVRTKTsKKwkJCXVuc2lnbmVkIGxvbmcgayA9IDA7CiAKLQl3aGlsZSAobnJfcGFnZXMgPiAwKSB7Ci0JCWlmIChucl9wYWdlcyA+IDEpIHsKLQkJCXU2NCBudW1fcGFnZXMgPSBtaW4obnJfcGFnZXMsICh1NjQpNTEyKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykKLQkJCQlwdFtpXSA9IHZpcnRfdG9fYWJzKCh2b2lkKikoKCh1NjQpc3RhcnQpICsKLQkJCQkJCQkgICAgKChrKyspICoKLQkJCQkJCQkgICAgIEVIRUFfUEFHRVNJWkUpKSk7CisJCQlmb3IgKGogPSAwOyBqIDwgKFBBR0VTX1BFUl9TRUNUSU9OIC8gRUhFQV9NQVhfUlBBR0UpOworCQkJICAgICAgaisrKSB7CiAKLQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJCW1yLT5oYW5kbGUsIDAsCi0JCQkJCQkJMCwgKHU2NClwdF9hYnMsCi0JCQkJCQkJbnVtX3BhZ2VzKTsKLQkJCW5yX3BhZ2VzIC09IG51bV9wYWdlczsKLQkJfSBlbHNlIHsKLQkJCXU2NCBhYnNfYWRyID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkgKwotCQkJCQkJCSAgKGsgKiBFSEVBX1BBR0VTSVpFKSkpOworCQkJCWZvciAobSA9IDA7IG0gPCBFSEVBX01BWF9SUEFHRTsgbSsrKSB7CisJCQkJCXBnID0gc2VjdGJhc2UgKyAoKGsrKykgKiBFSEVBX1BBR0VTSVpFKTsKKwkJCQkJcHRbbV0gPSB2aXJ0X3RvX2FicyhwZyk7CisJCQkJfQogCi0JCQlocmV0ID0gZWhlYV9oX3JlZ2lzdGVyX3JwYWdlX21yKGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJCQltci0+aGFuZGxlLCAwLAotCQkJCQkJCTAsIGFic19hZHIsMSk7Ci0JCQlucl9wYWdlcy0tOworCQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAorCQkJCQkJCQltci0+aGFuZGxlLAorCQkJCQkJCQkwLCAwLCBwdF9hYnMsCisJCQkJCQkJCUVIRUFfTUFYX1JQQUdFKTsKKwkJCQlpZiAoKGhyZXQgIT0gSF9TVUNDRVNTKQorCQkJCSAgICAmJiAoaHJldCAhPSBIX1BBR0VfUkVHSVNURVJFRCkpIHsKKwkJCQkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLAorCQkJCQkJCSAgICAgbXItPmhhbmRsZSwKKwkJCQkJCQkgICAgIEZPUkNFX0ZSRUUpOworCQkJCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKKwkJCQkJcmV0ID0gLUVJTzsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQogCQl9CiAKLQkJaWYgKChocmV0ICE9IEhfU1VDQ0VTUykgJiYgKGhyZXQgIT0gSF9QQUdFX1JFR0lTVEVSRUQpKSB7Ci0JCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsCi0JCQkJCSAgICAgbXItPmhhbmRsZSwgRk9SQ0VfRlJFRSk7Ci0JCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIG1yLT5oYW5kbGUsCi0JCQkJICAgICBGT1JDRV9GUkVFKTsKLQkJZWhlYV9lcnJvcigicmVnaXN0ZXJfcnBhZ2UgZmFpbGVkIGZvciBsYXN0IHBhZ2UiKTsKKwkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBtci0+aGFuZGxlLCBGT1JDRV9GUkVFKTsKKwkJZWhlYV9lcnJvcigicmVnaXN0ZXJpbmcgbXIgZmFpbGVkIik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gb3V0OwogCX0KIAorCW1yLT52YWRkciA9IEVIRUFfQlVTTUFQX1NUQVJUOwogCW1yLT5hZGFwdGVyID0gYWRhcHRlcjsKIAlyZXQgPSAwOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCmluZGV4IGMwZWIzZTAuLmI3MWY4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKQEAgLTM2LDggKzM2LDE0IEBACiAgKiBwYWdlIHNpemUgb2YgZWhlYSBoYXJkd2FyZSBxdWV1ZXMKICAqLwogCi0jZGVmaW5lIEVIRUFfUEFHRVNISUZUICAxMgotI2RlZmluZSBFSEVBX1BBR0VTSVpFICAgNDA5NlVMCisjZGVmaW5lIEVIRUFfUEFHRVNISUZUICAgICAgICAgMTIKKyNkZWZpbmUgRUhFQV9QQUdFU0laRSAgICAgICAgICAoMVVMIDw8IEVIRUFfUEFHRVNISUZUKQorI2RlZmluZSBFSEVBX1NFQ1RTSVpFICAgICAgICAgICgxVUwgPDwgMjQpCisjZGVmaW5lIEVIRUFfUEFHRVNfUEVSX1NFQ1RJT04gKEVIRUFfU0VDVFNJWkUgPj4gUEFHRV9TSElGVCkKKworI2lmICgxVUwgPDwgU0VDVElPTl9TSVpFX0JJVFMpIDwgRUhFQV9TRUNUU0laRQorI2Vycm9yIGVIRUEgbW9kdWxlIGNhbid0IHdvcmsgaWYga2VybmVsIHNlY3Rpb25zaXplIDwgZWhlYSBzZWN0aW9uc2l6ZQorI2VuZGlmCiAKIC8qIFNvbWUgYWJicmV2aWF0aW9ucyB1c2VkIGhlcmU6CiAgKgpAQCAtMzcyLDQgKzM3OCw4IEBACiAKIHZvaWQgZWhlYV9lcnJvcl9kYXRhKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCByZXNfaGFuZGxlKTsKIAoraW50IGVoZWFfY3JlYXRlX2J1c21hcCggdm9pZCApOwordm9pZCBlaGVhX2Rlc3Ryb3lfYnVzbWFwKCB2b2lkICk7Cit1NjQgZWhlYV9tYXBfdmFkZHIodm9pZCAqY2FkZHIpOworCiAjZW5kaWYJLyogX19FSEVBX1FNUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggNjcwNDZlOC4uMTM2ODI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTU1MCw2ICs1NTAsOCBAQAogLyogUEhZIGRlZmluZXMgKi8KICNkZWZpbmUgUEhZX09VSV9NQVJWRUxMCTB4NTA0MwogI2RlZmluZSBQSFlfT1VJX0NJQ0FEQQkweDAzZjEKKyNkZWZpbmUgUEhZX09VSV9WSVRFU1NFCTB4MDFjMQorI2RlZmluZSBQSFlfT1VJX1JFQUxURUsJMHgwMWMxCiAjZGVmaW5lIFBIWUlEMV9PVUlfTUFTSwkweDAzZmYKICNkZWZpbmUgUEhZSUQxX09VSV9TSEZUCTYKICNkZWZpbmUgUEhZSUQyX09VSV9NQVNLCTB4ZmMwMApAQCAtNTU3LDEyICs1NTksMzYgQEAKICNkZWZpbmUgUEhZSUQyX01PREVMX01BU0sJCTB4MDNmMAogI2RlZmluZSBQSFlfTU9ERUxfTUFSVkVMTF9FMzAxNgkJMHgyMjAKICNkZWZpbmUgUEhZX01BUlZFTExfRTMwMTZfSU5JVE1BU0sJMHgwMzAwCi0jZGVmaW5lIFBIWV9JTklUMQkweDBmMDAwCi0jZGVmaW5lIFBIWV9JTklUMgkweDBlMDAKLSNkZWZpbmUgUEhZX0lOSVQzCTB4MDEwMDAKLSNkZWZpbmUgUEhZX0lOSVQ0CTB4MDIwMAotI2RlZmluZSBQSFlfSU5JVDUJMHgwMDA0Ci0jZGVmaW5lIFBIWV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDEJMHgwZjAwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQyCTB4MGUwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQzCTB4MDEwMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNAkweDAyMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNQkweDAwMDQKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMQkweDFmCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMgkweDEwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMwkweDExCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHNAkweDEyCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfTVNLMQkweGMKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9NU0syCTB4MDE4MAorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMQkweDUyYjUKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDIJMHhhZjhhCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQzCTB4OAorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNAkweDhmOGEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDUJMHhhZjg2CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ2CTB4OGY4NgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNwkweGFmODIKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDgJMHgwMTAwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ5CTB4OGY4MgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMTAJMHgwCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMQkweDFmCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMgkweDE5CisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMwkweDEzCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQxCTB4MDAwMAorI2RlZmluZSBQSFlfUkVBTFRFS19JTklUMgkweDhlMDAKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDMJMHgwMDAxCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQ0CTB4YWQxNworCiAjZGVmaW5lIFBIWV9HSUdBQklUCTB4MDEwMAogCiAjZGVmaW5lIFBIWV9USU1FT1VUCTB4MQpAQCAtMTA5Niw2ICsxMTIyLDI4IEBACiAJCQlyZXR1cm4gUEhZX0VSUk9SOwogCQl9CiAJfQorCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUspIHsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KIAogCS8qIHNldCBhZHZlcnRpc2UgcmVnaXN0ZXIgKi8KIAlyZWcgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOwpAQCAtMTE0MSwxNCArMTE4OSwxNCBAQAogCS8qIHBoeSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwogCWlmICgobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9DSUNBREEpICYmIChwaHlpbnRlcmZhY2UgJiBQSFlfUkdNSUkpICkgewogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1JFU1YxLCBNSUlfUkVBRCk7Ci0JCXBoeV9yZXNlcnZlZCAmPSB+KFBIWV9JTklUMSB8IFBIWV9JTklUMik7Ci0JCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0lOSVQzIHwgUEhZX0lOSVQ0KTsKKwkJcGh5X3Jlc2VydmVkICY9IH4oUEhZX0NJQ0FEQV9JTklUMSB8IFBIWV9DSUNBREFfSU5JVDIpOworCQlwaHlfcmVzZXJ2ZWQgfD0gKFBIWV9DSUNBREFfSU5JVDMgfCBQSFlfQ0lDQURBX0lOSVQ0KTsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKIAkJfQogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIE1JSV9SRUFEKTsKLQkJcGh5X3Jlc2VydmVkIHw9IFBIWV9JTklUNTsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9DSUNBREFfSU5JVDU7CiAJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKQEAgLTExNTYsMTIgKzEyMDQsMTA2IEBACiAJfQogCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgewogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1NSRVZJU0lPTiwgTUlJX1JFQUQpOwotCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ2OworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0NJQ0FEQV9JTklUNjsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfU1JFVklTSU9OLCBwaHlfcmVzZXJ2ZWQpKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKIAkJCXJldHVybiBQSFlfRVJST1I7CiAJCX0KIAl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfVklURVNTRSkgeworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMSwgUEhZX1ZJVEVTU0VfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIE1JSV9SRUFEKTsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+UEhZX1ZJVEVTU0VfSU5JVF9NU0sxOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1ZJVEVTU0VfSU5JVDM7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+UEhZX1ZJVEVTU0VfSU5JVF9NU0sxOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1ZJVEVTU0VfSU5JVDM7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDcpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzI7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUODsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDkpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzEsIFBIWV9WSVRFU1NFX0lOSVQxMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9SRUFMVEVLKSB7CisJCS8qIHJlc2V0IGNvdWxkIGhhdmUgY2xlYXJlZCB0aGVzZSBvdXQsIHNldCB0aGVtIGJhY2sgKi8KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwogCS8qIHNvbWUgcGh5cyBjbGVhciBvdXQgcGF1c2UgYWR2ZXJ0aXNtZW50IG9uIHJlc2V0LCBzZXQgaXQgYmFjayAqLwogCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCByZWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwppbmRleCA1ZGQzNGExLi5hYzM1OTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9vY3AuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDBlMDRmN2EuLmE0YmIwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTE3LDEzICsxNywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21paS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgogCiAjaW5jbHVkZSAibWFjYi5oIgogCkBAIC04NSwxNzIgKzg0LDIwMiBAQAogCQltZW1jcHkoYnAtPmRldi0+ZGV2X2FkZHIsIGFkZHIsIHNpemVvZihhZGRyKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfZW5hYmxlX21kaW8oc3RydWN0IG1hY2IgKmJwKQorc3RhdGljIGludCBtYWNiX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHJlZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwotCXJlZyA9IG1hY2JfcmVhZGwoYnAsIE5DUik7Ci0JcmVnIHw9IE1BQ0JfQklUKE1QRSk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DUiwgcmVnKTsKLQltYWNiX3dyaXRlbChicCwgSUVSLCBNQUNCX0JJVChNRkQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtYWNiX2Rpc2FibGVfbWRpbyhzdHJ1Y3QgbWFjYiAqYnApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNSKTsKLQlyZWcgJj0gfk1BQ0JfQklUKE1QRSk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DUiwgcmVnKTsKLQltYWNiX3dyaXRlbChicCwgSURSLCBNQUNCX0JJVChNRkQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG1hY2JfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKLXsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtYWNiICpicCA9IGJ1cy0+cHJpdjsKIAlpbnQgdmFsdWU7CiAKLQltdXRleF9sb2NrKCZicC0+bWRpb19tdXRleCk7Ci0KLQltYWNiX2VuYWJsZV9tZGlvKGJwKTsKIAltYWNiX3dyaXRlbChicCwgTUFOLCAoTUFDQl9CRihTT0YsIE1BQ0JfTUFOX1NPRikKIAkJCSAgICAgIHwgTUFDQl9CRihSVywgTUFDQl9NQU5fUkVBRCkKLQkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBwaHlfaWQpCi0JCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgbG9jYXRpb24pCisJCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgbWlpX2lkKQorCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIHJlZ251bSkKIAkJCSAgICAgIHwgTUFDQl9CRihDT0RFLCBNQUNCX01BTl9DT0RFKSkpOwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmYnAtPm1kaW9fY29tcGxldGUpOworCS8qIHdhaXQgZm9yIGVuZCBvZiB0cmFuc2ZlciAqLworCXdoaWxlICghTUFDQl9CRkVYVChJRExFLCBtYWNiX3JlYWRsKGJwLCBOU1IpKSkKKwkJY3B1X3JlbGF4KCk7CiAKIAl2YWx1ZSA9IE1BQ0JfQkZFWFQoREFUQSwgbWFjYl9yZWFkbChicCwgTUFOKSk7Ci0JbWFjYl9kaXNhYmxlX21kaW8oYnApOwotCW11dGV4X3VubG9jaygmYnAtPm1kaW9fbXV0ZXgpOwogCiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwKLQkJCSAgICBpbnQgbG9jYXRpb24sIGludCB2YWwpCitzdGF0aWMgaW50IG1hY2JfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLAorCQkJICAgdTE2IHZhbHVlKQogewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAibWRpb193cml0ZSAlMDJ4OiUwMnggPC0gJTA0eFxuIiwKLQkJcGh5X2lkLCBsb2NhdGlvbiwgdmFsKTsKLQotCW11dGV4X2xvY2soJmJwLT5tZGlvX211dGV4KTsKLQltYWNiX2VuYWJsZV9tZGlvKGJwKTsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBidXMtPnByaXY7CiAKIAltYWNiX3dyaXRlbChicCwgTUFOLCAoTUFDQl9CRihTT0YsIE1BQ0JfTUFOX1NPRikKIAkJCSAgICAgIHwgTUFDQl9CRihSVywgTUFDQl9NQU5fV1JJVEUpCi0JCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgcGh5X2lkKQotCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIGxvY2F0aW9uKQorCQkJICAgICAgfCBNQUNCX0JGKFBIWUEsIG1paV9pZCkKKwkJCSAgICAgIHwgTUFDQl9CRihSRUdBLCByZWdudW0pCiAJCQkgICAgICB8IE1BQ0JfQkYoQ09ERSwgTUFDQl9NQU5fQ09ERSkKLQkJCSAgICAgIHwgTUFDQl9CRihEQVRBLCB2YWwpKSk7CisJCQkgICAgICB8IE1BQ0JfQkYoREFUQSwgdmFsdWUpKSk7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisJLyogd2FpdCBmb3IgZW5kIG9mIHRyYW5zZmVyICovCisJd2hpbGUgKCFNQUNCX0JGRVhUKElETEUsIG1hY2JfcmVhZGwoYnAsIE5TUikpKQorCQljcHVfcmVsYXgoKTsKIAotCW1hY2JfZGlzYWJsZV9tZGlvKGJwKTsKLQltdXRleF91bmxvY2soJmJwLT5tZGlvX211dGV4KTsKLX0KLQotc3RhdGljIGludCBtYWNiX3BoeV9wcm9iZShzdHJ1Y3QgbWFjYiAqYnApCi17Ci0JaW50IHBoeV9hZGRyZXNzOwotCXUxNiBwaHlpZDEsIHBoeWlkMjsKLQotCWZvciAocGh5X2FkZHJlc3MgPSAwOyBwaHlfYWRkcmVzcyA8IDMyOyBwaHlfYWRkcmVzcysrKSB7Ci0JCXBoeWlkMSA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMSk7Ci0JCXBoeWlkMiA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMik7Ci0KLQkJaWYgKHBoeWlkMSAhPSAweGZmZmYgJiYgcGh5aWQxICE9IDB4MDAwMAotCQkgICAgJiYgcGh5aWQyICE9IDB4ZmZmZiAmJiBwaHlpZDIgIT0gMHgwMDAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBoeV9hZGRyZXNzID09IDMyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldl9pbmZvKCZicC0+cGRldi0+ZGV2LAotCQkgImRldGVjdGVkIFBIWSBhdCBhZGRyZXNzICVkIChJRCAlMDR4OiUwNHgpXG4iLAotCQkgcGh5X2FkZHJlc3MsIHBoeWlkMSwgcGh5aWQyKTsKLQotCWJwLT5taWkucGh5X2lkID0gcGh5X2FkZHJlc3M7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2Jfc2V0X21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG1lZGlhKQorc3RhdGljIGludCBtYWNiX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKIHsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwotCXJlZyA9IG1hY2JfcmVhZGwoYnAsIE5DRkdSKTsKLQlyZWcgJj0gfihNQUNCX0JJVChTUEQpIHwgTUFDQl9CSVQoRkQpKTsKLQlpZiAobWVkaWEgJiAoQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCkpCi0JCXJlZyB8PSBNQUNCX0JJVChTUEQpOwotCWlmIChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKQotCQlyZWcgfD0gTUFDQl9CSVQoRkQpOwotCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgcmVnKTsKLQlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9jaGVja19tZWRpYShzdHJ1Y3QgbWFjYiAqYnAsIGludCBva190b19wcmludCwgaW50IGluaXRfbWVkaWEpCitzdGF0aWMgdm9pZCBtYWNiX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpID0gJmJwLT5taWk7Ci0JdW5zaWduZWQgaW50IG9sZF9jYXJyaWVyLCBuZXdfY2FycmllcjsKLQlpbnQgYWR2ZXJ0aXNlLCBscGEsIG1lZGlhLCBkdXBsZXg7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIGlmIGZvcmNlZCBtZWRpYSwgZ28gbm8gZnVydGhlciAqLwotCWlmIChtaWktPmZvcmNlX21lZGlhKQotCQlyZXR1cm47CisJaW50IHN0YXR1c19jaGFuZ2UgPSAwOwogCi0JLyogY2hlY2sgY3VycmVudCBhbmQgb2xkIGxpbmsgc3RhdHVzICovCi0Jb2xkX2NhcnJpZXIgPSBuZXRpZl9jYXJyaWVyX29rKG1paS0+ZGV2KSA/IDEgOiAwOwotCW5ld19jYXJyaWVyID0gKHVuc2lnbmVkIGludCkgbWlpX2xpbmtfb2sobWlpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIGlmIGNhcnJpZXIgc3RhdGUgZGlkIG5vdCBjaGFuZ2UsIGFzc3VtZSBub3RoaW5nIGVsc2UgZGlkICovCi0JaWYgKCFpbml0X21lZGlhICYmIG9sZF9jYXJyaWVyID09IG5ld19jYXJyaWVyKQotCQlyZXR1cm47CisJaWYgKHBoeWRldi0+bGluaykgeworCQlpZiAoKGJwLT5zcGVlZCAhPSBwaHlkZXYtPnNwZWVkKSB8fAorCQkgICAgKGJwLT5kdXBsZXggIT0gcGh5ZGV2LT5kdXBsZXgpKSB7CisJCQl1MzIgcmVnOwogCi0JLyogbm8gY2Fycmllciwgbm90aGluZyBtdWNoIHRvIGRvICovCi0JaWYgKCFuZXdfY2FycmllcikgewotCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIG1paS0+ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOworCQkJcmVnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOworCQkJcmVnICY9IH4oTUFDQl9CSVQoU1BEKSB8IE1BQ0JfQklUKEZEKSk7CisKKwkJCWlmIChwaHlkZXYtPmR1cGxleCkKKwkJCQlyZWcgfD0gTUFDQl9CSVQoRkQpOworCQkJaWYgKHBoeWRldi0+c3BlZWQpCisJCQkJcmVnIHw9IE1BQ0JfQklUKFNQRCk7CisKKwkJCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgcmVnKTsKKworCQkJYnAtPnNwZWVkID0gcGh5ZGV2LT5zcGVlZDsKKwkJCWJwLT5kdXBsZXggPSBwaHlkZXYtPmR1cGxleDsKKwkJCXN0YXR1c19jaGFuZ2UgPSAxOworCQl9CiAJfQogCi0JLyoKLQkgKiB3ZSBoYXZlIGNhcnJpZXIsIHNlZSB3aG8ncyBvbiB0aGUgb3RoZXIgZW5kCi0JICovCi0JbmV0aWZfY2Fycmllcl9vbihtaWktPmRldik7CisJaWYgKHBoeWRldi0+bGluayAhPSBicC0+bGluaykgeworCQlpZiAocGh5ZGV2LT5saW5rKQorCQkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKKwkJZWxzZSB7CisJCQlicC0+c3BlZWQgPSAwOworCQkJYnAtPmR1cGxleCA9IC0xOworCQl9CisJCWJwLT5saW5rID0gcGh5ZGV2LT5saW5rOwogCi0JLyogZ2V0IE1JSSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KLQlpZiAoIWluaXRfbWVkaWEgJiYgbWlpLT5hZHZlcnRpc2luZykgewotCQlhZHZlcnRpc2UgPSBtaWktPmFkdmVydGlzaW5nOworCQlzdGF0dXNfY2hhbmdlID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXR1c19jaGFuZ2UpIHsKKwkJaWYgKHBoeWRldi0+bGluaykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwICglZC8lcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwaHlkZXYtPnNwZWVkLAorCQkJICAgICAgIERVUExFWF9GVUxMID09IHBoeWRldi0+ZHVwbGV4ID8gIkZ1bGwiOiJIYWxmIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJfQorfQorCisvKiBiYXNlZCBvbiBhdTEwMDBfZXRoLiBjKi8KK3N0YXRpYyBpbnQgbWFjYl9taWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBOVUxMOworCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IHBoeV9hZGRyOworCisJLyogZmluZCB0aGUgZmlyc3QgcGh5ICovCisJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgUEhZX01BWF9BRERSOyBwaHlfYWRkcisrKSB7CisJCWlmIChicC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXSkgeworCQkJcGh5ZGV2ID0gYnAtPm1paV9idXMucGh5X21hcFtwaHlfYWRkcl07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcGh5ZGV2KSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBubyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkvKiBUT0RPIDogYWRkIHBpbl9pcnEgKi8KKworCS8qIGF0dGFjaCB0aGUgbWFjIHRvIHRoZSBwaHkgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpIHsKKwkJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlkZXYtPmRldi5idXNfaWQsCisJCQkmbWFjYl9oYW5kbGVfbGlua19jaGFuZ2UsIDAsIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKTsKIAl9IGVsc2UgewotCQlhZHZlcnRpc2UgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOwotCQltaWktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwKKwkJCSZtYWNiX2hhbmRsZV9saW5rX2NoYW5nZSwgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX01JSSk7CiAJfQotCWxwYSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CiAKLQkvKiBmaWd1cmUgb3V0IG1lZGlhIGFuZCBkdXBsZXggZnJvbSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KLQltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHZlcnRpc2UpOwotCWR1cGxleCA9IChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKSA/IDEgOiAwOworCWlmIChJU19FUlIocGh5ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5ZGV2KTsKKwl9CiAKLQlpZiAob2tfdG9fcHJpbnQpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCAlc01icHMsICVzLWR1cGxleCwgbHBhIDB4JTA0WFxuIiwKLQkJICAgICAgIG1paS0+ZGV2LT5uYW1lLAotCQkgICAgICAgbWVkaWEgJiAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTAwSEFMRikgPyAiMTAwIiA6ICIxMCIsCi0JCSAgICAgICBkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIGxwYSk7CisJLyogbWFzayB3aXRoIE1BQyBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKwlwaHlkZXYtPnN1cHBvcnRlZCAmPSBQSFlfQkFTSUNfRkVBVFVSRVM7CiAKLQltaWktPmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIAotCS8qIExldCB0aGUgTUFDIGtub3cgYWJvdXQgdGhlIG5ldyBsaW5rIHN0YXRlICovCi0JbWFjYl9zZXRfbWVkaWEoYnAsIG1lZGlhKTsKKwlicC0+bGluayA9IDA7CisJYnAtPnNwZWVkID0gMDsKKwlicC0+ZHVwbGV4ID0gLTE7CisJYnAtPnBoeV9kZXYgPSBwaHlkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNiX21paV9pbml0KHN0cnVjdCBtYWNiICpicCkKK3sKKwlzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCBlcnIgPSAtRU5YSU8sIGk7CisKKwkvKiBFbmFibGUgbWFuYWdtZW50IHBvcnQgKi8KKwltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChNUEUpKTsKKworCWJwLT5taWlfYnVzLm5hbWUgPSAiTUFDQl9taWlfYnVzIiwKKwlicC0+bWlpX2J1cy5yZWFkID0gJm1hY2JfbWRpb19yZWFkLAorCWJwLT5taWlfYnVzLndyaXRlID0gJm1hY2JfbWRpb193cml0ZSwKKwlicC0+bWlpX2J1cy5yZXNldCA9ICZtYWNiX21kaW9fcmVzZXQsCisJYnAtPm1paV9idXMuaWQgPSBicC0+cGRldi0+aWQsCisJYnAtPm1paV9idXMucHJpdiA9IGJwLAorCWJwLT5taWlfYnVzLmRldiA9ICZicC0+ZGV2LT5kZXY7CisJcGRhdGEgPSBicC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEpCisJCWJwLT5taWlfYnVzLnBoeV9tYXNrID0gcGRhdGEtPnBoeV9tYXNrOworCisJYnAtPm1paV9idXMuaXJxID0ga21hbGxvYyhzaXplb2YoaW50KSpQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOworCWlmICghYnAtPm1paV9idXMuaXJxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCisJCWJwLT5taWlfYnVzLmlycVtpXSA9IFBIWV9QT0xMOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoYnAtPmRldiwgJmJwLT5taWlfYnVzKTsKKworCWlmIChtZGlvYnVzX3JlZ2lzdGVyKCZicC0+bWlpX2J1cykpCisJCWdvdG8gZXJyX291dF9mcmVlX21kaW9faXJxOworCisJaWYgKG1hY2JfbWlpX3Byb2JlKGJwLT5kZXYpICE9IDApIHsKKwkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfYnVzOworCX0KKworCXJldHVybiAwOworCitlcnJfb3V0X3VucmVnaXN0ZXJfYnVzOgorCW1kaW9idXNfdW5yZWdpc3RlcigmYnAtPm1paV9idXMpOworZXJyX291dF9mcmVlX21kaW9faXJxOgorCWtmcmVlKGJwLT5taWlfYnVzLmlycSk7CitlcnJfb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG1hY2JfdXBkYXRlX3N0YXRzKHN0cnVjdCBtYWNiICpicCkKQEAgLTI2NSwxNiArMjk0LDYgQEAKIAkJKnAgKz0gX19yYXdfcmVhZGwocmVnKTsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9wZXJpb2RpY190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1hY2IsIHBlcmlvZGljX3Rhc2sud29yayk7Ci0KLQltYWNiX3VwZGF0ZV9zdGF0cyhicCk7Ci0JbWFjYl9jaGVja19tZWRpYShicCwgMSwgMCk7Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Ci19Ci0KIHN0YXRpYyB2b2lkIG1hY2JfdHgoc3RydWN0IG1hY2IgKmJwKQogewogCXVuc2lnbmVkIGludCB0YWlsOwpAQCAtNTE5LDkgKzUzOCw2IEBACiAJc3Bpbl9sb2NrKCZicC0+bG9jayk7CiAKIAl3aGlsZSAoc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgJiBNQUNCX0JJVChNRkQpKQotCQkJY29tcGxldGUoJmJwLT5tZGlvX2NvbXBsZXRlKTsKLQogCQkvKiBjbG9zZSBwb3NzaWJsZSByYWNlIHdpdGggZGV2X2Nsb3NlICovCiAJCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgewogCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgfjBVTCk7CkBAIC01MzUsNyArNTUxLDggQEAKIAkJCQkgKiB1bnRpbCB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgYnVmZmVycwogCQkJCSAqLwogCQkJCW1hY2Jfd3JpdGVsKGJwLCBJRFIsIE1BQ0JfUlhfSU5UX0ZMQUdTKTsKLQkJCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAic2NoZWR1bGluZyBSWCBzb2Z0aXJxXG4iKTsKKwkJCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAorCQkJCQkic2NoZWR1bGluZyBSWCBzb2Z0aXJxXG4iKTsKIAkJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJCQl9CiAJCX0KQEAgLTc2NSw3ICs3ODIsNyBAQAogCW1hY2Jfd3JpdGVsKGJwLCBUQlFQLCBicC0+dHhfcmluZ19kbWEpOwogCiAJLyogRW5hYmxlIFRYIGFuZCBSWCAqLwotCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIE1BQ0JfQklUKFJFKSB8IE1BQ0JfQklUKFRFKSk7CisJbWFjYl93cml0ZWwoYnAsIE5DUiwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpIHwgTUFDQl9CSVQoTVBFKSk7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogCW1hY2Jfd3JpdGVsKGJwLCBJRVIsIChNQUNCX0JJVChSQ09NUCkKQEAgLTc3NiwxOCArNzkzLDEyNiBAQAogCQkJICAgICAgfCBNQUNCX0JJVChUQ09NUCkKIAkJCSAgICAgIHwgTUFDQl9CSVQoSVNSX1JPVlIpCiAJCQkgICAgICB8IE1BQ0JfQklUKEhSRVNQKSkpOworCiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfaW5pdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qCisgKiBUaGUgaGFzaCBhZGRyZXNzIHJlZ2lzdGVyIGlzIDY0IGJpdHMgbG9uZyBhbmQgdGFrZXMgdXAgdHdvCisgKiBsb2NhdGlvbnMgaW4gdGhlIG1lbW9yeSBtYXAuICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgc3RvcmVkCisgKiBpbiBFTUFDX0hTTCBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBFTUFDX0hTSC4KKyAqCisgKiBUaGUgdW5pY2FzdCBoYXNoIGVuYWJsZSBhbmQgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXRzIGluIHRoZQorICogbmV0d29yayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGVuYWJsZSB0aGUgcmVjZXB0aW9uIG9mIGhhc2ggbWF0Y2hlZAorICogZnJhbWVzLiBUaGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyByZWR1Y2VkIHRvIGEgNiBiaXQgaW5kZXggaW50bworICogdGhlIDY0IGJpdCBoYXNoIHJlZ2lzdGVyIHVzaW5nIHRoZSBmb2xsb3dpbmcgaGFzaCBmdW5jdGlvbi4gIFRoZQorICogaGFzaCBmdW5jdGlvbiBpcyBhbiBleGNsdXNpdmUgb3Igb2YgZXZlcnkgc2l4dGggYml0IG9mIHRoZQorICogZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqCisgKiBoaVs1XSA9IGRhWzVdIF4gZGFbMTFdIF4gZGFbMTddIF4gZGFbMjNdIF4gZGFbMjldIF4gZGFbMzVdIF4gZGFbNDFdIF4gZGFbNDddCisgKiBoaVs0XSA9IGRhWzRdIF4gZGFbMTBdIF4gZGFbMTZdIF4gZGFbMjJdIF4gZGFbMjhdIF4gZGFbMzRdIF4gZGFbNDBdIF4gZGFbNDZdCisgKiBoaVszXSA9IGRhWzNdIF4gZGFbMDldIF4gZGFbMTVdIF4gZGFbMjFdIF4gZGFbMjddIF4gZGFbMzNdIF4gZGFbMzldIF4gZGFbNDVdCisgKiBoaVsyXSA9IGRhWzJdIF4gZGFbMDhdIF4gZGFbMTRdIF4gZGFbMjBdIF4gZGFbMjZdIF4gZGFbMzJdIF4gZGFbMzhdIF4gZGFbNDRdCisgKiBoaVsxXSA9IGRhWzFdIF4gZGFbMDddIF4gZGFbMTNdIF4gZGFbMTldIF4gZGFbMjVdIF4gZGFbMzFdIF4gZGFbMzddIF4gZGFbNDNdCisgKiBoaVswXSA9IGRhWzBdIF4gZGFbMDZdIF4gZGFbMTJdIF4gZGFbMThdIF4gZGFbMjRdIF4gZGFbMzBdIF4gZGFbMzZdIF4gZGFbNDJdCisgKgorICogZGFbMF0gcmVwcmVzZW50cyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmaXJzdCBieXRlCisgKiByZWNlaXZlZCwgdGhhdCBpcywgdGhlIG11bHRpY2FzdC91bmljYXN0IGluZGljYXRvciwgYW5kIGRhWzQ3XQorICogcmVwcmVzZW50cyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxhc3QgYnl0ZSByZWNlaXZlZC4gIElmCisgKiB0aGUgaGFzaCBpbmRleCwgaGlbbl0sIHBvaW50cyB0byBhIGJpdCB0aGF0IGlzIHNldCBpbiB0aGUgaGFzaAorICogcmVnaXN0ZXIgdGhlbiB0aGUgZnJhbWUgd2lsbCBiZSBtYXRjaGVkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZQorICogZnJhbWUgaXMgbXVsdGljYXN0IG9yIHVuaWNhc3QuICBBIG11bHRpY2FzdCBtYXRjaCB3aWxsIGJlIHNpZ25hbGxlZAorICogaWYgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXQgaXMgc2V0LCBkYVswXSBpcyAxIGFuZCB0aGUgaGFzaAorICogaW5kZXggcG9pbnRzIHRvIGEgYml0IHNldCBpbiB0aGUgaGFzaCByZWdpc3Rlci4gIEEgdW5pY2FzdCBtYXRjaAorICogd2lsbCBiZSBzaWduYWxsZWQgaWYgdGhlIHVuaWNhc3QgaGFzaCBlbmFibGUgYml0IGlzIHNldCwgZGFbMF0gaXMgMAorICogYW5kIHRoZSBoYXNoIGluZGV4IHBvaW50cyB0byBhIGJpdCBzZXQgaW4gdGhlIGhhc2ggcmVnaXN0ZXIuICBUbworICogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IGZyYW1lcywgdGhlIGhhc2ggcmVnaXN0ZXIgc2hvdWxkIGJlIHNldCB3aXRoCisgKiBhbGwgb25lcyBhbmQgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aGUKKyAqIG5ldHdvcmsgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBoYXNoX2JpdF92YWx1ZShpbnQgYml0bnIsIF9fdTggKmFkZHIpCiB7CisJaWYgKGFkZHJbYml0bnIgLyA4XSAmICgxIDw8IChiaXRuciAlIDgpKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGhhc2ggaW5kZXggdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBoYXNoX2dldF9pbmRleChfX3U4ICphZGRyKQoreworCWludCBpLCBqLCBiaXR2YWw7CisJaW50IGhhc2hfaW5kZXggPSAwOworCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworCQlmb3IgKGkgPSAwLCBiaXR2YWwgPSAwOyBpIDwgODsgaSsrKQorCQkJYml0dmFsIF49IGhhc2hfYml0X3ZhbHVlKGkqNiArIGosIGFkZHIpOworCisJCWhhc2hfaW5kZXggfD0gKGJpdHZhbCA8PCBqKTsKKwl9CisKKwlyZXR1cm4gaGFzaF9pbmRleDsKK30KKworLyoKKyAqIEFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIHRoZSBpbnRlcm5hbCBtdWx0aWNhc3QtaGFzaCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgbWFjYl9zZXRoYXNodGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmN1cnI7CisJdW5zaWduZWQgbG9uZyBtY19maWx0ZXJbMl07CisJdW5zaWduZWQgaW50IGksIGJpdG5yOwogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHQgc2V0dGluZ3MgKi8KLQltYWNiX21kaW9fd3JpdGUoZGV2LCBicC0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKLQkJCUFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX0FMTCk7Ci0JbWFjYl9tZGlvX3dyaXRlKGRldiwgYnAtPm1paS5waHlfaWQsIE1JSV9CTUNSLAotCQkJKEJNQ1JfU1BFRUQxMDAgfCBCTUNSX0FORU5BQkxFCi0JCQkgfCBCTUNSX0FOUkVTVEFSVCB8IEJNQ1JfRlVMTERQTFgpKTsKKwltY19maWx0ZXJbMF0gPSBtY19maWx0ZXJbMV0gPSAwOworCisJY3VyciA9IGRldi0+bWNfbGlzdDsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBjdXJyID0gY3Vyci0+bmV4dCkgeworCQlpZiAoIWN1cnIpIGJyZWFrOwkvKiB1bmV4cGVjdGVkIGVuZCBvZiBsaXN0ICovCisKKwkJYml0bnIgPSBoYXNoX2dldF9pbmRleChjdXJyLT5kbWlfYWRkcik7CisJCW1jX2ZpbHRlcltiaXRuciA+PiA1XSB8PSAxIDw8IChiaXRuciAmIDMxKTsKKwl9CisKKwltYWNiX3dyaXRlbChicCwgSFJCLCBtY19maWx0ZXJbMF0pOworCW1hY2Jfd3JpdGVsKGJwLCBIUlQsIG1jX2ZpbHRlclsxXSk7Cit9CisKKy8qCisgKiBFbmFibGUvRGlzYWJsZSBwcm9taXNjdW91cyBhbmQgbXVsdGljYXN0IG1vZGVzLgorICovCitzdGF0aWMgdm9pZCBtYWNiX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBjZmc7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNmZyA9IG1hY2JfcmVhZGwoYnAsIE5DRkdSKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWNmZyB8PSBNQUNCX0JJVChDQUYpOworCWVsc2UgaWYgKGRldi0+ZmxhZ3MgJiAofklGRl9QUk9NSVNDKSkKKwkJIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQljZmcgJj0gfk1BQ0JfQklUKENBRik7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBFbmFibGUgYWxsIG11bHRpY2FzdCBtb2RlICovCisJCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIC0xKTsKKwkJbWFjYl93cml0ZWwoYnAsIEhSVCwgLTEpOworCQljZmcgfD0gTUFDQl9CSVQoTkNGR1JfTVRJKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCS8qIEVuYWJsZSBzcGVjaWZpYyBtdWx0aWNhc3RzICovCisJCW1hY2Jfc2V0aGFzaHRhYmxlKGRldik7CisJCWNmZyB8PSBNQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmICh+SUZGX0FMTE1VTFRJKSkgeworCQkvKiBEaXNhYmxlIGFsbCBtdWx0aWNhc3QgbW9kZSAqLworCQltYWNiX3dyaXRlbChicCwgSFJCLCAwKTsKKwkJbWFjYl93cml0ZWwoYnAsIEhSVCwgMCk7CisJCWNmZyAmPSB+TUFDQl9CSVQoTkNGR1JfTVRJKTsKKwl9CisKKwltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNmZyk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03OTcsNiArOTIyLDEwIEBACiAKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAib3BlblxuIik7CiAKKwkvKiBpZiB0aGUgcGh5IGlzIG5vdCB5ZXQgcmVnaXN0ZXIsIHJldHJ5IGxhdGVyKi8KKwlpZiAoIWJwLT5waHlfZGV2KQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCkBAIC04MTAsMTMgKzkzOSwxMiBAQAogCiAJbWFjYl9pbml0X3JpbmdzKGJwKTsKIAltYWNiX2luaXRfaHcoYnApOwotCW1hY2JfaW5pdF9waHkoZGV2KTsKIAotCW1hY2JfY2hlY2tfbWVkaWEoYnAsIDEsIDEpOworCS8qIHNjaGVkdWxlIGEgbGluayBzdGF0ZSBjaGVjayAqLworCXBoeV9zdGFydChicC0+cGh5X2Rldik7CisKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kaWNfdGFzaywgSFopOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyNSwxMCArOTUzLDExIEBACiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmYnAtPnBlcmlvZGljX3Rhc2spOwotCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCisJaWYgKGJwLT5waHlfZGV2KQorCQlwaHlfc3RvcChicC0+cGh5X2Rldik7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAltYWNiX3Jlc2V0X2h3KGJwKTsKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwpAQCAtODQ1LDYgKzk3NCw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0ID0gJmJwLT5zdGF0czsKIAlzdHJ1Y3QgbWFjYl9zdGF0cyAqaHdzdGF0ID0gJmJwLT5od19zdGF0czsKIAorCS8qIHJlYWQgc3RhdHMgZnJvbSBoYXJkd2FyZSAqLworCW1hY2JfdXBkYXRlX3N0YXRzKGJwKTsKKwogCS8qIENvbnZlcnQgSFcgc3RhdHMgaW50byBuZXRkZXZpY2Ugc3RhdHMgKi8KIAluc3RhdC0+cnhfZXJyb3JzID0gKGh3c3RhdC0+cnhfZmNzX2Vycm9ycyArCiAJCQkgICAgaHdzdGF0LT5yeF9hbGlnbl9lcnJvcnMgKwpAQCAtODgyLDE4ICsxMDE0LDI3IEBACiBzdGF0aWMgaW50IG1hY2JfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCi0JcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJmJwLT5taWksIGNtZCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5ZGV2LCBjbWQpOwogfQogCiBzdGF0aWMgaW50IG1hY2Jfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCi0JcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJmJwLT5taWksIGNtZCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBjbWQpOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCitzdGF0aWMgdm9pZCBtYWNiX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtOTAyLDEwNCArMTA0MywzNCBAQAogCXN0cmNweShpbmZvLT5idXNfaW5mbywgYnAtPnBkZXYtPmRldi5idXNfaWQpOwogfQogCi1zdGF0aWMgaW50IG1hY2JfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmJwLT5taWkpOwotfQotCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG1hY2JfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkJPSBtYWNiX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzCQk9IG1hY2Jfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBtYWNiX2dldF9kcnZpbmZvLAotCS5ud2F5X3Jlc2V0CQk9IG1hY2JfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIH07CiAKIHN0YXRpYyBpbnQgbWFjYl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZicC0+bWlpLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworCWlmICghcGh5ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgaWZfbWlpKHJxKSwgY21kKTsKIH0KIAotc3RhdGljIHNzaXplX3QgbWFjYl9taWlfc2hvdyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpfZGV2LCBjaGFyICpidWYsCi0JCQl1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoX2Rldik7Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzc2l6ZV90IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCWludCB2YWx1ZTsKLQkJdmFsdWUgPSBtYWNiX21kaW9fcmVhZChkZXYsIGJwLT5taWkucGh5X2lkLCBhZGRyKTsKLQkJcmV0ID0gc3ByaW50ZihidWYsICIweCUwNHhcbiIsICh1aW50MTZfdCl2YWx1ZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBNSUlfRU5UUlkobmFtZSwgYWRkcikJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKl9kZXYsCQkJXAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCSAgIGNoYXIgKmJ1ZikJCQkJXAotewkJCQkJCQkJXAotCXJldHVybiBtYWNiX21paV9zaG93KF9kZXYsIGJ1ZiwgYWRkcik7CQkJXAotfQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQotCi1NSUlfRU5UUlkoYm1jciwgTUlJX0JNQ1IpOwotTUlJX0VOVFJZKGJtc3IsIE1JSV9CTVNSKTsKLU1JSV9FTlRSWShwaHlzaWQxLCBNSUlfUEhZU0lEMSk7Ci1NSUlfRU5UUlkocGh5c2lkMiwgTUlJX1BIWVNJRDIpOwotTUlJX0VOVFJZKGFkdmVydGlzZSwgTUlJX0FEVkVSVElTRSk7Ci1NSUlfRU5UUlkobHBhLCBNSUlfTFBBKTsKLU1JSV9FTlRSWShleHBhbnNpb24sIE1JSV9FWFBBTlNJT04pOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWFjYl9taWlfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfYm1jci5hdHRyLAotCSZkZXZfYXR0cl9ibXNyLmF0dHIsCi0JJmRldl9hdHRyX3BoeXNpZDEuYXR0ciwKLQkmZGV2X2F0dHJfcGh5c2lkMi5hdHRyLAotCSZkZXZfYXR0cl9hZHZlcnRpc2UuYXR0ciwKLQkmZGV2X2F0dHJfbHBhLmF0dHIsCi0JJmRldl9hdHRyX2V4cGFuc2lvbi5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWNiX21paV9ncm91cCA9IHsKLQkubmFtZQk9ICJtaWkiLAotCS5hdHRycwk9IG1hY2JfbWlpX2F0dHJzLAotfTsKLQotc3RhdGljIHZvaWQgbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IGRldmljZSAqX2RldiA9ICZuZXQtPmRldjsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKLX0KLQotc3RhdGljIGludCBtYWNiX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IGRldmljZSAqX2RldiA9ICZuZXQtPmRldjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZfZGV2LT5rb2JqLCAmbWFjYl9taWlfZ3JvdXApOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczogc3lzZnMgbWlpIGF0dHJpYnV0ZSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIG5ldC0+bmFtZSwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQogc3RhdGljIGludCBfX2RldmluaXQgbWFjYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZWdzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG1hY2IgKmJwOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJdW5zaWduZWQgbG9uZyBwY2xrX2h6OwogCXUzMiBjb25maWc7CiAJaW50IGVyciA9IC1FTlhJTzsKQEAgLTEwNzMsNiArMTE0NCw3IEBACiAJZGV2LT5zdG9wID0gbWFjYl9jbG9zZTsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG1hY2Jfc3RhcnRfeG1pdDsKIAlkZXYtPmdldF9zdGF0cyA9IG1hY2JfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbWFjYl9zZXRfcnhfbW9kZTsKIAlkZXYtPmRvX2lvY3RsID0gbWFjYl9pb2N0bDsKIAlkZXYtPnBvbGwgPSBtYWNiX3BvbGw7CiAJZGV2LT53ZWlnaHQgPSA2NDsKQEAgLTEwODAsMTAgKzExNTIsNiBAQAogCiAJZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKIAotCUlOSVRfREVMQVlFRF9XT1JLKCZicC0+cGVyaW9kaWNfdGFzaywgbWFjYl9wZXJpb2RpY190YXNrKTsKLQltdXRleF9pbml0KCZicC0+bWRpb19tdXRleCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7Ci0KIAkvKiBTZXQgTUlJIG1hbmFnZW1lbnQgY2xvY2sgZGl2aWRlciAqLwogCXBjbGtfaHogPSBjbGtfZ2V0X3JhdGUoYnAtPnBjbGspOwogCWlmIChwY2xrX2h6IDw9IDIwMDAwMDAwKQpAQCAtMTA5NiwyMCArMTE2NCw5IEBACiAJCWNvbmZpZyA9IE1BQ0JfQkYoQ0xLLCBNQUNCX0NMS19ESVY2NCk7CiAJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCBjb25maWcpOwogCi0JYnAtPm1paS5kZXYgPSBkZXY7Ci0JYnAtPm1paS5tZGlvX3JlYWQgPSBtYWNiX21kaW9fcmVhZDsKLQlicC0+bWlpLm1kaW9fd3JpdGUgPSBtYWNiX21kaW9fd3JpdGU7Ci0JYnAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7Ci0JYnAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwotCiAJbWFjYl9nZXRfaHdhZGRyKGJwKTsKLQllcnIgPSBtYWNiX3BoeV9wcm9iZShicCk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZGV0ZWN0IFBIWSwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfaXJxOwotCX0KLQogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQogCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIChNQUNCX0JJVChSTUlJKSB8IE1BQ0JfQklUKENMS0VOKSkgKTsKQEAgLTExMzEsOSArMTE4OCwxMSBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlpZiAobWFjYl9taWlfaW5pdChicCkgIT0gMCkgeworCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7CisJfQogCi0JbWFjYl9yZWdpc3Rlcl9zeXNmcyhkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogQXRtZWwgTUFDQiBhdCAweCUwOGx4IGlycSAlZCAiCiAJICAgICAgICIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLApAQCAtMTE0MSw4ICsxMjAwLDE1IEBACiAJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCiAJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOwogCisJcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF0dGFjaGVkIFBIWSBkcml2ZXIgWyVzXSAiCisJCSIobWlpX2J1czpwaHlfYWRkcj0lcywgaXJxPSVkKVxuIiwKKwkJZGV2LT5uYW1lLCBwaHlkZXYtPmRydi0+bmFtZSwgcGh5ZGV2LT5kZXYuYnVzX2lkLCBwaHlkZXYtPmlycSk7CisKIAlyZXR1cm4gMDsKIAorZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjoKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogZXJyX291dF9mcmVlX2lycToKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIGVycl9vdXRfaW91bm1hcDoKQEAgLTExNTMsNyArMTIxOSw5IEBACiAJY2xrX3B1dChicC0+aGNsayk7CiAjZW5kaWYKIAljbGtfZGlzYWJsZShicC0+cGNsayk7CisjaWZuZGVmIENPTkZJR19BUkNIX0FUOTEKIGVycl9vdXRfcHV0X3BjbGs6CisjZW5kaWYKIAljbGtfcHV0KGJwLT5wY2xrKTsKIGVycl9vdXRfZnJlZV9kZXY6CiAJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTExNzEsNyArMTIzOSw4IEBACiAKIAlpZiAoZGV2KSB7CiAJCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKGRldik7CisJCW1kaW9idXNfdW5yZWdpc3RlcigmYnAtPm1paV9idXMpOworCQlrZnJlZShicC0+bWlpX2J1cy5pcnEpOwogCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJaW91bm1hcChicC0+cmVncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmggYi9kcml2ZXJzL25ldC9tYWNiLmgKaW5kZXggYjNiYjIxOC4uNGUzMjgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjYi5oCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuaApAQCAtMzgzLDExICszODMsMTEgQEAKIAogCXVuc2lnbmVkIGludAkJcnhfcGVuZGluZywgdHhfcGVuZGluZzsKIAotCXN0cnVjdCBkZWxheWVkX3dvcmsJcGVyaW9kaWNfdGFzazsKLQotCXN0cnVjdCBtdXRleAkJbWRpb19tdXRleDsKLQlzdHJ1Y3QgY29tcGxldGlvbgltZGlvX2NvbXBsZXRlOwotCXN0cnVjdCBtaWlfaWZfaW5mbwltaWk7CisJc3RydWN0IG1paV9idXMJCW1paV9idXM7CisJc3RydWN0IHBoeV9kZXZpY2UJKnBoeV9kZXY7CisJdW5zaWduZWQgaW50IAkJbGluazsKKwl1bnNpZ25lZCBpbnQgCQlzcGVlZDsKKwl1bnNpZ25lZCBpbnQgCQlkdXBsZXg7CiB9OwogCiAjZW5kaWYgLyogX01BQ0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggZTE3MzJjMS4uZGVjYTY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC0xMDYwLDcgKzEwNjAsNiBAQAogCXN0cnVjdCBteXJpMTBnZV90eF9idWYgKnR4ID0gJm1ncC0+dHg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaWR4LCBsZW47Ci0JaW50IGxpbWl0ID0gMDsKIAogCXdoaWxlICh0eC0+cGt0X2RvbmUgIT0gbWNwX2luZGV4KSB7CiAJCWlkeCA9IHR4LT5kb25lICYgdHgtPm1hc2s7CkBAIC0xMDkxLDExICsxMDkwLDYgQEAKIAkJCQkJCQkgICAgICBidXMpLCBsZW4sCiAJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJfQotCi0JCS8qIGxpbWl0IHBvdGVudGlhbCBmb3IgbGl2ZWxvY2sgYnkgb25seSBoYW5kbGluZwotCQkgKiAyIGZ1bGwgdHggcmluZ3MgcGVyIGNhbGwgKi8KLQkJaWYgKHVubGlrZWx5KCsrbGltaXQgPiAyICogdHgtPm1hc2spKQotCQkJYnJlYWs7CiAJfQogCS8qIHN0YXJ0IHRoZSBxdWV1ZSBpZiB3ZSd2ZSBzdG9wcGVkIGl0ICovCiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobWdwLT5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggNThiYmZkZC4uYWZlZjZjMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTc5NiwxMiArNzk2LDE0IEBACiAJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAJaW50IGxzdF9zaXplLCBsc3RfcGVyX3BhZ2U7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IHBhZ2VfbnVtID0gMDsKIAogCWlmICghbmljKQogCQlyZXR1cm47CiAKKwlkZXYgPSBuaWMtPmRldjsKKwogCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CiAJY29uZmlnID0gJm5pYy0+Y29uZmlnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW52bmV0LmMgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NjdjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuYwpAQCAtMCwwICsxLDExNjQgQEAKKy8qIHN1bnZuZXQuYzogU3VuIExET00gVmlydHVhbCBOZXR3b3JrIERyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisKKyNpbmNsdWRlICJzdW52bmV0LmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkic3Vudm5ldCIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bmUgMjUsIDIwMDciCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuIExET00gdmlydHVhbCBuZXR3b3JrIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0ICovCitzdGF0aWMgc3RydWN0IHZpb192ZXJzaW9uIHZuZXRfdmVyc2lvbnNbXSA9IHsKKwl7IC5tYWpvciA9IDEsIC5taW5vciA9IDAgfSwKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZuZXRfdHhfZHJpbmdfYXZhaWwoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIpCit7CisJcmV0dXJuIHZpb19kcmluZ19hdmFpbChkciwgVk5FVF9UWF9SSU5HX1NJWkUpOworfQorCitzdGF0aWMgaW50IHZuZXRfaGFuZGxlX3Vua25vd24oc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aW9fbXNnX3RhZyAqcGt0ID0gYXJnOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUmVjZWl2ZWQgdW5rbm93biBtc2cgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCSAgICAgICBwa3QtPnR5cGUsIHBrdC0+c3R5cGUsIHBrdC0+c3R5cGVfZW52LCBwa3QtPnNpZCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUmVzZXR0aW5nIGNvbm5lY3Rpb24uXG4iKTsKKworCWxkY19kaXNjb25uZWN0KHBvcnQtPnZpby5scCk7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9zZW5kX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gdG9fdm5ldF9wb3J0KHZpbyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPnZwLT5kZXY7CisJc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvIHBrdDsKKwlpbnQgaTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJcGt0LnRhZy50eXBlID0gVklPX1RZUEVfQ1RSTDsKKwlwa3QudGFnLnN0eXBlID0gVklPX1NVQlRZUEVfSU5GTzsKKwlwa3QudGFnLnN0eXBlX2VudiA9IFZJT19BVFRSX0lORk87CisJcGt0LnRhZy5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKwlwa3QueGZlcl9tb2RlID0gVklPX0RSSU5HX01PREU7CisJcGt0LmFkZHJfdHlwZSA9IFZORVRfQUREUl9FVEhFUk1BQzsKKwlwa3QuYWNrX2ZyZXEgPSAwOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXBrdC5hZGRyIHw9ICh1NjQpZGV2LT5kZXZfYWRkcltpXSA8PCAoKDUgLSBpKSAqIDgpOworCXBrdC5tdHUgPSBFVEhfRlJBTUVfTEVOOworCisJdmlvZGJnKEhTLCAiU0VORCBORVQgQVRUUiB4bW9kZVsweCV4XSBhdHlwZVsweCV4XSBhZGRyWyVsbHhdICIKKwkgICAgICAgImFja2ZyZXFbJXVdIG10dVslbGx1XVxuIiwKKwkgICAgICAgcGt0LnhmZXJfbW9kZSwgcGt0LmFkZHJfdHlwZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LmFkZHIsCisJICAgICAgIHBrdC5hY2tfZnJlcSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0Lm10dSk7CisKKwlyZXR1cm4gdmlvX2xkY19zZW5kKHZpbywgJnBrdCwgc2l6ZW9mKHBrdCkpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hdHRyX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgTkVUIEFUVFIgSU5GTyB4bW9kZVsweCV4XSBhdHlwZVsweCV4XSBhZGRyWyVsbHhdICIKKwkgICAgICAgImFja2ZyZXFbJXVdIG10dVslbGx1XVxuIiwKKwkgICAgICAgcGt0LT54ZmVyX21vZGUsIHBrdC0+YWRkcl90eXBlLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QtPmFkZHIsCisJICAgICAgIHBrdC0+YWNrX2ZyZXEsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+bXR1KTsKKworCXBrdC0+dGFnLnNpZCA9IHZpb19zZW5kX3NpZCh2aW8pOworCisJaWYgKHBrdC0+eGZlcl9tb2RlICE9IFZJT19EUklOR19NT0RFIHx8CisJICAgIHBrdC0+YWRkcl90eXBlICE9IFZORVRfQUREUl9FVEhFUk1BQyB8fAorCSAgICBwa3QtPm10dSAhPSBFVEhfRlJBTUVfTEVOKSB7CisJCXZpb2RiZyhIUywgIlNFTkQgTkVUIEFUVFIgTkFDS1xuIik7CisKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCisJCSh2b2lkKSB2aW9fbGRjX3NlbmQodmlvLCBwa3QsIHNpemVvZigqcGt0KSk7CisKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCX0gZWxzZSB7CisJCXZpb2RiZyhIUywgIlNFTkQgTkVUIEFUVFIgQUNLXG4iKTsKKworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0FDSzsKKworCQlyZXR1cm4gdmlvX2xkY19zZW5kKHZpbywgcGt0LCBzaXplb2YoKnBrdCkpOworCX0KKworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hdHRyX2FjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIE5FVCBBVFRSIEFDS1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfYXR0cl9uYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIE5FVCBBVFRSIE5BQ0tcbiIpOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHZuZXRfaGFuZGxlX2F0dHIoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0ID0gYXJnOworCisJc3dpdGNoIChwa3QtPnRhZy5zdHlwZSkgeworCWNhc2UgVklPX1NVQlRZUEVfSU5GTzoKKwkJcmV0dXJuIGhhbmRsZV9hdHRyX2luZm8odmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9BQ0s6CisJCXJldHVybiBoYW5kbGVfYXR0cl9hY2sodmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9OQUNLOgorCQlyZXR1cm4gaGFuZGxlX2F0dHJfbmFjayh2aW8sIHBrdCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bmV0X2hhbmRzaGFrZV9jb21wbGV0ZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKwlkci0+c25kX254dCA9IGRyLT5yY3Zfbnh0ID0gMTsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJZHItPnNuZF9ueHQgPSBkci0+cmN2X254dCA9IDE7Cit9CisKKy8qIFRoZSBoeXBlcnZpc29yIGludGVyZmFjZSB0aGF0IGltcGxlbWVudHMgY29weWluZyB0by9mcm9tIGltcG9ydGVkCisgKiBtZW1vcnkgZnJvbSBhbm90aGVyIGRvbWFpbiByZXF1aXJlcyB0aGF0IGNvcGllcyBhcmUgZG9uZSB0byA4LWJ5dGUKKyAqIGFsaWduZWQgYnVmZmVycywgYW5kIHRoYXQgdGhlIGxlbmd0aHMgb2Ygc3VjaCBjb3BpZXMgYXJlIGFsc28gOC1ieXRlCisgKiBtdWx0aXBsZXMuCisgKgorICogU28gd2UgYWxpZ24gc2tiLT5kYXRhIHRvIGFuIDgtYnl0ZSBtdWx0aXBsZSBhbmQgcGFkLW91dCB0aGUgZGF0YQorICogYXJlYSBzbyB3ZSBjYW4gcm91bmQgdGhlIGNvcHkgbGVuZ3RoIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mCisgKiA4IGZvciB0aGUgY29weS4KKyAqCisgKiBUaGUgdHJhbnNtaXR0ZXIgcHV0cyB0aGUgYWN0dWFsIHN0YXJ0IG9mIHRoZSBwYWNrZXQgNiBieXRlcyBpbnRvCisgKiB0aGUgYnVmZmVyIGl0IHNlbmRzIG92ZXIsIHNvIHRoYXQgdGhlIElQIGhlYWRlcnMgYWZ0ZXIgdGhlIGV0aGVybmV0CisgKiBoZWFkZXIgYXJlIGFsaWduZWQgcHJvcGVybHkuICBUaGVzZSA2IGJ5dGVzIGFyZSBub3QgaW4gdGhlIGRlc2NyaXB0b3IKKyAqIGxlbmd0aCwgdGhleSBhcmUgc2ltcGx5IGltcGxpZWQuICBUaGlzIG9mZnNldCBpcyByZXByZXNlbnRlZCB1c2luZworICogdGhlIFZORVRfUEFDS0VUX1NLSVAgbWFjcm8uCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2NfYW5kX2FsaWduX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuK1ZORVRfUEFDS0VUX1NLSVArOCs4KTsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIG9mZjsKKworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKKwlvZmYgPSAoKGFkZHIgKyA3VUwpICYgfjdVTCkgLSBhZGRyOworCWlmIChvZmYpCisJCXNrYl9yZXNlcnZlKHNrYiwgb2ZmKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9yeF9vbmUoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPnZwLT5kZXY7CisJdW5zaWduZWQgaW50IGNvcHlfbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKworCWVyciA9IC1FTVNHU0laRTsKKwlpZiAodW5saWtlbHkobGVuIDwgRVRIX1pMRU4gfHwgbGVuID4gRVRIX0ZSQU1FX0xFTikpIHsKKwkJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWdvdG8gb3V0X2Ryb3BwZWQ7CisJfQorCisJc2tiID0gYWxsb2NfYW5kX2FsaWduX3NrYihkZXYsIGxlbik7CisJZXJyID0gLUVOT01FTTsKKwlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCWdvdG8gb3V0X2Ryb3BwZWQ7CisJfQorCisJY29weV9sZW4gPSAobGVuICsgVk5FVF9QQUNLRVRfU0tJUCArIDdVKSAmIH43VTsKKwlza2JfcHV0KHNrYiwgY29weV9sZW4pOworCWVyciA9IGxkY19jb3B5KHBvcnQtPnZpby5scCwgTERDX0NPUFlfSU4sCisJCSAgICAgICBza2ItPmRhdGEsIGNvcHlfbGVuLCAwLAorCQkgICAgICAgY29va2llcywgbmNvb2tpZXMpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlnb3RvIG91dF9mcmVlX3NrYjsKKwl9CisKKwlza2JfcHVsbChza2IsIFZORVRfUEFDS0VUX1NLSVApOworCXNrYl90cmltKHNrYiwgbGVuKTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwluZXRpZl9yeChza2IpOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3NrYjoKKwlrZnJlZV9za2Ioc2tiKTsKKworb3V0X2Ryb3BwZWQ6CisJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bmV0X3NlbmRfYWNrKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJIHUzMiBzdGFydCwgdTMyIGVuZCwgdTggdmlvX2RyaW5nX3N0YXRlKQoreworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSBoZHIgPSB7CisJCS50YWcgPSB7CisJCQkudHlwZQkJPSBWSU9fVFlQRV9EQVRBLAorCQkJLnN0eXBlCQk9IFZJT19TVUJUWVBFX0FDSywKKwkJCS5zdHlwZV9lbnYJPSBWSU9fRFJJTkdfREFUQSwKKwkJCS5zaWQJCT0gdmlvX3NlbmRfc2lkKCZwb3J0LT52aW8pLAorCQl9LAorCQkuZHJpbmdfaWRlbnQJCT0gZHItPmlkZW50LAorCQkuc3RhcnRfaWR4CQk9IHN0YXJ0LAorCQkuZW5kX2lkeAkJPSBlbmQsCisJCS5zdGF0ZQkJCT0gdmlvX2RyaW5nX3N0YXRlLAorCX07CisJaW50IGVyciwgZGVsYXk7CisKKwloZHIuc2VxID0gZHItPnNuZF9ueHQ7CisJZGVsYXkgPSAxOworCWRvIHsKKwkJZXJyID0gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZoZHIsIHNpemVvZihoZHIpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWRyLT5zbmRfbnh0Kys7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoZGVsYXkpOworCQlpZiAoKGRlbGF5IDw8PSAxKSA+IDEyOCkKKwkJCWRlbGF5ID0gMTI4OworCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1MzIgbmV4dF9pZHgodTMyIGlkeCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIpCit7CisJaWYgKCsraWR4ID09IGRyLT5udW1fZW50cmllcykKKwkJaWR4ID0gMDsKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgdTMyIHByZXZfaWR4KHUzMiBpZHgsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCWlmIChpZHggPT0gMCkKKwkJaWR4ID0gZHItPm51bV9lbnRyaWVzIC0gMTsKKwllbHNlCisJCWlkeC0tOworCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fbmV0X2Rlc2MgKmdldF9yeF9kZXNjKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsCisJCQkJCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJCQl1MzIgaW5kZXgpCit7CisJc3RydWN0IHZpb19uZXRfZGVzYyAqZGVzYyA9IHBvcnQtPnZpby5kZXNjX2J1ZjsKKwlpbnQgZXJyOworCisJZXJyID0gbGRjX2dldF9kcmluZ19lbnRyeShwb3J0LT52aW8ubHAsIGRlc2MsIGRyLT5lbnRyeV9zaXplLAorCQkJCSAgKGluZGV4ICogZHItPmVudHJ5X3NpemUpLAorCQkJCSAgZHItPmNvb2tpZXMsIGRyLT5uY29va2llcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwlyZXR1cm4gZGVzYzsKK30KKworc3RhdGljIGludCBwdXRfcnhfZGVzYyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LAorCQkgICAgICAgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCSAgICAgICBzdHJ1Y3QgdmlvX25ldF9kZXNjICpkZXNjLAorCQkgICAgICAgdTMyIGluZGV4KQoreworCWludCBlcnI7CisKKwllcnIgPSBsZGNfcHV0X2RyaW5nX2VudHJ5KHBvcnQtPnZpby5scCwgZGVzYywgZHItPmVudHJ5X3NpemUsCisJCQkJICAoaW5kZXggKiBkci0+ZW50cnlfc2l6ZSksCisJCQkJICBkci0+Y29va2llcywgZHItPm5jb29raWVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfd2Fsa19yeF9vbmUoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwKKwkJCSAgICBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCSAgICB1MzIgaW5kZXgsIGludCAqbmVlZHNfYWNrKQoreworCXN0cnVjdCB2aW9fbmV0X2Rlc2MgKmRlc2MgPSBnZXRfcnhfZGVzYyhwb3J0LCBkciwgaW5kZXgpOworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAmcG9ydC0+dmlvOworCWludCBlcnI7CisKKwlpZiAoSVNfRVJSKGRlc2MpKQorCQlyZXR1cm4gUFRSX0VSUihkZXNjKTsKKworCXZpb2RiZyhEQVRBLCAidmlvX3dhbGtfcnhfb25lIGRlc2NbJTAyeDolMDJ4OiUwOHg6JTA4eDolbHg6JWx4XVxuIiwKKwkgICAgICAgZGVzYy0+aGRyLnN0YXRlLCBkZXNjLT5oZHIuYWNrLAorCSAgICAgICBkZXNjLT5zaXplLCBkZXNjLT5uY29va2llcywKKwkgICAgICAgZGVzYy0+Y29va2llc1swXS5jb29raWVfYWRkciwKKwkgICAgICAgZGVzYy0+Y29va2llc1swXS5jb29raWVfc2l6ZSk7CisKKwlpZiAoZGVzYy0+aGRyLnN0YXRlICE9IFZJT19ERVNDX1JFQURZKQorCQlyZXR1cm4gMTsKKwllcnIgPSB2bmV0X3J4X29uZShwb3J0LCBkZXNjLT5zaXplLCBkZXNjLT5jb29raWVzLCBkZXNjLT5uY29va2llcyk7CisJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJcmV0dXJuIGVycjsKKwlkZXNjLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19ET05FOworCWVyciA9IHB1dF9yeF9kZXNjKHBvcnQsIGRyLCBkZXNjLCBpbmRleCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJKm5lZWRzX2FjayA9IGRlc2MtPmhkci5hY2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF93YWxrX3J4KHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJdTMyIHN0YXJ0LCB1MzIgZW5kKQoreworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAmcG9ydC0+dmlvOworCWludCBhY2tfc3RhcnQgPSAtMSwgYWNrX2VuZCA9IC0xOworCisJZW5kID0gKGVuZCA9PSAodTMyKSAtMSkgPyBwcmV2X2lkeChzdGFydCwgZHIpIDogbmV4dF9pZHgoZW5kLCBkcik7CisKKwl2aW9kYmcoREFUQSwgInZuZXRfd2Fsa19yeCBzdGFydFslMDh4XSBlbmRbJTA4eF1cbiIsIHN0YXJ0LCBlbmQpOworCisJd2hpbGUgKHN0YXJ0ICE9IGVuZCkgeworCQlpbnQgYWNrID0gMCwgZXJyID0gdm5ldF93YWxrX3J4X29uZShwb3J0LCBkciwgc3RhcnQsICZhY2spOworCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGVyciAhPSAwKQorCQkJYnJlYWs7CisJCWlmIChhY2tfc3RhcnQgPT0gLTEpCisJCQlhY2tfc3RhcnQgPSBzdGFydDsKKwkJYWNrX2VuZCA9IHN0YXJ0OworCQlzdGFydCA9IG5leHRfaWR4KHN0YXJ0LCBkcik7CisJCWlmIChhY2sgJiYgc3RhcnQgIT0gZW5kKSB7CisJCQllcnIgPSB2bmV0X3NlbmRfYWNrKHBvcnQsIGRyLCBhY2tfc3RhcnQsIGFja19lbmQsCisJCQkJCSAgICBWSU9fRFJJTkdfQUNUSVZFKTsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJcmV0dXJuIGVycjsKKwkJCWFja19zdGFydCA9IC0xOworCQl9CisJfQorCWlmICh1bmxpa2VseShhY2tfc3RhcnQgPT0gLTEpKQorCQlhY2tfc3RhcnQgPSBhY2tfZW5kID0gcHJldl9pZHgoc3RhcnQsIGRyKTsKKwlyZXR1cm4gdm5ldF9zZW5kX2Fjayhwb3J0LCBkciwgYWNrX3N0YXJ0LCBhY2tfZW5kLCBWSU9fRFJJTkdfU1RPUFBFRCk7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9yeChzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJc3RydWN0IHZpb19kcmluZ19kYXRhICpwa3QgPSBtc2didWY7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAmcG9ydC0+dmlvOworCisJdmlvZGJnKERBVEEsICJ2bmV0X3J4IHN0eXBlX2VudlslMDR4XSBzZXFbJTAxNmx4XSByY3Zfbnh0WyUwMTZseF1cbiIsCisJICAgICAgIHBrdC0+dGFnLnN0eXBlX2VudiwgcGt0LT5zZXEsIGRyLT5yY3Zfbnh0KTsKKworCWlmICh1bmxpa2VseShwa3QtPnRhZy5zdHlwZV9lbnYgIT0gVklPX0RSSU5HX0RBVEEpKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkocGt0LT5zZXEgIT0gZHItPnJjdl9ueHQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJYIG91dCBvZiBzZXF1ZW5jZSBzZXFbMHglbHhdICIKKwkJICAgICAgICJyY3Zfbnh0WzB4JWx4XVxuIiwgcGt0LT5zZXEsIGRyLT5yY3Zfbnh0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZHItPnJjdl9ueHQrKzsKKworCS8qIFhYWCBWYWxpZGF0ZSBwa3QtPnN0YXJ0X2lkeCBhbmQgcGt0LT5lbmRfaWR4IFhYWCAqLworCisJcmV0dXJuIHZuZXRfd2Fsa19yeChwb3J0LCBkciwgcGt0LT5zdGFydF9pZHgsIHBrdC0+ZW5kX2lkeCk7Cit9CisKK3N0YXRpYyBpbnQgaWR4X2lzX3BlbmRpbmcoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsIHUzMiBlbmQpCit7CisJdTMyIGlkeCA9IGRyLT5jb25zOworCWludCBmb3VuZCA9IDA7CisKKwl3aGlsZSAoaWR4ICE9IGRyLT5wcm9kKSB7CisJCWlmIChpZHggPT0gZW5kKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZHggPSBuZXh0X2lkeChpZHgsIGRyKTsKKwl9CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50IHZuZXRfYWNrKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJc3RydWN0IHZpb19kcmluZ19kYXRhICpwa3QgPSBtc2didWY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgdm5ldCAqdnA7CisJdTMyIGVuZDsKKworCWlmICh1bmxpa2VseShwa3QtPnRhZy5zdHlwZV9lbnYgIT0gVklPX0RSSU5HX0RBVEEpKQorCQlyZXR1cm4gMDsKKworCWVuZCA9IHBrdC0+ZW5kX2lkeDsKKwlpZiAodW5saWtlbHkoIWlkeF9pc19wZW5kaW5nKGRyLCBlbmQpKSkKKwkJcmV0dXJuIDA7CisKKwlkci0+Y29ucyA9IG5leHRfaWR4KGVuZCwgZHIpOworCisJdnAgPSBwb3J0LT52cDsKKwlkZXYgPSB2cC0+ZGV2OworCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJICAgICB2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA+PSBWTkVUX1RYX1dBS0VVUF9USFJFU0goZHIpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X25hY2soc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCS8qIFhYWCBqdXN0IHJlc2V0IG9yIHNpbWlsYXIgWFhYICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3R4X3dha2V1cChzdHJ1Y3Qgdm5ldCAqdnApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZwLT5kZXY7CisKKwluZXRpZl90eF9sb2NrKGRldik7CisJaWYgKGxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKSB7CisJCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQ7CisJCWludCB3YWtlID0gMTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZ2cC0+cG9ydF9saXN0LCBsaXN0KSB7CisJCQlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKworCQkJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCQkJaWYgKHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpIDwKKwkJCSAgICBWTkVUX1RYX1dBS0VVUF9USFJFU0goZHIpKSB7CisJCQkJd2FrZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHdha2UpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCW5ldGlmX3R4X3VubG9jayhkZXYpOworfQorCitzdGF0aWMgdm9pZCB2bmV0X2V2ZW50KHZvaWQgKmFyZywgaW50IGV2ZW50KQoreworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQgPSBhcmc7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdHhfd2FrZXVwLCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkoZXZlbnQgPT0gTERDX0VWRU5UX1JFU0VUIHx8CisJCSAgICAgZXZlbnQgPT0gTERDX0VWRU5UX1VQKSkgeworCQl2aW9fbGlua19zdGF0ZV9jaGFuZ2UodmlvLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworCisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoZXZlbnQgIT0gTERDX0VWRU5UX0RBVEFfUkVBRFkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmV4cGVjdGVkIExEQyBldmVudCAlZFxuIiwgZXZlbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXR4X3dha2V1cCA9IGVyciA9IDA7CisJd2hpbGUgKDEpIHsKKwkJdW5pb24geworCQkJc3RydWN0IHZpb19tc2dfdGFnIHRhZzsKKwkJCXU2NCByYXdbOF07CisJCX0gbXNnYnVmOworCisJCWVyciA9IGxkY19yZWFkKHZpby0+bHAsICZtc2didWYsIHNpemVvZihtc2didWYpKTsKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJCXZpb19jb25uX3Jlc2V0KHZpbyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKwkJdmlvZGJnKERBVEEsICJUQUcgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCQkgICAgICAgbXNnYnVmLnRhZy50eXBlLAorCQkgICAgICAgbXNnYnVmLnRhZy5zdHlwZSwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc3R5cGVfZW52LAorCQkgICAgICAgbXNnYnVmLnRhZy5zaWQpOworCQllcnIgPSB2aW9fdmFsaWRhdGVfc2lkKHZpbywgJm1zZ2J1Zi50YWcpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCWlmIChsaWtlbHkobXNnYnVmLnRhZy50eXBlID09IFZJT19UWVBFX0RBVEEpKSB7CisJCQlpZiAobXNnYnVmLnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9JTkZPKSB7CisJCQkJZXJyID0gdm5ldF9yeChwb3J0LCAmbXNnYnVmKTsKKwkJCX0gZWxzZSBpZiAobXNnYnVmLnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9BQ0spIHsKKwkJCQllcnIgPSB2bmV0X2Fjayhwb3J0LCAmbXNnYnVmKTsKKwkJCQlpZiAoZXJyID4gMCkKKwkJCQkJdHhfd2FrZXVwIHw9IGVycjsKKwkJCX0gZWxzZSBpZiAobXNnYnVmLnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9OQUNLKSB7CisJCQkJZXJyID0gdm5ldF9uYWNrKHBvcnQsICZtc2didWYpOworCQkJfQorCQl9IGVsc2UgaWYgKG1zZ2J1Zi50YWcudHlwZSA9PSBWSU9fVFlQRV9DVFJMKSB7CisJCQllcnIgPSB2aW9fY29udHJvbF9wa3RfZW5naW5lKHZpbywgJm1zZ2J1Zik7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZXJyID0gdm5ldF9oYW5kbGVfdW5rbm93bihwb3J0LCAmbXNnYnVmKTsKKwkJfQorCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZ2aW8tPmxvY2spOworCWlmICh1bmxpa2VseSh0eF93YWtldXAgJiYgZXJyICE9IC1FQ09OTlJFU0VUKSkKKwkJbWF5YmVfdHhfd2FrZXVwKHBvcnQtPnZwKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX192bmV0X3R4X3RyaWdnZXIoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJc3RydWN0IHZpb19kcmluZ19kYXRhIGhkciA9IHsKKwkJLnRhZyA9IHsKKwkJCS50eXBlCQk9IFZJT19UWVBFX0RBVEEsCisJCQkuc3R5cGUJCT0gVklPX1NVQlRZUEVfSU5GTywKKwkJCS5zdHlwZV9lbnYJPSBWSU9fRFJJTkdfREFUQSwKKwkJCS5zaWQJCT0gdmlvX3NlbmRfc2lkKCZwb3J0LT52aW8pLAorCQl9LAorCQkuZHJpbmdfaWRlbnQJCT0gZHItPmlkZW50LAorCQkuc3RhcnRfaWR4CQk9IGRyLT5wcm9kLAorCQkuZW5kX2lkeAkJPSAodTMyKSAtMSwKKwl9OworCWludCBlcnIsIGRlbGF5OworCisJaGRyLnNlcSA9IGRyLT5zbmRfbnh0OworCWRlbGF5ID0gMTsKKwlkbyB7CisJCWVyciA9IHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJCWlmIChlcnIgPiAwKSB7CisJCQlkci0+c25kX254dCsrOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KGRlbGF5KTsKKwkJaWYgKChkZWxheSA8PD0gMSkgPiAxMjgpCisJCQlkZWxheSA9IDEyODsKKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3Qgdm5ldF9wb3J0ICpfX3R4X3BvcnRfZmluZChzdHJ1Y3Qgdm5ldCAqdnAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGhhc2ggPSB2bmV0X2hhc2hmbihza2ItPmRhdGEpOworCXN0cnVjdCBobGlzdF9oZWFkICpocCA9ICZ2cC0+cG9ydF9oYXNoW2hhc2hdOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQ7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCBuLCBocCwgaGFzaCkgeworCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwb3J0LT5yYWRkciwgc2tiLT5kYXRhKSkKKwkJCXJldHVybiBwb3J0OworCX0KKwlwb3J0ID0gTlVMTDsKKwlpZiAoIWxpc3RfZW1wdHkoJnZwLT5wb3J0X2xpc3QpKQorCQlwb3J0ID0gbGlzdF9lbnRyeSh2cC0+cG9ydF9saXN0Lm5leHQsIHN0cnVjdCB2bmV0X3BvcnQsIGxpc3QpOworCisJcmV0dXJuIHBvcnQ7Cit9CisKK3N0cnVjdCB2bmV0X3BvcnQgKnR4X3BvcnRfZmluZChzdHJ1Y3Qgdm5ldCAqdnAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBfX3R4X3BvcnRfZmluZCh2cCwgc2tiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm5ldCAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQgPSB0eF9wb3J0X2ZpbmQodnAsIHNrYik7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisJc3RydWN0IHZpb19uZXRfZGVzYyAqZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBsZW47CisJdm9pZCAqdHhfYnVmOworCWludCBpLCBlcnI7CisKKwlpZiAodW5saWtlbHkoIXBvcnQpKQorCQlnb3RvIG91dF9kcm9wcGVkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisKKwlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJaWYgKHVubGlrZWx5KHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpIDwgMikpIHsKKwkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkJLyogVGhpcyBpcyBhIGhhcmQgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuICIKKwkJCSAgICAgICAicXVldWUgYXdha2UhXG4iLCBkZXYtPm5hbWUpOworCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJZCA9IHZpb19kcmluZ19jdXIoZHIpOworCisJdHhfYnVmID0gcG9ydC0+dHhfYnVmc1tkci0+cHJvZF0uYnVmOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0eF9idWYgKyBWTkVUX1BBQ0tFVF9TS0lQLCBza2ItPmxlbik7CisKKwlsZW4gPSBza2ItPmxlbjsKKwlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJbGVuID0gRVRIX1pMRU47CisJCW1lbXNldCh0eF9idWYrVk5FVF9QQUNLRVRfU0tJUCtza2ItPmxlbiwgMCwgbGVuIC0gc2tiLT5sZW4pOworCX0KKworCWQtPmhkci5hY2sgPSBWSU9fQUNLX0VOQUJMRTsKKwlkLT5zaXplID0gbGVuOworCWQtPm5jb29raWVzID0gcG9ydC0+dHhfYnVmc1tkci0+cHJvZF0ubmNvb2tpZXM7CisJZm9yIChpID0gMDsgaSA8IGQtPm5jb29raWVzOyBpKyspCisJCWQtPmNvb2tpZXNbaV0gPSBwb3J0LT50eF9idWZzW2RyLT5wcm9kXS5jb29raWVzW2ldOworCisJLyogVGhpcyBoYXMgdG8gYmUgYSBub24tU01QIHdyaXRlIGJhcnJpZXIgYmVjYXVzZSB3ZSBhcmUgd3JpdGluZworCSAqIHRvIG1lbW9yeSB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgcGVlciBMRE9NLgorCSAqLworCXdtYigpOworCisJZC0+aGRyLnN0YXRlID0gVklPX0RFU0NfUkVBRFk7CisKKwllcnIgPSBfX3ZuZXRfdHhfdHJpZ2dlcihwb3J0KTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBUWCB0cmlnZ2VyIGVycm9yICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlkLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19GUkVFOworCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWdvdG8gb3V0X2Ryb3BwZWRfdW5sb2NrOworCX0KKworCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlkci0+cHJvZCA9IChkci0+cHJvZCArIDEpICYgKFZORVRfVFhfUklOR19TSVpFIC0gMSk7CisJaWYgKHVubGlrZWx5KHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpIDwgMikpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlpZiAodm5ldF90eF9kcmluZ19hdmFpbChkcikgPiBWTkVUX1RYX1dBS0VVUF9USFJFU0goZHIpKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitvdXRfZHJvcHBlZF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworb3V0X2Ryb3BwZWQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFhYWCBJbXBsZW1lbnQgbWUgWFhYICovCit9CisKK3N0YXRpYyBpbnQgdm5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm5ldF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFhYWCBJbXBsZW1lbnQgbXVsdGljYXN0IHN1cHBvcnQgWFhYICovCit9CisKK3N0YXRpYyBpbnQgdm5ldF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1ICE9IEVUSF9EQVRBX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgdm5ldF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTik7Cit9CisKK3N0YXRpYyB1MzIgdm5ldF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm5ldCAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiB2cC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgdm5ldF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCB2bmV0ICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdnAtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB2bmV0X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSB2bmV0X2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJCT0gdm5ldF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSB2bmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3Blcm1fYWRkcgkJPSBldGh0b29sX29wX2dldF9wZXJtX2FkZHIsCit9OworCitzdGF0aWMgdm9pZCB2bmV0X3BvcnRfZnJlZV90eF9idWZzKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisJaW50IGk7CisKKwlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJaWYgKGRyLT5iYXNlKSB7CisJCWxkY19mcmVlX2V4cF9kcmluZyhwb3J0LT52aW8ubHAsIGRyLT5iYXNlLAorCQkJCSAgIChkci0+ZW50cnlfc2l6ZSAqIGRyLT5udW1fZW50cmllcyksCisJCQkJICAgZHItPmNvb2tpZXMsIGRyLT5uY29va2llcyk7CisJCWRyLT5iYXNlID0gTlVMTDsKKwkJZHItPmVudHJ5X3NpemUgPSAwOworCQlkci0+bnVtX2VudHJpZXMgPSAwOworCQlkci0+cGVuZGluZyA9IDA7CisJCWRyLT5uY29va2llcyA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFZORVRfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdm9pZCAqYnVmID0gcG9ydC0+dHhfYnVmc1tpXS5idWY7CisKKwkJaWYgKCFidWYpCisJCQljb250aW51ZTsKKworCQlsZGNfdW5tYXAocG9ydC0+dmlvLmxwLAorCQkJICBwb3J0LT50eF9idWZzW2ldLmNvb2tpZXMsCisJCQkgIHBvcnQtPnR4X2J1ZnNbaV0ubmNvb2tpZXMpOworCisJCWtmcmVlKGJ1Zik7CisJCXBvcnQtPnR4X2J1ZnNbaV0uYnVmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZuZXRfcG9ydF9hbGxvY190eF9idWZzKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJaW50IGksIGVyciwgbmNvb2tpZXM7CisJdm9pZCAqZHJpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgVk5FVF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQl2b2lkICpidWYgPSBremFsbG9jKEVUSF9GUkFNRV9MRU4gKyA4LCBHRlBfS0VSTkVMKTsKKwkJaW50IG1hcF9sZW4gPSAoRVRIX0ZSQU1FX0xFTiArIDcpICYgfjc7CisKKwkJZXJyID0gLUVOT01FTTsKKwkJaWYgKCFidWYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVFggYnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKWJ1ZiAmICg4VUwgLSAxKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUWCBidWZmZXIgbWlzYWxpZ25lZFxuIik7CisJCQlrZnJlZShidWYpOworCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJZXJyID0gbGRjX21hcF9zaW5nbGUocG9ydC0+dmlvLmxwLCBidWYsIG1hcF9sZW4sCisJCQkJICAgICBwb3J0LT50eF9idWZzW2ldLmNvb2tpZXMsIDIsCisJCQkJICAgICAoTERDX01BUF9TSEFET1cgfAorCQkJCSAgICAgIExEQ19NQVBfRElSRUNUIHwKKwkJCQkgICAgICBMRENfTUFQX1JXKSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShidWYpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCXBvcnQtPnR4X2J1ZnNbaV0uYnVmID0gYnVmOworCQlwb3J0LT50eF9idWZzW2ldLm5jb29raWVzID0gZXJyOworCX0KKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKworCWxlbiA9IChWTkVUX1RYX1JJTkdfU0laRSAqCisJICAgICAgIChzaXplb2Yoc3RydWN0IHZpb19uZXRfZGVzYykgKworCQkoc2l6ZW9mKHN0cnVjdCBsZGNfdHJhbnNfY29va2llKSAqIDIpKSk7CisKKwluY29va2llcyA9IFZJT19NQVhfUklOR19DT09LSUVTOworCWRyaW5nID0gbGRjX2FsbG9jX2V4cF9kcmluZyhwb3J0LT52aW8ubHAsIGxlbiwKKwkJCQkgICAgZHItPmNvb2tpZXMsICZuY29va2llcywKKwkJCQkgICAgKExEQ19NQVBfU0hBRE9XIHwKKwkJCQkgICAgIExEQ19NQVBfRElSRUNUIHwKKwkJCQkgICAgIExEQ19NQVBfUlcpKTsKKwlpZiAoSVNfRVJSKGRyaW5nKSkgeworCQllcnIgPSBQVFJfRVJSKGRyaW5nKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWRyLT5iYXNlID0gZHJpbmc7CisJZHItPmVudHJ5X3NpemUgPSAoc2l6ZW9mKHN0cnVjdCB2aW9fbmV0X2Rlc2MpICsKKwkJCSAgKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKiAyKSk7CisJZHItPm51bV9lbnRyaWVzID0gVk5FVF9UWF9SSU5HX1NJWkU7CisJZHItPnByb2QgPSBkci0+Y29ucyA9IDA7CisJZHItPnBlbmRpbmcgPSBWTkVUX1RYX1JJTkdfU0laRTsKKwlkci0+bmNvb2tpZXMgPSBuY29va2llczsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCXZuZXRfcG9ydF9mcmVlX3R4X2J1ZnMocG9ydCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyB2bmV0X2xkY19jZmcgPSB7CisJLmV2ZW50CQk9IHZuZXRfZXZlbnQsCisJLm10dQkJPSA2NCwKKwkubW9kZQkJPSBMRENfTU9ERV9VTlJFTElBQkxFLAorfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyX29wcyB2bmV0X3Zpb19vcHMgPSB7CisJLnNlbmRfYXR0cgkJPSB2bmV0X3NlbmRfYXR0ciwKKwkuaGFuZGxlX2F0dHIJCT0gdm5ldF9oYW5kbGVfYXR0ciwKKwkuaGFuZHNoYWtlX2NvbXBsZXRlCT0gdm5ldF9oYW5kc2hha2VfY29tcGxldGUsCit9OworCitjb25zdCBjaGFyICpyZW1vdGVfbWFjYWRkcl9wcm9wID0gInJlbW90ZS1tYWMtYWRkcmVzcyI7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZuZXRfcG9ydF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZuZXQgKnZwOworCWNvbnN0IHU2NCAqcm1hYzsKKwlpbnQgbGVuLCBpLCBlcnIsIHN3aXRjaF9wb3J0OworCisJdnAgPSBkZXZfZ2V0X2RydmRhdGEodmRldi0+ZGV2LnBhcmVudCk7CisJaWYgKCF2cCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBwb3J0IHBhcmVudCB2bmV0LlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhwID0gbWRlc2NfZ3JhYigpOworCisJcm1hYyA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdmRldi0+bXAsIHJlbW90ZV9tYWNhZGRyX3Byb3AsICZsZW4pOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFybWFjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlBvcnQgbGFja3MgJXMgcHJvcGVydHkuXG4iLAorCQkgICAgICAgcmVtb3RlX21hY2FkZHJfcHJvcCk7CisJCWdvdG8gZXJyX291dF9wdXRfbWRlc2M7CisJfQorCisJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKCpwb3J0KSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXBvcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIHZuZXRfcG9ydC5cbiIpOworCQlnb3RvIGVycl9vdXRfcHV0X21kZXNjOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlwb3J0LT5yYWRkcltpXSA9ICgqcm1hYyA+PiAoNSAtIGkpICogOCkgJiAweGZmOworCisJcG9ydC0+dnAgPSB2cDsKKworCWVyciA9IHZpb19kcml2ZXJfaW5pdCgmcG9ydC0+dmlvLCB2ZGV2LCBWREVWX05FVFdPUkssCisJCQkgICAgICB2bmV0X3ZlcnNpb25zLCBBUlJBWV9TSVpFKHZuZXRfdmVyc2lvbnMpLAorCQkJICAgICAgJnZuZXRfdmlvX29wcywgdnAtPmRldi0+bmFtZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcG9ydDsKKworCWVyciA9IHZpb19sZGNfYWxsb2MoJnBvcnQtPnZpbywgJnZuZXRfbGRjX2NmZywgcG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcG9ydDsKKworCWVyciA9IHZuZXRfcG9ydF9hbGxvY190eF9idWZzKHBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX2xkYzsKKworCUlOSVRfSExJU1RfTk9ERSgmcG9ydC0+aGFzaCk7CisJSU5JVF9MSVNUX0hFQUQoJnBvcnQtPmxpc3QpOworCisJc3dpdGNoX3BvcnQgPSAwOworCWlmIChtZGVzY19nZXRfcHJvcGVydHkoaHAsIHZkZXYtPm1wLCAic3dpdGNoLXBvcnQiLCBOVUxMKSAhPSBOVUxMKQorCQlzd2l0Y2hfcG9ydCA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc3dpdGNoX3BvcnQpCisJCWxpc3RfYWRkKCZwb3J0LT5saXN0LCAmdnAtPnBvcnRfbGlzdCk7CisJZWxzZQorCQlsaXN0X2FkZF90YWlsKCZwb3J0LT5saXN0LCAmdnAtPnBvcnRfbGlzdCk7CisJaGxpc3RfYWRkX2hlYWQoJnBvcnQtPmhhc2gsICZ2cC0+cG9ydF9oYXNoW3ZuZXRfaGFzaGZuKHBvcnQtPnJhZGRyKV0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgcG9ydCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogUE9SVCAoIHJlbW90ZS1tYWMgIiwgdnAtPmRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgcG9ydC0+cmFkZHJbaV0sIGkgPT0gNSA/ICcgJyA6ICc6Jyk7CisJaWYgKHN3aXRjaF9wb3J0KQorCQlwcmludGsoInN3aXRjaC1wb3J0ICIpOworCXByaW50aygiKVxuIik7CisKKwl2aW9fcG9ydF91cCgmcG9ydC0+dmlvKTsKKworCW1kZXNjX3JlbGVhc2UoaHApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9sZGM6CisJdmlvX2xkY19mcmVlKCZwb3J0LT52aW8pOworCitlcnJfb3V0X2ZyZWVfcG9ydDoKKwlrZnJlZShwb3J0KTsKKworZXJyX291dF9wdXRfbWRlc2M6CisJbWRlc2NfcmVsZWFzZShocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bmV0X3BvcnRfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlpZiAocG9ydCkgeworCQlzdHJ1Y3Qgdm5ldCAqdnAgPSBwb3J0LT52cDsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlkZWxfdGltZXJfc3luYygmcG9ydC0+dmlvLnRpbWVyKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9kZWwoJnBvcnQtPmxpc3QpOworCQlobGlzdF9kZWwoJnBvcnQtPmhhc2gpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJCXZuZXRfcG9ydF9mcmVlX3R4X2J1ZnMocG9ydCk7CisJCXZpb19sZGNfZnJlZSgmcG9ydC0+dmlvKTsKKworCQlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgTlVMTCk7CisKKwkJa2ZyZWUocG9ydCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdm5ldF9wb3J0X21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJ2bmV0LXBvcnQiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZuZXRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgdm5ldF9wb3J0X2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSB2bmV0X3BvcnRfbWF0Y2gsCisJLnByb2JlCQk9IHZuZXRfcG9ydF9wcm9iZSwKKwkucmVtb3ZlCQk9IHZuZXRfcG9ydF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInZuZXRfcG9ydCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK2NvbnN0IGNoYXIgKmxvY2FsX21hY19wcm9wID0gImxvY2FsLW1hYy1hZGRyZXNzIjsKKworc3RhdGljIGludCBfX2RldmluaXQgdm5ldF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RhdGljIGludCB2bmV0X3ZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB2bmV0ICp2cDsKKwljb25zdCB1NjQgKm1hYzsKKwlpbnQgZXJyLCBpLCBsZW47CisKKwlpZiAodm5ldF92ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJaHAgPSBtZGVzY19ncmFiKCk7CisKKwltYWMgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHZkZXYtPm1wLCBsb2NhbF9tYWNfcHJvcCwgJmxlbik7CisJaWYgKCFtYWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidm5ldCBsYWNrcyAlcyBwcm9wZXJ0eS5cbiIsCisJCSAgICAgICBsb2NhbF9tYWNfcHJvcCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnZwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSAoKm1hYyA+PiAoNSAtIGkpICogOCkgJiAweGZmOworCisJbWVtY3B5KGRldi0+cGVybV9hZGRyLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKworCVNFVF9ORVRERVZfREVWKGRldiwgJnZkZXYtPmRldik7CisKKwl2cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmdnAtPmxvY2spOworCXZwLT5kZXYgPSBkZXY7CisJdnAtPnZkZXYgPSB2ZGV2OworCisJSU5JVF9MSVNUX0hFQUQoJnZwLT5wb3J0X2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBWTkVUX1BPUlRfSEFTSF9TSVpFOyBpKyspCisJCUlOSVRfSExJU1RfSEVBRCgmdnAtPnBvcnRfaGFzaFtpXSk7CisKKwlkZXYtPm9wZW4gPSB2bmV0X29wZW47CisJZGV2LT5zdG9wID0gdm5ldF9jbG9zZTsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHZuZXRfc2V0X3J4X21vZGU7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSB2bmV0X3NldF9tYWNfYWRkcjsKKwlkZXYtPnR4X3RpbWVvdXQgPSB2bmV0X3R4X3RpbWVvdXQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZ2bmV0X2V0aHRvb2xfb3BzOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBWTkVUX1RYX1RJTUVPVVQ7CisJZGV2LT5jaGFuZ2VfbXR1ID0gdm5ldF9jaGFuZ2VfbXR1OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdm5ldF9zdGFydF94bWl0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU3VuIExET00gdm5ldCAiLCBkZXYtPm5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgdnApOworCisJbWRlc2NfcmVsZWFzZShocCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCitlcnJfb3V0OgorCW1kZXNjX3JlbGVhc2UoaHApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisKKwlzdHJ1Y3Qgdm5ldCAqdnAgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlpZiAodnApIHsKKwkJLyogWFhYIHVucmVnaXN0ZXIgcG9ydCwgb3IgYXQgbGVhc3QgY2hlY2sgWFhYICovCisJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHZwLT5kZXYpOworCQlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdm5ldF9tYXRjaFtdID0geworCXsKKwkJLnR5cGUgPSAibmV0d29yayIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgdm5ldF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2bmV0X2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSB2bmV0X21hdGNoLAorCS5wcm9iZQkJPSB2bmV0X3Byb2JlLAorCS5yZW1vdmUJCT0gdm5ldF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInZuZXQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCB2bmV0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmdm5ldF9kcml2ZXIpOworCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmdm5ldF9wb3J0X2RyaXZlcik7CisJCWlmIChlcnIpCisJCQl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfZHJpdmVyKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdm5ldF9leGl0KHZvaWQpCit7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X3BvcnRfZHJpdmVyKTsKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodm5ldF9pbml0KTsKK21vZHVsZV9leGl0KHZuZXRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW52bmV0LmggYi9kcml2ZXJzL25ldC9zdW52bmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4ODczMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuaApAQCAtMCwwICsxLDcwIEBACisjaWZuZGVmIF9TVU5WTkVUX0gKKyNkZWZpbmUgX1NVTlZORVRfSAorCisjZGVmaW5lIERFU0NfTkNPT0tJRVMoZW50cnlfc2l6ZSkJXAorCSgoZW50cnlfc2l6ZSkgLSBzaXplb2Yoc3RydWN0IHZpb19uZXRfZGVzYykpCisKKy8qIGxlbmd0aCBvZiB0aW1lIGJlZm9yZSB3ZSBkZWNpZGUgdGhlIGhhcmR3YXJlIGlzIGJvcmtlZCwKKyAqIGFuZCBkZXYtPnR4X3RpbWVvdXQoKSBzaG91bGQgYmUgY2FsbGVkIHRvIGZpeCB0aGUgcHJvYmxlbQorICovCisjZGVmaW5lIFZORVRfVFhfVElNRU9VVAkJCSg1ICogSFopCisKKyNkZWZpbmUgVk5FVF9UWF9SSU5HX1NJWkUJCTUxMgorI2RlZmluZSBWTkVUX1RYX1dBS0VVUF9USFJFU0goZHIpCSgoZHIpLT5wZW5kaW5nIC8gNCkKKworLyogVk5FVCBwYWNrZXRzIGFyZSBzZW50IGluIGJ1ZmZlcnMgd2l0aCB0aGUgZmlyc3QgNiBieXRlcyBza2lwcGVkCisgKiBzbyB0aGF0IGFmdGVyIHRoZSBldGhlcm5ldCBoZWFkZXIgdGhlIElQdjQvSVB2NiBoZWFkZXJzIGFyZSBhbGlnbmVkCisgKiBwcm9wZXJseS4KKyAqLworI2RlZmluZSBWTkVUX1BBQ0tFVF9TS0lQCQk2CisKK3N0cnVjdCB2bmV0X3R4X2VudHJ5IHsKKwl2b2lkCQkJKmJ1ZjsKKwl1bnNpZ25lZCBpbnQJCW5jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMl07Cit9OworCitzdHJ1Y3Qgdm5ldDsKK3N0cnVjdCB2bmV0X3BvcnQgeworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlCXZpbzsKKworCXN0cnVjdCBobGlzdF9ub2RlCWhhc2g7CisJdTgJCQlyYWRkcltFVEhfQUxFTl07CisKKwlzdHJ1Y3Qgdm5ldAkJKnZwOworCisJc3RydWN0IHZuZXRfdHhfZW50cnkJdHhfYnVmc1tWTkVUX1RYX1JJTkdfU0laRV07CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2bmV0X3BvcnQgKnRvX3ZuZXRfcG9ydChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXJldHVybiBjb250YWluZXJfb2YodmlvLCBzdHJ1Y3Qgdm5ldF9wb3J0LCB2aW8pOworfQorCisjZGVmaW5lIFZORVRfUE9SVF9IQVNIX1NJWkUJMTYKKyNkZWZpbmUgVk5FVF9QT1JUX0hBU0hfTUFTSwkoVk5FVF9QT1JUX0hBU0hfU0laRSAtIDEpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZuZXRfaGFzaGZuKHU4ICptYWMpCit7CisJdW5zaWduZWQgaW50IHZhbCA9IG1hY1s0XSBeIG1hY1s1XTsKKworCXJldHVybiB2YWwgJiAoVk5FVF9QT1JUX0hBU0hfTUFTSyk7Cit9CisKK3N0cnVjdCB2bmV0IHsKKwkvKiBQcm90ZWN0cyBwb3J0X2xpc3QgYW5kIHBvcnRfaGFzaC4gICovCisJc3BpbmxvY2tfdAkJbG9jazsKKworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisKKwl1MzIJCQltc2dfZW5hYmxlOworCXN0cnVjdCB2aW9fZGV2CQkqdmRldjsKKworCXN0cnVjdCBsaXN0X2hlYWQJcG9ydF9saXN0OworCisJc3RydWN0IGhsaXN0X2hlYWQJcG9ydF9oYXNoW1ZORVRfUE9SVF9IQVNIX1NJWkVdOworfTsKKworI2VuZGlmIC8qIF9TVU5WTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfc3Vic2V0LmMgYi9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jCmluZGV4IGJjNjJiMDEuLjk0Mzk4OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfc3Vic2V0LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYwpAQCAtMzA1LDYgKzMwNSw5IEBACiAJVVNCX0RFVklDRSAoMHg4MDg2LCAweDA3ZDMpLAkvLyAiYmxvYiIgYm9vdGxvYWRlcgogCS5kcml2ZXJfaW5mbyA9CSh1bnNpZ25lZCBsb25nKSAmYmxvYl9pbmZvLAogfSwgeworCVVTQl9ERVZJQ0UgKDB4MTI4NiwgMHg4MDAxKSwgICAgLy8gImJsb2IiIGJvb3Rsb2FkZXIKKwkuZHJpdmVyX2luZm8gPSAgKHVuc2lnbmVkIGxvbmcpICZibG9iX2luZm8sCit9LCB7CiAJLy8gTGludXggRXRoZXJuZXQvUk5ESVMgZ2FkZ2V0IG9uIHB4YTIxMC8yNXgvMjZ4LCBzZWNvbmQgY29uZmlnCiAJLy8gZS5nLiBHdW1zdGl4LCBjdXJyZW50IE9wZW5aYXVydXMsIC4uLgogCVVTQl9ERVZJQ0VfVkVSICgweDA1MjUsIDB4YTRhMiwgMHgwMjAzLCAweDAyMDMpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwppbmRleCA0ZmM4NjgxLi5hM2RmMDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwpAQCAtNjEsNyArNjEsNyBAQAogIwogY29uZmlnIExBTk1FRElBCiAJdHJpc3RhdGUgIkxhbk1lZGlhIENvcnAuIFNTSS9WLjM1LCBUMS9FMSwgSFNTSSwgVDMgYm9hcmRzIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAktLS1oZWxwLS0tCiAJICBEcml2ZXIgZm9yIHRoZSBmb2xsb3dpbmcgTGFuIE1lZGlhIGZhbWlseSBvZiBzZXJpYWwgYm9hcmRzOgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggMmQzYTE4MC4uZWUxY2MxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtNTIsNiArNTIsOCBAQAogCiAjaW5jbHVkZSAiYWlyby5oIgogCisjZGVmaW5lIERSVl9OQU1FICJhaXJvIgorCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNhcmRfaWRzW10gPSB7CiAJeyAweDE0YjksIDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCkBAIC03MSw3ICs3Myw3IEBACiBzdGF0aWMgaW50IGFpcm9fcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhaXJvX2RyaXZlciA9IHsKLQkubmFtZSAgICAgPSAiYWlybyIsCisJLm5hbWUgICAgID0gRFJWX05BTUUsCiAJLmlkX3RhYmxlID0gY2FyZF9pZHMsCiAJLnByb2JlICAgID0gYWlyb19wY2lfcHJvYmUsCiAJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYWlyb19wY2lfcmVtb3ZlKSwKQEAgLTEwOTIsNyArMTA5NCw3IEBACiBzdGF0aWMgdm9pZCBPVVQ0NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByZWdpc3RlciwgdTE2IHZhbHVlICk7CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgSU40NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByZWdpc3RlciApOwogc3RhdGljIHUxNiBzZXR1cF9jYXJkKHN0cnVjdCBhaXJvX2luZm8qLCB1OCAqbWFjLCBpbnQgbG9jayk7Ci1zdGF0aWMgaW50IGVuYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBSZXNwICpyc3AsIGludCBsb2NrICk7CitzdGF0aWMgaW50IGVuYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKTsKIHN0YXRpYyB2b2lkIGRpc2FibGVfTUFDKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jayk7CiBzdGF0aWMgdm9pZCBlbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgYWlyb19pbmZvKik7CiBzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGFpcm9faW5mbyopOwpAQCAtMTI1MCw3ICsxMjUyLDcgQEAKIHN0YXRpYyBpbnQgZmxhc2hyZXN0YXJ0KHN0cnVjdCBhaXJvX2luZm8gKmFpLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAjZGVmaW5lIGFpcm9fcHJpbnQodHlwZSwgbmFtZSwgZm10LCBhcmdzLi4uKSBcCi0JeyBwcmludGsodHlwZSAiYWlybyglcyk6ICIgZm10ICJcbiIsIG5hbWUsICMjYXJncyk7IH0KKwlwcmludGsodHlwZSBEUlZfTkFNRSAiKCVzKTogIiBmbXQgIlxuIiwgbmFtZSwgIyNhcmdzKQogCiAjZGVmaW5lIGFpcm9fcHJpbnRfaW5mbyhuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKIAlhaXJvX3ByaW50KEtFUk5fSU5GTywgbmFtZSwgZm10LCAjI2FyZ3MpCkBAIC0xOTI2LDI4ICsxOTI4LDU0IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGFpcm9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0Jc3RydWN0IGFpcm9faW5mbyAqaW5mbyA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKK3N0YXRpYyB2b2lkIHRyeV9hdXRvX3dlcChzdHJ1Y3QgYWlyb19pbmZvICphaSkKK3sKKwlpZiAoYXV0b193ZXAgJiYgIShhaS0+ZmxhZ3MgJiBGTEFHX1JBRElPX0RPV04pKSB7CisJCWFpLT5leHBpcmVzID0gUlVOX0FUKDMqSFopOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFpLT50aHJfd2FpdCk7CisJfQorfQogCi0JaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZpbmZvLT5mbGFncykpCitzdGF0aWMgaW50IGFpcm9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IHJjID0gMDsKKworCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiBNYWtlIHN1cmUgdGhlIGNhcmQgaXMgY29uZmlndXJlZC4KIAkgKiBXaXJlbGVzcyBFeHRlbnNpb25zIG1heSBwb3N0cG9uZSBjb25maWcgY2hhbmdlcyB1bnRpbCB0aGUgY2FyZAogCSAqIGlzIG9wZW4gKHRvIHBpcGVsaW5lIGNoYW5nZXMgYW5kIHNwZWVkLXVwIGNhcmQgc2V0dXApLiBJZgogCSAqIHRob3NlIGNoYW5nZXMgYXJlIG5vdCB5ZXQgY29tbWl0ZWQsIGRvIGl0IG5vdyAtIEplYW4gSUkgKi8KLQlpZiAodGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmaW5mby0+ZmxhZ3MpKSB7Ci0JCWRpc2FibGVfTUFDKGluZm8sIDEpOwotCQl3cml0ZUNvbmZpZ1JpZChpbmZvLCAxKTsKKwlpZiAodGVzdF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpKSB7CisJCWRpc2FibGVfTUFDKGFpLCAxKTsKKwkJd3JpdGVDb25maWdSaWQoYWksIDEpOwogCX0KIAotCWlmIChpbmZvLT53aWZpZGV2ICE9IGRldikgeworCWlmIChhaS0+d2lmaWRldiAhPSBkZXYpIHsKKwkJY2xlYXJfYml0KEpPQl9ESUUsICZhaS0+am9icyk7CisJCWFpLT5haXJvX3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oYWlyb190aHJlYWQsIGRldiwgZGV2LT5uYW1lKTsKKwkJaWYgKElTX0VSUihhaS0+YWlyb190aHJlYWRfdGFzaykpCisJCQlyZXR1cm4gKGludClQVFJfRVJSKGFpLT5haXJvX3RocmVhZF90YXNrKTsKKworCQlyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBhaXJvX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQlkZXYtPm5hbWUsIGRldik7CisJCWlmIChyYykgeworCQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLAorCQkJCSJyZWdpc3RlciBpbnRlcnJ1cHQgJWQgZmFpbGVkLCByYyAlZCIsCisJCQkJZGV2LT5pcnEsIHJjKTsKKwkJCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKKwkJCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwogCQkvKiBQb3dlciBvbiB0aGUgTUFDIGNvbnRyb2xsZXIgKHdoaWNoIG1heSBoYXZlIGJlZW4gZGlzYWJsZWQpICovCi0JCWNsZWFyX2JpdChGTEFHX1JBRElPX0RPV04sICZpbmZvLT5mbGFncyk7Ci0JCWVuYWJsZV9pbnRlcnJ1cHRzKGluZm8pOworCQljbGVhcl9iaXQoRkxBR19SQURJT19ET1dOLCAmYWktPmZsYWdzKTsKKwkJZW5hYmxlX2ludGVycnVwdHMoYWkpOworCisJCXRyeV9hdXRvX3dlcChhaSk7CiAJfQotCWVuYWJsZV9NQUMoaW5mbywgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCXJldHVybiAwOwpAQCAtMjMzOCwxNCArMjM2NiwxMyBAQAogewogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7Ci0JUmVzcCByc3A7CiAKIAlyZWFkQ29uZmlnUmlkKGFpLCAxKTsKIAltZW1jcHkgKGFpLT5jb25maWcubWFjQWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CiAJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOwogCWRpc2FibGVfTUFDKGFpLCAxKTsKIAl3cml0ZUNvbmZpZ1JpZCAoYWksIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogCW1lbWNweSAoYWktPmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwogCWlmIChhaS0+d2lmaWRldikKIAkJbWVtY3B5IChhaS0+d2lmaWRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwpAQCAtMjM5Miw2ICsyNDE5LDExIEBACiAJCWRpc2FibGVfTUFDKGFpLCAxKTsKICNlbmRpZgogCQlkaXNhYmxlX2ludGVycnVwdHMoIGFpICk7CisKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkJc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOworCQlrdGhyZWFkX3N0b3AoYWktPmFpcm9fdGhyZWFkX3Rhc2spOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI0MDMsNyArMjQzNSw2IEBACiAJc2V0X2JpdChGTEFHX1JBRElPX0RPV04sICZhaS0+ZmxhZ3MpOwogCWRpc2FibGVfTUFDKGFpLCAxKTsKIAlkaXNhYmxlX2ludGVycnVwdHMoYWkpOwotCWZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7CiAJdGFrZWRvd25fcHJvY19lbnRyeSggZGV2LCBhaSApOwogCWlmICh0ZXN0X2JpdChGTEFHX1JFR0lTVEVSRUQsICZhaS0+ZmxhZ3MpKSB7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKQEAgLTI0MTQsOSArMjQ0NSw2IEBACiAJCX0KIAkJY2xlYXJfYml0KEZMQUdfUkVHSVNURVJFRCwgJmFpLT5mbGFncyk7CiAJfQotCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKLQlrdGhyZWFkX3N0b3AoYWktPmFpcm9fdGhyZWFkX3Rhc2spOwotCiAJLyoKIAkgKiBDbGVhbiBvdXQgdHggcXVldWUKIAkgKi8KQEAgLTI1NTQsOCArMjU4Miw3IEBACiAgKiAyKSBNYXAgUENJIG1lbW9yeSBmb3IgaXNzdWVpbmcgY29tbWFuZHMuCiAgKiAzKSBBbGxvY2F0ZSBtZW1vcnkgKHNoYXJlZCkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBldGhlcm5ldCBmcmFtZXMuCiAgKi8KLXN0YXRpYyBpbnQgbXBpX21hcF9jYXJkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBzdHJ1Y3QgcGNpX2RldiAqcGNpLAotCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgbXBpX21hcF9jYXJkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewogCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0LCBtZW1fbGVuLCBhdXhfc3RhcnQsIGF1eF9sZW47CiAJaW50IHJjID0gLTE7CkBAIC0yNTY5LDM1ICsyNTk2LDM1IEBACiAJYXV4X3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CiAJYXV4X2xlbiA9IEFVWE1FTVNJWkU7CiAKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4sIG5hbWUpKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuLCBEUlZfTkFNRSkpIHsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSIsCisJCQkoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGF1eF9zdGFydCwgYXV4X2xlbiwgbmFtZSkpIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIGZvciAlcyIsCi0JCSAgICAgICAoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuLCBuYW1lKTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4sIERSVl9OQU1FKSkgeworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIiwKKwkJCShpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4pOwogCQlnb3RvIGZyZWVfcmVnaW9uMTsKIAl9CiAKIAlhaS0+cGNpbWVtID0gaW9yZW1hcChtZW1fc3RhcnQsIG1lbV9sZW4pOwogCWlmICghYWktPnBjaW1lbSkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4sIG5hbWUpOworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIiwKKwkJCShpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4pOwogCQlnb3RvIGZyZWVfcmVnaW9uMjsKIAl9CiAJYWktPnBjaWF1eCA9IGlvcmVtYXAoYXV4X3N0YXJ0LCBhdXhfbGVuKTsKIAlpZiAoIWFpLT5wY2lhdXgpIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIGZvciAlcyIsCi0JCSAgICAgICAoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuLCBuYW1lKTsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSIsCisJCQkoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuKTsKIAkJZ290byBmcmVlX21lbW1hcDsKIAl9CiAKIAkvKiBSZXNlcnZlIFBLVFNJWkUgZm9yIGVhY2ggZmlkIGFuZCAySyBmb3IgdGhlIFJpZHMgKi8KIAlhaS0+c2hhcmVkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpLCBQQ0lfU0hBUkVEX0xFTiwgJmFpLT5zaGFyZWRfZG1hKTsKIAlpZiAoIWFpLT5zaGFyZWQpIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IGFsbG9jX2NvbnNpc3RlbnQgJWQiLAotCQkgICAgICAgUENJX1NIQVJFRF9MRU4pOworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGFsbG9jX2NvbnNpc3RlbnQgJWQiLAorCQkJUENJX1NIQVJFRF9MRU4pOwogCQlnb3RvIGZyZWVfYXV4bWFwOwogCX0KIApAQCAtMjc0Miw3ICsyNzY5LDcgQEAKIAkgICAga3phbGxvYyhBSVJPX01BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKEJTU0xpc3RFbGVtZW50KSwKIAkJICAgIEdGUF9LRVJORUwpOwogCWlmICghYWktPm5ldHdvcmtzKSB7Ci0JCWFpcm9fcHJpbnRfd2FybihhaS0+ZGV2LT5uYW1lLCAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnMiKTsKKwkJYWlyb19wcmludF93YXJuKCIiLCAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnMiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNzcwLDcgKzI3OTcsNiBAQAogewogCWludCBzdGF0dXM7CiAJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBhaS0+ZGV2LT5uYW1lOwogCiAJc3RhdHVzID0gcmVhZENhcGFiaWxpdHlSaWQoYWksICZjYXBfcmlkLCAxKTsKIAlpZiAoc3RhdHVzICE9IFNVQ0NFU1MpIHJldHVybiAwOwpAQCAtMjc3OCwxMiArMjgwNCwxMiBAQAogCS8qIE9ubHkgZmlybXdhcmUgdmVyc2lvbnMgNS4zMC4xNyBvciBiZXR0ZXIgY2FuIGRvIFdQQSAqLwogCWlmICgoY2FwX3JpZC5zb2Z0VmVyID4gMHg1MzApCiAJICB8fCAoKGNhcF9yaWQuc29mdFZlciA9PSAweDUzMCkgJiYgKGNhcF9yaWQuc29mdFN1YlZlciA+PSAxNykpKSB7Ci0JCWFpcm9fcHJpbnRfaW5mbyhuYW1lLCAiV1BBIGlzIHN1cHBvcnRlZC4iKTsKKwkJYWlyb19wcmludF9pbmZvKCIiLCAiV1BBIGlzIHN1cHBvcnRlZC4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJLyogTm8gV1BBIHN1cHBvcnQgKi8KLQlhaXJvX3ByaW50X2luZm8obmFtZSwgIldQQSB1bnN1cHBvcnRlZCAob25seSBmaXJtd2FyZSB2ZXJzaW9ucyA1LjMwLjE3IgorCWFpcm9fcHJpbnRfaW5mbygiIiwgIldQQSB1bnN1cHBvcnRlZCAob25seSBmaXJtd2FyZSB2ZXJzaW9ucyA1LjMwLjE3IgogCQkiIGFuZCBncmVhdGVyIHN1cHBvcnQgV1BBLiAgRGV0ZWN0ZWQgJXMpIiwgY2FwX3JpZC5wcm9kVmVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI3OTcsMjMgKzI4MjMsMTkgQEAKIAlpbnQgaSwgcmM7CiAKIAkvKiBDcmVhdGUgdGhlIG5ldHdvcmsgZGV2aWNlIG9iamVjdC4gKi8KLSAgICAgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCphaSkpOwotICAgICAgICBpZiAoIWRldikgeworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKmFpKSwgIiIsIGV0aGVyX3NldHVwKTsKKwlpZiAoIWRldikgewogCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGFsbG9jX2V0aGVyZGV2Iik7CiAJCXJldHVybiBOVUxMOwotICAgICAgICB9Ci0JaWYgKGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDApIHsKLQkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBnZXQgbmFtZSEiKTsKLQkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQogCiAJYWkgPSBkZXYtPnByaXY7CiAJYWktPndpZmlkZXYgPSBOVUxMOwotCWFpLT5mbGFncyA9IDA7CisJYWktPmZsYWdzID0gMSA8PCBGTEFHX1JBRElPX0RPV047CiAJYWktPmpvYnMgPSAwOwogCWFpLT5kZXYgPSBkZXY7CiAJaWYgKHBjaSAmJiAocGNpLT5kZXZpY2UgPT0gMHg1MDAwIHx8IHBjaS0+ZGV2aWNlID09IDB4YTUwNCkpIHsKLQkJYWlyb19wcmludF9kYmcoZGV2LT5uYW1lLCAiRm91bmQgYW4gTVBJMzUwIGNhcmQiKTsKKwkJYWlyb19wcmludF9kYmcoIiIsICJGb3VuZCBhbiBNUEkzNTAgY2FyZCIpOwogCQlzZXRfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKTsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJmFpLT5hdXhfbG9jayk7CkBAIC0yODIxLDE0ICsyODQzLDExIEBACiAJYWktPmNvbmZpZy5sZW4gPSAwOwogCWFpLT5wY2kgPSBwY2k7CiAJaW5pdF93YWl0cXVldWVfaGVhZCAoJmFpLT50aHJfd2FpdCk7Ci0JYWktPmFpcm9fdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihhaXJvX3RocmVhZCwgZGV2LCBkZXYtPm5hbWUpOwotCWlmIChJU19FUlIoYWktPmFpcm9fdGhyZWFkX3Rhc2spKQotCQlnb3RvIGVycl9vdXRfZnJlZTsKIAlhaS0+dGZtID0gTlVMTDsKIAlhZGRfYWlyb19kZXYoYWkpOwogCiAJaWYgKGFpcm9fbmV0d29ya3NfYWxsb2NhdGUgKGFpKSkKLQkJZ290byBlcnJfb3V0X3RocjsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CiAJYWlyb19uZXR3b3Jrc19pbml0aWFsaXplIChhaSk7CiAKIAkvKiBUaGUgQWlyby1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwpAQCAtMjg1MSwyNyArMjg3MCwyMiBAQAogCWRldi0+YmFzZV9hZGRyID0gcG9ydDsKIAogCVNFVF9ORVRERVZfREVWKGRldiwgZG1kZXYpOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAogCXJlc2V0X2NhcmQgKGRldiwgMSk7CiAJbXNsZWVwKDQwMCk7CiAKLQlyYyA9IHJlcXVlc3RfaXJxKCBkZXYtPmlycSwgYWlyb19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldiApOwotCWlmIChyYykgewotCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJyZWdpc3RlciBpbnRlcnJ1cHQgJWQgZmFpbGVkLCByYyAlZCIsCi0JCQkJaXJxLCByYyk7Ci0JCWdvdG8gZXJyX291dF9uZXRzOwotCX0KIAlpZiAoIWlzX3BjbWNpYSkgewotCQlpZiAoIXJlcXVlc3RfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQsIGRldi0+bmFtZSApKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDY0LCBEUlZfTkFNRSkpIHsKIAkJCXJjID0gLUVCVVNZOwogCQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAiQ291bGRuJ3QgcmVxdWVzdCByZWdpb24iKTsKLQkJCWdvdG8gZXJyX291dF9pcnE7CisJCQlnb3RvIGVycl9vdXRfbmV0czsKIAkJfQogCX0KIAogCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgewotCQlpZiAobXBpX21hcF9jYXJkKGFpLCBwY2ksIGRldi0+bmFtZSkpIHsKLQkJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgIkNvdWxkIG5vdCBtYXAgbWVtb3J5Iik7CisJCWlmIChtcGlfbWFwX2NhcmQoYWksIHBjaSkpIHsKKwkJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGQgbm90IG1hcCBtZW1vcnkiKTsKIAkJCWdvdG8gZXJyX291dF9yZXM7CiAJCX0KIAl9CkBAIC0yODk5LDYgKzI5MTMsNyBAQAogCQlhaS0+YnNzTGlzdFJpZExlbiA9IHNpemVvZihCU1NMaXN0UmlkKSAtIHNpemVvZihCU1NMaXN0UmlkRXh0cmEpOwogCX0KIAorCXN0cmNweShkZXYtPm5hbWUsICJldGglZCIpOwogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKHJjKSB7CiAJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgIkNvdWxkbid0IHJlZ2lzdGVyX25ldGRldiIpOwpAQCAtMjkyMSw4ICsyOTM2LDYgQEAKIAlpZiAoc2V0dXBfcHJvY19lbnRyeShkZXYsIGRldi0+cHJpdikgPCAwKQogCQlnb3RvIGVycl9vdXRfd2lmaTsKIAotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JU0VUX01PRFVMRV9PV05FUihkZXYpOwogCXJldHVybiBkZXY7CiAKIGVycl9vdXRfd2lmaToKQEAgLTI5NDAsMTQgKzI5NTMsOSBAQAogZXJyX291dF9yZXM6CiAJaWYgKCFpc19wY21jaWEpCiAJICAgICAgICByZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0ICk7Ci1lcnJfb3V0X2lycToKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIGVycl9vdXRfbmV0czoKIAlhaXJvX25ldHdvcmtzX2ZyZWUoYWkpOwotZXJyX291dF90aHI6CiAJZGVsX2Fpcm9fZGV2KGFpKTsKLQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7Ci0Ja3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKIGVycl9vdXRfZnJlZToKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBOVUxMOwpAQCAtMzA3OCw3ICszMDg2LDggQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlpbnQgbG9ja2VkOwotCQorCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlKDEpIHsKIAkJLyogbWFrZSBzd3N1c3AgaGFwcHkgd2l0aCBvdXIgdGhyZWFkICovCiAJCXRyeV90b19mcmVlemUoKTsKQEAgLTM1MjksOSArMzUzOCwxMSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApIHsKK3N0YXRpYyBpbnQgZW5hYmxlX01BQyhzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2spCit7CiAJaW50IHJjOwotICAgICAgICBDbWQgY21kOworCUNtZCBjbWQ7CisJUmVzcCByc3A7CiAKIAkvKiBGTEFHX1JBRElPX09GRiA6IFJhZGlvIGRpc2FibGVkIHZpYSAvcHJvYyBvciBXaXJlbGVzcyBFeHRlbnNpb25zCiAJICogRkxBR19SQURJT19ET1dOIDogUmFkaW8gZGlzYWJsZWQgdmlhICJpZmNvbmZpZyBldGhYIGRvd24iCkBAIC0zNTQ3LDcgKzM1NTgsNyBAQAogCWlmICghdGVzdF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKSkgewogCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCQljbWQuY21kID0gTUFDX0VOQUJMRTsKLQkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsIHJzcCk7CisJCXJjID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKIAkJaWYgKHJjID09IFNVQ0NFU1MpCiAJCQlzZXRfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncyk7CiAJfSBlbHNlCkBAIC0zNTU3LDggKzM1NjgsMTIgQEAKIAkgICAgdXAoJmFpLT5zZW0pOwogCiAJaWYgKHJjKQotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiJXM6IENhbm5vdCBlbmFibGUgTUFDLCBlcnI9JWQiLAotCQkJX19GVU5DVElPTl9fLCByYyk7CisJCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDYW5ub3QgZW5hYmxlIE1BQyIpOworCWVsc2UgaWYgKChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSB7CisJCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJCYWQgTUFDIGVuYWJsZSByZWFzb249JXgsICIKKwkJCSJyaWQ9JXgsIG9mZnNldD0lZCIsIHJzcC5yc3AwLCByc3AucnNwMSwgcnNwLnJzcDIpOworCQlyYyA9IEVSUk9SOworCX0KIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTM5MDIsMTIgKzM5MTcsOSBAQAogCQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTICkgcmV0dXJuIEVSUk9SOwogCX0KIAotCXN0YXR1cyA9IGVuYWJsZV9NQUMoYWksICZyc3AsIGxvY2spOwotCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgfHwgKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkJhZCBNQUMgZW5hYmxlIHJlYXNvbiA9ICV4LCByaWQgPSAleCwiCi0JCQkiIG9mZnNldCA9ICVkIiwgcnNwLnJzcDAsIHJzcC5yc3AxLCByc3AucnNwMiApOworCXN0YXR1cyA9IGVuYWJsZV9NQUMoYWksIGxvY2spOworCWlmIChzdGF0dXMgIT0gU1VDQ0VTUykKIAkJcmV0dXJuIEVSUk9SOwotCX0KIAogCS8qIEdyYWIgdGhlIGluaXRpYWwgd2VwIGtleSwgd2UgZ290dGEgc2F2ZSBpdCBmb3IgYXV0b193ZXAgKi8KIAlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDEsIGxvY2spOwpAQCAtMzkxOSwxMCArMzkzMSw3IEBACiAJCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMCwgbG9jayk7CiAJfSB3aGlsZShsYXN0aW5kZXggIT0gd2tyLmtpbmRleCk7CiAKLQlpZiAoYXV0b193ZXApIHsKLQkJYWktPmV4cGlyZXMgPSBSVU5fQVQoMypIWik7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWktPnRocl93YWl0KTsKLQl9CisJdHJ5X2F1dG9fd2VwKGFpKTsKIAogCXJldHVybiBTVUNDRVNTOwogfQpAQCAtNDAwNCw3ICs0MDEzLDcgQEAKIAkJfQogCQlpZiAoICEobWF4X3RyaWVzLS0pICkgewogCQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwKLQkJCQkiYWlybzogQkFQIHNldHVwIGVycm9yIHRvbyBtYW55IHJldHJpZXNcbiIpOworCQkJCSJCQVAgc2V0dXAgZXJyb3IgdG9vIG1hbnkgcmV0cmllc1xuIik7CiAJCQlyZXR1cm4gRVJST1I7CiAJCX0KIAkJLy8gLS0gUEM0NTAwIG1pc3NlZCBpdCwgdHJ5IGFnYWluCkBAIC01MTUyLDcgKzUxNjEsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlTc2lkUmlkIFNTSURfcmlkOwotCVJlc3AgcnNwOwogCWludCBpOwogCWludCBvZmZzZXQgPSAwOwogCkBAIC01MTc3LDcgKzUxODUsNyBAQAogCQlTU0lEX3JpZC5sZW4gPSBzaXplb2YoU1NJRF9yaWQpOwogCWRpc2FibGVfTUFDKGFpLCAxKTsKIAl3cml0ZVNzaWRSaWQoYWksICZTU0lEX3JpZCwgMSk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggaGV4VmFsKGNoYXIgYykgewpAQCAtNTE5Myw3ICs1MjAxLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJQVBMaXN0UmlkIEFQTGlzdF9yaWQ7Ci0JUmVzcCByc3A7CiAJaW50IGk7CiAKIAlpZiAoICFkYXRhLT53cml0ZWxlbiApIHJldHVybjsKQEAgLTUyMTgsMTggKzUyMjUsMTcgQEAKIAl9CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXdyaXRlQVBMaXN0UmlkKGFpLCAmQVBMaXN0X3JpZCwgMSk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gd3JhcHMgUEM0NTAwX3dyaXRlcmlkIHdpdGggYSBNQUMgZGlzYWJsZSAqLwogc3RhdGljIGludCBkb193cml0ZXJpZCggc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByaWQsIGNvbnN0IHZvaWQgKnJpZF9kYXRhLAogCQkJaW50IGxlbiwgaW50IGR1bW15ICkgewogCWludCByYzsKLQlSZXNwIHJzcDsKIAogCWRpc2FibGVfTUFDKGFpLCAxKTsKIAlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgcmlkLCByaWRfZGF0YSwgbGVuLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTUyNjAsNyArNTI2Niw2IEBACiAJCSAgICAgICBjb25zdCBjaGFyICprZXksIHUxNiBrZXlsZW4sIGludCBwZXJtLCBpbnQgbG9jayApIHsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYWNhZGRyW0VUSF9BTEVOXSA9IHsgMHgwMSwgMCwgMCwgMCwgMCwgMCB9OwogCVdlcEtleVJpZCB3a3I7Ci0JUmVzcCByc3A7CiAKIAltZW1zZXQoJndrciwgMCwgc2l6ZW9mKHdrcikpOwogCWlmIChrZXlsZW4gPT0gMCkgewpAQCAtNTI4MCw3ICs1Mjg1LDcgQEAKIAogCWlmIChwZXJtKSBkaXNhYmxlX01BQyhhaSwgbG9jayk7CiAJd3JpdGVXZXBLZXlSaWQoYWksICZ3a3IsIHBlcm0sIGxvY2spOwotCWlmIChwZXJtKSBlbmFibGVfTUFDKGFpLCAmcnNwLCBsb2NrKTsKKwlpZiAocGVybSkgZW5hYmxlX01BQyhhaSwgbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU1NDgsNyArNTU1Myw2IEBACiAgICBjaGFuZ2VkLiAqLwogc3RhdGljIHZvaWQgdGltZXJfZnVuYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAogLyogV2UgZG9uJ3QgaGF2ZSBhIGxpbmsgc28gdHJ5IGNoYW5naW5nIHRoZSBhdXRodHlwZSAqLwogCXJlYWRDb25maWdSaWQoYXByaXYsIDApOwpAQCAtNTU3NSw3ICs1NTc5LDcgQEAKIAl9CiAJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhcHJpdi0+ZmxhZ3MpOwogCXdyaXRlQ29uZmlnUmlkKGFwcml2LCAwKTsKLQllbmFibGVfTUFDKGFwcml2LCAmcnNwLCAwKTsKKwllbmFibGVfTUFDKGFwcml2LCAwKTsKIAl1cCgmYXByaXYtPnNlbSk7CiAKIC8qIFNjaGVkdWxlIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2hhbmdlIHdvcmtlZCAqLwpAQCAtNTU5Nyw4ICs1NjAxLDEwIEBACiAJCQlkZXYgPSBfaW5pdF9haXJvX2NhcmQocGRldi0+aXJxLCBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMCwgcGRldiwgJnBkZXYtPmRldik7CiAJZWxzZQogCQkJZGV2ID0gX2luaXRfYWlyb19jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMl0uc3RhcnQsIDAsIHBkZXYsICZwZGV2LT5kZXYpOwotCWlmICghZGV2KQorCWlmICghZGV2KSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAJcmV0dXJuIDA7CkBAIC01NjEwLDYgKzU2MTYsOCBAQAogCiAJYWlyb19wcmludF9pbmZvKGRldi0+bmFtZSwgIlVucmVnaXN0ZXJpbmcuLi4iKTsKIAlzdG9wX2Fpcm9fY2FyZChkZXYsIDEpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgYWlyb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpAQCAtNTY0Niw3ICs1NjU0LDYgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCXBjaV9wb3dlcl90IHByZXZfc3RhdGUgPSBwZGV2LT5jdXJyZW50X3N0YXRlOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwpAQCAtNTY3OSw3ICs1Njg2LDcgQEAKIAkJYWktPkFQTGlzdCA9IE5VTEw7CiAJfQogCXdyaXRlQ29uZmlnUmlkKGFpLCAwKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAwKTsKKwllbmFibGVfTUFDKGFpLCAwKTsKIAlhaS0+cG93ZXIgPSBQTVNHX09OOwogCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CkBAIC01OTAzLDcgKzU5MTAsNiBAQAogCQkJICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAlTc2lkUmlkIFNTSURfcmlkOwkJLyogU1NJRHMgKi8KIAogCS8qIFJlbG9hZCB0aGUgbGlzdCBvZiBjdXJyZW50IFNTSUQgKi8KQEAgLTU5MzUsNyArNTk0MSw3IEBACiAJLyogV3JpdGUgaXQgdG8gdGhlIGNhcmQgKi8KIAlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CiAJd3JpdGVTc2lkUmlkKGxvY2FsLCAmU1NJRF9yaWQsIDEpOwotCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDEpOworCWVuYWJsZV9NQUMobG9jYWwsIDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDAwLDcgKzYwMDYsNyBAQAogCQltZW1jcHkoQVBMaXN0X3JpZC5hcFswXSwgYXdycS0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCQlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CiAJCXdyaXRlQVBMaXN0UmlkKGxvY2FsLCAmQVBMaXN0X3JpZCwgMSk7Ci0JCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDEpOworCQllbmFibGVfTUFDKGxvY2FsLCAxKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC03NDU0LDcgKzc0NjAsNiBAQAogCQkJICAgICAgY2hhciAqZXh0cmEpCQkJLyogTlVMTCAqLwogewogCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCiAJaWYgKCF0ZXN0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKQEAgLTc0NzksNyArNzQ4NCw3IEBACiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbG9jYWwtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJd3JpdGVDb25maWdSaWQobG9jYWwsIDApOwotCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDApOworCWVuYWJsZV9NQUMobG9jYWwsIDApOwogCWlmICh0ZXN0X2JpdCAoRkxBR19SRVNFVCwgJmxvY2FsLT5mbGFncykpCiAJCWFpcm9fc2V0X3Byb21pc2MobG9jYWwpOwogCWVsc2UKQEAgLTc3NDYsNyArNzc1MSw2IEBACiAJdW5zaWduZWQgY2hhciAqaW9idWY7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAogCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkKIAkJcmV0dXJuIC1FSU87CkBAIC03NzU4LDcgKzc3NjIsNyBAQAogCQlpZiAodGVzdF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpKSB7CiAJCQlkaXNhYmxlX01BQyAoYWksIDEpOwogCQkJd3JpdGVDb25maWdSaWQgKGFpLCAxKTsKLQkJCWVuYWJsZV9NQUMgKGFpLCAmcnNwLCAxKTsKKwkJCWVuYWJsZV9NQUMoYWksIDEpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQUlST0dTTElTVDogICAgcmlkY29kZSA9IFJJRF9TU0lEOyAgICAgICAgIGJyZWFrOwpAQCAtNzgxNSw3ICs3ODE5LDYgQEAKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlpbnQgIHJpZGNvZGU7CiAgICAgICAgIGludCAgZW5hYmxlZDsKLQlSZXNwICAgICAgcnNwOwogCXN0YXRpYyBpbnQgKCogd3JpdGVyKShzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByaWQsIGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwogCXVuc2lnbmVkIGNoYXIgKmlvYnVmOwogCkBAIC03ODQ5LDcgKzc4NTIsNyBAQAogCQkgKiBzYW1lIHdpdGggTUFDIG9mZgogCQkgKi8KIAljYXNlIEFJUk9QTUFDT046Ci0JCWlmIChlbmFibGVfTUFDKGFpLCAmcnNwLCAxKSAhPSAwKQorCQlpZiAoZW5hYmxlX01BQyhhaSwgMSkgIT0gMCkKIAkJCXJldHVybiAtRUlPOwogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCmluZGV4IGQ1MWRhZjguLjA3MmVkZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKQEAgLTE3NjgsNyArMTc2OCw4IEBACiAKIAkJaWYgKHByaXYtPnN0b3BfcmZfa2lsbCkgewogCQkJcHJpdi0+c3RvcF9yZl9raWxsID0gMDsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKKwkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCQl9CiAKIAkJZGVmZXJyZWQgPSAxOwpAQCAtMjA5OCw3ICsyMDk5LDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhlIFJGIEtpbGwgY2hlY2sgdGltZXIgaXMgcnVubmluZyAqLwogCXByaXYtPnN0b3BfcmZfa2lsbCA9IDA7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7Ci0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgcm91bmRfamlmZmllcyhIWikpOwogfQogCiBzdGF0aWMgdm9pZCBpc3Jfc2Nhbl9jb21wbGV0ZShzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LCB1MzIgc3RhdHVzKQpAQCAtNDIzMyw3ICs0MjM0LDggQEAKIAkJCS8qIE1ha2Ugc3VyZSB0aGUgUkZfS0lMTCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCiAJCQlwcml2LT5zdG9wX3JmX2tpbGwgPSAwOwogCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgSFopOworCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsCisJCQkJCSAgIHJvdW5kX2ppZmZpZXMoSFopKTsKIAkJfSBlbHNlCiAJCQlzY2hlZHVsZV9yZXNldChwcml2KTsKIAl9CkBAIC01OTY5LDcgKzU5NzEsOCBAQAogCWlmIChyZl9raWxsX2FjdGl2ZShwcml2KSkgewogCQlJUFdfREVCVUdfUkZfS0lMTCgiUkYgS2lsbCBhY3RpdmUsIHJlc2NoZWR1bGluZyBHUElPIGNoZWNrXG4iKTsKIAkJaWYgKCFwcml2LT5zdG9wX3JmX2tpbGwpCi0JCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgSFopOworCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsCisJCQkJCSAgIHJvdW5kX2ppZmZpZXMoSFopKTsKIAkJZ290byBleGl0X3VubG9jazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwppbmRleCA3Y2IyMDUyLi5hYTMyYTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCkBAIC0xNzUxLDcgKzE3NTEsNyBAQAogCQkJLyogTWFrZSBzdXJlIHRoZSBSRl9LSUxMIGNoZWNrIHRpbWVyIGlzIHJ1bm5pbmcgKi8KIAkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwogCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsCi0JCQkJCSAgIDIgKiBIWik7CisJCQkJCSAgIHJvdW5kX2ppZmZpZXMoMiAqIEhaKSk7CiAJCX0gZWxzZQogCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT51cCk7CiAJfQpAQCAtNDY5MCw3ICs0NjkwLDggQEAKIAkJCWVsc2UgaWYgKHByaXYtPmNvbmZpZyAmIENGR19CQUNLR1JPVU5EX1NDQU4KIAkJCQkgJiYgcHJpdi0+c3RhdHVzICYgU1RBVFVTX0FTU09DSUFURUQpCiAJCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwKLQkJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4sIEhaKTsKKwkJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4sCisJCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAKIAkJCS8qIFNlbmQgYW4gZW1wdHkgZXZlbnQgdG8gdXNlciBzcGFjZS4KIAkJCSAqIFdlIGRvbid0IHNlbmQgdGhlIHJlY2VpdmVkIGRhdGEgb24gdGhlIGV2ZW50IGJlY2F1c2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKaW5kZXggMTNmNjUyOC4uNGE4ZjVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKQEAgLTI0MCw3ICsyNDAsNyBAQAogCQlpZiAoKmVuYWJsZSkKIAkJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9lbmFibGVfcnNuKTsKIAkJZWxzZQotCQkJcGVuYWJsZVJTTi0+ZW5hYmxlID0gY3B1X3RvX2xlMTYoY21kX2VuYWJsZV9yc24pOworCQkJcGVuYWJsZVJTTi0+ZW5hYmxlID0gY3B1X3RvX2xlMTYoY21kX2Rpc2FibGVfcnNuKTsKIAl9CiAKIAlsYnNfZGViX2xlYXZlKExCU19ERUJfQ01EKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwppbmRleCA0YTU5MzA2Li45ZjM2NjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCkBAIC02MTMsNiArNjEzLDcgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCWxic19kZWJfdGhyZWFkKCAibWFpbi10aHJlYWQgMTExOiBpbnRjb3VudGVyPSVkICIKIAkJICAgICAgICJjdXJyZW50dHhza2I9JXAgZG5sZF9zZW50PSVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKaW5kZXggODhkOWQyZC4uNzY5Yzg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCkBAIC00MzksNyArNDM5LDYgQEAKIAlyZXQgPSAwOwogCiBkb25lOgotCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKDB4MDAxOSk7CS8qIEVUSF9QXzgwMjExX1JBVyAqLwogCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1JYLCAicmV0ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCmluZGV4IGY0MmI3OTYuLjJmY2MzYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKQEAgLTE3MTksOSArMTcxOSw2IEBACiAJCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfVEtJUDsKIAkJfSBlbHNlIGlmIChhbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7CiAJCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfQUVTOwotCQl9IGVsc2UgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwogCQl9CiAKIAkJLyogSWYgV1BBIGlzbid0IGVuYWJsZWQgeWV0LCBkbyB0aGF0IG5vdyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKaW5kZXggMjgzYmU0YS4uNTg1ZjU5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCkBAIC0xODUzLDcgKzE4NTMsNiBAQAogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CiAJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CiAKIAlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKQEAgLTE4NjEsMTEgKzE4NjAsOSBAQAogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYWNsLT5tYWNfbGlzdCwgX2xpc3QpIHsKIAkJaWYgKG1lbWNtcChlbnRyeS0+YWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pID09IDApIHsKLQkJCWxpc3RfZGVsKHB0cik7CisJCQlsaXN0X2RlbCgmZW50cnktPl9saXN0KTsKIAkJCWFjbC0+c2l6ZS0tOwogCQkJa2ZyZWUoZW50cnkpOwogCQkJdXAoJmFjbC0+c2VtKTsKQEAgLTE4ODMsNyArMTg4MCw2IEBACiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKIAlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAJc3RydWN0IHNvY2thZGRyICpkc3QgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOwogCiAJZHdycS0+bGVuZ3RoID0gMDsKQEAgLTE4OTEsOSArMTg4Nyw3IEBACiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZhY2wtPm1hY19saXN0LCBfbGlzdCkgewogCQltZW1jcHkoZHN0LT5zYV9kYXRhLCBlbnRyeS0+YWRkciwgRVRIX0FMRU4pOwogCQlkc3QtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJZHdycS0+bGVuZ3RoKys7CkBAIC0xOTYwLDcgKzE5NTQsNiBAQAogc3RhdGljIGludAogcHJpc201NF9tYWNfYWNjZXB0KHN0cnVjdCBpc2xwY2lfYWNsICphY2wsIGNoYXIgKm1hYykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CiAJaW50IHJlcyA9IDA7CiAKQEAgLTE5NzIsOCArMTk2NSw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjbC0+bWFjX2xpc3QsIF9saXN0KSB7CiAJCWlmIChtZW1jbXAoZW50cnktPmFkZHIsIG1hYywgRVRIX0FMRU4pID09IDApIHsKIAkJCXJlcyA9IDE7CiAJCQlicmVhazsKQEAgLTIyMTYsMTEgKzIyMDgsOSBAQAogdm9pZAogcHJpc201NF93cGFfYnNzX2llX2NsZWFuKGlzbHBjaV9wcml2YXRlICpwcml2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llICpic3MsICpuOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbiwgJnByaXYtPmJzc193cGFfbGlzdCkgewotCQlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzczsKLQkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJzcywgbiwgJnByaXYtPmJzc193cGFfbGlzdCwgbGlzdCkgewogCQlrZnJlZShic3MpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4N19ydGw4MjI1LmMKaW5kZXggZTI1YTA5Zi4uZWZjNDEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4N19ydGw4MjI1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4N19ydGw4MjI1LmMKQEAgLTY3LDcgKzY3LDcgQEAKIAltc2xlZXAoMik7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgyMjVfd3JpdGVfODA1MShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHU4IGFkZHIsIHUxNiBkYXRhKQorc3RhdGljIHZvaWQgcnRsODIyNV93cml0ZV84MDUxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTggYWRkciwgX19sZTE2IGRhdGEpCiB7CiAJc3RydWN0IHJ0bDgxODdfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAl1MTYgcmVnODAsIHJlZzgyLCByZWc4NDsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXN0cnVjdCBydGw4MTg3X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAKIAlpZiAocHJpdi0+YXNpY19yZXYpCi0JCXJ0bDgyMjVfd3JpdGVfODA1MShkZXYsIGFkZHIsIGRhdGEpOworCQlydGw4MjI1X3dyaXRlXzgwNTEoZGV2LCBhZGRyLCBjcHVfdG9fbGUxNihkYXRhKSk7CiAJZWxzZQogCQlydGw4MjI1X3dyaXRlX2JpdGJhbmcoZGV2LCBhZGRyLCBkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwppbmRleCA1YjYyNGJmLi5jMzlmMTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCkBAIC00OSw4ICs0OSw5IEBACiAJWkRfTUVNQ0xFQVIoY2hpcCwgc2l6ZW9mKCpjaGlwKSk7CiB9CiAKLXN0YXRpYyBpbnQgc2NucHJpbnRfbWFjX291aShjb25zdCB1OCAqYWRkciwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgc2NucHJpbnRfbWFjX291aShzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKKwl1OCAqYWRkciA9IHpkX3VzYl90b19uZXRkZXYoJmNoaXAtPnVzYiktPmRldl9hZGRyOwogCXJldHVybiBzY25wcmludGYoYnVmZmVyLCBzaXplLCAiJTAyeC0lMDJ4LSUwMngiLAogCQkgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdKTsKIH0KQEAgLTYxLDEwICs2MiwxMCBAQAogCWludCBpID0gMDsKIAogCWkgPSBzY25wcmludGYoYnVmZmVyLCBzaXplLCAiemQxMjExJXMgY2hpcCAiLAotCQkgICAgICBjaGlwLT5pc196ZDEyMTFiID8gImIiIDogIiIpOworCQkgICAgICB6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkgPyAiYiIgOiAiIik7CiAJaSArPSB6ZF91c2Jfc2NucHJpbnRfaWQoJmNoaXAtPnVzYiwgYnVmZmVyK2ksIHNpemUtaSk7CiAJaSArPSBzY25wcmludGYoYnVmZmVyK2ksIHNpemUtaSwgIiAiKTsKLQlpICs9IHNjbnByaW50X21hY19vdWkoY2hpcC0+ZTJwX21hYywgYnVmZmVyK2ksIHNpemUtaSk7CisJaSArPSBzY25wcmludF9tYWNfb3VpKGNoaXAsIGJ1ZmZlcitpLCBzaXplLWkpOwogCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgIik7CiAJaSArPSB6ZF9yZl9zY25wcmludF9pZCgmY2hpcC0+cmYsIGJ1ZmZlcitpLCBzaXplLWkpOwogCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgcGElMXggJWMlYyVjJWMlYyIsIGNoaXAtPnBhX3R5cGUsCkBAIC0zNjYsNjQgKzM2Nyw5IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgX3JlYWRfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkciwKLQkgICAgICAgICAgICAgICAgICBjb25zdCB6ZF9hZGRyX3QgKmFkZHIpCi17Ci0JaW50IHI7Ci0JdTMyIHBhcnRzWzJdOwotCi0JciA9IHpkX2lvcmVhZDMydl9sb2NrZWQoY2hpcCwgcGFydHMsIChjb25zdCB6ZF9hZGRyX3QgKilhZGRyLCAyKTsKLQlpZiAocikgewotCQlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksCi0JCQkiZXJyb3I6IGNvdWxkbid0IHJlYWQgZTJwIG1hY3MuIEVycm9yIG51bWJlciAlZFxuIiwgcik7Ci0JCXJldHVybiByOwotCX0KLQotCW1hY19hZGRyWzBdID0gcGFydHNbMF07Ci0JbWFjX2FkZHJbMV0gPSBwYXJ0c1swXSA+PiAgODsKLQltYWNfYWRkclsyXSA9IHBhcnRzWzBdID4+IDE2OwotCW1hY19hZGRyWzNdID0gcGFydHNbMF0gPj4gMjQ7Ci0JbWFjX2FkZHJbNF0gPSBwYXJ0c1sxXTsKLQltYWNfYWRkcls1XSA9IHBhcnRzWzFdID4+ICA4OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9lMnBfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXApCi17Ci0Jc3RhdGljIGNvbnN0IHpkX2FkZHJfdCBhZGRyWzJdID0geyBFMlBfTUFDX0FERFJfUDEsIEUyUF9NQUNfQUREUl9QMiB9OwotCi0JWkRfQVNTRVJUKG11dGV4X2lzX2xvY2tlZCgmY2hpcC0+bXV0ZXgpKTsKLQlyZXR1cm4gX3JlYWRfbWFjX2FkZHIoY2hpcCwgY2hpcC0+ZTJwX21hYywgKGNvbnN0IHpkX2FkZHJfdCAqKWFkZHIpOwotfQotCiAvKiBNQUMgYWRkcmVzczogaWYgY3VzdG9tIG1hYyBhZGRyZXNzZXMgYXJlIHRvIHRvIGJlIHVzZWQgQ1JfTUFDX0FERFJfUDEgYW5kCiAgKiAgICAgICAgICAgICAgQ1JfTUFDX0FERFJfUDIgbXVzdCBiZSBvdmVyd3JpdHRlbgogICovCi12b2lkIHpkX2dldF9lMnBfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcikKLXsKLQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JbWVtY3B5KG1hY19hZGRyLCBjaGlwLT5lMnBfbWFjLCBFVEhfQUxFTik7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKQotewotCXN0YXRpYyBjb25zdCB6ZF9hZGRyX3QgYWRkclsyXSA9IHsgQ1JfTUFDX0FERFJfUDEsIENSX01BQ19BRERSX1AyIH07Ci0JcmV0dXJuIF9yZWFkX21hY19hZGRyKGNoaXAsIG1hY19hZGRyLCAoY29uc3QgemRfYWRkcl90ICopYWRkcik7Ci19Ci0KLWludCB6ZF9yZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpCi17Ci0JaW50IHI7Ci0KLQlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJcbiIpOwotCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQlyID0gcmVhZF9tYWNfYWRkcihjaGlwLCBtYWNfYWRkcik7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci0JcmV0dXJuIHI7Ci19Ci0KIGludCB6ZF93cml0ZV9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgY29uc3QgdTggKm1hY19hZGRyKQogewogCWludCByOwpAQCAtNDQ0LDEyICszOTAsNiBAQAogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwogCXIgPSB6ZF9pb3dyaXRlMzJhX2xvY2tlZChjaGlwLCByZXFzLCBBUlJBWV9TSVpFKHJlcXMpKTsKLSNpZmRlZiBERUJVRwotCXsKLQkJdTggdG1wW0VUSF9BTEVOXTsKLQkJcmVhZF9tYWNfYWRkcihjaGlwLCB0bXApOwotCX0KLSNlbmRpZiAvKiBERUJVRyAqLwogCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwogCXJldHVybiByOwogfQpAQCAtODA5LDcgKzc0OSw3IEBACiAKIHN0YXRpYyBpbnQgaHdfcmVzZXRfcGh5KHN0cnVjdCB6ZF9jaGlwICpjaGlwKQogewotCXJldHVybiBjaGlwLT5pc196ZDEyMTFiID8gemQxMjExYl9od19yZXNldF9waHkoY2hpcCkgOgorCXJldHVybiB6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkgPyB6ZDEyMTFiX2h3X3Jlc2V0X3BoeShjaGlwKSA6CiAJCSAgICAgICAgICAgICAgICAgIHpkMTIxMV9od19yZXNldF9waHkoY2hpcCk7CiB9CiAKQEAgLTg3NCw3ICs4MTQsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXJldHVybiBjaGlwLT5pc196ZDEyMTFiID8KKwlyZXR1cm4gemRfY2hpcF9pc196ZDEyMTFiKGNoaXApID8KIAkJemQxMjExYl9od19pbml0X2htYWMoY2hpcCkgOiB6ZDEyMTFfaHdfaW5pdF9obWFjKGNoaXApOwogfQogCkBAIC0xMTM2LDggKzEwNzYsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogUmVhZCBtYWMgYWRkcmVzcyB1c2luZyBwcmUtZmlybXdhcmUgaW50ZXJmYWNlICovCitpbnQgemRfY2hpcF9yZWFkX21hY19hZGRyX2Z3KHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqYWRkcikKK3sKKwlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJcbiIpOworCXJldHVybiB6ZF91c2JfcmVhZF9mdygmY2hpcC0+dXNiLCBFMlBfTUFDX0FERFJfUDEsIGFkZHIsCisJCUVUSF9BTEVOKTsKK30KIAotaW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggZGV2aWNlX3R5cGUpCitpbnQgemRfY2hpcF9pbml0X2h3KHN0cnVjdCB6ZF9jaGlwICpjaGlwKQogewogCWludCByOwogCXU4IHJmX3R5cGU7CkBAIC0xMTQ1LDcgKzEwOTIsNiBAQAogCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwgIlxuIik7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JY2hpcC0+aXNfemQxMjExYiA9IChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfWkQxMjExQikgIT0gMDsKIAogI2lmZGVmIERFQlVHCiAJciA9IHRlc3RfaW5pdChjaGlwKTsKQEAgLTEyMDEsMTAgKzExNDcsNiBAQAogCQlnb3RvIG91dDsKICNlbmRpZiAvKiBERUJVRyAqLwogCi0JciA9IHJlYWRfZTJwX21hY19hZGRyKGNoaXApOwotCWlmIChyKQotCQlnb3RvIG91dDsKLQogCXIgPSByZWFkX2NhbF9pbnRfdGFibGVzKGNoaXApOwogCWlmIChyKQogCQlnb3RvIG91dDsKQEAgLTEyNTksNyArMTIwMSw3IEBACiAJciA9IHVwZGF0ZV9wd3JfaW50KGNoaXAsIGNoYW5uZWwpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc1tdID0gewogCQkJeyBDUjY5LCAweDI4IH0sCiAJCQl7fSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaAppbmRleCA3OWQwMjg4Li5mNDY5ODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCkBAIC03MDQsNyArNzA0LDYgQEAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJLyogQmFzZSBhZGRyZXNzIG9mIEZXX1JFR18gcmVnaXN0ZXJzICovCiAJemRfYWRkcl90IGZ3X3JlZ3NfYmFzZTsKLQl1OCBlMnBfbWFjW0VUSF9BTEVOXTsKIAkvKiBFZXBTZXRQb2ludCBpbiB0aGUgdmVuZG9yIGRyaXZlciAqLwogCXU4IHB3cl9jYWxfdmFsdWVzW0UyUF9DSEFOTkVMX0NPVU5UXTsKIAkvKiBpbnRlZ3JhdGlvbiB2YWx1ZXMgaW4gdGhlIHZlbmRvciBkcml2ZXIgKi8KQEAgLTcxNSw3ICs3MTQsNyBAQAogCXVuc2lnbmVkIGludCBwYV90eXBlOjQsCiAJCXBhdGNoX2Nja19nYWluOjEsIHBhdGNoX2NyMTU3OjEsIHBhdGNoXzZtX2JhbmRfZWRnZToxLAogCQluZXdfcGh5X2xheW91dDoxLCBhbDIyMzBzX2JpdDoxLAotCQlpc196ZDEyMTFiOjEsIHN1cHBvcnRzX3R4X2xlZDoxOworCQlzdXBwb3J0c190eF9sZWQ6MTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHpkX2NoaXAgKnpkX3VzYl90b19jaGlwKHN0cnVjdCB6ZF91c2IgKnVzYikKQEAgLTczNCw5ICs3MzMsMTUgQEAKIAkgICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCSAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIHZvaWQgemRfY2hpcF9jbGVhcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7Ci1pbnQgemRfY2hpcF9pbml0X2h3KHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCBkZXZpY2VfdHlwZSk7CitpbnQgemRfY2hpcF9yZWFkX21hY19hZGRyX2Z3KHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqYWRkcik7CitpbnQgemRfY2hpcF9pbml0X2h3KHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9jaGlwX3Jlc2V0KHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIAorc3RhdGljIGlubGluZSBpbnQgemRfY2hpcF9pc196ZDEyMTFiKHN0cnVjdCB6ZF9jaGlwICpjaGlwKQoreworCXJldHVybiBjaGlwLT51c2IuaXNfemQxMjExYjsKK30KKwogc3RhdGljIGlubGluZSBpbnQgemRfaW9yZWFkMTZ2X2xvY2tlZChzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTE2ICp2YWx1ZXMsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgemRfYWRkcl90ICphZGRyZXNzZXMsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50KQpAQCAtODI1LDggKzgzMCw2IEBACiB9CiB1OCAgemRfY2hpcF9nZXRfY2hhbm5lbChzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiBpbnQgemRfcmVhZF9yZWdkb21haW4oc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICpyZWdkb21haW4pOwotdm9pZCB6ZF9nZXRfZTJwX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpOwotaW50IHpkX3JlYWRfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcik7CiBpbnQgemRfd3JpdGVfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICptYWNfYWRkcik7CiBpbnQgemRfY2hpcF9zd2l0Y2hfcmFkaW9fb24oc3RydWN0IHpkX2NoaXAgKmNoaXApOwogaW50IHpkX2NoaXBfc3dpdGNoX3JhZGlvX29mZihzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCmluZGV4IDY3NTNkMjQuLmY2YzQ4N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCkBAIC04NiwzOCArODYsNDYgQEAKIAlyZXR1cm4gcjsKIH0KIAotaW50IHpkX21hY19pbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggZGV2aWNlX3R5cGUpCitpbnQgemRfbWFjX3ByZWluaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKQoreworCWludCByOworCXU4IGFkZHJbRVRIX0FMRU5dOworCisJciA9IHpkX2NoaXBfcmVhZF9tYWNfYWRkcl9mdygmbWFjLT5jaGlwLCBhZGRyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwltZW1jcHkobWFjLT5uZXRkZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJcmV0dXJuIDA7Cit9CisKK2ludCB6ZF9tYWNfaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMpCiB7CiAJaW50IHI7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSAmbWFjLT5jaGlwOwotCXU4IGFkZHJbRVRIX0FMRU5dOwogCXU4IGRlZmF1bHRfcmVnZG9tYWluOwogCiAJciA9IHpkX2NoaXBfZW5hYmxlX2ludChjaGlwKTsKIAlpZiAocikKIAkJZ290byBvdXQ7Ci0JciA9IHpkX2NoaXBfaW5pdF9odyhjaGlwLCBkZXZpY2VfdHlwZSk7CisJciA9IHpkX2NoaXBfaW5pdF9odyhjaGlwKTsKIAlpZiAocikKIAkJZ290byBkaXNhYmxlX2ludDsKIAotCXpkX2dldF9lMnBfbWFjX2FkZHIoY2hpcCwgYWRkcik7Ci0JciA9IHpkX3dyaXRlX21hY19hZGRyKGNoaXAsIGFkZHIpOwotCWlmIChyKQotCQlnb3RvIGRpc2FibGVfaW50OwogCVpEX0FTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKLQlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOwotCW1lbWNweShtYWMtPm5ldGRldi0+ZGV2X2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKLQlzcGluX3VubG9ja19pcnEoJm1hYy0+bG9jayk7CiAKIAlyID0gemRfcmVhZF9yZWdkb21haW4oY2hpcCwgJmRlZmF1bHRfcmVnZG9tYWluKTsKIAlpZiAocikKIAkJZ290byBkaXNhYmxlX2ludDsKIAlpZiAoIXpkX3JlZ2RvbWFpbl9zdXBwb3J0ZWQoZGVmYXVsdF9yZWdkb21haW4pKSB7Ci0JCWRldl9kYmdfZih6ZF9tYWNfZGV2KG1hYyksCi0JCQkgICJSZWd1bGF0b3J5IERvbWFpbiAlIzA0eCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwKLQkJICAgICAgICAgIGRlZmF1bHRfcmVnZG9tYWluKTsKLQkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZGlzYWJsZV9pbnQ7CisJCS8qIFRoZSB2ZW5kb3IgZHJpdmVyIG92ZXJyaWRlcyB0aGUgcmVndWxhdG9yeSBkb21haW4gYW5kCisJCSAqIGFsbG93ZWQgY2hhbm5lbCByZWdpc3RlcnMgYW5kIHVuY29uZGl0aW9uYWxseSByZXN0cmljdHMKKwkJICogYXZhaWxhYmxlIGNoYW5uZWxzIHRvIDEtMTEgZXZlcnl3aGVyZS4gTWF0Y2ggdGhlaXIKKwkJICogcXVlc3Rpb25hYmxlIGJlaGF2aW91ciBvbmx5IGZvciByZWdkb21haW5zIHdoaWNoIHdlIGRvbid0CisJCSAqIHJlY29nbmlzZS4gKi8KKwkJZGV2X3dhcm4oemRfbWFjX2RldihtYWMpLCAgIlVucmVjb2duaXNlZCByZWd1bGF0b3J5IGRvbWFpbjogIgorCQkJIiUjMDR4LiBEZWZhdWx0aW5nIHRvIEZDQy5cbiIsIGRlZmF1bHRfcmVnZG9tYWluKTsKKwkJZGVmYXVsdF9yZWdkb21haW4gPSBaRF9SRUdET01BSU5fRkNDOwogCX0KIAlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOwogCW1hYy0+cmVnZG9tYWluID0gbWFjLT5kZWZhdWx0X3JlZ2RvbWFpbiA9IGRlZmF1bHRfcmVnZG9tYWluOwpAQCAtMTY0LDE0ICsxNzIsMjUgQEAKIHsKIAlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9uZXRkZXZfbWFjKG5ldGRldik7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSAmbWFjLT5jaGlwOworCXN0cnVjdCB6ZF91c2IgKnVzYiA9ICZjaGlwLT51c2I7CiAJaW50IHI7CiAKKwlpZiAoIXVzYi0+aW5pdGlhbGl6ZWQpIHsKKwkJciA9IHpkX3VzYl9pbml0X2h3KHVzYik7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJfQorCiAJdGFza2xldF9lbmFibGUoJm1hYy0+cnhfdGFza2xldCk7CiAKIAlyID0gemRfY2hpcF9lbmFibGVfaW50KGNoaXApOwogCWlmIChyIDwgMCkKIAkJZ290byBvdXQ7CiAKKwlyID0gemRfd3JpdGVfbWFjX2FkZHIoY2hpcCwgbmV0ZGV2LT5kZXZfYWRkcik7CisJaWYgKHIpCisJCWdvdG8gZGlzYWJsZV9pbnQ7CisKIAlyID0gemRfY2hpcF9zZXRfYmFzaWNfcmF0ZXMoY2hpcCwgQ1JfUkFURVNfODAyMTFCIHwgQ1JfUkFURVNfODAyMTFHKTsKIAlpZiAociA8IDApCiAJCWdvdG8gZGlzYWJsZV9pbnQ7CkBAIC0yNTEsOSArMjcwLDExIEBACiAJZGV2X2RiZ19mKHpkX21hY19kZXYobWFjKSwKIAkJICAiU2V0dGluZyBNQUMgdG8gIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoYWRkci0+c2FfZGF0YSkpOwogCi0JciA9IHpkX3dyaXRlX21hY19hZGRyKGNoaXAsIGFkZHItPnNhX2RhdGEpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQlyID0gemRfd3JpdGVfbWFjX2FkZHIoY2hpcCwgYWRkci0+c2FfZGF0YSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CkBAIC04NTUsNyArODc2LDcgQEAKIAkvKiBaRDEyMTFCOiBDb21wdXRpbmcgdGhlIGxlbmd0aCBkaWZmZXJlbmNlIHRoaXMgd2F5LCBnaXZlcyB1cwogCSAqIGZsZXhpYmlsaXR5IHRvIGNvbXB1dGUgdGhlIHBhY2tldCBsZW5ndGguCiAJICovCi0JY3MtPnBhY2tldF9sZW5ndGggPSBjcHVfdG9fbGUxNihtYWMtPmNoaXAuaXNfemQxMjExYiA/CisJY3MtPnBhY2tldF9sZW5ndGggPSBjcHVfdG9fbGUxNih6ZF9jaGlwX2lzX3pkMTIxMWIoJm1hYy0+Y2hpcCkgPwogCQkJcGFja2V0X2xlbmd0aCAtIGZyYWdfbGVuIDogcGFja2V0X2xlbmd0aCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAppbmRleCBmYWY0Yzc4Li45ZjkzNDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaApAQCAtMTg5LDcgKzE4OSw4IEBACiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIHZvaWQgemRfbWFjX2NsZWFyKHN0cnVjdCB6ZF9tYWMgKm1hYyk7CiAKLWludCB6ZF9tYWNfaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMsIHU4IGRldmljZV90eXBlKTsKK2ludCB6ZF9tYWNfcHJlaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMpOworaW50IHpkX21hY19pbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYyk7CiAKIGludCB6ZF9tYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIGludCB6ZF9tYWNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCmluZGV4IDc0MDc0MDkuLmFiZTVkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYwpAQCAtMzQsNyArMzQsNyBAQAogCVtBTDIyMTBfUkZdCT0gIkFMMjIxMF9SRiIsCiAJW01BWElNX05FV19SRl0JPSAiTUFYSU1fTkVXX1JGIiwKIAlbVVcyNDUzX1JGXQk9ICJVVzI0NTNfUkYiLAotCVtVTktOT1dOX0FfUkZdCT0gIlVOS05PV05fQV9SRiIsCisJW0FMMjIzMFNfUkZdCT0gIkFMMjIzMFNfUkYiLAogCVtSQUxJTktfUkZdCT0gIlJBTElOS19SRiIsCiAJW0lOVEVSU0lMX1JGXQk9ICJJTlRFUlNJTF9SRiIsCiAJW1JGMjk1OV9SRl0JPSAiUkYyOTU5X1JGIiwKQEAgLTc3LDYgKzc3LDcgQEAKIAkJciA9IHpkX3JmX2luaXRfcmYyOTU5KHJmKTsKIAkJYnJlYWs7CiAJY2FzZSBBTDIyMzBfUkY6CisJY2FzZSBBTDIyMzBTX1JGOgogCQlyID0gemRfcmZfaW5pdF9hbDIyMzAocmYpOwogCQlicmVhazsKIAljYXNlIEFMNzIzMEJfUkY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaAppbmRleCBjNmRmZDgyLi4zMDUwMmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKQEAgLTI2LDcgKzI2LDcgQEAKICNkZWZpbmUgQUwyMjEwX1JGCQkJMHg3CiAjZGVmaW5lIE1BWElNX05FV19SRgkJCTB4OAogI2RlZmluZSBVVzI0NTNfUkYJCQkweDkKLSNkZWZpbmUgVU5LTk9XTl9BX1JGCQkJMHhhCisjZGVmaW5lIEFMMjIzMFNfUkYJCQkweGEKICNkZWZpbmUgUkFMSU5LX1JGCQkJMHhiCiAjZGVmaW5lIElOVEVSU0lMX1JGCQkJMHhjCiAjZGVmaW5lIFJGMjk1OV9SRgkJCTB4ZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDIyMzAuYwppbmRleCBlN2E0ZWNmLi4wMDY3NzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDIyMzAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDIyMzAuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgInpkX3VzYi5oIgogI2luY2x1ZGUgInpkX2NoaXAuaCIKIAorI2RlZmluZSBJU19BTDIyMzBTKGNoaXApICgoY2hpcCktPmFsMjIzMHNfYml0IHx8IChjaGlwKS0+cmYudHlwZSA9PSBBTDIyMzBTX1JGKQorCiBzdGF0aWMgY29uc3QgdTMyIHpkMTIxMV9hbDIyMzBfdGFibGVbXVszXSA9IHsKIAlSRl9DSEFOTkVMKCAxKSA9IHsgMHgwM2Y3OTAsIDB4MDMzMzMxLCAweDAwMDAwZCwgfSwKIAlSRl9DSEFOTkVMKCAyKSA9IHsgMHgwM2Y3OTAsIDB4MGIzMzMxLCAweDAwMDAwZCwgfSwKQEAgLTE3Niw3ICsxNzgsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkgeworCWlmIChJU19BTDIyMzBTKGNoaXApKSB7CiAJCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfaW5pdF9hbDIyMzBzLAogCQkJQVJSQVlfU0laRShpb3JlcXNfaW5pdF9hbDIyMzBzKSk7CiAJCWlmIChyKQpAQCAtMTg4LDcgKzE5MCw3IEBACiAJCXJldHVybiByOwogCiAJLyogaW1wcm92ZSBiYW5kIGVkZ2UgZm9yIEFMMjIzMFMgKi8KLQlpZiAoY2hpcC0+YWwyMjMwc19iaXQpCisJaWYgKElTX0FMMjIzMFMoY2hpcCkpCiAJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDAwMDgyNCwgUkZfUlZfQklUUyk7CiAJZWxzZQogCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgwMDA1YTQsIFJGX1JWX0JJVFMpOwpAQCAtMzE0LDcgKzMxNiw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KSB7CisJaWYgKElTX0FMMjIzMFMoY2hpcCkpIHsKIAkJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19pbml0X2FsMjIzMHMsCiAJCQlBUlJBWV9TSVpFKGlvcmVxc19pbml0X2FsMjIzMHMpKTsKIAkJaWYgKHIpCkBAIC0zMjgsNyArMzMwLDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlpZiAoY2hpcC0+YWwyMjMwc19iaXQpCisJaWYgKElTX0FMMjIzMFMoY2hpcCkpCiAJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDI0MTAwMCwgUkZfUlZfQklUUyk7CiAJZWxzZQogCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgyNWEwMDAsIFJGX1JWX0JJVFMpOwpAQCAtNDIyLDcgKzQyNCw3IEBACiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF9yZl90b19jaGlwKHJmKTsKIAogCXJmLT5zd2l0Y2hfcmFkaW9fb2ZmID0gYWwyMjMwX3N3aXRjaF9yYWRpb19vZmY7Ci0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCXJmLT5pbml0X2h3ID0gemQxMjExYl9hbDIyMzBfaW5pdF9odzsKIAkJcmYtPnNldF9jaGFubmVsID0gemQxMjExYl9hbDIyMzBfc2V0X2NoYW5uZWw7CiAJCXJmLT5zd2l0Y2hfcmFkaW9fb24gPSB6ZDEyMTFiX2FsMjIzMF9zd2l0Y2hfcmFkaW9fb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMKaW5kZXggZjRlOGI2YS4uNzNkMGJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYwpAQCAtNDczLDcgKzQ3Myw3IEBACiB7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF9yZl90b19jaGlwKHJmKTsKIAotCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkgewogCQlyZi0+aW5pdF9odyA9IHpkMTIxMWJfYWw3MjMwYl9pbml0X2h3OwogCQlyZi0+c3dpdGNoX3JhZGlvX29uID0gemQxMjExYl9hbDcyMzBiX3N3aXRjaF9yYWRpb19vbjsKIAkJcmYtPnNldF9jaGFubmVsID0gemQxMjExYl9hbDcyMzBiX3NldF9jaGFubmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYwppbmRleCAyZDczNmJkLi5jYzcwZDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiB7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF9yZl90b19jaGlwKHJmKTsKIAotCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkgewogCQlkZXZfZXJyKHpkX2NoaXBfZGV2KGNoaXApLAogCQkgICAgICAgIlJGMjk1OSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBmb3IgWkQxMjExQiIKIAkJICAgICAgICIgZGV2aWNlc1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3V3MjQ1My5jCmluZGV4IDQxNGU0MGQuLjg1N2RjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3V3MjQ1My5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3V3MjQ1My5jCkBAIC00ODYsNyArNDg2LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlpZiAoY2hpcC0+aXNfemQxMjExYikKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKQogCQlpb3JlcXNbMV0udmFsdWUgPSAweDdmOwogCiAJcmV0dXJuIHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxcywgQVJSQVlfU0laRShpb3JlcXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKaW5kZXggY2EyNDI5OS4uMjhkNDFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKQEAgLTcxLDYgKzcxLDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MTIpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxMyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDA1MywgMHg1MzAxKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAwZGEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCS8qICJEcml2ZXJsZXNzIiBkZXZpY2VzIHRoYXQgbmVlZCBlamVjdGluZyAqLwogCXsgVVNCX0RFVklDRSgweDBhY2UsIDB4MjAxMSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9JTlNUQUxMRVIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwYWNlLCAweDIwZmYpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfSU5TVEFMTEVSIH0sCkBAIC0xOTUsMjYgKzE5NiwyNyBAQAogCXJldHVybiBsZTE2X3RvX2NwdShwW29mZnNldF0pOwogfQogCi1zdGF0aWMgY2hhciAqZ2V0X2Z3X25hbWUoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdTggZGV2aWNlX3R5cGUsCitzdGF0aWMgY2hhciAqZ2V0X2Z3X25hbWUoc3RydWN0IHpkX3VzYiAqdXNiLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLAogCSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBvc3RmaXgpCiB7CiAJc2NucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVzJXMiLAotCQlkZXZpY2VfdHlwZSA9PSBERVZJQ0VfWkQxMjExQiA/CisJCXVzYi0+aXNfemQxMjExYiA/CiAJCQlGV19aRDEyMTFCX1BSRUZJWCA6IEZXX1pEMTIxMV9QUkVGSVgsCiAJCXBvc3RmaXgpOwogCXJldHVybiBidWZmZXI7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2goc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IGRldmljZV90eXBlLAorc3RhdGljIGludCBoYW5kbGVfdmVyc2lvbl9taXNtYXRjaChzdHJ1Y3QgemRfdXNiICp1c2IsCiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Yl9mdykKIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHpkX3VzYl90b191c2JkZXYodXNiKTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVyX2Z3ID0gTlVMTDsKIAlpbnQgb2Zmc2V0OwogCWludCByID0gMDsKIAljaGFyIGZ3X25hbWVbMTI4XTsKIAogCXIgPSByZXF1ZXN0X2Z3X2ZpbGUoJnVyX2Z3LAotCQlnZXRfZndfbmFtZShmd19uYW1lLCBzaXplb2YoZndfbmFtZSksIGRldmljZV90eXBlLCAidXIiKSwKKwkJZ2V0X2Z3X25hbWUodXNiLCBmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJ1ciIpLAogCQkmdWRldi0+ZGV2KTsKIAlpZiAocikKIAkJZ290byBlcnJvcjsKQEAgLTIzNywxMSArMjM5LDEyIEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgdXBsb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBkZXZpY2VfdHlwZSkKK3N0YXRpYyBpbnQgdXBsb2FkX2Zpcm13YXJlKHN0cnVjdCB6ZF91c2IgKnVzYikKIHsKIAlpbnQgcjsKIAl1MTYgZndfYmNkRGV2aWNlOwogCXUxNiBiY2REZXZpY2U7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Yl9mdyA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICp1cGhfZncgPSBOVUxMOwogCWNoYXIgZndfbmFtZVsxMjhdOwpAQCAtMjQ5LDcgKzI1Miw3IEBACiAJYmNkRGV2aWNlID0gZ2V0X2JjZERldmljZSh1ZGV2KTsKIAogCXIgPSByZXF1ZXN0X2Z3X2ZpbGUoJnViX2Z3LAotCQlnZXRfZndfbmFtZShmd19uYW1lLCBzaXplb2YoZndfbmFtZSksIGRldmljZV90eXBlLCAgInViIiksCisJCWdldF9md19uYW1lKHVzYiwgZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAidWIiKSwKIAkJJnVkZXYtPmRldik7CiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CkBAIC0yNjQsNyArMjY3LDcgQEAKIAkJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICJkZXZpY2UgaGFzIG9sZCBib290Y29kZSwgcGxlYXNlICIKIAkJCQkicmVwb3J0IHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuIik7CiAKLQkJciA9IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHVkZXYsIGRldmljZV90eXBlLCB1Yl9mdyk7CisJCXIgPSBoYW5kbGVfdmVyc2lvbl9taXNtYXRjaCh1c2IsIHViX2Z3KTsKIAkJaWYgKHIpCiAJCQlnb3RvIGVycm9yOwogCX0gZWxzZSB7CkBAIC0yNzUsNyArMjc4LDcgQEAKIAogCiAJciA9IHJlcXVlc3RfZndfZmlsZSgmdXBoX2Z3LAotCQlnZXRfZndfbmFtZShmd19uYW1lLCBzaXplb2YoZndfbmFtZSksIGRldmljZV90eXBlLCAidXBociIpLAorCQlnZXRfZndfbmFtZSh1c2IsIGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInVwaHIiKSwKIAkJJnVkZXYtPmRldik7CiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CkBAIC0yOTQsNiArMjk3LDMwIEBACiAJcmV0dXJuIHI7CiB9CiAKKy8qIFJlYWQgZGF0YSBmcm9tIGRldmljZSBhZGRyZXNzIHNwYWNlIHVzaW5nICJmaXJtd2FyZSBpbnRlcmZhY2UiIHdoaWNoIGRvZXMKKyAqIG5vdCByZXF1aXJlIGZpcm13YXJlIHRvIGJlIGxvYWRlZC4gKi8KK2ludCB6ZF91c2JfcmVhZF9mdyhzdHJ1Y3QgemRfdXNiICp1c2IsIHpkX2FkZHJfdCBhZGRyLCB1OCAqZGF0YSwgdTE2IGxlbikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHpkX3VzYl90b191c2JkZXYodXNiKTsKKworCXIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQlVU0JfUkVRX0ZJUk1XQVJFX1JFQURfREFUQSwgVVNCX0RJUl9JTiB8IDB4NDAsIGFkZHIsIDAsCisJCWRhdGEsIGxlbiwgNTAwMCk7CisJaWYgKHIgPCAwKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCSJyZWFkIG92ZXIgZmlybXdhcmUgaW50ZXJmYWNlIGZhaWxlZDogJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9IGVsc2UgaWYgKHIgIT0gbGVuKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCSJpbmNvbXBsZXRlIHJlYWQgb3ZlciBmaXJtd2FyZSBpbnRlcmZhY2U6ICVkLyVkXG4iLAorCQkJciwgbGVuKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgdXJiX2Rldih1cmIpICgmKHVyYiktPmRldi0+ZGV2KQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX3JlZ3NfaW50KHN0cnVjdCB1cmIgKnVyYikKQEAgLTkyMCw5ICs5NDcsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHpkX3VzYl9pbml0X2h3KHN0cnVjdCB6ZF91c2IgKnVzYikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF91c2JfdG9fbWFjKHVzYik7CisKKwlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiXG4iKTsKKworCXIgPSB1cGxvYWRfZmlybXdhcmUodXNiKTsKKwlpZiAocikgeworCQlkZXZfZXJyKHpkX3VzYl9kZXYodXNiKSwKKwkJICAgICAgICJjb3VsZG4ndCBsb2FkIGZpcm13YXJlLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oemRfdXNiX3RvX3VzYmRldih1c2IpKTsKKwlpZiAocikgeworCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAorCQkJImNvdWxkbid0IHJlc2V0IGNvbmZpZ3VyYXRpb24uIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0KKworCXIgPSB6ZF9tYWNfaW5pdF9odyhtYWMpOworCWlmIChyKSB7CisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCisJCSAgICAgICAgICJjb3VsZG4ndCBpbml0aWFsaXplIG1hYy4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJdXNiLT5pbml0aWFsaXplZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcjsKKwlzdHJ1Y3QgemRfdXNiICp1c2I7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBOVUxMOwogCkBAIC05NTAsMjYgKzEwMTAsMTAgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlyID0gdXBsb2FkX2Zpcm13YXJlKHVkZXYsIGlkLT5kcml2ZXJfaW5mbyk7Ci0JaWYgKHIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LAotCQkgICAgICAgImNvdWxkbid0IGxvYWQgZmlybXdhcmUuIEVycm9yIG51bWJlciAlZFxuIiwgcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorCXVzYiA9ICZ6ZF9uZXRkZXZfbWFjKG5ldGRldiktPmNoaXAudXNiOworCXVzYi0+aXNfemQxMjExYiA9IChpZC0+ZHJpdmVyX2luZm8gPT0gREVWSUNFX1pEMTIxMUIpICE9IDA7CiAKLQlyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24odWRldik7Ci0JaWYgKHIpIHsKLQkJZGV2X2RiZ19mKCZpbnRmLT5kZXYsCi0JCQkiY291bGRuJ3QgcmVzZXQgY29uZmlndXJhdGlvbi4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBBdCB0aGlzIHBvaW50IHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQgaXMgbm90IGdlbmVyYWxseSBlbmFibGVkLiBXZQotCSAqIHNhdmUgdGhlIFVTQiBiYW5kd2lkdGggdW50aWwgdGhlIG5ldHdvcmsgZGV2aWNlIGlzIG9wZW5lZC4gQnV0Ci0JICogbm90aWZ5IHRoYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBNQUMgd2lsbCByZXF1aXJlIHRoZQotCSAqIGludGVycnVwdHMgdG8gYmUgdGVtcG9yYXJ5IGVuYWJsZWQuCi0JICovCi0JciA9IHpkX21hY19pbml0X2h3KHpkX25ldGRldl9tYWMobmV0ZGV2KSwgaWQtPmRyaXZlcl9pbmZvKTsKKwlyID0gemRfbWFjX3ByZWluaXRfaHcoemRfbmV0ZGV2X21hYyhuZXRkZXYpKTsKIAlpZiAocikgewogCQlkZXZfZGJnX2YoJmludGYtPmRldiwKIAkJICAgICAgICAgImNvdWxkbid0IGluaXRpYWxpemUgbWFjLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaAppbmRleCA1MDZlYTZhLi45NjFhN2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaApAQCAtMTg4LDYgKzE4OCw3IEBACiAJc3RydWN0IHpkX3VzYl9yeCByeDsKIAlzdHJ1Y3QgemRfdXNiX3R4IHR4OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCXU4IGlzX3pkMTIxMWI6MSwgaW5pdGlhbGl6ZWQ6MTsKIH07CiAKICNkZWZpbmUgemRfdXNiX2Rldih1c2IpICgmdXNiLT5pbnRmLT5kZXYpCkBAIC0yMzYsNiArMjM3LDggQEAKIAogaW50IHpkX3VzYl9yZndyaXRlKHN0cnVjdCB6ZF91c2IgKnVzYiwgdTMyIHZhbHVlLCB1OCBiaXRzKTsKIAoraW50IHpkX3VzYl9yZWFkX2Z3KHN0cnVjdCB6ZF91c2IgKnVzYiwgemRfYWRkcl90IGFkZHIsIHU4ICpkYXRhLCB1MTYgbGVuKTsKKwogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp6ZF93b3JrcXVldWU7CiAKICNlbmRpZiAvKiBfWkRfVVNCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnIGIvZHJpdmVycy9wYXJwb3J0L0tjb25maWcKaW5kZXggZjQ2YzY5ZS4uMDljOTNmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC01LDExICs1LDkgQEAKICMgUGFycG9ydCBjb25maWd1cmF0aW9uLgogIwogCi1tZW51ICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBBUlBPUlQKK21lbnVjb25maWcgUEFSUE9SVAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugd2FudCB0byB1c2UgZGV2aWNlcyBjb25uZWN0ZWQgdG8geW91ciBtYWNoaW5lJ3MgcGFyYWxsZWwgcG9ydAogCSAgKHRoZSBjb25uZWN0b3IgYXQgdGhlIGNvbXB1dGVyIHdpdGggMjUgaG9sZXMpLCBlLmcuIHByaW50ZXIsIFpJUApAQCAtMzMsOSArMzEsMTEgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAoraWYgUEFSUE9SVAorCiBjb25maWcgUEFSUE9SVF9QQwogCXRyaXN0YXRlICJQQy1zdHlsZSBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uIFBBUlBPUlQgJiYgKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgorCWRlcGVuZHMgb24gKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgogCS0tLWhlbHAtLS0KIAkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBDLXN0eWxlIHBhcmFsbGVsIHBvcnQuIEFsbAogCSAgSUJNIFBDIGNvbXBhdGlibGUgY29tcHV0ZXJzIGFuZCBzb21lIEFscGhhcyBoYXZlIFBDLXN0eWxlCkBAIC04NSw3ICs4NSw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0lQMzIKIAl0cmlzdGF0ZSAiU0dJIElQMzIgYnVpbHRpbiBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gU0dJX0lQMzIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNHSV9JUDMyICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgdGhlIHBhcmFsbGVsIHBvcnQgb24KQEAgLTk0LDcgKzk0LDcgQEAKIAogY29uZmlnIFBBUlBPUlRfQU1JR0EKIAl0cmlzdGF0ZSAiQW1pZ2EgYnVpbHRpbiBwb3J0IgotCWRlcGVuZHMgb24gQU1JR0EgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQU1JR0EKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogY29uZmlnIFBBUlBPUlRfTUZDMwogCXRyaXN0YXRlICJNdWx0aWZhY2UgSUlJIHBhcmFsbGVsIHBvcnQiCi0JZGVwZW5kcyBvbiBaT1JSTyAmJiBQQVJQT1JUCisJZGVwZW5kcyBvbiBaT1JSTwogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgcGFyYWxsZWwgcG9ydCBzdXBwb3J0IGZvciB0aGUgTUZDMyBjYXJkLgpAQCAtMTEyLDcgKzExMiw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0FUQVJJCiAJdHJpc3RhdGUgIkF0YXJpIGhhcmR3YXJlIgotCWRlcGVuZHMgb24gQVRBUkkgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQVRBUkkKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMjIsMTIgKzEyMiwxMSBAQAogY29uZmlnIFBBUlBPUlRfR1NDCiAJdHJpc3RhdGUKIAlkZWZhdWx0IEdTQwotCWRlcGVuZHMgb24gUEFSUE9SVAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCiBjb25maWcgUEFSUE9SVF9TVU5CUFAKIAl0cmlzdGF0ZSAiU3BhcmMgaGFyZHdhcmUgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTQlVTICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTQlVTICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBiaWRpcmVjdGlvbmFsIHBhcmFsbGVsIHBvcnQKQEAgLTEzNiw3ICsxMzUsNiBAQAogCiBjb25maWcgUEFSUE9SVF9BWDg4Nzk2CiAJdHJpc3RhdGUgIkFYODg3OTYgUGFyYWxsZWwgUG9ydCIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xNDgsNyArMTQ2LDYgQEAKIAogY29uZmlnIFBBUlBPUlRfMTI4NAogCWJvb2wgIklFRUUgMTI4NCB0cmFuc2ZlciBtb2RlcyIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIHByaW50ZXIgdGhhdCBzdXBwb3J0cyBzdGF0dXMgcmVhZGJhY2sgb3IgZGV2aWNlIElELCBvcgogCSAgd2FudCB0byB1c2UgYSBkZXZpY2UgdGhhdCB1c2VzIGVuaGFuY2VkIHBhcmFsbGVsIHBvcnQgdHJhbnNmZXIgbW9kZXMKQEAgLTE1OSw1ICsxNTYsNCBAQAogY29uZmlnIFBBUlBPUlRfTk9UX1BDCiAJYm9vbAogCi1lbmRtZW51Ci0KK2VuZGlmICMgUEFSUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKaW5kZXggN2JmYmFkNS4uNWQ1OGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCkBAIC0yNDI0LDcgKzI0MjQsNiBAQAogCXUzMiBpdGU4ODcyc2V0OwogCXUzMiBpdGU4ODcyX2xwdCwgaXRlODg3Ml9scHRoaTsKIAl1OCBpdGU4ODcyX2lycSwgdHlwZTsKLQljaGFyICpmYWtlX25hbWUgPSAicGFycG9ydCBwcm9iZSI7CiAJaW50IGlycTsKIAlpbnQgaTsKIApAQCAtMjQzMiwxMSArMjQzMSwxMSBAQAogCQogCS8vIG1ha2Ugc3VyZSB3aGljaCBvbmUgY2hpcAogCWZvcihpID0gMDsgaSA8IDU7IGkrKykgewotCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMHg4LCBmYWtlX25hbWUpOworCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMzIsICJpdDg4N3giKTsKIAkJaWYgKGJhc2VfcmVzKSB7CiAJCQlpbnQgdGVzdDsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NjAsCi0JCQkJCQkweGU3MDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKKwkJCQkJCTB4ZTUwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAocGRldiwgMHg3OCwKIAkJCQkJCTB4MDAwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJdGVzdCA9IGluYiAoaW50YV9hZGRyW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKaW5kZXggYmIzYzEwMS4uZGViNmI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKQEAgLTE1OSw4ICsxNTksOCBAQAogCS8qIENsYWltIG5ldyBidXMgcmVzb3VyY2VzICovCiAJcGNpYmlvc19jbGFpbV9vbmVfYnVzKGRldi0+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+Yml0YmFuZy5tYXN0ZXIpOworCisJbG03MGxscCA9IE5VTEw7Cit9CisKKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBzcGlfbG03MGxscF9kcnYgPSB7CisJLm5hbWUgPQkJRFJWTkFNRSwKKwkuYXR0YWNoID0Jc3BpX2xtNzBsbHBfYXR0YWNoLAorCS5kZXRhY2ggPQlzcGlfbG03MGxscF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwaV9sbTcwbGxwKHZvaWQpCit7CisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZzcGlfbG03MGxscF9kcnYpOworfQorbW9kdWxlX2luaXQoaW5pdF9zcGlfbG03MGxscCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3NwaV9sbTcwbGxwKHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmc3BpX2xtNzBsbHBfZHJ2KTsKK30KK21vZHVsZV9leGl0KGNsZWFudXBfc3BpX2xtNzBsbHApOworCitNT0RVTEVfQVVUSE9SKCJLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigKKwkiUGFycG9ydCBhZGFwdGVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIExMUCBldmFsIGJvYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbXBjODN4eC5jIGIvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYwppbmRleCBlOTc5OGJmLi4zMjk1Y2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfbXBjODN4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNkZWZpbmUJU1BNT0RFX0VOQUJMRQkJKDEgPDwgMjQpCiAjZGVmaW5lCVNQTU9ERV9MRU4oeCkJCSgoeCkgPDwgMjApCiAjZGVmaW5lCVNQTU9ERV9QTSh4KQkJKCh4KSA8PCAxNikKKyNkZWZpbmUJU1BNT0RFX09QCQkoMSA8PCAxNCkKIAogLyoKICAqIERlZmF1bHQgZm9yIFNQSSBNb2RlOgpAQCAtODUsNiArODYsMTEgQEAKIAl1bnNpZ25lZCBuc2VjczsJCS8qIChjbG9jayBjeWNsZSB0aW1lKS8yICovCiAKIAl1MzIgc3lzY2xrOworCXUzMiByeF9zaGlmdDsJCS8qIFJYIGRhdGEgcmVnIHNoaWZ0IHdoZW4gaW4gcWUgbW9kZSAqLworCXUzMiB0eF9zaGlmdDsJCS8qIFRYIGRhdGEgcmVnIHNoaWZ0IHdoZW4gaW4gcWUgbW9kZSAqLworCisJYm9vbCBxZV9tb2RlOworCiAJdm9pZCAoKmFjdGl2YXRlX2NzKSAodTggY3MsIHU4IHBvbGFyaXR5KTsKIAl2b2lkICgqZGVhY3RpdmF0ZV9jcykgKHU4IGNzLCB1OCBwb2xhcml0eSk7CiB9OwpAQCAtMTAzLDcgKzEwOSw3IEBACiB2b2lkIG1wYzgzeHhfc3BpX3J4X2J1Zl8jI3R5cGUodTMyIGRhdGEsIHN0cnVjdCBtcGM4M3h4X3NwaSAqbXBjODN4eF9zcGkpIFwKIHsJCQkJCQkJCQkgIFwKIAl0eXBlICogcnggPSBtcGM4M3h4X3NwaS0+cng7CQkJCQkgIFwKLQkqcngrKyA9ICh0eXBlKWRhdGE7CQkJCQkJICBcCisJKnJ4KysgPSAodHlwZSkoZGF0YSA+PiBtcGM4M3h4X3NwaS0+cnhfc2hpZnQpOwkJCSAgXAogCW1wYzgzeHhfc3BpLT5yeCA9IHJ4OwkJCQkJCSAgXAogfQogCkBAIC0xMTQsNyArMTIwLDcgQEAKIAljb25zdCB0eXBlICogdHggPSBtcGM4M3h4X3NwaS0+dHg7CQkJXAogCWlmICghdHgpCQkJCQkJXAogCQlyZXR1cm4gMDsJCQkJCVwKLQlkYXRhID0gKnR4Kys7CQkJCQkJXAorCWRhdGEgPSAqdHgrKyA8PCBtcGM4M3h4X3NwaS0+dHhfc2hpZnQ7CQkJXAogCW1wYzgzeHhfc3BpLT50eCA9IHR4OwkJCQkJXAogCXJldHVybiBkYXRhOwkJCQkJCVwKIH0KQEAgLTE1OCw2ICsxNjQsMTIgQEAKIAogCQlpZiAoKG1wYzgzeHhfc3BpLT5zeXNjbGsgLyBzcGktPm1heF9zcGVlZF9oeikgPj0gNjQpIHsKIAkJCXU4IHBtID0gbXBjODN4eF9zcGktPnN5c2NsayAvIChzcGktPm1heF9zcGVlZF9oeiAqIDY0KTsKKwkJCWlmIChwbSA+IDB4MGYpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNUEM4M3h4IFNQSTogU1BJQ0xLIGNhbid0IGJlIGxlc3MgdGhlbiBhIFNZU0NMSy8xMDI0IVxuIgorCQkJCQkJIlJlcXVlc3RlZCBTUElDTEsgaXMgJWQgSHouIFdpbGwgdXNlICVkIEh6IGluc3RlYWQuXG4iLAorCQkJCQkJc3BpLT5tYXhfc3BlZWRfaHosIG1wYzgzeHhfc3BpLT5zeXNjbGsgLyAxMDI0KTsKKwkJCQlwbSA9IDB4MGY7CisJCQl9CiAJCQlyZWd2YWwgfD0gU1BNT0RFX1BNKHBtKSB8IFNQTU9ERV9ESVYxNjsKIAkJfSBlbHNlIHsKIAkJCXU4IHBtID0gbXBjODN4eF9zcGktPnN5c2NsayAvIChzcGktPm1heF9zcGVlZF9oeiAqIDQpOwpAQCAtMTk3LDEyICsyMDksMjIgQEAKIAkgICAgfHwgKChiaXRzX3Blcl93b3JkID4gMTYpICYmIChiaXRzX3Blcl93b3JkICE9IDMyKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXBjODN4eF9zcGktPnJ4X3NoaWZ0ID0gMDsKKwltcGM4M3h4X3NwaS0+dHhfc2hpZnQgPSAwOwogCWlmIChiaXRzX3Blcl93b3JkIDw9IDgpIHsKIAkJbXBjODN4eF9zcGktPmdldF9yeCA9IG1wYzgzeHhfc3BpX3J4X2J1Zl91ODsKIAkJbXBjODN4eF9zcGktPmdldF90eCA9IG1wYzgzeHhfc3BpX3R4X2J1Zl91ODsKKwkJaWYgKG1wYzgzeHhfc3BpLT5xZV9tb2RlKSB7CisJCQltcGM4M3h4X3NwaS0+cnhfc2hpZnQgPSAxNjsKKwkJCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDI0OworCQl9CiAJfSBlbHNlIGlmIChiaXRzX3Blcl93b3JkIDw9IDE2KSB7CiAJCW1wYzgzeHhfc3BpLT5nZXRfcnggPSBtcGM4M3h4X3NwaV9yeF9idWZfdTE2OwogCQltcGM4M3h4X3NwaS0+Z2V0X3R4ID0gbXBjODN4eF9zcGlfdHhfYnVmX3UxNjsKKwkJaWYgKG1wYzgzeHhfc3BpLT5xZV9tb2RlKSB7CisJCQltcGM4M3h4X3NwaS0+cnhfc2hpZnQgPSAxNjsKKwkJCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDE2OworCQl9CiAJfSBlbHNlIGlmIChiaXRzX3Blcl93b3JkIDw9IDMyKSB7CiAJCW1wYzgzeHhfc3BpLT5nZXRfcnggPSBtcGM4M3h4X3NwaV9yeF9idWZfdTMyOwogCQltcGM4M3h4X3NwaS0+Z2V0X3R4ID0gbXBjODN4eF9zcGlfdHhfYnVmX3UzMjsKQEAgLTIzMiwxMiArMjU0LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQorCiBzdGF0aWMgaW50IG1wYzgzeHhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nOwogCXN0cnVjdCBtcGM4M3h4X3NwaSAqbXBjODN4eF9zcGk7CiAJaW50IHJldHZhbDsKIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKCFzcGktPm1heF9zcGVlZF9oeikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTM3MSw3ICs0MDIsNiBAQAogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGZyZWVfbWFzdGVyOwogCX0KLQogCW1wYzgzeHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCW1wYzgzeHhfc3BpLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CiAJbXBjODN4eF9zcGktPmJpdGJhbmcuY2hpcHNlbGVjdCA9IG1wYzgzeHhfc3BpX2NoaXBzZWxlY3Q7CkBAIC0zODAsOSArNDEwLDE3IEBACiAJbXBjODN4eF9zcGktPnN5c2NsayA9IHBkYXRhLT5zeXNjbGs7CiAJbXBjODN4eF9zcGktPmFjdGl2YXRlX2NzID0gcGRhdGEtPmFjdGl2YXRlX2NzOwogCW1wYzgzeHhfc3BpLT5kZWFjdGl2YXRlX2NzID0gcGRhdGEtPmRlYWN0aXZhdGVfY3M7CisJbXBjODN4eF9zcGktPnFlX21vZGUgPSBwZGF0YS0+cWVfbW9kZTsKIAltcGM4M3h4X3NwaS0+Z2V0X3J4ID0gbXBjODN4eF9zcGlfcnhfYnVmX3U4OwogCW1wYzgzeHhfc3BpLT5nZXRfdHggPSBtcGM4M3h4X3NwaV90eF9idWZfdTg7CiAKKwltcGM4M3h4X3NwaS0+cnhfc2hpZnQgPSAwOworCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDA7CisJaWYgKG1wYzgzeHhfc3BpLT5xZV9tb2RlKSB7CisJCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDE2OworCQltcGM4M3h4X3NwaS0+dHhfc2hpZnQgPSAyNDsKKwl9CisKIAltcGM4M3h4X3NwaS0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0gbXBjODN4eF9zcGlfc2V0dXA7CiAJaW5pdF9jb21wbGV0aW9uKCZtcGM4M3h4X3NwaS0+ZG9uZSk7CiAKQEAgLTQxNyw2ICs0NTUsOSBAQAogCiAJLyogRW5hYmxlIFNQSSBpbnRlcmZhY2UgKi8KIAlyZWd2YWwgPSBwZGF0YS0+aW5pdGlhbF9zcG1vZGUgfCBTUE1PREVfSU5JVF9WQUwgfCBTUE1PREVfRU5BQkxFOworCWlmIChwZGF0YS0+cWVfbW9kZSkKKwkJcmVndmFsIHw9IFNQTU9ERV9PUDsKKwogCW1wYzgzeHhfc3BpX3dyaXRlX3JlZygmbXBjODN4eF9zcGktPmJhc2UtPm1vZGUsIHJlZ3ZhbCk7CiAKIAlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmbXBjODN4eF9zcGktPmJpdGJhbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKaW5kZXggZDVhNzEwZi4uNzA3MWZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCkBAIC0xNDYsNiArMTQ2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCisKIHN0YXRpYyBpbnQgczNjMjR4eF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlpbnQgcmV0OwpAQCAtMTUzLDggKzE1NiwxMSBAQAogCWlmICghc3BpLT5iaXRzX3Blcl93b3JkKQogCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCi0JaWYgKChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSAhPSAwKQorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJcmV0ID0gczNjMjR4eF9zcGlfc2V0dXB4ZmVyKHNwaSwgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV90eHg5LmMgYi9kcml2ZXJzL3NwaS9zcGlfdHh4OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTk4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGlfdHh4OS5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogc3BpX3R4eDkuYyAtIFRYeDkgU1BJIGNvbnRyb2xsZXIgZHJpdmVyLgorICoKKyAqIEJhc2VkIG9uIGxpbnV4L2FyY2gvbWlwcy90eDQ5MzgvdG9zaGliYV9yYnR4NDkzOC9zcGlfdHh4OS5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCisgKgorICogMjAwMy0yMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcworICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICoKKyAqIFN1cHBvcnQgZm9yIFRYNDkzOCBpbiAyLjYgLSBNYW5pc2ggTGFjaHdhbmkgKG1sYWNod2FuaUBtdmlzdGEuY29tKQorICoKKyAqIENvbnZlcnQgdG8gZ2VuZXJpYyBTUEkgZnJhbWV3b3JrIC0gQXRzdXNoaSBOZW1vdG8gKGFuZW1vQG1iYS5vY24ubmUuanApCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKworCisjZGVmaW5lIFNQSV9GSUZPX1NJWkUgNAorCisjZGVmaW5lIFRYeDlfU1BNQ1IJCTB4MDAKKyNkZWZpbmUgVFh4OV9TUENSMAkJMHgwNAorI2RlZmluZSBUWHg5X1NQQ1IxCQkweDA4CisjZGVmaW5lIFRYeDlfU1BGUwkJMHgwYworI2RlZmluZSBUWHg5X1NQU1IJCTB4MTQKKyNkZWZpbmUgVFh4OV9TUERSCQkweDE4CisKKy8qIFNQTUNSIDogU1BJIE1hc3RlciBDb250cm9sICovCisjZGVmaW5lIFRYeDlfU1BNQ1JfT1BNT0RFCTB4YzAKKyNkZWZpbmUgVFh4OV9TUE1DUl9DT05GSUcJMHg0MAorI2RlZmluZSBUWHg5X1NQTUNSX0FDVElWRQkweDgwCisjZGVmaW5lIFRYeDlfU1BNQ1JfU1BTVFAJMHgwMgorI2RlZmluZSBUWHg5X1NQTUNSX0JDTFIJCTB4MDEKKworLyogU1BDUjAgOiBTUEkgQ29udHJvbCAwICovCisjZGVmaW5lIFRYeDlfU1BDUjBfVFhJRkxfTUFTSwkweGMwMDAKKyNkZWZpbmUgVFh4OV9TUENSMF9SWElGTF9NQVNLCTB4MzAwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1NJRElFCTB4MDgwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1NPRUlFCTB4MDQwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1JCU0lFCTB4MDIwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1RCU0lFCTB4MDEwMAorI2RlZmluZSBUWHg5X1NQQ1IwX0lGU1BTRQkweDAwMTAKKyNkZWZpbmUgVFh4OV9TUENSMF9TQk9TCQkweDAwMDQKKyNkZWZpbmUgVFh4OV9TUENSMF9TUEhBCQkweDAwMDIKKyNkZWZpbmUgVFh4OV9TUENSMF9TUE9MCQkweDAwMDEKKworLyogU1BTUiA6IFNQSSBTdGF0dXMgKi8KKyNkZWZpbmUgVFh4OV9TUFNSX1RCU0kJCTB4ODAwMAorI2RlZmluZSBUWHg5X1NQU1JfUkJTSQkJMHg0MDAwCisjZGVmaW5lIFRYeDlfU1BTUl9UQlNfTUFTSwkweDM4MDAKKyNkZWZpbmUgVFh4OV9TUFNSX1JCU19NQVNLCTB4MDcwMAorI2RlZmluZSBUWHg5X1NQU1JfU1BPRQkJMHgwMDgwCisjZGVmaW5lIFRYeDlfU1BTUl9JRlNECQkweDAwMDgKKyNkZWZpbmUgVFh4OV9TUFNSX1NJRExFCQkweDAwMDQKKyNkZWZpbmUgVFh4OV9TUFNSX1NUUkRZCQkweDAwMDIKKyNkZWZpbmUgVFh4OV9TUFNSX1NSUkRZCQkweDAwMDEKKworCitzdHJ1Y3QgdHh4OXNwaSB7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3QgJ3F1ZXVlJyAqLworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJdm9pZCBfX2lvbWVtICptZW1iYXNlOworCWludCBpcnE7CisJaW50IGJhc2VjbGs7CisJc3RydWN0IGNsayAqY2xrOworCXUzMiBtYXhfc3BlZWRfaHosIG1pbl9zcGVlZF9oejsKKwlpbnQgbGFzdF9jaGlwc2VsZWN0OworCWludCBsYXN0X2NoaXBzZWxlY3RfdmFsOworfTsKKworc3RhdGljIHUzMiB0eHg5c3BpX3JkKHN0cnVjdCB0eHg5c3BpICpjLCBpbnQgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkbChjLT5tZW1iYXNlICsgcmVnKTsKK30KK3N0YXRpYyB2b2lkIHR4eDlzcGlfd3Ioc3RydWN0IHR4eDlzcGkgKmMsIHUzMiB2YWwsIGludCByZWcpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgYy0+bWVtYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHR4eDlzcGlfY3NfZnVuYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3QgdHh4OXNwaSAqYywKKwkJaW50IG9uLCB1bnNpZ25lZCBpbnQgY3NfZGVsYXkpCit7CisJaW50IHZhbCA9IChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkgPyBvbiA6ICFvbjsKKwlpZiAob24pIHsKKwkJLyogZGVzZWxlY3QgdGhlIGNoaXAgd2l0aCBjc19jaGFuZ2UgaGludCBpbiBsYXN0IHRyYW5zZmVyICovCisJCWlmIChjLT5sYXN0X2NoaXBzZWxlY3QgPj0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlKGMtPmxhc3RfY2hpcHNlbGVjdCwKKwkJCQkJIWMtPmxhc3RfY2hpcHNlbGVjdF92YWwpOworCQljLT5sYXN0X2NoaXBzZWxlY3QgPSBzcGktPmNoaXBfc2VsZWN0OworCQljLT5sYXN0X2NoaXBzZWxlY3RfdmFsID0gdmFsOworCX0gZWxzZSB7CisJCWMtPmxhc3RfY2hpcHNlbGVjdCA9IC0xOworCQluZGVsYXkoY3NfZGVsYXkpOwkvKiBDUyBIb2xkIFRpbWUgKi8KKwl9CisJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jaGlwX3NlbGVjdCwgdmFsKTsKKwluZGVsYXkoY3NfZGVsYXkpOwkvKiBDUyBTZXR1cCBUaW1lIC8gQ1MgUmVjb3ZlcnkgVGltZSAqLworfQorCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMJKFNQSV9DU19ISUdIfFNQSV9DUE9MfFNQSV9DUEhBKQorCitzdGF0aWMgaW50IHR4eDlzcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXU4IGJpdHNfcGVyX3dvcmQ7CisKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3BpLT5tYXhfc3BlZWRfaHoKKwkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6ID4gYy0+bWF4X3NwZWVkX2h6CisJCQl8fCBzcGktPm1heF9zcGVlZF9oeiA8IGMtPm1pbl9zcGVlZF9oeikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkID8gOiA4OworCWlmIChiaXRzX3Blcl93b3JkICE9IDggJiYgYml0c19wZXJfd29yZCAhPSAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHNwaS0+Y2hpcF9zZWxlY3QsCisJCQkhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJDYW5ub3Qgc2V0dXAgR1BJTyBmb3IgY2hpcHNlbGVjdC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBkZXNlbGVjdCBjaGlwICovCisJc3Bpbl9sb2NrKCZjLT5sb2NrKTsKKwl0eHg5c3BpX2NzX2Z1bmMoc3BpLCBjLCAwLCAoTlNFQ19QRVJfU0VDIC8gMikgLyBzcGktPm1heF9zcGVlZF9oeik7CisJc3Bpbl91bmxvY2soJmMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0eHg5c3BpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBkZXZfaWQ7CisKKwkvKiBkaXNhYmxlIHJ4IGludHIgKi8KKwl0eHg5c3BpX3dyKGMsIHR4eDlzcGlfcmQoYywgVFh4OV9TUENSMCkgJiB+VFh4OV9TUENSMF9SQlNJRSwKKwkJCVRYeDlfU1BDUjApOworCXdha2VfdXAoJmMtPndhaXRxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHR4eDlzcGlfd29ya19vbmUoc3RydWN0IHR4eDlzcGkgKmMsIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbS0+c3BpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdW5zaWduZWQgaW50IGNzX2RlbGF5OworCXVuc2lnbmVkIGludCBjc19jaGFuZ2UgPSAxOworCWludCBzdGF0dXMgPSAwOworCXUzMiBtY3I7CisJdTMyIHByZXZfc3BlZWRfaHogPSAwOworCXU4IHByZXZfYml0c19wZXJfd29yZCA9IDA7CisKKwkvKiBDUyBzZXR1cC9ob2xkL3JlY292ZXJ5IHRpbWUgaW4gbnNlYyAqLworCWNzX2RlbGF5ID0gMTAwICsgKE5TRUNfUEVSX1NFQyAvIDIpIC8gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwltY3IgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BNQ1IpOworCWlmICh1bmxpa2VseSgobWNyICYgVFh4OV9TUE1DUl9PUE1PREUpID09IFRYeDlfU1BNQ1JfQUNUSVZFKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkJhZCBtb2RlLlxuIik7CisJCXN0YXR1cyA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisJbWNyICY9IH4oVFh4OV9TUE1DUl9PUE1PREUgfCBUWHg5X1NQTUNSX1NQU1RQIHwgVFh4OV9TUE1DUl9CQ0xSKTsKKworCS8qIGVudGVyIGNvbmZpZyBtb2RlICovCisJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7CisJdHh4OXNwaV93cihjLCBUWHg5X1NQQ1IwX1NCT1MKKwkJCXwgKChzcGktPm1vZGUgJiBTUElfQ1BPTCkgPyBUWHg5X1NQQ1IwX1NQT0wgOiAwKQorCQkJfCAoKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSA/IFRYeDlfU1BDUjBfU1BIQSA6IDApCisJCQl8IDB4MDgsCisJCQlUWHg5X1NQQ1IwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJY29uc3Qgdm9pZCAqdHhidWYgPSB0LT50eF9idWY7CisJCXZvaWQgKnJ4YnVmID0gdC0+cnhfYnVmOworCQl1MzIgZGF0YTsKKwkJdW5zaWduZWQgaW50IGxlbiA9IHQtPmxlbjsKKwkJdW5zaWduZWQgaW50IHdzaXplOworCQl1MzIgc3BlZWRfaHogPSB0LT5zcGVlZF9oeiA/IDogc3BpLT5tYXhfc3BlZWRfaHo7CisJCXU4IGJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkID8gOiBzcGktPmJpdHNfcGVyX3dvcmQ7CisKKwkJYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQgPyA6IDg7CisJCXdzaXplID0gYml0c19wZXJfd29yZCA+PiAzOyAvKiBpbiBieXRlcyAqLworCisJCWlmIChwcmV2X3NwZWVkX2h6ICE9IHNwZWVkX2h6CisJCQkJfHwgcHJldl9iaXRzX3Blcl93b3JkICE9IGJpdHNfcGVyX3dvcmQpIHsKKwkJCXUzMiBuID0gKGMtPmJhc2VjbGsgKyBzcGVlZF9oeiAtIDEpIC8gc3BlZWRfaHo7CisJCQlpZiAobiA8IDEpCisJCQkJbiA9IDE7CisJCQllbHNlIGlmIChuID4gMHhmZikKKwkJCQluID0gMHhmZjsKKwkJCS8qIGVudGVyIGNvbmZpZyBtb2RlICovCisJCQl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLAorCQkJCQlUWHg5X1NQTUNSKTsKKwkJCXR4eDlzcGlfd3IoYywgKG4gPDwgOCkgfCBiaXRzX3Blcl93b3JkLCBUWHg5X1NQQ1IxKTsKKwkJCS8qIGVudGVyIGFjdGl2ZSBtb2RlICovCisJCQl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQUNUSVZFLCBUWHg5X1NQTUNSKTsKKworCQkJcHJldl9zcGVlZF9oeiA9IHNwZWVkX2h6OworCQkJcHJldl9iaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZDsKKwkJfQorCisJCWlmIChjc19jaGFuZ2UpCisJCQl0eHg5c3BpX2NzX2Z1bmMoc3BpLCBjLCAxLCBjc19kZWxheSk7CisJCWNzX2NoYW5nZSA9IHQtPmNzX2NoYW5nZTsKKwkJd2hpbGUgKGxlbikgeworCQkJdW5zaWduZWQgaW50IGNvdW50ID0gU1BJX0ZJRk9fU0laRTsKKwkJCWludCBpOworCQkJdTMyIGNyMDsKKworCQkJaWYgKGxlbiA8IGNvdW50ICogd3NpemUpCisJCQkJY291bnQgPSBsZW4gLyB3c2l6ZTsKKwkJCS8qIG5vdyB0eCBtdXN0IGJlIGlkbGUuLi4gKi8KKwkJCXdoaWxlICghKHR4eDlzcGlfcmQoYywgVFh4OV9TUFNSKSAmIFRYeDlfU1BTUl9TSURMRSkpCisJCQkJY3B1X3JlbGF4KCk7CisJCQljcjAgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BDUjApOworCQkJY3IwICY9IH5UWHg5X1NQQ1IwX1JYSUZMX01BU0s7CisJCQljcjAgfD0gKGNvdW50IC0gMSkgPDwgMTI7CisJCQkvKiBlbmFibGUgcnggaW50ciAqLworCQkJY3IwIHw9IFRYeDlfU1BDUjBfUkJTSUU7CisJCQl0eHg5c3BpX3dyKGMsIGNyMCwgVFh4OV9TUENSMCk7CisJCQkvKiBzZW5kICovCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJCWlmICh0eGJ1ZikgeworCQkJCQlkYXRhID0gKHdzaXplID09IDEpCisJCQkJCQk/ICooY29uc3QgdTggKil0eGJ1ZgorCQkJCQkJOiAqKGNvbnN0IHUxNiAqKXR4YnVmOworCQkJCQl0eHg5c3BpX3dyKGMsIGRhdGEsIFRYeDlfU1BEUik7CisJCQkJCXR4YnVmICs9IHdzaXplOworCQkJCX0gZWxzZQorCQkJCQl0eHg5c3BpX3dyKGMsIDAsIFRYeDlfU1BEUik7CisJCQl9CisJCQkvKiB3YWl0IGFsbCByeCBkYXRhICovCisJCQl3YWl0X2V2ZW50KGMtPndhaXRxLAorCQkJCXR4eDlzcGlfcmQoYywgVFh4OV9TUFNSKSAmIFRYeDlfU1BTUl9SQlNJKTsKKwkJCS8qIHJlY2VpdmUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJZGF0YSA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUERSKTsKKwkJCQlpZiAocnhidWYpIHsKKwkJCQkJaWYgKHdzaXplID09IDEpCisJCQkJCQkqKHU4ICopcnhidWYgPSBkYXRhOworCQkJCQllbHNlCisJCQkJCQkqKHUxNiAqKXJ4YnVmID0gZGF0YTsKKwkJCQkJcnhidWYgKz0gd3NpemU7CisJCQkJfQorCQkJfQorCQkJbGVuIC09IGNvdW50ICogd3NpemU7CisJCX0KKwkJbS0+YWN0dWFsX2xlbmd0aCArPSB0LT5sZW47CisJCWlmICh0LT5kZWxheV91c2VjcykKKwkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7CisKKwkJaWYgKCFjc19jaGFuZ2UpCisJCQljb250aW51ZTsKKwkJaWYgKHQtPnRyYW5zZmVyX2xpc3QubmV4dCA9PSAmbS0+dHJhbnNmZXJzKQorCQkJYnJlYWs7CisJCS8qIHNvbWV0aW1lcyBhIHNob3J0IG1pZC1tZXNzYWdlIGRlc2VsZWN0IG9mIHRoZSBjaGlwCisJCSAqIG1heSBiZSBuZWVkZWQgdG8gdGVybWluYXRlIGEgbW9kZSBvciBjb21tYW5kCisJCSAqLworCQl0eHg5c3BpX2NzX2Z1bmMoc3BpLCBjLCAwLCBjc19kZWxheSk7CisJfQorCitleGl0OgorCW0tPnN0YXR1cyA9IHN0YXR1czsKKwltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKworCS8qIG5vcm1hbGx5IGRlYWN0aXZhdGUgY2hpcHNlbGVjdCAuLi4gdW5sZXNzIG5vIGVycm9yIGFuZAorCSAqIGNzX2NoYW5nZSBoYXMgaGludGVkIHRoYXQgdGhlIG5leHQgbWVzc2FnZSB3aWxsIHByb2JhYmx5CisJICogYmUgZm9yIHRoaXMgY2hpcCB0b28uCisJICovCisJaWYgKCEoc3RhdHVzID09IDAgJiYgY3NfY2hhbmdlKSkKKwkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMCwgY3NfZGVsYXkpOworCisJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKK30KKworc3RhdGljIHZvaWQgdHh4OXNwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHh4OXNwaSwgd29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjLT5xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlICptOworCisJCW0gPSBjb250YWluZXJfb2YoYy0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+bG9jaywgZmxhZ3MpOworCisJCXR4eDlzcGlfd29ya19vbmUoYywgbSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmxvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHR4eDlzcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltLT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCS8qIGNoZWNrIGVhY2ggdHJhbnNmZXIncyBwYXJhbWV0ZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQl1MzIgc3BlZWRfaHogPSB0LT5zcGVlZF9oeiA/IDogc3BpLT5tYXhfc3BlZWRfaHo7CisJCXU4IGJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkID8gOiBzcGktPmJpdHNfcGVyX3dvcmQ7CisKKwkJYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQgPyA6IDg7CisJCWlmICghdC0+dHhfYnVmICYmICF0LT5yeF9idWYgJiYgdC0+bGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChiaXRzX3Blcl93b3JkICE9IDggJiYgYml0c19wZXJfd29yZCAhPSAxNikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodC0+bGVuICYgKChiaXRzX3Blcl93b3JkID4+IDMpIC0gMSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHNwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6IHx8IHNwZWVkX2h6ID4gYy0+bWF4X3NwZWVkX2h6KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJmMtPnF1ZXVlKTsKKwlxdWV1ZV93b3JrKGMtPndvcmtxdWV1ZSwgJmMtPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0eHg5c3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCB0eHg5c3BpICpjOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSAtRU5PREVWOworCXUzMiBtY3I7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZkZXYtPmRldiwgc2l6ZW9mKCpjKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiByZXQ7CisJYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwljLT5pcnEgPSAtMTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisKKwlJTklUX1dPUksoJmMtPndvcmssIHR4eDlzcGlfd29yayk7CisJc3Bpbl9sb2NrX2luaXQoJmMtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZjLT5xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+d2FpdHEpOworCisJYy0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJzcGktYmFzZWNsayIpOworCWlmIChJU19FUlIoYy0+Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGMtPmNsayk7CisJCWMtPmNsayA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gY2xrX2VuYWJsZShjLT5jbGspOworCWlmIChyZXQpIHsKKwkJY2xrX3B1dChjLT5jbGspOworCQljLT5jbGsgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJfQorCWMtPmJhc2VjbGsgPSBjbGtfZ2V0X3JhdGUoYy0+Y2xrKTsKKwljLT5taW5fc3BlZWRfaHogPSAoYy0+YmFzZWNsayArIDB4ZmYgLSAxKSAvIDB4ZmY7CisJYy0+bWF4X3NwZWVkX2h6ID0gYy0+YmFzZWNsazsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJZ290byBleGl0OworCWMtPm1lbWJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCWlmICghYy0+bWVtYmFzZSkKKwkJZ290byBleGl0OworCisJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwltY3IgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BNQ1IpOworCW1jciAmPSB+KFRYeDlfU1BNQ1JfT1BNT0RFIHwgVFh4OV9TUE1DUl9TUFNUUCB8IFRYeDlfU1BNQ1JfQkNMUik7CisJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7CisKKwljLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CisJaWYgKGMtPmlycSA8IDApCisJCWdvdG8gZXhpdDsKKwlyZXQgPSByZXF1ZXN0X2lycShjLT5pcnEsIHR4eDlzcGlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGMpOworCWlmIChyZXQpIHsKKwkJYy0+aXJxID0gLTE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwljLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShtYXN0ZXItPmNkZXYuZGV2LT5idXNfaWQpOworCWlmICghYy0+d29ya3F1ZXVlKQorCQlnb3RvIGV4aXQ7CisJYy0+bGFzdF9jaGlwc2VsZWN0ID0gLTE7CisKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJhdCAlI2xseCwgaXJxICVkLCAlZE1IelxuIiwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwgYy0+aXJxLAorCQkgKGMtPmJhc2VjbGsgKyA1MDAwMDApIC8gMTAwMDAwMCk7CisKKwltYXN0ZXItPmJ1c19udW0gPSBkZXYtPmlkOworCW1hc3Rlci0+c2V0dXAgPSB0eHg5c3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSB0eHg5c3BpX3RyYW5zZmVyOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAodTE2KVVJTlRfTUFYOyAvKiBhbnkgR1BJTyBudW1iZXJzICovCisKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHJldCkKKwkJZ290byBleGl0OworCXJldHVybiAwOworZXhpdDoKKwlpZiAoYy0+d29ya3F1ZXVlKQorCQlkZXN0cm95X3dvcmtxdWV1ZShjLT53b3JrcXVldWUpOworCWlmIChjLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEoYy0+aXJxLCBjKTsKKwlpZiAoYy0+bWVtYmFzZSkKKwkJaW91bm1hcChjLT5tZW1iYXNlKTsKKwlpZiAoYy0+Y2xrKSB7CisJCWNsa19kaXNhYmxlKGMtPmNsayk7CisJCWNsa19wdXQoYy0+Y2xrKTsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHR4eDlzcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpX21hc3Rlcl9nZXQocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGMtPndvcmtxdWV1ZSk7CisJZnJlZV9pcnEoYy0+aXJxLCBjKTsKKwlpb3VubWFwKGMtPm1lbWJhc2UpOworCWNsa19kaXNhYmxlKGMtPmNsayk7CisJY2xrX3B1dChjLT5jbGspOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR4eDlzcGlfZHJpdmVyID0geworCS5yZW1vdmUgPSBfX2V4aXRfcCh0eHg5c3BpX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHh4OXNwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0eHg5c3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZ0eHg5c3BpX2RyaXZlciwgdHh4OXNwaV9wcm9iZSk7Cit9CitzdWJzeXNfaW5pdGNhbGwodHh4OXNwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHR4eDlzcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0eHg5c3BpX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0eHg5c3BpX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRYeDkgU1BJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpZGV2LmMgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwppbmRleCBkMDQyNDJhLi4zOGI2MGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlkZXYuYworKysgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwpAQCAtMTgxLDcgKzE4MSw4IEBACiAJCX0KIAkJaWYgKHVfdG1wLT50eF9idWYpIHsKIAkJCWtfdG1wLT50eF9idWYgPSBidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAoY29uc3QgdTggX191c2VyICopdV90bXAtPnR4X2J1ZiwKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIChjb25zdCB1OCBfX3VzZXIgKikKKwkJCQkJCShwdHJkaWZmX3QpIHVfdG1wLT50eF9idWYsCiAJCQkJCXVfdG1wLT5sZW4pKQogCQkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMjEzLDcgKzIxNCw4IEBACiAJYnVmID0gc3BpZGV2LT5idWZmZXI7CiAJZm9yIChuID0gbl94ZmVycywgdV90bXAgPSB1X3hmZXJzOyBuOyBuLS0sIHVfdG1wKyspIHsKIAkJaWYgKHVfdG1wLT5yeF9idWYpIHsKLQkJCWlmIChfX2NvcHlfdG9fdXNlcigodTggX191c2VyICopdV90bXAtPnJ4X2J1ZiwgYnVmLAorCQkJaWYgKF9fY29weV90b191c2VyKCh1OCBfX3VzZXIgKikKKwkJCQkJKHB0cmRpZmZfdCkgdV90bXAtPnJ4X2J1ZiwgYnVmLAogCQkJCQl1X3RtcC0+bGVuKSkgewogCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvdGxlNjJ4MC5jIGIvZHJpdmVycy9zcGkvdGxlNjJ4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTU4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS90bGU2MngwLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiB0bGU2MngwLmMgLS0gc3VwcG9ydCBJbmZpbmVvbiBUTEU2MngwIGRyaXZlciBjaGlwcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3RsZTYyeDAuaD4KKworCisjZGVmaW5lIENNRF9SRUFECTB4MDAKKyNkZWZpbmUgQ01EX1NFVAkJMHhmZgorCisjZGVmaW5lIERJQUdfTk9STUFMCTB4MDMKKyNkZWZpbmUgRElBR19PVkVSTE9BRAkweDAyCisjZGVmaW5lIERJQUdfT1BFTgkweDAxCisjZGVmaW5lIERJQUdfU0hPUlRHTkQJMHgwMAorCitzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJKnVzOworCXN0cnVjdCBtdXRleAkJbG9jazsKKwl1bnNpZ25lZCBpbnQJCW5yX2dwaW87CisJdW5zaWduZWQgaW50CQlncGlvX3N0YXRlOworCisJdW5zaWduZWQgY2hhcgkJdHhfYnVmZls0XTsKKwl1bnNpZ25lZCBjaGFyCQlyeF9idWZmWzRdOworfTsKKworc3RhdGljIGludCB0b19ncGlvX251bShzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cik7CisKK3N0YXRpYyBpbmxpbmUgaW50IHRsZTYyeDBfd3JpdGUoc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0KQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZmYgPSBzdC0+dHhfYnVmZjsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19zdGF0ZSA9IHN0LT5ncGlvX3N0YXRlOworCisJYnVmZlswXSA9IENNRF9TRVQ7CisKKwlpZiAoc3QtPm5yX2dwaW8gPT0gMTYpIHsKKwkJYnVmZlsxXSA9IGdwaW9fc3RhdGUgPj4gODsKKwkJYnVmZlsyXSA9IGdwaW9fc3RhdGU7CisJfSBlbHNlIHsKKwkJYnVmZlsxXSA9IGdwaW9fc3RhdGU7CisJfQorCisJZGV2X2RiZygmc3QtPnVzLT5kZXYsICJidWZmICUwMngsJTAyeCwlMDJ4XG4iLAorCQlidWZmWzBdLCBidWZmWzFdLCBidWZmWzJdKTsKKworCXJldHVybiBzcGlfd3JpdGUoc3QtPnVzLCBidWZmLCAoc3QtPm5yX2dwaW8gPT0gMTYpID8gMyA6IDIpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0bGU2MngwX3JlYWQoc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0KQoreworCXVuc2lnbmVkIGNoYXIgKnR4YnVmZiA9IHN0LT50eF9idWZmOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlciA9IHsKKwkJLnR4X2J1ZgkJPSB0eGJ1ZmYsCisJCS5yeF9idWYJCT0gc3QtPnJ4X2J1ZmYsCisJCS5sZW4JCT0gKHN0LT5ucl9ncGlvICogMikgLyA4LAorCX07CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKworCXR4YnVmZlswXSA9IENNRF9SRUFEOworCXR4YnVmZlsxXSA9IDB4MDA7CisJdHhidWZmWzJdID0gMHgwMDsKKwl0eGJ1ZmZbM10gPSAweDAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisKKwlyZXR1cm4gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRlY29kZV9mYXVsdCh1bnNpZ25lZCBpbnQgZmF1bHRfY29kZSkKK3sKKwlmYXVsdF9jb2RlICY9IDM7CisKKwlzd2l0Y2ggKGZhdWx0X2NvZGUpIHsKKwljYXNlIERJQUdfTk9STUFMOgorCQlyZXR1cm4gIk4iOworCWNhc2UgRElBR19PVkVSTE9BRDoKKwkJcmV0dXJuICJWIjsKKwljYXNlIERJQUdfT1BFTjoKKwkJcmV0dXJuICJPIjsKKwljYXNlIERJQUdfU0hPUlRHTkQ6CisJCXJldHVybiAiRyI7CisJfQorCisJcmV0dXJuICI/IjsKK30KKworc3RhdGljIHNzaXplX3QgdGxlNjJ4MF9zdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY2hhciAqYnAgPSBidWY7CisJdW5zaWduZWQgY2hhciAqYnVmZiA9IHN0LT5yeF9idWZmOworCXVuc2lnbmVkIGxvbmcgZmF1bHQgPSAwOworCWludCBwdHI7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlyZXQgPSB0bGU2MngwX3JlYWQoc3QpOworCisJZGV2X2RiZyhkZXYsICJ0bGU2MngwX3JlYWQoKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKworCWZvciAocHRyID0gMDsgcHRyIDwgKHN0LT5ucl9ncGlvICogMikvODsgcHRyICs9IDEpIHsKKwkJZmF1bHQgPDw9IDg7CisJCWZhdWx0ICB8PSAoKHVuc2lnbmVkIGxvbmcpYnVmZltwdHJdKTsKKworCQlkZXZfZGJnKGRldiwgImJ5dGUgJWQgaXMgJTAyeFxuIiwgcHRyLCBidWZmW3B0cl0pOworCX0KKworCWZvciAocHRyID0gMDsgcHRyIDwgc3QtPm5yX2dwaW87IHB0cisrKSB7CisJCWJwICs9IHNwcmludGYoYnAsICIlcyAiLCBkZWNvZGVfZmF1bHQoZmF1bHQgPj4gKHB0ciAqIDIpKSk7CisJfQorCisJKmJwKysgPSAnXG4nOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIGJwIC0gYnVmOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzX3Nob3csIFNfSVJVR08sIHRsZTYyeDBfc3RhdHVzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCB0bGU2MngwX2dwaW9fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGdwaW9fbnVtID0gdG9fZ3Bpb19udW0oYXR0cik7CisJaW50IHZhbHVlOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXZhbHVlID0gKHN0LT5ncGlvX3N0YXRlID4+IGdwaW9fbnVtKSAmIDE7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgdGxlNjJ4MF9ncGlvX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZ3Bpb19udW0gPSB0b19ncGlvX251bShhdHRyKTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwljaGFyICplbmRwOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7CisJaWYgKGJ1ZiA9PSBlbmRwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoZGV2LCAic2V0dGluZyBncGlvICVkIHRvICVsZFxuIiwgZ3Bpb19udW0sIHZhbCk7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlpZiAodmFsKQorCQlzdC0+Z3Bpb19zdGF0ZSB8PSAxIDw8IGdwaW9fbnVtOworCWVsc2UKKwkJc3QtPmdwaW9fc3RhdGUgJj0gfigxIDw8IGdwaW9fbnVtKTsKKworCXRsZTYyeDBfd3JpdGUoc3QpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8yLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8zLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW80LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW81LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW82LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW83LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW84LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW85LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMCwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTEsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEyLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMywgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTQsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzE1LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xNiwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpncGlvX2F0dHJzW10gPSB7CisJWzBdCQk9ICZkZXZfYXR0cl9ncGlvMSwKKwlbMV0JCT0gJmRldl9hdHRyX2dwaW8yLAorCVsyXQkJPSAmZGV2X2F0dHJfZ3BpbzMsCisJWzNdCQk9ICZkZXZfYXR0cl9ncGlvNCwKKwlbNF0JCT0gJmRldl9hdHRyX2dwaW81LAorCVs1XQkJPSAmZGV2X2F0dHJfZ3BpbzYsCisJWzZdCQk9ICZkZXZfYXR0cl9ncGlvNywKKwlbN10JCT0gJmRldl9hdHRyX2dwaW84LAorCVs4XQkJPSAmZGV2X2F0dHJfZ3BpbzksCisJWzldCQk9ICZkZXZfYXR0cl9ncGlvMTAsCisJWzEwXQkJPSAmZGV2X2F0dHJfZ3BpbzExLAorCVsxMV0JCT0gJmRldl9hdHRyX2dwaW8xMiwKKwlbMTJdCQk9ICZkZXZfYXR0cl9ncGlvMTMsCisJWzEzXQkJPSAmZGV2X2F0dHJfZ3BpbzE0LAorCVsxNF0JCT0gJmRldl9hdHRyX2dwaW8xNSwKKwlbMTVdCQk9ICZkZXZfYXR0cl9ncGlvMTYKK307CisKK3N0YXRpYyBpbnQgdG9fZ3Bpb19udW0oc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaW50IHB0cjsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShncGlvX2F0dHJzKTsgcHRyKyspIHsKKwkJaWYgKGdwaW9fYXR0cnNbcHRyXSA9PSBhdHRyKQorCQkJcmV0dXJuIHB0cjsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRsZTYyeDBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3Q7CisJc3RydWN0IHRsZTYyeDBfcGRhdGEgKnBkYXRhOworCWludCBwdHI7CisJaW50IHJldDsKKworCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIGRldmljZSBkYXRhIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRsZTYyeDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIG1lbW9yeSBmb3IgZGV2aWNlIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3QtPnVzID0gc3BpOworCXN0LT5ucl9ncGlvID0gcGRhdGEtPmdwaW9fY291bnQ7CisJc3QtPmdwaW9fc3RhdGUgPSBwZGF0YS0+aW5pdF9zdGF0ZTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9zdGF0dXNfc2hvdyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBjcmVhdGUgc3RhdHVzIGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyX3N0YXR1czsKKwl9CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IHBkYXRhLT5ncGlvX2NvdW50OyBwdHIrKykgeworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCBncGlvX2F0dHJzW3B0cl0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbm5vdCBjcmVhdGUgZ3BpbyBhdHRyaWJ1dGVcbiIpOworCQkJZ290byBlcnJfZ3Bpb3M7CisJCX0KKwl9CisKKwkvKiB0bGU2MngwX3dyaXRlKHN0KTsgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisJcmV0dXJuIDA7CisKKyBlcnJfZ3Bpb3M6CisJZm9yICg7IHB0ciA+IDA7IHB0ci0tKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCBncGlvX2F0dHJzW3B0cl0pOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3N0YXR1c19zaG93KTsKKworIGVycl9zdGF0dXM6CisJa2ZyZWUoc3QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRsZTYyeDBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJaW50IHB0cjsKKworCWZvciAocHRyID0gMDsgcHRyIDwgc3QtPm5yX2dwaW87IHB0cisrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCBncGlvX2F0dHJzW3B0cl0pOworCisJa2ZyZWUoc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgdGxlNjJ4MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidGxlNjJ4MCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHRsZTYyeDBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0bGU2MngwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCB0bGU2MngwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmdGxlNjJ4MF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgdGxlNjJ4MF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bGU2MngwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRsZTYyeDBfaW5pdCk7Cittb2R1bGVfZXhpdCh0bGU2MngwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRMRTYyeDAgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkveGlsaW54X3NwaS5jIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmY5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qCisgKiB4aWxpbnhfc3BpLmMKKyAqCisgKiBYaWxpbnggU1BJIGNvbnRyb2xsZXIgZHJpdmVyIChtYXN0ZXIgbW9kZSBvbmx5KQorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoJc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAyMDAyLTIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQKKyAqICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxzeXNsaWIvdmlydGV4X2RldmljZXMuaD4KKworI2RlZmluZSBYSUxJTlhfU1BJX05BTUUgInhzcGkiCisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zIGFzIHBlciAiT1BCIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSAodjEuMDBlKQorICogUHJvZHVjdCBTcGVjaWZpY2F0aW9uIiwgRFM0NjQKKyAqLworI2RlZmluZSBYU1BJX0NSX09GRlNFVAkJMHg2MgkvKiAxNi1iaXQgQ29udHJvbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFhTUElfQ1JfRU5BQkxFCQkweDAyCisjZGVmaW5lIFhTUElfQ1JfTUFTVEVSX01PREUJMHgwNAorI2RlZmluZSBYU1BJX0NSX0NQT0wJCTB4MDgKKyNkZWZpbmUgWFNQSV9DUl9DUEhBCQkweDEwCisjZGVmaW5lIFhTUElfQ1JfTU9ERV9NQVNLCShYU1BJX0NSX0NQSEEgfCBYU1BJX0NSX0NQT0wpCisjZGVmaW5lIFhTUElfQ1JfVFhGSUZPX1JFU0VUCTB4MjAKKyNkZWZpbmUgWFNQSV9DUl9SWEZJRk9fUkVTRVQJMHg0MAorI2RlZmluZSBYU1BJX0NSX01BTlVBTF9TU0VMRUNUCTB4ODAKKyNkZWZpbmUgWFNQSV9DUl9UUkFOU19JTkhJQklUCTB4MTAwCisKKyNkZWZpbmUgWFNQSV9TUl9PRkZTRVQJCTB4NjcJLyogOC1iaXQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgWFNQSV9TUl9SWF9FTVBUWV9NQVNLCTB4MDEJLyogUmVjZWl2ZSBGSUZPIGlzIGVtcHR5ICovCisjZGVmaW5lIFhTUElfU1JfUlhfRlVMTF9NQVNLCTB4MDIJLyogUmVjZWl2ZSBGSUZPIGlzIGZ1bGwgKi8KKyNkZWZpbmUgWFNQSV9TUl9UWF9FTVBUWV9NQVNLCTB4MDQJLyogVHJhbnNtaXQgRklGTyBpcyBlbXB0eSAqLworI2RlZmluZSBYU1BJX1NSX1RYX0ZVTExfTUFTSwkweDA4CS8qIFRyYW5zbWl0IEZJRk8gaXMgZnVsbCAqLworI2RlZmluZSBYU1BJX1NSX01PREVfRkFVTFRfTUFTSwkweDEwCS8qIE1vZGUgZmF1bHQgZXJyb3IgKi8KKworI2RlZmluZSBYU1BJX1RYRF9PRkZTRVQJCTB4NmIJLyogOC1iaXQgRGF0YSBUcmFuc21pdCBSZWdpc3RlciAqLworI2RlZmluZSBYU1BJX1JYRF9PRkZTRVQJCTB4NmYJLyogOC1iaXQgRGF0YSBSZWNlaXZlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgWFNQSV9TU1JfT0ZGU0VUCQkweDcwCS8qIDMyLWJpdCBTbGF2ZSBTZWxlY3QgUmVnaXN0ZXIgKi8KKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgYXMgcGVyICJPUEIgSVBJRiAodjMuMDFjKSBQcm9kdWN0IFNwZWNpZmljYXRpb24iLCBEUzQxNAorICogSVBJRiByZWdpc3RlcnMgYXJlIDMyIGJpdAorICovCisjZGVmaW5lIFhJUElGX1YxMjNCX0RHSUVSX09GRlNFVAkweDFjCS8qIElQSUYgZ2xvYmFsIGludCBlbmFibGUgcmVnICovCisjZGVmaW5lIFhJUElGX1YxMjNCX0dJTlRSX0VOQUJMRQkweDgwMDAwMDAwCisKKyNkZWZpbmUgWElQSUZfVjEyM0JfSUlTUl9PRkZTRVQJCTB4MjAJLyogSVBJRiBpbnRlcnJ1cHQgc3RhdHVzIHJlZyAqLworI2RlZmluZSBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVAkJMHgyOAkvKiBJUElGIGludGVycnVwdCBlbmFibGUgcmVnICovCisKKyNkZWZpbmUgWFNQSV9JTlRSX01PREVfRkFVTFQJCTB4MDEJLyogTW9kZSBmYXVsdCBlcnJvciAqLworI2RlZmluZSBYU1BJX0lOVFJfU0xBVkVfTU9ERV9GQVVMVAkweDAyCS8qIFNlbGVjdGVkIGFzIHNsYXZlIHdoaWxlCisJCQkJCQkgKiBkaXNhYmxlZCAqLworI2RlZmluZSBYU1BJX0lOVFJfVFhfRU1QVFkJCTB4MDQJLyogVHhGSUZPIGlzIGVtcHR5ICovCisjZGVmaW5lIFhTUElfSU5UUl9UWF9VTkRFUlJVTgkJMHgwOAkvKiBUeEZJRk8gd2FzIHVuZGVycnVuICovCisjZGVmaW5lIFhTUElfSU5UUl9SWF9GVUxMCQkweDEwCS8qIFJ4RklGTyBpcyBmdWxsICovCisjZGVmaW5lIFhTUElfSU5UUl9SWF9PVkVSUlVOCQkweDIwCS8qIFJ4RklGTyB3YXMgb3ZlcnJ1biAqLworCisjZGVmaW5lIFhJUElGX1YxMjNCX1JFU0VUUl9PRkZTRVQJMHg0MAkvKiBJUElGIHJlc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIFhJUElGX1YxMjNCX1JFU0VUX01BU0sJCTB4MGEJLyogdGhlIHZhbHVlIHRvIHdyaXRlICovCisKK3N0cnVjdCB4aWxpbnhfc3BpIHsKKwkvKiBiaXRiYW5nIGhhcyB0byBiZSBmaXJzdCAqLworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CisKKwl2b2lkIF9faW9tZW0JKnJlZ3M7CS8qIHZpcnQuIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKwl1MzIJCWlycTsKKworCXUzMgkJc3BlZWRfaHo7IC8qIFNDSyBoYXMgYSBmaXhlZCBmcmVxdWVuY3kgb2Ygc3BlZWRfaHogSHogKi8KKworCXU4ICpyeF9wdHI7CQkvKiBwb2ludGVyIGluIHRoZSBUeCBidWZmZXIgKi8KKwljb25zdCB1OCAqdHhfcHRyOwkvKiBwb2ludGVyIGluIHRoZSBSeCBidWZmZXIgKi8KKwlpbnQgcmVtYWluaW5nX2J5dGVzOwkvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gdHJhbnNmZXIgKi8KK307CisKK3N0YXRpYyB2b2lkIHhzcGlfaW5pdF9odyh2b2lkIF9faW9tZW0gKnJlZ3NfYmFzZSkKK3sKKwkvKiBSZXNldCB0aGUgU1BJIGRldmljZSAqLworCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX1JFU0VUUl9PRkZTRVQsCisJCSBYSVBJRl9WMTIzQl9SRVNFVF9NQVNLKTsKKwkvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyBqdXN0IGluIGNhc2UgKi8KKwlvdXRfYmUzMihyZWdzX2Jhc2UgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCwgMCk7CisJLyogRW5hYmxlIHRoZSBnbG9iYWwgSVBJRiBpbnRlcnJ1cHQgKi8KKwlvdXRfYmUzMihyZWdzX2Jhc2UgKyBYSVBJRl9WMTIzQl9ER0lFUl9PRkZTRVQsCisJCSBYSVBJRl9WMTIzQl9HSU5UUl9FTkFCTEUpOworCS8qIERlc2VsZWN0IHRoZSBzbGF2ZSBvbiB0aGUgU1BJIGJ1cyAqLworCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhTUElfU1NSX09GRlNFVCwgMHhmZmZmKTsKKwkvKiBEaXNhYmxlIHRoZSB0cmFuc21pdHRlciwgZW5hYmxlIE1hbnVhbCBTbGF2ZSBTZWxlY3QgQXNzZXJ0aW9uLAorCSAqIHB1dCBTUEkgY29udHJvbGxlciBpbnRvIG1hc3RlciBtb2RlLCBhbmQgZW5hYmxlIGl0ICovCisJb3V0X2JlMTYocmVnc19iYXNlICsgWFNQSV9DUl9PRkZTRVQsCisJCSBYU1BJX0NSX1RSQU5TX0lOSElCSVQgfCBYU1BJX0NSX01BTlVBTF9TU0VMRUNUCisJCSB8IFhTUElfQ1JfTUFTVEVSX01PREUgfCBYU1BJX0NSX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIHhpbGlueF9zcGlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWlmIChpc19vbiA9PSBCSVRCQU5HX0NTX0lOQUNUSVZFKSB7CisJCS8qIERlc2VsZWN0IHRoZSBzbGF2ZSBvbiB0aGUgU1BJIGJ1cyAqLworCQlvdXRfYmUzMih4c3BpLT5yZWdzICsgWFNQSV9TU1JfT0ZGU0VULCAweGZmZmYpOworCX0gZWxzZSBpZiAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpIHsKKwkJLyogU2V0IHRoZSBTUEkgY2xvY2sgcGhhc2UgYW5kIHBvbGFyaXR5ICovCisJCXUxNiBjciA9IGluX2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKQorCQkJICYgflhTUElfQ1JfTU9ERV9NQVNLOworCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCisJCQljciB8PSBYU1BJX0NSX0NQSEE7CisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJCWNyIHw9IFhTUElfQ1JfQ1BPTDsKKwkJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULCBjcik7CisKKwkJLyogV2UgZG8gbm90IGNoZWNrIHNwaS0+bWF4X3NwZWVkX2h6IGhlcmUgYXMgdGhlIFNQSSBjbG9jaworCQkgKiBmcmVxdWVuY3kgaXMgbm90IHNvZnR3YXJlIHByb2dyYW1tYWJsZSAodGhlIElQIGJsb2NrIGRlc2lnbgorCQkgKiBwYXJhbWV0ZXIpCisJCSAqLworCisJCS8qIEFjdGl2YXRlIHRoZSBjaGlwIHNlbGVjdCAqLworCQlvdXRfYmUzMih4c3BpLT5yZWdzICsgWFNQSV9TU1JfT0ZGU0VULAorCQkJIH4oMHgwMDAxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpKTsKKwl9Cit9CisKKy8qIHNwaV9iaXRiYW5nIHJlcXVpcmVzIGN1c3RvbSBzZXR1cF90cmFuc2ZlcigpIHRvIGJlIGRlZmluZWQgaWYgdGhlcmUgaXMgYQorICogY3VzdG9tIHR4cnhfYnVmcygpLiBXZSBoYXZlIG5vdGhpbmcgdG8gc2V0dXAgaGVyZSBhcyB0aGUgU1BJIElQIGJsb2NrCisgKiBzdXBwb3J0cyBqdXN0IDggYml0cyBwZXIgd29yZCwgYW5kIFNQSSBjbG9jayBjYW4ndCBiZSBjaGFuZ2VkIGluIHNvZnR3YXJlLgorICogQ2hlY2sgZm9yIDggYml0cyBwZXIgd29yZC4gQ2hpcCBzZWxlY3QgZGVsYXkgY2FsY3VsYXRpb25zIGNvdWxkIGJlCisgKiBhZGRlZCBoZXJlIGFzIHNvb24gYXMgYml0YmFuZ193b3JrKCkgY2FuIGJlIG1hZGUgYXdhcmUgb2YgdGhlIGRlbGF5IHZhbHVlLgorICovCitzdGF0aWMgaW50IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwl1OCBiaXRzX3Blcl93b3JkOworCXUzMiBoejsKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJYml0c19wZXJfd29yZCA9ICh0KSA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7CisJaHogPSAodCkgPyB0LT5zcGVlZF9oeiA6IHNwaS0+bWF4X3NwZWVkX2h6OworCWlmIChiaXRzX3Blcl93b3JkICE9IDgpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgYml0c19wZXJfd29yZD0lZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgYml0c19wZXJfd29yZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChoeiAmJiB4c3BpLT5zcGVlZF9oeiA+IGh6KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXMsIHVuc3VwcG9ydGVkIGNsb2NrIHJhdGUgJXVIelxuIiwKKwkJCV9fRlVOQ1RJT05fXywgaHopOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBKQorCitzdGF0aWMgaW50IHhpbGlueF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmc7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGk7CisJaW50IHJldHZhbDsKKworCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwliaXRiYW5nID0gJnhzcGktPmJpdGJhbmc7CisKKwlpZiAoIXNwaS0+Yml0c19wZXJfd29yZCkKKwkJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKworCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJX19GVU5DVElPTl9fLCBzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR2YWwgPSB4aWxpbnhfc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIiVzLCBtb2RlICVkLCAldSBiaXRzL3csICV1IG5zZWMvYml0XG4iLAorCQlfX0ZVTkNUSU9OX18sIHNwaS0+bW9kZSAmIE1PREVCSVRTLCBzcGktPmJpdHNfcGVyX3dvcmQsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhpbGlueF9zcGlfZmlsbF90eF9maWZvKHN0cnVjdCB4aWxpbnhfc3BpICp4c3BpKQoreworCXU4IHNyOworCisJLyogRmlsbCB0aGUgVHggRklGTyB3aXRoIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUgKi8KKwlzciA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKKwl3aGlsZSAoKHNyICYgWFNQSV9TUl9UWF9GVUxMX01BU0spID09IDAgJiYgeHNwaS0+cmVtYWluaW5nX2J5dGVzID4gMCkgeworCQlpZiAoeHNwaS0+dHhfcHRyKSB7CisJCQlvdXRfOCh4c3BpLT5yZWdzICsgWFNQSV9UWERfT0ZGU0VULCAqeHNwaS0+dHhfcHRyKyspOworCQl9IGVsc2UgeworCQkJb3V0XzgoeHNwaS0+cmVncyArIFhTUElfVFhEX09GRlNFVCwgMCk7CisJCX0KKwkJeHNwaS0+cmVtYWluaW5nX2J5dGVzLS07CisJCXNyID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOworCX0KK30KKworc3RhdGljIGludCB4aWxpbnhfc3BpX3R4cnhfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTMyIGlwaWZfaWVyOworCXUxNiBjcjsKKworCS8qIFdlIGdldCBoZXJlIHdpdGggdHJhbnNtaXR0ZXIgaW5oaWJpdGVkICovCisKKwl4c3BpLT50eF9wdHIgPSB0LT50eF9idWY7CisJeHNwaS0+cnhfcHRyID0gdC0+cnhfYnVmOworCXhzcGktPnJlbWFpbmluZ19ieXRlcyA9IHQtPmxlbjsKKwlJTklUX0NPTVBMRVRJT04oeHNwaS0+ZG9uZSk7CisKKwl4aWxpbnhfc3BpX2ZpbGxfdHhfZmlmbyh4c3BpKTsKKworCS8qIEVuYWJsZSB0aGUgdHJhbnNtaXQgZW1wdHkgaW50ZXJydXB0LCB3aGljaCB3ZSB1c2UgdG8gZGV0ZXJtaW5lCisJICogcHJvZ3Jlc3Mgb24gdGhlIHRyYW5zbWlzc2lvbi4KKwkgKi8KKwlpcGlmX2llciA9IGluX2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VUKTsKKwlvdXRfYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQsCisJCSBpcGlmX2llciB8IFhTUElfSU5UUl9UWF9FTVBUWSk7CisKKwkvKiBTdGFydCB0aGUgdHJhbnNmZXIgYnkgbm90IGluaGliaXRpbmcgdGhlIHRyYW5zbWl0dGVyIGFueSBsb25nZXIgKi8KKwljciA9IGluX2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKSAmIH5YU1BJX0NSX1RSQU5TX0lOSElCSVQ7CisJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULCBjcik7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ4c3BpLT5kb25lKTsKKworCS8qIERpc2FibGUgdGhlIHRyYW5zbWl0IGVtcHR5IGludGVycnVwdCAqLworCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCwgaXBpZl9pZXIpOworCisJcmV0dXJuIHQtPmxlbiAtIHhzcGktPnJlbWFpbmluZ19ieXRlczsKK30KKworCisvKiBUaGlzIGRyaXZlciBzdXBwb3J0cyBzaW5nbGUgbWFzdGVyIG1vZGUgb25seS4gSGVuY2UgVHggRklGTyBFbXB0eQorICogaXMgdGhlIG9ubHkgaW50ZXJydXB0IHdlIGNhcmUgYWJvdXQuCisgKiBSZWNlaXZlIEZJRk8gT3ZlcnJ1biwgVHJhbnNtaXQgRklGTyBVbmRlcnJ1biwgTW9kZSBGYXVsdCwgYW5kIFNsYXZlIE1vZGUKKyAqIEZhdWx0IGFyZSBub3QgdG8gaGFwcGVuLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgeGlsaW54X3NwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpID0gZGV2X2lkOworCXUzMiBpcGlmX2lzcjsKKworCS8qIEdldCB0aGUgSVBJRiBpbnRlcnJ1cHRzLCBhbmQgY2xlYXIgdGhlbSBpbW1lZGlhdGVseSAqLworCWlwaWZfaXNyID0gaW5fYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlTUl9PRkZTRVQpOworCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSVNSX09GRlNFVCwgaXBpZl9pc3IpOworCisJaWYgKGlwaWZfaXNyICYgWFNQSV9JTlRSX1RYX0VNUFRZKSB7CS8qIFRyYW5zbWlzc2lvbiBjb21wbGV0ZWQgKi8KKwkJdTE2IGNyOworCQl1OCBzcjsKKworCQkvKiBBIHRyYW5zbWl0IGhhcyBqdXN0IGNvbXBsZXRlZC4gUHJvY2VzcyByZWNlaXZlZCBkYXRhIGFuZAorCQkgKiBjaGVjayBmb3IgbW9yZSBkYXRhIHRvIHRyYW5zbWl0LiBBbHdheXMgaW5oaWJpdCB0aGUKKwkJICogdHJhbnNtaXR0ZXIgd2hpbGUgdGhlIElzciByZWZpbGxzIHRoZSB0cmFuc21pdCByZWdpc3Rlci9GSUZPLAorCQkgKiBvciBtYWtlIHN1cmUgaXQgaXMgc3RvcHBlZCBpZiB3ZSdyZSBkb25lLgorCQkgKi8KKwkJY3IgPSBpbl9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCk7CisJCW91dF9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCwKKwkJCSBjciB8IFhTUElfQ1JfVFJBTlNfSU5ISUJJVCk7CisKKwkJLyogUmVhZCBvdXQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIFJ4IEZJRk8gKi8KKwkJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJCXdoaWxlICgoc3IgJiBYU1BJX1NSX1JYX0VNUFRZX01BU0spID09IDApIHsKKwkJCXU4IGRhdGE7CisKKwkJCWRhdGEgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1JYRF9PRkZTRVQpOworCQkJaWYgKHhzcGktPnJ4X3B0cikgeworCQkJCSp4c3BpLT5yeF9wdHIrKyA9IGRhdGE7CisJCQl9CisJCQlzciA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKKwkJfQorCisJCS8qIFNlZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gc2VuZCAqLworCQlpZiAoeHNwaS0+cmVtYWluaW5nX2J5dGVzID4gMCkgeworCQkJeGlsaW54X3NwaV9maWxsX3R4X2ZpZm8oeHNwaSk7CisJCQkvKiBTdGFydCB0aGUgdHJhbnNmZXIgYnkgbm90IGluaGliaXRpbmcgdGhlCisJCQkgKiB0cmFuc21pdHRlciBhbnkgbG9uZ2VyCisJCQkgKi8KKwkJCW91dF9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCwgY3IpOworCQl9IGVsc2UgeworCQkJLyogTm8gbW9yZSBkYXRhIHRvIHNlbmQuCisJCQkgKiBJbmRpY2F0ZSB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVkLgorCQkJICovCisJCQljb21wbGV0ZSgmeHNwaS0+ZG9uZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHhpbGlueF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGk7CisJc3RydWN0IHhzcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyOworCisJLyogR2V0IHJlc291cmNlcyhtZW1vcnksIElSUSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgKi8KKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB4aWxpbnhfc3BpKSk7CisKKwlpZiAobWFzdGVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBtYXN0ZXIpOworCXBkYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcHV0X21hc3RlcjsKKwl9CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBwdXRfbWFzdGVyOworCX0KKworCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJeHNwaS0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCXhzcGktPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHhpbGlueF9zcGlfY2hpcHNlbGVjdDsKKwl4c3BpLT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0geGlsaW54X3NwaV9zZXR1cF90cmFuc2ZlcjsKKwl4c3BpLT5iaXRiYW5nLnR4cnhfYnVmcyA9IHhpbGlueF9zcGlfdHhyeF9idWZzOworCXhzcGktPmJpdGJhbmcubWFzdGVyLT5zZXR1cCA9IHhpbGlueF9zcGlfc2V0dXA7CisJaW5pdF9jb21wbGV0aW9uKCZ4c3BpLT5kb25lKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LAorCQkJci0+ZW5kIC0gci0+c3RhcnQgKyAxLCBYSUxJTlhfU1BJX05BTUUpKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBwdXRfbWFzdGVyOworCX0KKworCXhzcGktPnJlZ3MgPSBpb3JlbWFwKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworCWlmICh4c3BpLT5yZWdzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBwdXRfbWFzdGVyOworCX0KKworCXhzcGktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKKwlpZiAoeHNwaS0+aXJxIDwgMCkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gdW5tYXBfaW87CisJfQorCisJbWFzdGVyLT5idXNfbnVtID0gcGRhdGEtPmJ1c19udW07CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBkYXRhLT5udW1fY2hpcHNlbGVjdDsKKwl4c3BpLT5zcGVlZF9oeiA9IHBkYXRhLT5zcGVlZF9oejsKKworCS8qIFNQSSBjb250cm9sbGVyIGluaXRpYWxpemF0aW9ucyAqLworCXhzcGlfaW5pdF9odyh4c3BpLT5yZWdzKTsKKworCS8qIFJlZ2lzdGVyIGZvciBTUEkgSW50ZXJydXB0ICovCisJcmV0ID0gcmVxdWVzdF9pcnEoeHNwaS0+aXJxLCB4aWxpbnhfc3BpX2lycSwgMCwgWElMSU5YX1NQSV9OQU1FLCB4c3BpKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gdW5tYXBfaW87CisKKwlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmeHNwaS0+Yml0YmFuZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAic3BpX2JpdGJhbmdfc3RhcnQgRkFJTEVEXG4iKTsKKwkJZ290byBmcmVlX2lycTsKKwl9CisKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJhdCAweCUwOFggbWFwcGVkIHRvIDB4JTA4WCwgaXJxPSVkXG4iLAorCQkJci0+c3RhcnQsICh1MzIpeHNwaS0+cmVncywgeHNwaS0+aXJxKTsKKworCXJldHVybiByZXQ7CisKK2ZyZWVfaXJxOgorCWZyZWVfaXJxKHhzcGktPmlycSwgeHNwaSk7Cit1bm1hcF9pbzoKKwlpb3VubWFwKHhzcGktPnJlZ3MpOworcHV0X21hc3RlcjoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHhpbGlueF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaTsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCisJbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX2JpdGJhbmdfc3RvcCgmeHNwaS0+Yml0YmFuZyk7CisJZnJlZV9pcnEoeHNwaS0+aXJxLCB4c3BpKTsKKwlpb3VubWFwKHhzcGktPnJlZ3MpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgMCk7CisJc3BpX21hc3Rlcl9wdXQoeHNwaS0+Yml0YmFuZy5tYXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHhpbGlueF9zcGlfZHJpdmVyID0geworCS5wcm9iZQk9IHhpbGlueF9zcGlfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHhpbGlueF9zcGlfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IFhJTElOWF9TUElfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhpbGlueF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnhpbGlueF9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHhpbGlueF9zcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4aWxpbnhfc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmeGlsaW54X3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoeGlsaW54X3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RlbGVwaG9ueS9LY29uZmlnIGIvZHJpdmVycy90ZWxlcGhvbnkvS2NvbmZpZwppbmRleCBkZDFkNmE1Li41Zjk4ZjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdGVsZXBob255L0tjb25maWcKQEAgLTIsMTEgKzIsOSBAQAogIyBUZWxlcGhvbnkgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiVGVsZXBob255IFN1cHBvcnQiCittZW51Y29uZmlnIFBIT05FCisJdHJpc3RhdGUgIlRlbGVwaG9ueSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBQSE9ORQotCXRyaXN0YXRlICJMaW51eCB0ZWxlcGhvbnkgc3VwcG9ydCIKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgdGVsZXBob255IGNhcmQsIHdoaWNoIGZvciBleGFtcGxlIGFsbG93cwogCSAgeW91IHRvIHVzZSBhIHJlZ3VsYXIgcGhvbmUgZm9yIHZvaWNlLW92ZXItSVAgYXBwbGljYXRpb25zLgpAQCAtMTcsOSArMTUsMTEgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBob25lZGV2LgogCitpZiBQSE9ORQorCiBjb25maWcgUEhPTkVfSVhKCiAJdHJpc3RhdGUgIlF1aWNrTmV0IEludGVybmV0IExpbmVKYWNrL1Bob25lSmFjayBzdXBwb3J0IgotCWRlcGVuZHMgb24gUEhPTkUKKwlkZXBlbmRzIElTQSB8fCBQQ0kKIAktLS1oZWxwLS0tCiAJICBTYXkgTSBpZiB5b3UgaGF2ZSBhIHRlbGVwaG9ueSBjYXJkIG1hbnVmYWN0dXJlZCBieSBRdWlja25ldAogCSAgVGVjaG5vbG9naWVzLCBJbmMuICBUaGVzZSBpbmNsdWRlIHRoZSBJbnRlcm5ldCBQaG9uZUpBQ0sgYW5kCkBAIC00NCw1ICs0NCw0IEBACiAJICBjYXJkcyBtYW51ZmFjdHVyZWQgYnkgUXVpY2tuZXQgVGVjaG5vbG9naWVzLCBJbmMuICBUaGlzIGNoYW5nZXMgdGhlCiAJICBjYXJkIGluaXRpYWxpemF0aW9uIGNvZGUgdG8gd29yayB3aXRoIHRoZSBjYXJkIG1hbmFnZXIgZGFlbW9uLgogCi1lbmRtZW51Ci0KK2VuZGlmICMgUEhPTkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29uZmlnCmluZGV4IDA3MWI5NjcuLjdkZDczNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvS2NvbmZpZwpAQCAtMTYsNyArMTYsNyBAQAogCWJvb2xlYW4KIAlkZWZhdWx0IHkgaWYgVVNCX0FSQ0hfSEFTX09IQ0kKIAlkZWZhdWx0IHkgaWYgVVNCX0FSQ0hfSEFTX0VIQ0kKLQlkZWZhdWx0IHkgaWYgUENNQ0lBCQkJCSMgc2w4MTFfY3MKKwlkZWZhdWx0IHkgaWYgUENNQ0lBICYmICFNMzJSCQkJIyBzbDgxMV9jcwogCWRlZmF1bHQgeSBpZiBBUk0JCQkJIyBTTC04MTEKIAlkZWZhdWx0IFBDSQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwppbmRleCA0OTczZTE0Li44ZjA0NjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTExNjgsNiArMTE2OCw3IEBACiAJc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSBkYXRhOwogCWludCByZXQgPSAtRUFHQUlOOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXVlYV9lbnRlcnMoSU5TX1RPX1VTQkRFVihzYykpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCWlmIChyZXQgPCAwIHx8IHNjLT5yZXNldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDUwZTc5MDEuLmZkNzRjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMjcyOCw2ICsyNzI4LDcgQEAKIAogc3RhdGljIGludCBodWJfdGhyZWFkKHZvaWQgKl9fdW51c2VkKQogeworCXNldF9mcmVlemFibGUoKTsKIAlkbyB7CiAJCWh1Yl9ldmVudHMoKTsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGtodWJkX3dhaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKaW5kZXggODcxMmVmOS4uYmU3YTFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwpAQCAtMzQzNCw2ICszNDM0LDkgQEAKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CiAJYWxsb3dfc2lnbmFsKFNJR1VTUjEpOwogCisJLyogQWxsb3cgdGhlIHRocmVhZCB0byBiZSBmcm96ZW4gKi8KKwlzZXRfZnJlZXphYmxlKCk7CisKIAkvKiBBcnJhbmdlIGZvciB1c2Vyc3BhY2UgcmVmZXJlbmNlcyB0byBiZSBpbnRlcnByZXRlZCBhcyBrZXJuZWwKIAkgKiBwb2ludGVycy4gIFRoYXQgd2F5IHdlIGNhbiBwYXNzIGEga2VybmVsIHBvaW50ZXIgdG8gYSByb3V0aW5lCiAJICogdGhhdCBleHBlY3RzIGEgX191c2VyIHBvaW50ZXIgYW5kIGl0IHdpbGwgd29yayBva2F5LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggYmVmOGJjZC4uMjg4NDJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC0zMTEsOCArMzExLDYgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gdXNfdG9faG9zdCh1cyk7CiAJaW50IGF1dG9wbV9yYzsKIAotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJZm9yKDs7KSB7CiAJCVVTX0RFQlVHUCgiKioqIHRocmVhZCBzbGVlcGluZy5cbiIpOwogCQlpZihkb3duX2ludGVycnVwdGlibGUoJnVzLT5zZW1hKSkKQEAgLTkyMCw2ICs5MTgsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHCiAJCSJ1c2Itc3RvcmFnZTogZGV2aWNlIGZvdW5kIGF0ICVkXG4iLCB1cy0+cHVzYl9kZXYtPmRldm51bSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJLyogV2FpdCBmb3IgdGhlIHRpbWVvdXQgdG8gZXhwaXJlIG9yIGZvciBhIGRpc2Nvbm5lY3QgKi8KIAlpZiAoZGVsYXlfdXNlID4gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAidXNiLXN0b3JhZ2U6IHdhaXRpbmcgZm9yIGRldmljZSAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvLzY4MzI4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jCmluZGV4IDBkZGE3M2QuLjdmOTA3ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jCkBAIC02MCw3ICs2MCw3IEBACiBzdGF0aWMgdV9sb25nIHZpZGVvbWVtb3J5c2l6ZTsKIAogc3RhdGljIHN0cnVjdCBmYl9pbmZvIGZiX2luZm87Ci1zdGF0aWMgdTMyIG1jNjh4MzI4ZmJfcHNldWRvX3BhbGV0dGVbMTddOworc3RhdGljIHUzMiBtYzY4eDMyOGZiX3BzZXVkb19wYWxldHRlWzE2XTsKIAogc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBtYzY4eDMyOGZiX2RlZmF1bHQgX19pbml0ZGF0YSA9IHsKIAkucmVkID0JCXsgMCwgOCwgMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9LY29uZmlnCmluZGV4IDQwM2RhYzcuLjBjNTY0NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC04MTIsNyArODEyLDcgQEAKIAogY29uZmlnIEZCX0VQU09OMTM1NQogCWJvb2wgIkVwc29uIDEzNTUgZnJhbWVidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIChTVVBFUkggfHwgQVJDSF9DRUlWQSkKKwlkZXBlbmRzIG9uIChGQiA9IHkpICYmIEFSQ0hfQ0VJVkEKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCkBAIC0xNzkwLDggKzE3OTAsOCBAQAogCSAgYWRhcHRvciwgZm91bmQgb24gc29tZSBJQk0gU3lzdGVtIFAgKHBTZXJpZXMpIG1hY2hpbmVzLgogCiBjb25maWcgRkJfUFMzCi0JYm9vbCAiUFMzIEdQVSBmcmFtZWJ1ZmZlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBQUzNfUFMzQVYKKwl0cmlzdGF0ZSAiUFMzIEdQVSBmcmFtZWJ1ZmZlciBkcml2ZXIiCisJZGVwZW5kcyBvbiBGQiAmJiBQUzNfUFMzQVYKIAlzZWxlY3QgRkJfU1lTX0ZJTExSRUNUCiAJc2VsZWN0IEZCX1NZU19DT1BZQVJFQQogCXNlbGVjdCBGQl9TWVNfSU1BR0VCTElUCkBAIC0xODIwLDYgKzE4MjAsMTAgQEAKIAkgIGZyYW1lYnVmZmVyLiBNTDMwMCBjYXJyaWVzIGEgNjQwKjQ4MCBMQ0QgZGlzcGxheSBvbiB0aGUgYm9hcmQsCiAJICBNTDQwMyB1c2VzIGEgc3RhbmRhcmQgREIxNSBWR0EgY29ubmVjdG9yLgogCitpZiBBUkNIX09NQVAKKwlzb3VyY2UgImRyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIgorZW5kaWYKKwogY29uZmlnIEZCX1ZJUlRVQUwKIAl0cmlzdGF0ZSAiVmlydHVhbCBGcmFtZSBCdWZmZXIgc3VwcG9ydCAoT05MWSBGT1IgVEVTVElORyEpIgogCWRlcGVuZHMgb24gRkIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCmluZGV4IGJkOGIwNTIuLmE1NjJmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQpAQCAtMTEzLDYgKzExMyw3IEBACiBvYmotJChDT05GSUdfRkJfUFMzKQkJICArPSBwczNmYi5vCiBvYmotJChDT05GSUdfRkJfU001MDEpICAgICAgICAgICAgKz0gc201MDFmYi5vCiBvYmotJChDT05GSUdfRkJfWElMSU5YKSAgICAgICAgICAgKz0geGlsaW54ZmIubworb2JqLSQoQ09ORklHX0ZCX09NQVApICAgICAgICAgICAgICs9IG9tYXAvCiAKICMgUGxhdGZvcm0gb3IgZmFsbGJhY2sgZHJpdmVycyBnbyBoZXJlCiBvYmotJChDT05GSUdfRkJfVkVTQSkgICAgICAgICAgICAgKz0gdmVzYWZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0aV9pZHMuaCBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0aV9pZHMuaAppbmRleCA5MGU3ZGYyLi42ODVhNzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdGlfaWRzLmgKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXRpX2lkcy5oCkBAIC0yMDQsNiArMjA0LDcgQEAKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MQkJMHg1OTYxCiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjIJCTB4NTk2MgogI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTY0CQkweDU5NjQKKyNkZWZpbmUgUENJX0NISVBfUlM0ODVfNTk3NQkJMHg1OTc1CiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzVDNjEJCTB4NUM2MQogI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81QzYzCQkweDVDNjMKICNkZWZpbmUgUENJX0NISVBfUjQyM181RDU3ICAgICAgICAgICAgICAweDVENTcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCAyZmJmZjYzLi5lZjMzMGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC01NDEsNyArNTQxLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCiAKIAotc3RhdGljIHUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CitzdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIAogI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKIHN0YXRpYyBjaGFyICphdHlfZ3hfcmFtWzhdIF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwppbmRleCAyMzQ5ZTcxLi40N2NhNjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKQEAgLTE1Myw2ICsxNTMsOCBAQAogCS8qIE1vYmlsaXR5IDkyMDAgKE05KykgKi8KIAlDSElQX0RFRihQQ0lfQ0hJUF9SVjI4MF81QzYxLAlSVjI4MCwJQ0hJUF9IQVNfQ1JUQzIgfCBDSElQX0lTX01PQklMSVRZKSwKIAlDSElQX0RFRihQQ0lfQ0hJUF9SVjI4MF81QzYzLAlSVjI4MCwJQ0hJUF9IQVNfQ1JUQzIgfCBDSElQX0lTX01PQklMSVRZKSwKKwkvKk1vYmlsaXR5IFhwcmVzcyAyMDAgKi8KKwlDSElQX0RFRihQQ0lfQ0hJUF9SUzQ4NV81OTc1LAlSMzAwLAlDSElQX0hBU19DUlRDMiB8IENISVBfSVNfSUdQIHwgQ0hJUF9JU19NT0JJTElUWSksCiAJLyogOTIwMCAqLwogCUNISVBfREVGKFBDSV9DSElQX1JWMjgwXzU5NjAsCVJWMjgwLAlDSElQX0hBU19DUlRDMiksCiAJQ0hJUF9ERUYoUENJX0NISVBfUlYyODBfNTk2MSwJUlYyODAsCUNISVBfSEFTX0NSVEMyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmggYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCmluZGV4IDdlYmZmY2QuLjdjOTIyYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaApAQCAtMzAxLDcgKzMwMSw3IEBACiAJdm9pZCBfX2lvbWVtCQkqYmlvc19zZWc7CiAJaW50CQkJZnBfYmlvc19zdGFydDsKIAotCXUzMgkJCXBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIJCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJc3RydWN0IHsgdTggcmVkLCBncmVlbiwgYmx1ZSwgcGFkOyB9CiAJCQkJcGFsZXR0ZVsyNTZdOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnCmluZGV4IGQzYjhhNmIuLjQ5NjQzOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnCkBAIC0xMTgsNiArMTE4LDIyIEBACiAJaGVscAogCSAgTG93LWxldmVsIGZyYW1lYnVmZmVyLWJhc2VkIGNvbnNvbGUgZHJpdmVyLgogCitjb25maWcgRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWQorICAgICAgIGJvb2wgIk1hcCB0aGUgY29uc29sZSB0byB0aGUgcHJpbWFyeSBkaXNwbGF5IGRldmljZSIKKyAgICAgICBkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKKyAgICAgICBkZWZhdWx0IG4KKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICBJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCwgdGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUgd2lsbAorICAgICAgICAgYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIHByaW1hcnkgZGlzcGxheSBkZXZpY2UgKGlmIHRoZSBhcmNoaXRlY3R1cmUKKwkgc3VwcG9ydHMgdGhpcyBmZWF0dXJlKS4gIE90aGVyd2lzZSwgdGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUgd2lsbAorICAgICAgICAgYWx3YXlzIHNlbGVjdCB0aGUgZmlyc3QgZnJhbWVidWZmZXIgZHJpdmVyIHRoYXQgaXMgbG9hZGVkLiBUaGUgbGF0dGVyCisgICAgICAgICBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4KKworCSBZb3UgY2FuIGFsd2F5cyBvdmVycmlkZSB0aGUgYXV0b21hdGljIHNlbGVjdGlvbiBvZiB0aGUgcHJpbWFyeSBkZXZpY2UKKwkgYnkgdXNpbmcgdGhlIGZiY29uPW1hcDogYm9vdCBvcHRpb24uCisKKwkgSWYgdW5zdXJlLCBzZWxlY3Qgbi4KKwogY29uZmlnIEZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04KICAgICAgICBib29sICJGcmFtZWJ1ZmZlciBDb25zb2xlIFJvdGF0aW9uIgogICAgICAgIGRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwppbmRleCA3MzgxM2M2Li5kZWNmZGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwpAQCAtNzUsNiArNzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPiAvKiBGb3IgY291bnRpbmcgZm9udCBjaGVja3N1bXMgKi8KKyNpbmNsdWRlIDxhc20vZmIuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xMjUsNiArMTI2LDggQEAKIHN0YXRpYyBpbnQgbGFzdF9mYl92YyA9IE1BWF9OUl9DT05TT0xFUyAtIDE7CiBzdGF0aWMgaW50IGZiY29uX2lzX2RlZmF1bHQgPSAxOyAKIHN0YXRpYyBpbnQgZmJjb25faGFzX2V4aXRlZDsKK3N0YXRpYyBpbnQgcHJpbWFyeV9kZXZpY2UgPSAtMTsKK3N0YXRpYyBpbnQgbWFwX292ZXJyaWRlOwogCiAvKiBmb250IGRhdGEgKi8KIHN0YXRpYyBjaGFyIGZvbnRuYW1lWzQwXTsKQEAgLTE1Miw2ICsxNTUsNyBAQAogI2RlZmluZSBERUZBVUxUX0NVUlNPUl9CTElOS19SQVRFCSgyMCkKIAogc3RhdGljIGludCB2YmxfY3Vyc29yX2NudDsKK3N0YXRpYyBpbnQgZmJjb25fY3Vyc29yX25vYmxpbms7CiAKICNkZWZpbmUgZGl2aWRlcyhhLCBiKQkoKCEoYSkgfHwgKGIpJShhKSkgPyAwIDogMSkKIApAQCAtMTg4LDE2ICsxOTIsMTQgQEAKIHN0YXRpYyB2b2lkIGZiY29uX2Jtb3ZlX3JlYyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3ksIGludCBzeCwKIAkJCSAgICBpbnQgZHksIGludCBkeCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCB1X2ludCB5X2JyZWFrKTsKIHN0YXRpYyB2b2lkIGZiY29uX3NldF9kaXNwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgIHN0cnVjdCB2Y19kYXRhICp2Yyk7Ci1zdGF0aWMgdm9pZCBmYmNvbl9wcmVzZXRfZGlzcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgICBpbnQgdW5pdCk7CisJCQkgICBpbnQgdW5pdCk7CiBzdGF0aWMgdm9pZCBmYmNvbl9yZWRyYXdfbW92ZShzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBkaXNwbGF5ICpwLAogCQkJICAgICAgaW50IGxpbmUsIGludCBjb3VudCwgaW50IGR5KTsKIHN0YXRpYyB2b2lkIGZiY29uX21vZGVjaGFuZ2VkKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyB2b2lkIGZiY29uX3NldF9hbGxfdmNzKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyB2b2lkIGZiY29uX3N0YXJ0KHZvaWQpOwogc3RhdGljIHZvaWQgZmJjb25fZXhpdCh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpmYmNvbl9jbGFzc19kZXZpY2U7CitzdGF0aWMgc3RydWN0IGRldmljZSAqZmJjb25fZGV2aWNlOwogCiAjaWZkZWYgQ09ORklHX01BQwogLyoKQEAgLTQ0MSw3ICs0NDMsOCBAQAogCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKIAogCWlmICgoIWluZm8tPnF1ZXVlLmZ1bmMgfHwgaW5mby0+cXVldWUuZnVuYyA9PSBmYl9mbGFzaGN1cnNvcikgJiYKLQkgICAgIShvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSkgeworCSAgICAhKG9wcy0+ZmxhZ3MgJiBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIpICYmCisJICAgICFmYmNvbl9jdXJzb3Jfbm9ibGluaykgewogCQlpZiAoIWluZm8tPnF1ZXVlLmZ1bmMpCiAJCQlJTklUX1dPUksoJmluZm8tPnF1ZXVlLCBmYl9mbGFzaGN1cnNvcik7CiAKQEAgLTQ5NSwxMyArNDk4LDE3IEBACiAJCQogCQlpZiAoIXN0cm5jbXAob3B0aW9ucywgIm1hcDoiLCA0KSkgewogCQkJb3B0aW9ucyArPSA0OwotCQkJaWYgKCpvcHRpb25zKQorCQkJaWYgKCpvcHRpb25zKSB7CiAJCQkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykgewogCQkJCQlpZiAoIW9wdGlvbnNbal0pCiAJCQkJCQlqID0gMDsKIAkJCQkJY29uMmZiX21hcF9ib290W2ldID0KIAkJCQkJCShvcHRpb25zW2orK10tJzAnKSAlIEZCX01BWDsKIAkJCQl9CisKKwkJCQltYXBfb3ZlcnJpZGUgPSAxOworCQkJfQorCiAJCQlyZXR1cm4gMTsKIAkJfQogCkBAIC03MzYsNyArNzQzLDkgQEAKIAogCWlmICghZXJyKSB7CiAJCWluZm8tPmZiY29uX3BhciA9IG9wczsKLQkJc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8pOworCisJCWlmICh2YykKKwkJCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvKTsKIAl9CiAKIAlpZiAoZXJyKSB7CkBAIC03OTgsMTEgKzgwNyw3IEBACiAKIAlvcHMtPmZsYWdzIHw9IEZCQ09OX0ZMQUdTX0lOSVQ7CiAJb3BzLT5ncmFwaGljcyA9IDA7Ci0KLQlpZiAodmMpCi0JCWZiY29uX3NldF9kaXNwKGluZm8sICZpbmZvLT52YXIsIHZjKTsKLQllbHNlCi0JCWZiY29uX3ByZXNldF9kaXNwKGluZm8sICZpbmZvLT52YXIsIHVuaXQpOworCWZiY29uX3NldF9kaXNwKGluZm8sICZpbmZvLT52YXIsIHVuaXQpOwogCiAJaWYgKHNob3dfbG9nbykgewogCQlzdHJ1Y3QgdmNfZGF0YSAqZmdfdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CkBAIC0xMTA3LDYgKzExMTIsOSBAQAogCWlmICh2YXJfdG9fZGlzcGxheShwLCAmaW5mby0+dmFyLCBpbmZvKSkKIAkJcmV0dXJuOwogCisJaWYgKCFpbmZvLT5mYmNvbl9wYXIpCisJCWNvbjJmYl9hY3F1aXJlX25ld2luZm8odmMsIGluZm8sIHZjLT52Y19udW0sIC0xKTsKKwogCS8qIElmIHdlIGFyZSBub3QgdGhlIGZpcnN0IGNvbnNvbGUgb24gdGhpcwogCSAgIGZiLCBjb3B5IHRoZSBmb250IGZyb20gdGhhdCBjb25zb2xlICovCiAJdCA9ICZmYl9kaXNwbGF5W2ZnX2NvbnNvbGVdOwpAQCAtMTM0OSw2ICsxMzU3LDExIEBACiAJaWYgKGZiY29uX2lzX2luYWN0aXZlKHZjLCBpbmZvKSB8fCB2Yy0+dmNfZGVjY20gIT0gMSkKIAkJcmV0dXJuOwogCisJaWYgKHZjLT52Y19jdXJzb3JfdHlwZSAmIDB4MTApCisJCWZiY29uX2RlbF9jdXJzb3JfdGltZXIoaW5mbyk7CisJZWxzZQorCQlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOworCiAJb3BzLT5jdXJzb3JfZmxhc2ggPSAobW9kZSA9PSBDTV9FUkFTRSkgPyAwIDogMTsKIAlpZiAobW9kZSAmIENNX1NPRlRCQUNLKSB7CiAJCW1vZGUgJj0gfkNNX1NPRlRCQUNLOwpAQCAtMTM2OCwzNiArMTM4MSwyOSBAQAogc3RhdGljIGludCBzY3JvbGxiYWNrX21heCA9IDA7CiBzdGF0aWMgaW50IHNjcm9sbGJhY2tfY3VycmVudCA9IDA7CiAKLS8qCi0gKiBJZiBubyB2YyBpcyBleGlzdGVudCB5ZXQsIGp1c3Qgc2V0IHN0cnVjdCBkaXNwbGF5Ci0gKi8KLXN0YXRpYyB2b2lkIGZiY29uX3ByZXNldF9kaXNwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgICAgIGludCB1bml0KQotewotCXN0cnVjdCBkaXNwbGF5ICpwID0gJmZiX2Rpc3BsYXlbdW5pdF07Ci0Jc3RydWN0IGRpc3BsYXkgKnQgPSAmZmJfZGlzcGxheVtmZ19jb25zb2xlXTsKLQotCWlmICh2YXJfdG9fZGlzcGxheShwLCB2YXIsIGluZm8pKQotCQlyZXR1cm47Ci0KLQlwLT5mb250ZGF0YSA9IHQtPmZvbnRkYXRhOwotCXAtPnVzZXJmb250ID0gdC0+dXNlcmZvbnQ7Ci0JaWYgKHAtPnVzZXJmb250KQotCQlSRUZDT1VOVChwLT5mb250ZGF0YSkrKzsKLX0KLQogc3RhdGljIHZvaWQgZmJjb25fc2V0X2Rpc3Aoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgc3RydWN0IHZjX2RhdGEgKnZjKQorCQkJICAgaW50IHVuaXQpCiB7Ci0Jc3RydWN0IGRpc3BsYXkgKnAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXSwgKnQ7Ci0Jc3RydWN0IHZjX2RhdGEgKipkZWZhdWx0X21vZGUgPSB2Yy0+dmNfZGlzcGxheV9mZzsKLQlzdHJ1Y3QgdmNfZGF0YSAqc3ZjID0gKmRlZmF1bHRfbW9kZTsKKwlzdHJ1Y3QgZGlzcGxheSAqcCwgKnQ7CisJc3RydWN0IHZjX2RhdGEgKipkZWZhdWx0X21vZGUsICp2YzsKKwlzdHJ1Y3QgdmNfZGF0YSAqc3ZjOwogCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKIAlpbnQgcm93cywgY29scywgY2hhcmNudCA9IDI1NjsKIAorCXAgPSAmZmJfZGlzcGxheVt1bml0XTsKKwogCWlmICh2YXJfdG9fZGlzcGxheShwLCB2YXIsIGluZm8pKQogCQlyZXR1cm47CisKKwl2YyA9IHZjX2NvbnNbdW5pdF0uZDsKKworCWlmICghdmMpCisJCXJldHVybjsKKworCWRlZmF1bHRfbW9kZSA9IHZjLT52Y19kaXNwbGF5X2ZnOworCXN2YyA9ICpkZWZhdWx0X21vZGU7CiAJdCA9ICZmYl9kaXNwbGF5W3N2Yy0+dmNfbnVtXTsKKwogCWlmICghdmMtPnZjX2ZvbnQuZGF0YSkgewogCQl2Yy0+dmNfZm9udC5kYXRhID0gKHZvaWQgKikocC0+Zm9udGRhdGEgPSB0LT5mb250ZGF0YSk7CiAJCXZjLT52Y19mb250LndpZHRoID0gKCpkZWZhdWx0X21vZGUpLT52Y19mb250LndpZHRoOwpAQCAtMTcwNCw2ICsxNzEwLDU2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmYmNvbl9yZWRyYXdfYmxpdChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJc3RydWN0IGRpc3BsYXkgKnAsIGludCBsaW5lLCBpbnQgY291bnQsIGludCB5Y291bnQpCit7CisJaW50IG9mZnNldCA9IHljb3VudCAqIHZjLT52Y19jb2xzOworCXVuc2lnbmVkIHNob3J0ICpkID0gKHVuc2lnbmVkIHNob3J0ICopCisJICAgICh2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogbGluZSk7CisJdW5zaWduZWQgc2hvcnQgKnMgPSBkICsgb2Zmc2V0OworCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXVuc2lnbmVkIHNob3J0ICpzdGFydCA9IHM7CisJCXVuc2lnbmVkIHNob3J0ICpsZSA9IGFkdmFuY2Vfcm93KHMsIDEpOworCQl1bnNpZ25lZCBzaG9ydCBjOworCQlpbnQgeCA9IDA7CisKKwkJZG8geworCQkJYyA9IHNjcl9yZWFkdyhzKTsKKworCQkJaWYgKGMgPT0gc2NyX3JlYWR3KGQpKSB7CisJCQkJaWYgKHMgPiBzdGFydCkgeworCQkJCQlvcHMtPmJtb3ZlKHZjLCBpbmZvLCBsaW5lICsgeWNvdW50LCB4LAorCQkJCQkJICAgbGluZSwgeCwgMSwgcy1zdGFydCk7CisJCQkJCXggKz0gcyAtIHN0YXJ0ICsgMTsKKwkJCQkJc3RhcnQgPSBzICsgMTsKKwkJCQl9IGVsc2UgeworCQkJCQl4Kys7CisJCQkJCXN0YXJ0Kys7CisJCQkJfQorCQkJfQorCisJCQlzY3Jfd3JpdGV3KGMsIGQpOworCQkJY29uc29sZV9jb25kaXRpb25hbF9zY2hlZHVsZSgpOworCQkJcysrOworCQkJZCsrOworCQl9IHdoaWxlIChzIDwgbGUpOworCQlpZiAocyA+IHN0YXJ0KQorCQkJb3BzLT5ibW92ZSh2YywgaW5mbywgbGluZSArIHljb3VudCwgeCwgbGluZSwgeCwgMSwKKwkJCQkgICBzLXN0YXJ0KTsKKwkJY29uc29sZV9jb25kaXRpb25hbF9zY2hlZHVsZSgpOworCQlpZiAoeWNvdW50ID4gMCkKKwkJCWxpbmUrKzsKKwkJZWxzZSB7CisJCQlsaW5lLS07CisJCQkvKiBOT1RFOiBXZSBzdWJ0cmFjdCB0d28gbGluZXMgZnJvbSB0aGVzZSBwb2ludGVycyAqLworCQkJcyAtPSB2Yy0+dmNfc2l6ZV9yb3c7CisJCQlkIC09IHZjLT52Y19zaXplX3JvdzsKKwkJfQorCX0KK30KKwogc3RhdGljIHZvaWQgZmJjb25fcmVkcmF3KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGRpc3BsYXkgKnAsCiAJCQkgaW50IGxpbmUsIGludCBjb3VudCwgaW50IG9mZnNldCkKIHsKQEAgLTE3ODksNyArMTg0NSw2IEBACiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbdmMtPnZjX251bV1dOwogCXN0cnVjdCBkaXNwbGF5ICpwID0gJmZiX2Rpc3BsYXlbdmMtPnZjX251bV07Ci0Jc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCWludCBzY3JvbGxfcGFydGlhbCA9IGluZm8tPmZsYWdzICYgRkJJTkZPX1BBUlRJQUxfUEFOX09LOwogCiAJaWYgKGZiY29uX2lzX2luYWN0aXZlKHZjLCBpbmZvKSkKQEAgLTE4MTMsMTAgKzE4NjgsMTUgQEAKIAkJCWdvdG8gcmVkcmF3X3VwOwogCQlzd2l0Y2ggKHAtPnNjcm9sbG1vZGUpIHsKIAkJY2FzZSBTQ1JPTExfTU9WRToKLQkJCW9wcy0+Ym1vdmUodmMsIGluZm8sIHQgKyBjb3VudCwgMCwgdCwgMCwKLQkJCQkgICAgYiAtIHQgLSBjb3VudCwgdmMtPnZjX2NvbHMpOwotCQkJb3BzLT5jbGVhcih2YywgaW5mbywgYiAtIGNvdW50LCAwLCBjb3VudCwKLQkJCQkgIHZjLT52Y19jb2xzKTsKKwkJCWZiY29uX3JlZHJhd19ibGl0KHZjLCBpbmZvLCBwLCB0LCBiIC0gdCAtIGNvdW50LAorCQkJCSAgICAgY291bnQpOworCQkJZmJjb25fY2xlYXIodmMsIGIgLSBjb3VudCwgMCwgY291bnQsIHZjLT52Y19jb2xzKTsKKwkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCisJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKKwkJCQkJCQkoYiAtIGNvdW50KSksCisJCQkJICAgIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAorCQkJCSAgICB2Yy0+dmNfc2l6ZV9yb3cgKiBjb3VudCk7CisJCQlyZXR1cm4gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NST0xMX1dSQVBfTU9WRToKQEAgLTE4OTksOSArMTk1OSwxNSBAQAogCQkJZ290byByZWRyYXdfZG93bjsKIAkJc3dpdGNoIChwLT5zY3JvbGxtb2RlKSB7CiAJCWNhc2UgU0NST0xMX01PVkU6Ci0JCQlvcHMtPmJtb3ZlKHZjLCBpbmZvLCB0LCAwLCB0ICsgY291bnQsIDAsCi0JCQkJICAgIGIgLSB0IC0gY291bnQsIHZjLT52Y19jb2xzKTsKLQkJCW9wcy0+Y2xlYXIodmMsIGluZm8sIHQsIDAsIGNvdW50LCB2Yy0+dmNfY29scyk7CisJCQlmYmNvbl9yZWRyYXdfYmxpdCh2YywgaW5mbywgcCwgYiAtIDEsIGIgLSB0IC0gY291bnQsCisJCQkJICAgICAtY291bnQpOworCQkJZmJjb25fY2xlYXIodmMsIHQsIDAsIGNvdW50LCB2Yy0+dmNfY29scyk7CisJCQlzY3JfbWVtc2V0dygodW5zaWduZWQgc2hvcnQgKikgKHZjLT52Y19vcmlnaW4gKworCQkJCQkJCXZjLT52Y19zaXplX3JvdyAqCisJCQkJCQkJdCksCisJCQkJICAgIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAorCQkJCSAgICB2Yy0+dmNfc2l6ZV9yb3cgKiBjb3VudCk7CisJCQlyZXR1cm4gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NST0xMX1dSQVBfTU9WRToKQEAgLTI5MzcsOSArMzAwMyw0OCBAQAogCXJldHVybiBmb3VuZDsKIH0KIAotc3RhdGljIGludCBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoaW50IGlkeCkKKyNpZmRlZiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HCitzdGF0aWMgaW50IGZiY29uX3VuYmluZCh2b2lkKQogewotCWludCBpOworCWludCByZXQ7CisKKwlyZXQgPSB1bmJpbmRfY29uX2RyaXZlcigmZmJfY29uLCBmaXJzdF9mYl92YywgbGFzdF9mYl92YywKKwkJCQlmYmNvbl9pc19kZWZhdWx0KTsKKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGZiY29uX3VuYmluZCh2b2lkKQoreworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmIC8qIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgKi8KKworc3RhdGljIGludCBmYmNvbl9mYl91bmJpbmQoaW50IGlkeCkKK3sKKwlpbnQgaSwgbmV3X2lkeCA9IC0xLCByZXQgPSAwOworCisJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CisJCWlmIChjb24yZmJfbWFwW2ldICE9IGlkeCAmJgorCQkgICAgY29uMmZiX21hcFtpXSAhPSAtMSkgeworCQkJbmV3X2lkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChuZXdfaWR4ICE9IC0xKSB7CisJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgeworCQkJaWYgKGNvbjJmYl9tYXBbaV0gPT0gaWR4KQorCQkJCXNldF9jb24yZmJfbWFwKGksIG5ld19pZHgsIDApOworCQl9CisJfSBlbHNlCisJCXJldCA9IGZiY29uX3VuYmluZCgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGksIGlkeCA9IGluZm8tPm5vZGU7CiAKIAlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKIAkJaWYgKGNvbjJmYl9tYXBbaV0gPT0gaWR4KQpAQCAtMjk2NywxMiArMzA3Miw0OCBAQAogCWlmICghbnVtX3JlZ2lzdGVyZWRfZmIpCiAJCXVucmVnaXN0ZXJfY29uX2RyaXZlcigmZmJfY29uKTsKIAorCisJaWYgKHByaW1hcnlfZGV2aWNlID09IGlkeCkKKwkJcHJpbWFyeV9kZXZpY2UgPSAtMTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZiY29uX2ZiX3JlZ2lzdGVyZWQoaW50IGlkeCkKKyNpZmRlZiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWQorc3RhdGljIHZvaWQgZmJjb25fc2VsZWN0X3ByaW1hcnkoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JaW50IHJldCA9IDAsIGk7CisJaWYgKCFtYXBfb3ZlcnJpZGUgJiYgcHJpbWFyeV9kZXZpY2UgPT0gLTEgJiYKKwkgICAgZmJfaXNfcHJpbWFyeV9kZXZpY2UoaW5mbykpIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmJjb246ICVzIChmYiVpKSBpcyBwcmltYXJ5IGRldmljZVxuIiwKKwkJICAgICAgIGluZm8tPmZpeC5pZCwgaW5mby0+bm9kZSk7CisJCXByaW1hcnlfZGV2aWNlID0gaW5mby0+bm9kZTsKKworCQlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspCisJCQljb24yZmJfbWFwX2Jvb3RbaV0gPSBwcmltYXJ5X2RldmljZTsKKworCQlpZiAoY29uX2lzX2JvdW5kKCZmYl9jb24pKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJmYmNvbjogUmVtYXBwaW5nIHByaW1hcnkgZGV2aWNlLCAiCisJCQkgICAgICAgImZiJWksIHRvIHR0eSAlaS0laVxuIiwgaW5mby0+bm9kZSwKKwkJCSAgICAgICBmaXJzdF9mYl92YyArIDEsIGxhc3RfZmJfdmMgKyAxKTsKKwkJCWluZm9faWR4ID0gcHJpbWFyeV9kZXZpY2U7CisJCX0KKwl9CisKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZmJjb25fc2VsZWN0X3ByaW1hcnkoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19GUkFNRUJVRkZFUl9ERVRFQ1RfUFJJTUFSWSAqLworCitzdGF0aWMgaW50IGZiY29uX2ZiX3JlZ2lzdGVyZWQoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDAsIGksIGlkeCA9IGluZm8tPm5vZGU7CisKKwlmYmNvbl9zZWxlY3RfcHJpbWFyeShpbmZvKTsKIAogCWlmIChpbmZvX2lkeCA9PSAtMSkgewogCQlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKQEAgLTI5ODYsOCArMzEyNyw3IEBACiAJCQlyZXQgPSBmYmNvbl90YWtlb3ZlcigxKTsKIAl9IGVsc2UgewogCQlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKLQkJCWlmIChjb24yZmJfbWFwX2Jvb3RbaV0gPT0gaWR4ICYmCi0JCQkgICAgY29uMmZiX21hcFtpXSA9PSAtMSkKKwkJCWlmIChjb24yZmJfbWFwX2Jvb3RbaV0gPT0gaWR4KQogCQkJCXNldF9jb24yZmJfbWFwKGksIGlkeCwgMCk7CiAJCX0KIAl9CkBAIC0zMDM0LDEyICszMTc0LDcgQEAKIAkJbW9kZSA9IGZiX2ZpbmRfbmVhcmVzdF9tb2RlKGZiX2Rpc3BsYXlbaV0ubW9kZSwKIAkJCQkJICAgICZpbmZvLT5tb2RlbGlzdCk7CiAJCWZiX3ZpZGVvbW9kZV90b192YXIoJnZhciwgbW9kZSk7Ci0KLQkJaWYgKHZjKQotCQkJZmJjb25fc2V0X2Rpc3AoaW5mbywgJnZhciwgdmMpOwotCQllbHNlCi0JCQlmYmNvbl9wcmVzZXRfZGlzcChpbmZvLCAmdmFyLCBpKTsKLQorCQlmYmNvbl9zZXRfZGlzcChpbmZvLCAmdmFyLCB2Yy0+dmNfbnVtKTsKIAl9CiB9CiAKQEAgLTMxMTQsMTEgKzMyNDksMTQgQEAKIAkJbW9kZSA9IGV2ZW50LT5kYXRhOwogCQlyZXQgPSBmYmNvbl9tb2RlX2RlbGV0ZWQoaW5mbywgbW9kZSk7CiAJCWJyZWFrOworCWNhc2UgRkJfRVZFTlRfRkJfVU5CSU5EOgorCQlyZXQgPSBmYmNvbl9mYl91bmJpbmQoaW5mby0+bm9kZSk7CisJCWJyZWFrOwogCWNhc2UgRkJfRVZFTlRfRkJfUkVHSVNURVJFRDoKLQkJcmV0ID0gZmJjb25fZmJfcmVnaXN0ZXJlZChpbmZvLT5ub2RlKTsKKwkJcmV0ID0gZmJjb25fZmJfcmVnaXN0ZXJlZChpbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9FVkVOVF9GQl9VTlJFR0lTVEVSRUQ6Ci0JCXJldCA9IGZiY29uX2ZiX3VucmVnaXN0ZXJlZChpbmZvLT5ub2RlKTsKKwkJcmV0ID0gZmJjb25fZmJfdW5yZWdpc3RlcmVkKGluZm8pOwogCQlicmVhazsKIAljYXNlIEZCX0VWRU5UX1NFVF9DT05TT0xFX01BUDoKIAkJY29uMmZiID0gZXZlbnQtPmRhdGE7CkBAIC0zMTc5LDggKzMzMTcsOSBAQAogCS5ub3RpZmllcl9jYWxsCT0gZmJjb25fZXZlbnRfbm90aWZ5LAogfTsKIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IHJvdGF0ZSwgaWR4OwpAQCAtMzIwMyw4ICszMzQyLDkgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZV9hbGwoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlX2FsbChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcm90YXRlLCBpZHg7CkBAIC0zMjI3LDcgKzMzNjcsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19yb3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3JvdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixjaGFyICpidWYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IHJvdGF0ZSA9IDAsIGlkeDsKQEAgLTMyNDgsMjAgKzMzODksODYgQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcm90YXRlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGNsYXNzX2RldmljZV9hdHRyc1tdID0geworc3RhdGljIHNzaXplX3Qgc2hvd19jdXJzb3JfYmxpbmsoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBmYmNvbl9vcHMgKm9wczsKKwlpbnQgaWR4LCBibGluayA9IC0xOworCisJaWYgKGZiY29uX2hhc19leGl0ZWQpCisJCXJldHVybiAwOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlkeCA9IGNvbjJmYl9tYXBbZmdfY29uc29sZV07CisKKwlpZiAoaWR4ID09IC0xIHx8IHJlZ2lzdGVyZWRfZmJbaWR4XSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWluZm8gPSByZWdpc3RlcmVkX2ZiW2lkeF07CisJb3BzID0gaW5mby0+ZmJjb25fcGFyOworCisJaWYgKCFvcHMpCisJCWdvdG8gZXJyOworCisJYmxpbmsgPSAob3BzLT5mbGFncyAmIEZCQ09OX0ZMQUdTX0NVUlNPUl9USU1FUikgPyAxIDogMDsKK2VycjoKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGJsaW5rKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfY3Vyc29yX2JsaW5rKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJaW50IGJsaW5rLCBpZHg7CisJY2hhciAqKmxhc3QgPSBOVUxMOworCisJaWYgKGZiY29uX2hhc19leGl0ZWQpCisJCXJldHVybiBjb3VudDsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZHggPSBjb24yZmJfbWFwW2ZnX2NvbnNvbGVdOworCisJaWYgKGlkeCA9PSAtMSB8fCByZWdpc3RlcmVkX2ZiW2lkeF0gPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpbmZvID0gcmVnaXN0ZXJlZF9mYltpZHhdOworCisJaWYgKCFpbmZvLT5mYmNvbl9wYXIpCisJCWdvdG8gZXJyOworCisJYmxpbmsgPSBzaW1wbGVfc3RydG91bChidWYsIGxhc3QsIDApOworCisJaWYgKGJsaW5rKSB7CisJCWZiY29uX2N1cnNvcl9ub2JsaW5rID0gMDsKKwkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKKwl9IGVsc2UgeworCQlmYmNvbl9jdXJzb3Jfbm9ibGluayA9IDE7CisJCWZiY29uX2RlbF9jdXJzb3JfdGltZXIoaW5mbyk7CisJfQorCitlcnI6CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldmljZV9hdHRyc1tdID0gewogCV9fQVRUUihyb3RhdGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19yb3RhdGUsIHN0b3JlX3JvdGF0ZSksCiAJX19BVFRSKHJvdGF0ZV9hbGwsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3JvdGF0ZV9hbGwpLAorCV9fQVRUUihjdXJzb3JfYmxpbmssIFNfSVJVR098U19JV1VTUiwgc2hvd19jdXJzb3JfYmxpbmssCisJICAgICAgIHN0b3JlX2N1cnNvcl9ibGluayksCiB9OwogCi1zdGF0aWMgaW50IGZiY29uX2luaXRfY2xhc3NfZGV2aWNlKHZvaWQpCitzdGF0aWMgaW50IGZiY29uX2luaXRfZGV2aWNlKHZvaWQpCiB7CiAJaW50IGksIGVycm9yID0gMDsKIAogCWZiY29uX2hhc19zeXNmcyA9IDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspIHsKLQkJZXJyb3IgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoZmJjb25fY2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZV9hdHRycyk7IGkrKykgeworCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShmYmNvbl9kZXZpY2UsICZkZXZpY2VfYXR0cnNbaV0pOwogCiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwpAQCAtMzI2OSw4ICszNDc2LDcgQEAKIAogCWlmIChlcnJvcikgewogCQl3aGlsZSAoLS1pID49IDApCi0JCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fY2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGZiY29uX2RldmljZSwgJmRldmljZV9hdHRyc1tpXSk7CiAKIAkJZmJjb25faGFzX3N5c2ZzID0gMDsKIAl9CkBAIC0zMzU2LDE2ICszNTYyLDE1IEBACiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAJZmJfcmVnaXN0ZXJfY2xpZW50KCZmYmNvbl9ldmVudF9ub3RpZmllcik7Ci0JZmJjb25fY2xhc3NfZGV2aWNlID0KLQkgICAgY2xhc3NfZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgTlVMTCwgTUtERVYoMCwgMCksIE5VTEwsICJmYmNvbiIpOworCWZiY29uX2RldmljZSA9IGRldmljZV9jcmVhdGUoZmJfY2xhc3MsIE5VTEwsIE1LREVWKDAsIDApLCAiZmJjb24iKTsKIAotCWlmIChJU19FUlIoZmJjb25fY2xhc3NfZGV2aWNlKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gY3JlYXRlIGNsYXNzX2RldmljZSAiCisJaWYgKElTX0VSUihmYmNvbl9kZXZpY2UpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgZGV2aWNlICIKIAkJICAgICAgICJmb3IgZmJjb247IGVycm5vID0gJWxkXG4iLAotCQkgICAgICAgUFRSX0VSUihmYmNvbl9jbGFzc19kZXZpY2UpKTsKLQkJZmJjb25fY2xhc3NfZGV2aWNlID0gTlVMTDsKKwkJICAgICAgIFBUUl9FUlIoZmJjb25fZGV2aWNlKSk7CisJCWZiY29uX2RldmljZSA9IE5VTEw7CiAJfSBlbHNlCi0JCWZiY29uX2luaXRfY2xhc3NfZGV2aWNlKCk7CisJCWZiY29uX2luaXRfZGV2aWNlKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspCiAJCWNvbjJmYl9tYXBbaV0gPSAtMTsKQEAgLTMzNzksMTQgKzM1ODQsMTMgQEAKIAogI2lmZGVmIE1PRFVMRQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmJjb25fZGVpbml0X2NsYXNzX2RldmljZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGZiY29uX2RlaW5pdF9kZXZpY2Uodm9pZCkKIHsKIAlpbnQgaTsKIAogCWlmIChmYmNvbl9oYXNfc3lzZnMpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKQotCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGZiY29uX2NsYXNzX2RldmljZSwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlX2F0dHJzKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKGZiY29uX2RldmljZSwgJmRldmljZV9hdHRyc1tpXSk7CiAKIAkJZmJjb25faGFzX3N5c2ZzID0gMDsKIAl9CkBAIC0zMzk2LDggKzM2MDAsOCBAQAogewogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAlmYl91bnJlZ2lzdGVyX2NsaWVudCgmZmJjb25fZXZlbnRfbm90aWZpZXIpOwotCWZiY29uX2RlaW5pdF9jbGFzc19kZXZpY2UoKTsKLQljbGFzc19kZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoMCwgMCkpOworCWZiY29uX2RlaW5pdF9kZXZpY2UoKTsKKwlkZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoMCwgMCkpOwogCWZiY29uX2V4aXQoKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAJdW5yZWdpc3Rlcl9jb25fZHJpdmVyKCZmYl9jb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKaW5kZXggOGI3NjI3My4uYjBiZTdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCkBAIC05NCw3ICs5NCw3IEBACiBzdHJ1Y3QgZmJfaW5mb19jb250cm9sIHsKIAlzdHJ1Y3QgZmJfaW5mbwkJaW5mbzsKIAlzdHJ1Y3QgZmJfcGFyX2NvbnRyb2wJcGFyOwotCXUzMgkJCXBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIJCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJCQogCXN0cnVjdCBjbWFwX3JlZ3MJX19pb21lbSAqY21hcF9yZWdzOwogCXVuc2lnbmVkIGxvbmcJCWNtYXBfcmVnc19waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jeWJsYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYwppbmRleCA5NGE2NmMyLi5lMjMzMjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYwpAQCAtMTA2OCwxNSArMTA2OCwxOCBAQAogCQlvdXQ4KDB4M0M5LCBncmVlbiA+PiAxMCk7CiAJCW91dDgoMHgzQzksIGJsdWUgPj4gMTApOwogCi0JfSBlbHNlIGlmIChicHAgPT0gMTYpCS8vIFJHQiA1NjUKLQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9Ci0JCSAgICAocmVkICYgMHhGODAwKSB8Ci0JCSAgICAoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8ICgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOwotCWVsc2UgaWYgKGJwcCA9PSAzMikJLy8gQVJHQiA4ODg4Ci0JCSgodTMyICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQotCQkgICAgKCh0cmFuc3AgJiAweEZGMDApIDw8IDE2KSB8Ci0JCSAgICAoKHJlZCAmIDB4RkYwMCkgPDwgOCkgfAotCQkgICAgKChncmVlbiAmIDB4RkYwMCkpIHwgKChibHVlICYgMHhGRjAwKSA+PiA4KTsKKwl9IGVsc2UgaWYgKHJlZ25vIDwgMTYpIHsKKwkJaWYgKGJwcCA9PSAxNikJLy8gUkdCIDU2NQorCQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCQkJKHJlZCAmIDB4RjgwMCkgfAorCQkJCSgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwKKwkJCQkoKGJsdWUgJiAweEY4MDApID4+IDExKTsKKwkJZWxzZSBpZiAoYnBwID09IDMyKQkvLyBBUkdCIDg4ODgKKwkJCSgodTMyICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQorCQkJCSgodHJhbnNwICYgMHhGRjAwKSA8PCAxNikgfAorCQkJCSgocmVkICYgMHhGRjAwKSA8PCA4KSB8CisJCQkJKChncmVlbiAmIDB4RkYwMCkpIHwgKChibHVlICYgMHhGRjAwKSA+PiA4KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYyBiL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYwppbmRleCBjYTJjNTRjLi4zM2JlNDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jCkBAIC02MywyMyArNjMsMTIgQEAKIAogc3RydWN0IGVwc29uMTM1NV9wYXIgewogCXVuc2lnbmVkIGxvbmcgcmVnX2FkZHI7CisJdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19TVVBFUkgKLQotc3RhdGljIGlubGluZSB1OCBlcHNvbjEzNTVfcmVhZF9yZWcoaW50IGluZGV4KQotewotCXJldHVybiBjdHJsX2luYihwYXIucmVnX2FkZHIgKyBpbmRleCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlcHNvbjEzNTVfd3JpdGVfcmVnKHU4IGRhdGEsIGludCBpbmRleCkKLXsKLQljdHJsX291dGIoZGF0YSwgcGFyLnJlZ19hZGRyICsgaW5kZXgpOwotfQotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUk0pCisjaWYgZGVmaW5lZChDT05GSUdfQVJNKQogCiAjIGlmZGVmIENPTkZJR19BUkNIX0NFSVZBCiAjICBpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgpAQCAtMjg5LDcgKzI3OCw3IEBACiAJc3RydWN0IGVwc29uMTM1NV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCXN3aXRjaCAoYmxhbmtfbW9kZSkgewotCWNhc2UgRkJfQkxBTktfVU5CTEFOS0lORzoKKwljYXNlIEZCX0JMQU5LX1VOQkxBTks6CiAJY2FzZSBGQl9CTEFOS19OT1JNQUw6CiAJCWxjZF9lbmFibGUocGFyLCAxKTsKIAkJYmFja2xpZ2h0X2VuYWJsZSgxKTsKQEAgLTYzNSw3ICs2MjQsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZXBzb24xMzU1X3BhcikgKyBzaXplb2YodTMyKSAqIDI1NiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBlcHNvbjEzNTVfcGFyKSwgJmRldi0+ZGV2KTsKIAlpZiAoIWluZm8pIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGJhaWw7CkBAIC02NDgsNyArNjM3LDcgQEAKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGJhaWw7CiAJfQotCWluZm8tPnBzZXVkb19wYWxldHRlID0gKHZvaWQgKikoZGVmYXVsdF9wYXIgKyAxKTsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGRlZmF1bHRfcGFyLT5wc2V1ZG9fcGFsZXR0ZTsKIAogCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChFUFNPTjEzNTVGQl9GQl9QSFlTLCBFUFNPTjEzNTVGQl9GQl9MRU4pOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwppbmRleCAzOGMyZTI1Li4yMTVhYzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKKysrIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCkBAIC0zMywxOCArMzMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KLQotI2lmIGRlZmluZWQoX19tYzY4MDAwX18pIHx8IGRlZmluZWQoQ09ORklHX0FQVVMpCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotCiAjaW5jbHVkZSA8bGludXgvZmIuaD4KIAorI2luY2x1ZGUgPGFzbS9mYi5oPgorCisKICAgICAvKgogICAgICAqICBGcmFtZSBidWZmZXIgZGV2aWNlIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cCByb3V0aW5lcwogICAgICAqLwpAQCAtNDExLDEwICs0MDQsMTQ2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGZiX3Nob3dfbG9nb19saW5lKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgcm90YXRlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywgaW50IHksCisJCQkgICAgIHVuc2lnbmVkIGludCBuKQoreworCXUzMiAqcGFsZXR0ZSA9IE5VTEwsICpzYXZlZF9wc2V1ZG9fcGFsZXR0ZSA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqbG9nb19uZXcgPSBOVUxMLCAqbG9nb19yb3RhdGUgPSBOVUxMOworCXN0cnVjdCBmYl9pbWFnZSBpbWFnZTsKKworCS8qIFJldHVybiBpZiB0aGUgZnJhbWUgYnVmZmVyIGlzIG5vdCBtYXBwZWQgb3Igc3VzcGVuZGVkICovCisJaWYgKGxvZ28gPT0gTlVMTCB8fCBpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORyB8fAorCSAgICBpbmZvLT5mbGFncyAmIEZCSU5GT19NT0RVTEUpCisJCXJldHVybiAwOworCisJaW1hZ2UuZGVwdGggPSA4OworCWltYWdlLmRhdGEgPSBsb2dvLT5kYXRhOworCisJaWYgKGZiX2xvZ28ubmVlZHNfY21hcHJlc2V0KQorCQlmYl9zZXRfbG9nb2NtYXAoaW5mbywgbG9nbyk7CisKKwlpZiAoZmJfbG9nby5uZWVkc190cnVlcGFsZXR0ZSB8fAorCSAgICBmYl9sb2dvLm5lZWRzX2RpcmVjdHBhbGV0dGUpIHsKKwkJcGFsZXR0ZSA9IGttYWxsb2MoMjU2ICogNCwgR0ZQX0tFUk5FTCk7CisJCWlmIChwYWxldHRlID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZmJfbG9nby5uZWVkc190cnVlcGFsZXR0ZSkKKwkJCWZiX3NldF9sb2dvX3RydWVwYWxldHRlKGluZm8sIGxvZ28sIHBhbGV0dGUpOworCQllbHNlCisJCQlmYl9zZXRfbG9nb19kaXJlY3RwYWxldHRlKGluZm8sIGxvZ28sIHBhbGV0dGUpOworCisJCXNhdmVkX3BzZXVkb19wYWxldHRlID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CisJCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFsZXR0ZTsKKwl9CisKKwlpZiAoZmJfbG9nby5kZXB0aCA8PSA0KSB7CisJCWxvZ29fbmV3ID0ga21hbGxvYyhsb2dvLT53aWR0aCAqIGxvZ28tPmhlaWdodCwgR0ZQX0tFUk5FTCk7CisJCWlmIChsb2dvX25ldyA9PSBOVUxMKSB7CisJCQlrZnJlZShwYWxldHRlKTsKKwkJCWlmIChzYXZlZF9wc2V1ZG9fcGFsZXR0ZSkKKwkJCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHNhdmVkX3BzZXVkb19wYWxldHRlOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaW1hZ2UuZGF0YSA9IGxvZ29fbmV3OworCQlmYl9zZXRfbG9nbyhpbmZvLCBsb2dvLCBsb2dvX25ldywgZmJfbG9nby5kZXB0aCk7CisJfQorCisJaW1hZ2UuZHggPSAwOworCWltYWdlLmR5ID0geTsKKwlpbWFnZS53aWR0aCA9IGxvZ28tPndpZHRoOworCWltYWdlLmhlaWdodCA9IGxvZ28tPmhlaWdodDsKKworCWlmIChyb3RhdGUpIHsKKwkJbG9nb19yb3RhdGUgPSBrbWFsbG9jKGxvZ28tPndpZHRoICoKKwkJCQkgICAgICBsb2dvLT5oZWlnaHQsIEdGUF9LRVJORUwpOworCQlpZiAobG9nb19yb3RhdGUpCisJCQlmYl9yb3RhdGVfbG9nbyhpbmZvLCBsb2dvX3JvdGF0ZSwgJmltYWdlLCByb3RhdGUpOworCX0KKworCWZiX2RvX3Nob3dfbG9nbyhpbmZvLCAmaW1hZ2UsIHJvdGF0ZSwgbik7CisKKwlrZnJlZShwYWxldHRlKTsKKwlpZiAoc2F2ZWRfcHNldWRvX3BhbGV0dGUgIT0gTlVMTCkKKwkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBzYXZlZF9wc2V1ZG9fcGFsZXR0ZTsKKwlrZnJlZShsb2dvX25ldyk7CisJa2ZyZWUobG9nb19yb3RhdGUpOworCXJldHVybiBsb2dvLT5oZWlnaHQ7Cit9CisKKworI2lmZGVmIENPTkZJR19GQl9MT0dPX0VYVFJBCisKKyNkZWZpbmUgRkJfTE9HT19FWF9OVU1fTUFYIDEwCitzdGF0aWMgc3RydWN0IGxvZ29fZGF0YV9leHRyYSB7CisJY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmxvZ287CisJdW5zaWduZWQgaW50IG47Cit9IGZiX2xvZ29fZXhbRkJfTE9HT19FWF9OVU1fTUFYXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmJfbG9nb19leF9udW07CisKK3ZvaWQgZmJfYXBwZW5kX2V4dHJhX2xvZ28oY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmxvZ28sIHVuc2lnbmVkIGludCBuKQoreworCWlmICghbiB8fCBmYl9sb2dvX2V4X251bSA9PSBGQl9MT0dPX0VYX05VTV9NQVgpCisJCXJldHVybjsKKworCWZiX2xvZ29fZXhbZmJfbG9nb19leF9udW1dLmxvZ28gPSBsb2dvOworCWZiX2xvZ29fZXhbZmJfbG9nb19leF9udW1dLm4gPSBuOworCWZiX2xvZ29fZXhfbnVtKys7Cit9CisKK3N0YXRpYyBpbnQgZmJfcHJlcGFyZV9leHRyYV9sb2dvcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCQkgIHVuc2lnbmVkIGludCB5cmVzKQoreworCXVuc2lnbmVkIGludCBpOworCisJLyogRklYTUU6IGxvZ29fZXggc3VwcG9ydHMgb25seSB0cnVlY29sb3IgZmIuICovCisJaWYgKGluZm8tPmZpeC52aXN1YWwgIT0gRkJfVklTVUFMX1RSVUVDT0xPUikKKwkJZmJfbG9nb19leF9udW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IGZiX2xvZ29fZXhfbnVtOyBpKyspIHsKKwkJaGVpZ2h0ICs9IGZiX2xvZ29fZXhbaV0ubG9nby0+aGVpZ2h0OworCQlpZiAoaGVpZ2h0ID4geXJlcykgeworCQkJaGVpZ2h0IC09IGZiX2xvZ29fZXhbaV0ubG9nby0+aGVpZ2h0OworCQkJZmJfbG9nb19leF9udW0gPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGhlaWdodDsKK30KKworc3RhdGljIGludCBmYl9zaG93X2V4dHJhX2xvZ29zKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgeSwgaW50IHJvdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmYl9sb2dvX2V4X251bTsgaSsrKQorCQl5ICs9IGZiX3Nob3dfbG9nb19saW5lKGluZm8sIHJvdGF0ZSwKKwkJCQkgICAgICAgZmJfbG9nb19leFtpXS5sb2dvLCB5LCBmYl9sb2dvX2V4W2ldLm4pOworCisJcmV0dXJuIHk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfRkJfTE9HT19FWFRSQSAqLworCitzdGF0aWMgaW5saW5lIGludCBmYl9wcmVwYXJlX2V4dHJhX2xvZ29zKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCQkgdW5zaWduZWQgaW50IGhlaWdodCwKKwkJCQkJIHVuc2lnbmVkIGludCB5cmVzKQoreworCXJldHVybiBoZWlnaHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX3Nob3dfZXh0cmFfbG9nb3Moc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB5LCBpbnQgcm90YXRlKQoreworCXJldHVybiB5OworfQorCisjZW5kaWYgLyogQ09ORklHX0ZCX0xPR09fRVhUUkEgKi8KKworCiBpbnQgZmJfcHJlcGFyZV9sb2dvKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgcm90YXRlKQogewogCWludCBkZXB0aCA9IGZiX2dldF9jb2xvcl9kZXB0aCgmaW5mby0+dmFyLCAmaW5mby0+Zml4KTsKLQlpbnQgeXJlczsKKwl1bnNpZ25lZCBpbnQgeXJlczsKIAogCW1lbXNldCgmZmJfbG9nbywgMCwgc2l6ZW9mKHN0cnVjdCBsb2dvX2RhdGEpKTsKIApAQCAtNDU2LDcgKzU4NSw3IEBACiAJaWYgKCFmYl9sb2dvLmxvZ28pIHsKIAkJcmV0dXJuIDA7CiAJfQotCQorCiAJaWYgKHJvdGF0ZSA9PSBGQl9ST1RBVEVfVVIgfHwgcm90YXRlID09IEZCX1JPVEFURV9VRCkKIAkJeXJlcyA9IGluZm8tPnZhci55cmVzOwogCWVsc2UKQEAgLTQ3Myw3NSArNjAyLDIwIEBACiAJZWxzZSBpZiAoZmJfbG9nby5sb2dvLT50eXBlID09IExJTlVYX0xPR09fVkdBMTYpCiAJCWZiX2xvZ28uZGVwdGggPSA0OwogCWVsc2UKLQkJZmJfbG9nby5kZXB0aCA9IDE7CQkKLQlyZXR1cm4gZmJfbG9nby5sb2dvLT5oZWlnaHQ7CisJCWZiX2xvZ28uZGVwdGggPSAxOworCisJcmV0dXJuIGZiX3ByZXBhcmVfZXh0cmFfbG9nb3MoaW5mbywgZmJfbG9nby5sb2dvLT5oZWlnaHQsIHlyZXMpOwogfQogCiBpbnQgZmJfc2hvd19sb2dvKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgcm90YXRlKQogewotCXUzMiAqcGFsZXR0ZSA9IE5VTEwsICpzYXZlZF9wc2V1ZG9fcGFsZXR0ZSA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciAqbG9nb19uZXcgPSBOVUxMLCAqbG9nb19yb3RhdGUgPSBOVUxMOwotCXN0cnVjdCBmYl9pbWFnZSBpbWFnZTsKKwlpbnQgeTsKIAotCS8qIFJldHVybiBpZiB0aGUgZnJhbWUgYnVmZmVyIGlzIG5vdCBtYXBwZWQgb3Igc3VzcGVuZGVkICovCi0JaWYgKGZiX2xvZ28ubG9nbyA9PSBOVUxMIHx8IGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8Ci0JICAgIGluZm8tPmZsYWdzICYgRkJJTkZPX01PRFVMRSkKLQkJcmV0dXJuIDA7CisJeSA9IGZiX3Nob3dfbG9nb19saW5lKGluZm8sIHJvdGF0ZSwgZmJfbG9nby5sb2dvLCAwLAorCQkJICAgICAgbnVtX29ubGluZV9jcHVzKCkpOworCXkgPSBmYl9zaG93X2V4dHJhX2xvZ29zKGluZm8sIHksIHJvdGF0ZSk7CiAKLQlpbWFnZS5kZXB0aCA9IDg7Ci0JaW1hZ2UuZGF0YSA9IGZiX2xvZ28ubG9nby0+ZGF0YTsKLQotCWlmIChmYl9sb2dvLm5lZWRzX2NtYXByZXNldCkKLQkJZmJfc2V0X2xvZ29jbWFwKGluZm8sIGZiX2xvZ28ubG9nbyk7Ci0KLQlpZiAoZmJfbG9nby5uZWVkc190cnVlcGFsZXR0ZSB8fCAKLQkgICAgZmJfbG9nby5uZWVkc19kaXJlY3RwYWxldHRlKSB7Ci0JCXBhbGV0dGUgPSBrbWFsbG9jKDI1NiAqIDQsIEdGUF9LRVJORUwpOwotCQlpZiAocGFsZXR0ZSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKGZiX2xvZ28ubmVlZHNfdHJ1ZXBhbGV0dGUpCi0JCQlmYl9zZXRfbG9nb190cnVlcGFsZXR0ZShpbmZvLCBmYl9sb2dvLmxvZ28sIHBhbGV0dGUpOwotCQllbHNlCi0JCQlmYl9zZXRfbG9nb19kaXJlY3RwYWxldHRlKGluZm8sIGZiX2xvZ28ubG9nbywgcGFsZXR0ZSk7Ci0KLQkJc2F2ZWRfcHNldWRvX3BhbGV0dGUgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKLQkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYWxldHRlOwotCX0KLQotCWlmIChmYl9sb2dvLmRlcHRoIDw9IDQpIHsKLQkJbG9nb19uZXcgPSBrbWFsbG9jKGZiX2xvZ28ubG9nby0+d2lkdGggKiBmYl9sb2dvLmxvZ28tPmhlaWdodCwgCi0JCQkJICAgR0ZQX0tFUk5FTCk7Ci0JCWlmIChsb2dvX25ldyA9PSBOVUxMKSB7Ci0JCQlrZnJlZShwYWxldHRlKTsKLQkJCWlmIChzYXZlZF9wc2V1ZG9fcGFsZXR0ZSkKLQkJCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHNhdmVkX3BzZXVkb19wYWxldHRlOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW1hZ2UuZGF0YSA9IGxvZ29fbmV3OwotCQlmYl9zZXRfbG9nbyhpbmZvLCBmYl9sb2dvLmxvZ28sIGxvZ29fbmV3LCBmYl9sb2dvLmRlcHRoKTsKLQl9Ci0KLQlpbWFnZS5keCA9IDA7Ci0JaW1hZ2UuZHkgPSAwOwotCWltYWdlLndpZHRoID0gZmJfbG9nby5sb2dvLT53aWR0aDsKLQlpbWFnZS5oZWlnaHQgPSBmYl9sb2dvLmxvZ28tPmhlaWdodDsKLQotCWlmIChyb3RhdGUpIHsKLQkJbG9nb19yb3RhdGUgPSBrbWFsbG9jKGZiX2xvZ28ubG9nby0+d2lkdGggKgotCQkJCSAgICAgIGZiX2xvZ28ubG9nby0+aGVpZ2h0LCBHRlBfS0VSTkVMKTsKLQkJaWYgKGxvZ29fcm90YXRlKQotCQkJZmJfcm90YXRlX2xvZ28oaW5mbywgbG9nb19yb3RhdGUsICZpbWFnZSwgcm90YXRlKTsKLQl9Ci0KLQlmYl9kb19zaG93X2xvZ28oaW5mbywgJmltYWdlLCByb3RhdGUsIG51bV9vbmxpbmVfY3B1cygpKTsKLQotCWtmcmVlKHBhbGV0dGUpOwotCWlmIChzYXZlZF9wc2V1ZG9fcGFsZXR0ZSAhPSBOVUxMKQotCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHNhdmVkX3BzZXVkb19wYWxldHRlOwotCWtmcmVlKGxvZ29fbmV3KTsKLQlrZnJlZShsb2dvX3JvdGF0ZSk7Ci0JcmV0dXJuIGZiX2xvZ28ubG9nby0+aGVpZ2h0OworCXJldHVybiB5OwogfQogI2Vsc2UKIGludCBmYl9wcmVwYXJlX2xvZ28oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUpIHsgcmV0dXJuIDA7IH0KQEAgLTExNTUsMTcgKzEyMjksMTUgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogZmJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQogewogCWludCBmYmlkeCA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHJlZ2lzdGVyZWRfZmJbZmJpZHhdOwogCXN0cnVjdCBmYl9vcHMgKmZiID0gaW5mby0+ZmJvcHM7CiAJdW5zaWduZWQgbG9uZyBvZmY7Ci0jaWYgIWRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfdjlfXykKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXUzMiBsZW47Ci0jZW5kaWYKIAogCWlmICh2bWEtPnZtX3Bnb2ZmID4gKH4wVUwgPj4gUEFHRV9TSElGVCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE4MCwxMiArMTI1Miw2IEBACiAJCXJldHVybiByZXM7CiAJfQogCi0jaWYgZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykKLQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGFsbCBmYiBkcml2ZXJzIHNob3VsZCBoYXZlIHRoZWlyIG93bgotCSAgIG1tYXAgcm91dGluZXMgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLSNlbHNlCi0JLyogIXNwYXJjMzIuLi4gKi8KIAlsb2NrX2tlcm5lbCgpOwogCiAJLyogZnJhbWUgYnVmZmVyIG1lbW9yeSAqLwpAQCAtMTIwOSw1MCArMTI3NSwxMSBAQAogCXZtYS0+dm1fcGdvZmYgPSBvZmYgPj4gUEFHRV9TSElGVDsKIAkvKiBUaGlzIGlzIGFuIElPIG1hcCAtIHRlbGwgbWF5ZHVtcCB0byBza2lwIHRoaXMgVk1BICovCiAJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEOwotI2lmIGRlZmluZWQoX19tYzY4MDAwX18pCi0jaWYgZGVmaW5lZChDT05GSUdfU1VOMykKLQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBTVU4zX1BBR0VfTk9DQUNIRTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX01NVSkKLQlpZiAoQ1BVX0lTXzAyMF9PUl8wMzApCi0JCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PQ0FDSEUwMzA7Ci0JaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7Ci0JCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICY9IF9DQUNIRU1BU0swNDA7Ci0JCS8qIFVzZSBuby1jYWNoZSBtb2RlLCBzZXJpYWxpemVkICovCi0JCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PQ0FDSEVfUzsKLQl9Ci0jZW5kaWYKLSNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCBvZmYgPj4gUEFHRV9TSElGVCwKLQkJCQkJCSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCi0JCQkJCQkgdm1hLT52bV9wYWdlX3Byb3QpOwotI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCi0JLyogQ2FjaGluZyBpcyBvZmYgaW4gdGhlIEkvTyBzcGFjZSBxdWFkcmFudCBieSBkZXNpZ24uICAqLwotI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotCWlmIChib290X2NwdV9kYXRhLng4NiA+IDMpCi0JCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX1BDRDsKLSNlbGlmIGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19zcGFyY192OV9fKQotCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxpZiBkZWZpbmVkKF9faHBwYV9fKQotCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PX0NBQ0hFOwotI2VsaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfX20zMnJfXykKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOwotI2VsaWYgZGVmaW5lZChfX2F2cjMyX18pCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdCgocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKLQkJCQkgICAgICAmIH5fUEFHRV9DQUNIQUJMRSkKLQkJCQkgICAgIHwgKF9QQUdFX0JVRkZFUiB8IF9QQUdFX0RJUlRZKSk7Ci0jZWxpZiBkZWZpbmVkKF9faWE2NF9fKQotCWlmIChlZmlfcmFuZ2VfaXNfd2Modm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSkKLQkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKLQllbHNlCi0JCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxzZQotI3dhcm5pbmcgV2hhdCBkbyB3ZSBoYXZlIHRvIGRvIGhlcmU/PwotI2VuZGlmCisJZmJfcGdwcm90ZWN0KGZpbGUsIHZtYSwgb2ZmKTsKIAlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgb2ZmID4+IFBBR0VfU0hJRlQsCiAJCQkgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAlyZXR1cm4gMDsKLSNlbmRpZiAvKiAhc3BhcmMzMiAqLwogfQogCiBzdGF0aWMgaW50CkBAIC0xMzg4LDE3ICsxNDE1LDM0IEBACiAgKgogICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBmb3Igc3VjY2Vzcy4KICAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIG5vdGlmeSB0aGUgZnJhbWVidWZmZXIgY29uc29sZQorICogICAgICB0byByZWxlYXNlIHRoZSBkcml2ZXIuCisgKgorICogICAgICBUaGlzIGlzIG1lYW50IHRvIGJlIGNhbGxlZCB3aXRoaW4gYSBkcml2ZXIncyBtb2R1bGVfZXhpdCgpCisgKiAgICAgIGZ1bmN0aW9uLiBJZiB0aGlzIGlzIGNhbGxlZCBvdXRzaWRlIG1vZHVsZV9leGl0KCksIGVuc3VyZQorICogICAgICB0aGF0IHRoZSBkcml2ZXIgaW1wbGVtZW50cyBmYl9vcGVuKCkgYW5kIGZiX3JlbGVhc2UoKSB0bworICogICAgICBjaGVjayB0aGF0IG5vIHByb2Nlc3NlcyBhcmUgdXNpbmcgdGhlIGRldmljZS4KICAqLwogCiBpbnQKIHVucmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pCiB7CiAJc3RydWN0IGZiX2V2ZW50IGV2ZW50OwotCWludCBpOworCWludCBpLCByZXQgPSAwOwogCiAJaSA9IGZiX2luZm8tPm5vZGU7Ci0JaWYgKCFyZWdpc3RlcmVkX2ZiW2ldKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXJlZ2lzdGVyZWRfZmJbaV0pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWV2ZW50LmluZm8gPSBmYl9pbmZvOworCXJldCA9IGZiX25vdGlmaWVyX2NhbGxfY2hhaW4oRkJfRVZFTlRfRkJfVU5CSU5ELCAmZXZlbnQpOworCisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQogCiAJaWYgKGZiX2luZm8tPnBpeG1hcC5hZGRyICYmCiAJICAgIChmYl9pbmZvLT5waXhtYXAuZmxhZ3MgJiBGQl9QSVhNQVBfREVGQVVMVCkpCkBAIC0xNDEwLDcgKzE0NTQsOCBAQAogCWRldmljZV9kZXN0cm95KGZiX2NsYXNzLCBNS0RFVihGQl9NQUpPUiwgaSkpOwogCWV2ZW50LmluZm8gPSBmYl9pbmZvOwogCWZiX25vdGlmaWVyX2NhbGxfY2hhaW4oRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVELCAmZXZlbnQpOwotCXJldHVybiAwOworZG9uZToKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZm0yZmIuYyBiL2RyaXZlcnMvdmlkZW8vZm0yZmIuYwppbmRleCA3MGZmNTViLi42YzkxYzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZtMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mbTJmYi5jCkBAIC0xOTUsMTMgKzE5NSwxNSBAQAogc3RhdGljIGludCBmbTJmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpZiAocmVnbm8gPiBpbmZvLT5jbWFwLmxlbikKLQkJcmV0dXJuIDE7Ci0JcmVkID4+PSA4OwotCWdyZWVuID4+PSA4OwotCWJsdWUgPj49IDg7CisJaWYgKHJlZ25vIDwgMTYpIHsKKwkJcmVkID4+PSA4OworCQlncmVlbiA+Pj0gODsKKwkJYmx1ZSA+Pj0gODsKIAotCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7CisJCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSAocmVkIDw8IDE2KSB8CisJCQkoZ3JlZW4gPDwgOCkgfCBibHVlOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yMzcsNyArMjM5LDcgQEAKIAlpZiAoIXpvcnJvX3JlcXVlc3RfZGV2aWNlKHosImZtMmZiIikpCiAJCXJldHVybiAtRU5YSU87CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2MoMjU2ICogc2l6ZW9mKHUzMiksICZ6LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygxNiAqIHNpemVvZih1MzIpLCAmei0+ZGV2KTsKIAlpZiAoIWluZm8pIHsKIAkJem9ycm9fcmVsZWFzZV9kZXZpY2Uoeik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nYmVmYi5jIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCmluZGV4IGJmMGU2MGIuLmI5YjU3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAogc3RhdGljIGludCB5cGFuLCB5d3JhcDsKIAotc3RhdGljIHVpbnQzMl90IHBzZXVkb19wYWxldHRlWzI1Nl07CitzdGF0aWMgdWludDMyX3QgcHNldWRvX3BhbGV0dGVbMTZdOwogCiBzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19pbml0ZGF0YSA9IE5VTEw7CiAKQEAgLTg1NCw4ICs4NTQsNyBAQAogCWdyZWVuID4+PSA4OwogCWJsdWUgPj49IDg7CiAKLQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgODoKKwlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIDw9IDgpIHsKIAkJLyogd2FpdCBmb3IgdGhlIGNvbG9yIG1hcCBGSUZPIHRvIGhhdmUgYSBmcmVlIGVudHJ5ICovCiAJCWZvciAoaSA9IDA7IGkgPCAxMDAwICYmIGdiZS0+Y21fZmlmbyA+PSA2MzsgaSsrKQogCQkJdWRlbGF5KDEwKTsKQEAgLTg2NCwyMyArODYzLDI1IEBACiAJCQlyZXR1cm4gMTsKIAkJfQogCQlnYmUtPmNtYXBbcmVnbm9dID0gKHJlZCA8PCAyNCkgfCAoZ3JlZW4gPDwgMTYpIHwgKGJsdWUgPDwgOCk7Ci0JCWJyZWFrOwotCWNhc2UgMTU6Ci0JY2FzZSAxNjoKLQkJcmVkID4+PSAzOwotCQlncmVlbiA+Pj0gMzsKLQkJYmx1ZSA+Pj0gMzsKLQkJcHNldWRvX3BhbGV0dGVbcmVnbm9dID0KLQkJCShyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKLQkJCShncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8Ci0JCQkoYmx1ZSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlwc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQotCQkJKHJlZCA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgfAotCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7Ci0JCWJyZWFrOworCX0gZWxzZSBpZiAocmVnbm8gPCAxNikgeworCQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDE1OgorCQljYXNlIDE2OgorCQkJcmVkID4+PSAzOworCQkJZ3JlZW4gPj49IDM7CisJCQlibHVlID4+PSAzOworCQkJcHNldWRvX3BhbGV0dGVbcmVnbm9dID0KKwkJCQkocmVkIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSB8CisJCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKKwkJCQkoYmx1ZSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlwc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQorCQkJCShyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7CisJCQlicmVhazsKKwkJfQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaCBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKaW5kZXggODg5ZTRlYS4uMzI4YWU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCkBAIC0yNjYsNyArMjY2LDcgQEAKIAlzdHJ1Y3QgaTgxMGZiX2kyY19jaGFuICAgY2hhblszXTsKIAlzdHJ1Y3QgbXV0ZXgJCSBvcGVuX2xvY2s7CiAJdW5zaWduZWQgaW50CQkgdXNlX2NvdW50OwotCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIAl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnRfcGh5czsKIAl1OCBfX2lvbWVtICptbWlvX3N0YXJ0X3ZpcnR1YWw7CiAJdTggKmVkaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaAppbmRleCA4MGI5NGMxLi42MTQ4MzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKQEAgLTMwMiw3ICszMDIsNyBAQAogCXUzMiByaW5nX2xvY2t1cDsKIAogCS8qIHBhbGV0dGUgKi8KLQl1MzIgcHNldWRvX3BhbGV0dGVbMTddOworCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07CiAKIAkvKiBjaGlwIGluZm8gKi8KIAlpbnQgcGNpX2NoaXBzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnCmluZGV4IDkzOTdiY2UuLmRhMjE5YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnCkBAIC0xMCw2ICsxMCwxMSBAQAogCiBpZiBMT0dPCiAKK2NvbmZpZyBGQl9MT0dPX0VYVFJBCisJYm9vbAorCWRlcGVuZHMgb24gRkIKKwlkZWZhdWx0IHkgaWYgU1BVX0JBU0UKKwogY29uZmlnIExPR09fTElOVVhfTU9OTwogCWJvb2wgIlN0YW5kYXJkIGJsYWNrIGFuZCB3aGl0ZSBMaW51eCBsb2dvIgogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9sb2dvL01ha2VmaWxlCmluZGV4IGI5ODVkZmEuLmE1ZmM0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDggQEAKIG9iai0kKENPTkZJR19MT0dPX1NVUEVSSF9DTFVUMjI0KQkrPSBsb2dvX3N1cGVyaF9jbHV0MjI0Lm8KIG9iai0kKENPTkZJR19MT0dPX00zMlJfQ0xVVDIyNCkJCSs9IGxvZ29fbTMycl9jbHV0MjI0Lm8KIAorb2JqLSQoQ09ORklHX1NQVV9CQVNFKQkJCSs9IGxvZ29fc3BlX2NsdXQyMjQubworCiAjIEhvdyB0byBnZW5lcmF0ZSBsb2dvJ3MKIAogIyBVc2UgbG9nby1jZmlsZXMgdG8gcmV0cmlldmUgbGlzdCBvZiAuYyBmaWxlcyB0byBiZSBidWlsdApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fc3BlX2NsdXQyMjQucHBtIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fc3BlX2NsdXQyMjQucHBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmFkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19zcGVfY2x1dDIyNC5wcG0KQEAgLTAsMCArMSwyODMgQEAKK1AzCis0MCA0MAorMjU1CiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIgIDYgNiA2CisxNSAxNSAxNSAgMjEgMjEgMjEgIDE5IDE5IDE5ICAxNCAxNCAxNCAgNiA2IDYgIDIgMiAyCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIgIDIxIDIxIDIxICA1NSA1NSA1NQorNTYgNTYgNTYgIDU0IDU0IDU0ICA1MyA1MyA1MyAgNjAgNjAgNjAgIDU2IDU2IDU2ICAyNSAyNSAyNQorNiA2IDYgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMiAyIDIgIDI3IDI3IDI3ICA2MiA2MiA2MiAgMTcgMTcgMTkKKzIgMiA2ICAyIDIgNiAgMiAyIDYgIDIgMiA2ICAxNiAxNiAxOCAgNTcgNTcgNTcKKzQ1IDQ1IDQ1ICA4IDggOCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAxICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDE2IDE2IDE2ICA2MiA2MiA2MiAgOCA4IDEwICAyIDIgNgorMiAyIDYgIDIgMiA2ICAyIDIgNiAgMTIgMTIgMTQgIDY3IDY3IDY3ICAxNiAxNiAxNworNDUgNDUgNDUgIDQxIDQxIDQxICA0IDQgNCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAyIDIgMiAgMzUgMzUgMzUgIDQwIDQwIDQwICAyIDIgNiAgMiAyIDYKKzIgMiA2ICAyIDIgNiAgMiAyIDYgIDE1IDE1IDE3ICA3MCA3MCA3MCAgMjcgMjcgMjcKKzMgMyA2ICA2MiA2MiA2MiAgMjAgMjAgMjAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNCA0IDQgIDU4IDU4IDU4ICAxMiAxMiAxNCAgMiAyIDYgIDIgMiA2CisyIDIgNiAgMiAyIDYgIDIgMiA2ICA0IDQgNyAgNCA0IDcgIDIgMiA2CisyIDIgNiAgMzQgMzQgMzYgIDQwIDQwIDQwICAzIDMgMyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDcgNyA3ICA2NCA2NCA2NCAgMiAyIDYgIDUgNSA1ICAxNyAxNyAxNworMyAzIDYgIDIgMiA2ICAyIDIgNiAgMTUgMTUgMTUgIDIxIDIxIDIxICA3IDcgMTAKKzIgMiA2ICA4IDggMTAgIDYyIDYyIDYyICA2IDYgNiAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDcgNyA3ICA2NiA2NiA2NiAgNSA1IDggIDEyMiAxMjIgMTIyICAxMjIgMTIyIDEyMgorOSA5IDExICAzIDMgNiAgMTA0IDk2IDgxICAxNzkgMTc5IDE3OSAgMTIyIDEyMiAxMjIgIDEzIDEzIDEzCisyIDIgNiAgMiAyIDYgIDY3IDY3IDY3ICAxMCAxMCAxMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDcgNyA3ICA2NSA2NSA2NSAgNDEgNDEgNDMgIDE1MiAxNDkgMTQyICAxOTIgMTkxIDE4OQorNDggNDggNDkgIDIzIDIzIDI0ICAyMjggMjEwIDIxMCAgODYgODYgODYgIDE5MiAxOTEgMTg5ICA1OSA1OSA2MQorMiAyIDYgIDIgMiA2ICA2NCA2NCA2NCAgMTQgMTQgMTQgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDEgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA3IDcgNyAgNjYgNjYgNjYgIDU5IDU5IDU5ICA1OSA1OSA2MSAgODYgODYgODYKKzk5IDg0IDUwICA3OCA2NiAyOCAgMTUyIDE0OSAxNDIgIDUgNSA4ICAxMjIgMTIyIDEyMiAgMTA0IDk2IDgxCisyIDIgNiAgMiAyIDYgIDY3IDY3IDY3ICAxNCAxNCAxNCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDUgNSA1ICA2MyA2MyA2MyAgMjQgMjQgMjQgIDE1MiAxNDkgMTQyICAxNzUgMTIyIDEzCisyMzggMTg0IDEyICAyMjAgMTcwIDEzICAyMjYgMTgxIDUyICAxMTIgODYgMzIgIDE5NCAxNjUgMTUxICA0NiA0NiA0NworMiAyIDYgIDIgMiA2ICA2NSA2NSA2NSAgMTcgMTcgMTcgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA1IDUgNSAgNTkgNTkgNTkgIDIxIDIxIDIxICAxNzUgMTIyIDEzICAyMzEgMTc0IDExCisyNDAgMTkyIDEzICAyMzcgMTgzIDYxICAyNDAgMTkyIDEzICAyNDAgMTkyIDEzICAyMzQgMTc5IDE2ICA4MSA2NCA5CisyIDIgNiAgMiAyIDYgIDYzIDYzIDYzICAyNSAyNSAyNSAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDUgNSA1ICA1NCA1NCA1NCAgNTEgNDggMzkgIDE4OSAxMzggOSAgMjM4IDE4NCAxMgorMjQwIDE5MiAxMyAgMjQwIDE5MiAxMyAgMjQwIDE5MiAxMyAgMjE1IDE2MSAxMSAgMjA3IDE1MiAxOSAgODEgNjQgOQorMTYgMTYgMTggIDUgNSA4ICA0MCA0MCA0MCAgNDQgNDQgNDQgIDQgNCA0ICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA1IDUgNSAgNTkgNTkgNTkgIDI3IDI3IDI3ICAxMjYgMTA3IDY0ICAxODcgMTM2IDEyCisyMjAgMTcwIDEzICAyMDEgMTQ3IDIwICAxODkgMTM4IDkgIDE5OCAxNTQgNDYgIDE5OSAxODIgMTI1ICA3MCA3MCA3MAorMjcgMjcgMjcgIDEwNCA5NiA4MSAgMTIgMTIgMTQgIDcwIDcwIDcwICAxNiAxNiAxNiAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMTcgMTcgMTcgIDcwIDcwIDcwICAxMiAxMiAxMiAgMTY4IDE2OCAxNjggIDE3NCAxMzUgMTM1CisxNzUgMTIyIDEzICAxNzUgMTIyIDEzICAxNzggMTUxIDgzICAxOTIgMTkxIDE4OSAgMjMzIDIzMyAyMzMgIDE3OSAxNzkgMTc5CiszIDMgNiAgMjkgMjkgMzEgIDMgMyA2ICA0MSA0MSA0MSAgNDQgNDQgNDQgIDUgNSA1CiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorOCA4IDggIDUzIDUzIDUzICA0NCA0NCA0NCAgNTkgNTkgNTkgIDIzOCAyMzggMjM4ICAxOTIgMTkxIDE4OQorMTkyIDE5MSAxODkgIDE5MiAxOTEgMTg5ICAyMjEgMjA1IDIwNSAgMjQwIDI0MCAyNDAgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworNzAgNzAgNzAgIDIgMiA2ICAyIDIgNiAgNSA1IDggIDY3IDY3IDY3ICAyMiAyMiAyMgorMiAyIDIgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgNSA1IDUKKzM4IDM4IDM4ICA1NiA1NiA1NiAgNyA3IDkgIDIyMSAyMDUgMjA1ICAyNTMgMjUzIDI1MyAgMjMzIDIzMyAyMzMKKzIyMSAyMDUgMjA1ICAyMzMgMjMzIDIzMyAgMjUxIDI1MSAyNTEgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzE5MiAxOTEgMTg5ICAyIDIgNiAgMiAyIDYgIDIgMiA2ICAyNSAyNSAyNSAgNjQgNjQgNjQKKzE1IDE1IDE1ICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIgIDI3IDI3IDI3Cis2NiA2NiA2NiAgNyA3IDkgIDg2IDg2IDg2ICAyNTIgMjUyIDI1MiAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTIgMjUyIDI1MiAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNDQgMjQ0IDI0NCAgMTkgMTkgMjEgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDM4IDM4IDM4Cis1NCA1NCA1NCAgMTAgMTAgMTAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDE0IDE0IDE0ICA2MiA2MiA2MgorMTAgMTAgMTIgIDMgMyA2ICAxMjIgMTIyIDEyMiAgMjM1IDIzNSAyMzUgIDI1MSAyNTEgMjUxICAyNDggMjQ4IDI0OAorMjM1IDIzNSAyMzUgIDI0OCAyNDggMjQ4ICAyNTIgMjUyIDI1MiAgMjQ2IDI0NiAyNDYgIDIzMyAyMzMgMjMzICAyMzcgMjI4IDIyOAorMjIzIDIwNyAyMDcgIDcwIDcwIDcwICAyIDIgNiAgMiAyIDYgIDIgMiA2ICAyIDIgNgorNDYgNDYgNDcgIDM4IDM4IDM4ICA0IDQgNCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyICAzMyAzMyAzMyAgNDQgNDQgNDQKKzQgNCA3ICA5IDkgMTEgIDE2OCAxNjggMTY4ICAyNDAgMjQwIDI0MCAgMjUyIDI1MiAyNTIgIDI1MiAyNTIgMjUyCisyNDYgMjQ2IDI0NiAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTEgMjUxIDI1MSAgMjQ1IDI0MSAyNDEgIDIzMyAyMzMgMjMzCisyMjEgMjA1IDIwNSAgMTkyIDE5MSAxODkgIDI5IDI5IDMxICAyNyAyNyAyNyAgOSA5IDEyICAyIDIgNgorMyAzIDYgIDY1IDY1IDY1ICAxNSAxNSAxNSAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDYgNiA2ICA1OSA1OSA1OSAgMTkgMTkgMjEKKzI0IDI0IDI0ICA4NiA4NiA4NiAgMjQ5IDI0OSAyNDkgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyMjggMjEwIDIxMCAgMjQxIDIzMCAyMzAgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MSAyNTEgMjUxICAyMjggMjEwIDIxMCAgMTUyIDE0OSAxNDIgIDUgNSA4ICAyNyAyNyAyNyAgNCA0IDcKKzIgMiA2ICA0NiA0NiA0NyAgMzQgMzQgMzQgIDIgMiAyICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAxNiAxNiAxNiAgNjcgNjcgNjcgIDE5IDE5IDIxCisxMiAxMiAxNCAgMjIzIDIwNyAyMDcgIDI1NCAyMCAyMCAgMjU0IDIwIDIwICAyNTMgMTI3IDEyNyAgMjQyIDIyMyAyMjMKKzI1NCAyMCAyMCAgMjUzIDEyNyAxMjcgIDI1NCA0OCA0OCAgMjQyIDIyMyAyMjMgIDI1NCA4NiA4NiAgMjU0IDIwIDIwCisyNTQgMjAgMjAgIDI1MyAxMzcgMTM3ICAyMzMgMjMzIDIzMyAgMzIgMzIgMzIgIDM1IDM1IDM1ICAyMyAyMyAyNAorMiAyIDYgIDE1IDE1IDE1ICA2MCA2MCA2MCAgNiA2IDYgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgNCA0IDQgIDM4IDM4IDM4ICA0OCA0OCA0OSAgMjIgMjIgMjIKKzg2IDg2IDg2ICAyNTMgMjUzIDI1MyAgMjU0IDIwIDIwICAyNDEgMjMwIDIzMCAgMjI3IDIxNiAxODYgIDI1MyAxMzcgMTM3CisyNTMgMTM3IDEzNyAgMjUzIDI1MyAyNTMgIDI1MyAxMzcgMTM3ICAyNTMgMTM3IDEzNyAgMjU0IDQ4IDQ4ICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgNjIgNjIgNjIgIDIgMiA2ICAyMyAyMyAyNAorMiAyIDYgIDIgMiA2ICA2MiA2MiA2MiAgMTcgMTcgMTcgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMTQgMTQgMTQgIDcwIDcwIDcwICAxNCAxNCAxNCAgMTYgMTYgMTgKKzE3OSAxNzkgMTc5ICAyNTMgMjUzIDI1MyAgMjI3IDIxNiAxODYgIDI1NCA0OCA0OCAgMjQwIDIxOSAxNjAgIDI1MyAxMjcgMTI3CisyNTQgMjAgMjAgIDI1MyAxMzcgMTM3ICAyNTQgODYgODYgIDIzMSAyMDMgMTQxICAyNTQgMjAgMjAgIDI1NCAyMCAyMAorMjUzIDEzNyAxMzcgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMTA0IDk2IDgxICAyIDIgNiAgMjMgMjMgMjQKKzIgMiA2ICAyIDIgNiAgNDYgNDYgNDcgIDI3IDI3IDI3ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNCA0IDQgIDM5IDM5IDM5ICA0MiA0MiA0MyAgMTkgMTkgMjEgIDEzIDEzIDEzCisyMjggMjEwIDIxMCAgMjQyIDIyMyAyMjMgIDI1MyAyNTMgMjUzICAyNDIgMjIzIDIyMyAgMjUzIDEyNyAxMjcgIDI1MyAxMjcgMTI3CisyNTMgMTI3IDEyNyAgMjUzIDEyNyAxMjcgIDI1MyAxMzcgMTM3ICAyNTMgMjUzIDI1MyAgMjU0IDQ4IDQ4ICAyNTMgMjUzIDI1MworMjI4IDIxMCAyMTAgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMTIyIDEyMiAxMjIgIDIgMiA2ICAxOSAxOSAxOQorMiAyIDYgIDIgMiA2ICAzOSAzOSAzOSAgMzggMzggMzggIDMgMyAzICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA4IDggOCAgNjAgNjAgNjAgIDMgMyA2ICAzMyAzMyAzMyAgMzggMzggMzgKKzI1MyAxMzcgMTM3ICAyNTQgODYgODYgIDI1MyAxMzcgMTM3ICAyNTQgODYgODYgIDI1MyAxMzcgMTM3ICAyMDkgMTk3IDE2OAorMjUzIDEyNyAxMjcgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAxMjcgMTI3ICAyNTQgODYgODYKKzI1NCA4NiA4NiAgMjUzIDEzNyAxMzcgIDI1MyAyNTMgMjUzICAxMjIgMTIyIDEyMiAgMiAyIDYgIDE3IDE3IDE3CisyIDIgNiAgMiAyIDYgIDM0IDM0IDM2ICA0MiA0MiA0MyAgMyAzIDMgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDEzIDEzIDEzICA1OSA1OSA1OSAgMiAyIDYgIDkgOSAxMiAgNTYgNTYgNTYKKzI1MiAyNTIgMjUyICAyNDAgMjE5IDE2MCAgMjUzIDEzNyAxMzcgIDI0MCAyMTkgMTYwICAyNTMgMjUzIDI1MyAgMjM3IDIyOCAyMjgKKzI1NCA4NiA4NiAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI0MiAyMjMgMjIzCisyMjcgMjE2IDE4NiAgMjQ5IDI0OSAyNDkgIDI1MyAyNTMgMjUzICAxMjIgMTIyIDEyMiAgMTYgMTYgMTcgIDE3IDE3IDE3CisxMiAxMiAxNCAgMyAzIDYgIDM5IDM5IDM5ICAzOCAzOCAzOCAgMyAzIDMgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMgorNSA1IDUgIDIyIDIyIDIyICAxMDQgOTYgODEgIDE4NyAxMzYgMTIgIDIwNyAxNTIgMTkgIDUxIDQ4IDM5CisyMjEgMjA1IDIwNSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI0MCAyNDAgMjQwCisyNTAgMjQ3IDI0MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUwIDI0NyAyNDMgIDI0MCAyMTkgMTYwICA5OSA4NCA1MCAgNSA1IDggIDIgMiA2Cis3IDcgOSAgNDYgNDYgNDcgIDU4IDU4IDU4ICAzNSAzNSAzNSAgMyAzIDMgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDggOCA4ICAzMyAzMyAzMworNTggNTggNTggIDg2IDg2IDg2ICAxNzAgMTM2IDUzICAyMzkgMTgyIDEzICAyNDYgMTkwIDE0ICAyMjAgMTcwIDEzCis0NCAzOCAyOSAgMTc5IDE3OSAxNzkgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI0MCAyNDAgMjQwCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjQwIDIxOSAxNjAgIDI0MCAxOTIgMTMgIDExMiA4NiAzMiAgMiAyIDYgIDIgMiA2CiszIDMgNiAgNDEgMzMgMjAgIDIyMCAxNzAgMTMgIDUzIDUzIDUzICA0IDQgNCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgMzIgMzIgMzIgIDE1MCAxMTYgNDQKKzIxNSAxNjEgMTEgIDIxNSAxNjEgMTEgIDIyOCAxNzAgMTEgIDI0NSAxODggMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzE4NyAxMzYgMTIgIDkgOSAxMSAgMTIyIDEyMiAxMjIgIDI1MSAyNTEgMjUxICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI0OCAyNDggMjQ4ICAyMTEgMTk2IDEzNSAgMjM5IDE4MiAxMyAgMTc1IDEyMiAxMyAgNiA1IDYgIDIgMiA2CisxNiAxNCAxMiAgMTg3IDEzNiAxMiAgMjM4IDE4NCAxMiAgODQgNzggNjUgIDEwIDEwIDEwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDQgNCA0ICA1MyA1MyA1MyAgMjA3IDE1MiAxOQorMjQyIDE4NSAxMyAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQwIDE5MiAxMyAgODEgNjQgOSAgMiAyIDYgIDg2IDg2IDg2ICAyNDQgMjQ0IDI0NCAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzIzMyAyMzMgMjMzICAxOTkgMTgyIDEyNSAgMjMxIDE3NCAxMSAgMjA3IDE1MiAxOSAgMTc1IDEyMiAxMyAgMTc1IDEyMiAxMworMjAxIDE0NyAyMCAgMjM5IDE4MiAxMyAgMjQ0IDE4NyAxNCAgMTUwIDExNiA0NCAgMzUgMzUgMzUgIDYgNiA2CiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNSA1IDUgIDUzIDUzIDUzICAyMDEgMTQ3IDIwCisyNDIgMTg1IDEzICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyMjAgMTcwIDEzICAxMyAxMSAxMCAgMiAyIDYgIDE1MiAxNDkgMTQyICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjM1IDIzNSAyMzUgIDE5OSAxODIgMTI1ICAyMjggMTcwIDExICAyMzQgMTc3IDEyICAyMjYgMTY4IDExICAyMjYgMTY4IDExCisyMzQgMTc3IDEyICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyMzQgMTc5IDE2ICAxMjYgMTA3IDY0ICAzNiAzNiAzNgorNiA2IDYgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDMgMyAzICA0OCA0OCA0OSAgMTg5IDE0MiAzNQorMjQyIDE4NSAxMyAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMTQwIDExMiAzOSAgMzYgMzYgMzYgIDE5MiAxOTEgMTg5ICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMTkyIDE5MSAxODkgIDExMiA4NiAzMiAgMjI2IDE2OCAxMSAgMjQ0IDE4NyAxNCAgMjQ0IDE4NyAxNCAgMjQ0IDE4NyAxNAorMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQyIDE4NSAxMyAgMTUwIDExNiA0NAorMjcgMjcgMjcgIDIgMiAyICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDYgNiA2ICA1OCA1OCA1OCAgMTg5IDE0MiAzNQorMjM5IDE4MiAxMyAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjM5IDE4OCAxNCAgMjA5IDE5NyAxNjggIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MiAyNTIgMjUyICAxNjggMTY4IDE2OAorMTYgMTYgMTggIDk3IDY3IDggIDIyOCAxNzAgMTEgIDI0NSAxODggMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NCAxODcgMTQgIDE5OCAxNTQgNDYKKzM1IDM1IDM1ICAzIDMgMyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAxMyAxMyAxMyAgODQgNzggNjUgIDIxNSAxNjEgMTEKKzI0NCAxODcgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDIzOCAxODQgMTIgIDE4NyAxMzYgMTIgIDE2OCAxNjggMTY4ICAyNDQgMjQ0IDI0NAorMjUzIDI1MyAyNTMgIDI1MiAyNTIgMjUyICAyNDAgMjQwIDI0MCAgMTc5IDE3OSAxNzkgIDY3IDY3IDY3ICAyIDIgNgorMiAyIDYgIDk3IDY3IDggIDIyOCAxNzAgMTEgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NSAxODggMTQgIDIzNCAxNzcgMTIgIDE4OSAxNDIgMzUgIDg2IDc3IDYxCisxNiAxNiAxNiAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMTMgMTMgMTMgIDEwMyA5MiA1NiAgMjA3IDE1MiAxOQorMjI4IDE3MCAxMSAgMjM0IDE3NyAxMiAgMjM5IDE4MiAxMyAgMjQyIDE4NiAxNCAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjM5IDE4MiAxMyAgMTg5IDEzOCA5ICA0MSAzMyAyMCAgMTAgMTAgMTIKKzMwIDMwIDMxICAyMyAyMyAyNCAgNSA1IDggIDIgMiA2ICAyIDIgNiAgMiAyIDYKKzQgNCA2ICAxMTIgODYgMzIgIDIxNSAxNjEgMTEgIDI0NSAxODggMTQgIDI0NiAxOTAgMTQgIDI0NSAxODggMTQKKzIzOSAxODIgMTMgIDIyOCAxNzAgMTEgIDE4OSAxNDIgMzUgIDEwNCA5NiA4MSAgNDggNDggNDkgIDE3IDE3IDE3CisyIDIgMiAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNSA1IDUgIDM5IDM5IDM5ICAxMDMgOTIgNTYKKzE0MSAxMDkgNDQgIDE3NSAxMjIgMTMgIDE4NyAxMzYgMTIgIDE4OSAxMzggOSAgMjA3IDE1MiAxOSAgMjI4IDE3MCAxMQorMjM5IDE4MiAxMyAgMjM5IDE4MiAxMyAgMjE1IDE2MSAxMSAgMTc1IDEyMiAxMyAgNDEgMzMgMjAgIDIgMiA2CisxNSAxNSAxNyAgMjAgMjAgMjIgIDIwIDIwIDIyICAyMCAyMCAyMiAgMjAgMjAgMjIgIDggOCAxMAorNCA0IDYgIDk3IDY3IDggIDE4OSAxMzggOSAgMjMxIDE3NCAxMSAgMjM5IDE4MiAxMyAgMjI2IDE2OCAxMQorMTg5IDEzOCA5ICAxMjYgMTA3IDY0ICA1OSA1OSA1OSAgMjEgMjEgMjEgIDUgNSA1ICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNSAgMTcgMTcgMTcKKzM0IDM0IDM0ICA1NyA1NyA1NyAgODQgNzggNjUgIDEwMyA5MiA1NiAgMTI1IDEwMSA0MSAgMTQwIDExMiAzOQorMTc1IDEyMiAxMyAgMTc1IDEyMiAxMyAgMTc1IDEyMiAxMyAgOTcgNjcgOCAgNzIgNjcgNTggIDg0IDc4IDY1Cis2MCA2MCA2MCAgNTYgNTYgNTYgIDU2IDU2IDU2ICA1NiA1NiA1NiAgNTcgNTcgNTcgIDY1IDY1IDY1Cis4NiA4NiA4NiAgOTUgNzMgMzQgIDE3NSAxMjIgMTMgIDE4NyAxMzYgMTIgIDE4NyAxMzYgMTIgIDE3NSAxMjIgMTMKKzEwMyA5MiA1NiAgNDEgNDEgNDEgIDEwIDEwIDEwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMiAyIDIgIDQgNCA0ICAxMiAxMiAxMiAgMjQgMjQgMjQgIDQwIDQwIDQwICA3MCA3MCA3MAorODYgNzcgNjEgIDk1IDczIDM0ICA4OCA3MiA0MSAgNzIgNjcgNTggIDM2IDM2IDM2ICAxMCAxMCAxMAorNSA1IDUgIDUgNSA1ICA1IDUgNSAgNCA0IDQgIDUgNSA1ICA2IDYgNgorMjIgMjIgMjIgIDYxIDYxIDU5ICA4OCA3MiA0MSAgMTEyIDg2IDMyICAxMTIgODYgMzIgIDg0IDc4IDY1CiszMiAzMiAzMiAgNiA2IDYgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDMgMyAzICAxMCAxMCAxMAorMjEgMjEgMjEgIDMzIDMzIDMzICAzMSAzMSAzMSAgMTYgMTYgMTYgIDIgMiAyICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMiAyIDIgIDEyIDEyIDEyICAzMCAzMCAzMSAgNDAgNDAgNDAgIDMyIDMyIDMyICAxNiAxNiAxNgorMiAyIDIgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWFjZmIuYyBiL2RyaXZlcnMvdmlkZW8vbWFjZmIuYwppbmRleCBmN2Q2NDdkLi5hYThjNzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9tYWNmYi5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyBmYl9pbmZvOwotc3RhdGljIHUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CitzdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIHN0YXRpYyBpbnQgaW52ZXJzZSAgID0gMDsKIHN0YXRpYyBpbnQgdmlkdGVzdCAgID0gMDsKIApAQCAtNTI5LDU2ICs1MjksNjMgQEAKIAlpZiAocmVnbm8gPj0gZmJfaW5mby0+Y21hcC5sZW4pCiAJCXJldHVybiAxOwogCi0Jc3dpdGNoIChmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKLQljYXNlIDE6Ci0JCS8qIFdlIHNob3VsZG4ndCBnZXQgaGVyZSAqLwotCQlicmVhazsKLQljYXNlIDI6Ci0JY2FzZSA0OgotCWNhc2UgODoKLQkJaWYgKG1hY2ZiX3NldHBhbGV0dGUpCi0JCQltYWNmYl9zZXRwYWxldHRlKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCBmYl9pbmZvKTsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JCWJyZWFrOwotCWNhc2UgMTY6Ci0JCWlmIChmYl9pbmZvLT52YXIucmVkLm9mZnNldCA9PSAxMCkgewotCQkJLyogMTo1OjU6NSAqLwotCQkJKCh1MzIqKSAoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQorCWlmIChmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gOCkgeworCQlzd2l0Y2ggKGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDE6CisJCQkvKiBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJY2FzZSA4OgorCQkJaWYgKG1hY2ZiX3NldHBhbGV0dGUpCisJCQkJbWFjZmJfc2V0cGFsZXR0ZShyZWdubywgcmVkLCBncmVlbiwgYmx1ZSwKKwkJCQkJCSBmYl9pbmZvKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChyZWdubyA8IDE2KSB7CisJCXN3aXRjaCAoZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMTY6CisJCQlpZiAoZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQgPT0gMTApIHsKKwkJCQkvKiAxOjU6NTo1ICovCisJCQkJKCh1MzIqKSAoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQogCQkJCQkoKHJlZCAgICYgMHhmODAwKSA+PiAgMSkgfAogCQkJCQkoKGdyZWVuICYgMHhmODAwKSA+PiAgNikgfAogCQkJCQkoKGJsdWUgICYgMHhmODAwKSA+PiAxMSkgfAogCQkJCQkoKHRyYW5zcCAhPSAwKSA8PCAxNSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAwOjU6Njo1ICovCi0JCQkoKHUzMiopIChmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQl9IGVsc2UgeworCQkJCS8qIDA6NTo2OjUgKi8KKwkJCQkoKHUzMiopIChmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CiAJCQkJCSgocmVkICAgJiAweGY4MDApICAgICAgKSB8CiAJCQkJCSgoZ3JlZW4gJiAweGZjMDApID4+ICA1KSB8CiAJCQkJCSgoYmx1ZSAgJiAweGY4MDApID4+IDExKTsKKwkJCX0KKwkJCWJyZWFrOworCQkJLyogSSdtIHByZXR0eSBzdXJlIHRoYXQgb25lIG9yIHRoZSBvdGhlciBvZiB0aGVzZQorCQkJICAgZG9lc24ndCBleGlzdCBvbiA2OGsgTWFjcyAqLworCQljYXNlIDI0OgorCQkJcmVkICAgPj49IDg7CisJCQlncmVlbiA+Pj0gODsKKwkJCWJsdWUgID4+PSA4OworCQkJKCh1MzIgKikoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQorCQkJCShyZWQgICA8PCBmYl9pbmZvLT52YXIucmVkLm9mZnNldCkgICB8CisJCQkJKGdyZWVuIDw8IGZiX2luZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKKwkJCQkoYmx1ZSAgPDwgZmJfaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJcmVkICAgPj49IDg7CisJCQlncmVlbiA+Pj0gODsKKwkJCWJsdWUgID4+PSA4OworCQkJKCh1MzIgKikoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQorCQkJCShyZWQgICA8PCBmYl9pbmZvLT52YXIucmVkLm9mZnNldCkgICB8CisJCQkJKGdyZWVuIDw8IGZiX2luZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKKwkJCQkoYmx1ZSAgPDwgZmJfaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJCWJyZWFrOwogCQl9Ci0JCWJyZWFrOwkKLQkJLyogSSdtIHByZXR0eSBzdXJlIHRoYXQgb25lIG9yIHRoZSBvdGhlciBvZiB0aGVzZQotCQkgICBkb2Vzbid0IGV4aXN0IG9uIDY4ayBNYWNzICovCi0JY2FzZSAyNDoKLQkJcmVkICAgPj49IDg7Ci0JCWdyZWVuID4+PSA4OwotCQlibHVlICA+Pj0gODsKLQkJKCh1MzIgKikoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQotCQkJKHJlZCAgIDw8IGZiX2luZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKLQkJCShncmVlbiA8PCBmYl9pbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8Ci0JCQkoYmx1ZSAgPDwgZmJfaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJcmVkICAgPj49IDg7Ci0JCWdyZWVuID4+PSA4OwotCQlibHVlICA+Pj0gODsKLQkJKCh1MzIgKikoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQotCQkJKHJlZCAgIDw8IGZiX2luZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKLQkJCShncmVlbiA8PCBmYl9pbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8Ci0JCQkoYmx1ZSAgPDwgZmJfaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKLQkJYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGZiX29wcyBtYWNmYl9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmMgYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmMKaW5kZXggYWIyMTQ5NS4uMDgzZjYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYwpAQCAtMzY5LDkgKzM2OSw4IEBACiAgKgogICovCiAKLWludCBfX2RldmluaXQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sCi0JCQkgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKQoraW50IG1hY19maW5kX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkgIGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLCB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApCiB7CiAgICAgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqZGIgPSBOVUxMOwogICAgIHVuc2lnbmVkIGludCBkYnNpemUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oCmluZGV4IGJhYmViODEuLmI4NmJhMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmgKQEAgLTU1LDEwICs1NSwxMCBAQAogZXh0ZXJuIGludCBtYWNfdmFyX3RvX3Ztb2RlKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgKnZtb2RlLAogCQkJICAgIGludCAqY21vZGUpOwogZXh0ZXJuIGludCBtYWNfbWFwX21vbml0b3Jfc2Vuc2UoaW50IHNlbnNlKTsKLWV4dGVybiBpbnQgX19kZXZpbml0IG1hY19maW5kX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCQkJICAgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sCi0JCQkJICAgdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKTsKK2V4dGVybiBpbnQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSBjb25zdCBjaGFyICptb2RlX29wdGlvbiwKKwkJCSB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApOwogCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2FjY2VsLmMKaW5kZXggYzU3YWFhZC4uMzY2MGQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9hY2NlbC5jCkBAIC05MSw3ICs5MSw2IEBACiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJcGFsW2ldID0gaSAqIDB4MTExMTExMTFVOwogCX0KLQlwYWxbaV0gPSAweEZGRkZGRkZGOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cm94X2NmYjhfcGFsKHVfaW50MzJfdCogcGFsKSB7CkBAIC0xMDAsNyArOTksNiBAQAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXBhbFtpXSA9IGkgKiAweDAxMDEwMTAxVTsKIAl9Ci0JcGFsW2ldID0gMHgwRjBGMEYwRjsKIH0KIAogc3RhdGljIHZvaWQgbWF0cm94ZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8qIGluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSogYXJlYSk7CkBAIC0xNDUsMTMgKzE0MywxMCBAQAogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9pbWFnZWJsaXQgPSBtYXRyb3hmYl9pbWFnZWJsaXQ7CiAJCQkJfQogCQkJCWJyZWFrOwotCQljYXNlIDE2OglpZiAoQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmdyZWVuLmxlbmd0aCA9PSA1KSB7CisJCWNhc2UgMTY6CWlmIChBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ubGVuZ3RoID09IDUpCiAJCQkJCW1hY2Nlc3MgPSAweEMwMDAwMDAxOwotCQkJCQlBQ0NFU1NfRkJJTkZPKGNtYXBbMTZdKSA9IDB4N0ZGRjdGRkY7Ci0JCQkJfSBlbHNlIHsKKwkJCQllbHNlCiAJCQkJCW1hY2Nlc3MgPSAweDQwMDAwMDAxOwotCQkJCQlBQ0NFU1NfRkJJTkZPKGNtYXBbMTZdKSA9IDB4RkZGRkZGRkY7Ci0JCQkJfQogCQkJCW1vcG1vZGUgPSBNX09QTU9ERV8xNkJQUDsKIAkJCQlpZiAoYWNjZWwpIHsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfY29weWFyZWEgPSBtYXRyb3hmYl9jb3B5YXJlYTsKQEAgLTE2MSw3ICsxNTYsNiBAQAogCQkJCWJyZWFrOwogCQljYXNlIDI0OgltYWNjZXNzID0gMHgwMDAwMDAwMzsKIAkJCQltb3Btb2RlID0gTV9PUE1PREVfMjRCUFA7Ci0JCQkJQUNDRVNTX0ZCSU5GTyhjbWFwWzE2XSkgPSAweEZGRkZGRkZGOwogCQkJCWlmIChhY2NlbCkgewogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9jb3B5YXJlYSA9IG1hdHJveGZiX2NvcHlhcmVhOwogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9maWxscmVjdCA9IG1hdHJveGZiX2ZpbGxyZWN0OwpAQCAtMTcwLDcgKzE2NCw2IEBACiAJCQkJYnJlYWs7CiAJCWNhc2UgMzI6CW1hY2Nlc3MgPSAweDAwMDAwMDAyOwogCQkJCW1vcG1vZGUgPSBNX09QTU9ERV8zMkJQUDsKLQkJCQlBQ0NFU1NfRkJJTkZPKGNtYXBbMTZdKSA9IDB4RkZGRkZGRkY7CiAJCQkJaWYgKGFjY2VsKSB7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2NvcHlhcmVhID0gbWF0cm94ZmJfY29weWFyZWE7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2ZpbGxyZWN0ID0gbWF0cm94ZmJfZmlsbHJlY3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKaW5kZXggODg2ZTQ3NS4uODZjYTdiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwpAQCAtNjc5LDYgKzY3OSw4IEBACiAJCW1nYV9vdXRiKE1fREFDX1ZBTCwgYmx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgMTY6CisJCWlmIChyZWdubyA+PSAxNikKKwkJCWJyZWFrOwogCQl7CiAJCQl1X2ludDE2X3QgY29sID0KIAkJCQkocmVkIDw8IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5yZWQub2Zmc2V0KSAgICAgfApAQCAtNjkwLDYgKzY5Miw4IEBACiAJCWJyZWFrOwogCWNhc2UgMjQ6CiAJY2FzZSAzMjoKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJYnJlYWs7CiAJCUFDQ0VTU19GQklORk8oY21hcFtyZWdub10pID0KIAkJCShyZWQgICA8PCBBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIucmVkLm9mZnNldCkgICB8CiAJCQkoZ3JlZW4gPDwgQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmdyZWVuLm9mZnNldCkgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oCmluZGV4IDljMjVjMmYuLmQ1OTU3N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuaAorKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmgKQEAgLTUxOCw3ICs1MTgsNyBAQAogCQkJCQlkbGw6MTsKIAkJCQkgICAgICB9IG1lbW9yeTsKIAkJCSAgICAgIH0gdmFsdWVzOwotCXVfaW50MzJfdCBjbWFwWzE3XTsKKwl1X2ludDMyX3QgY21hcFsxNl07CiB9OwogCiAjZGVmaW5lIGluZm8ybWluZm8oaW5mbykgY29udGFpbmVyX29mKGluZm8sIHN0cnVjdCBtYXRyb3hfZmJfaW5mbywgZmJjb24pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYwppbmRleCAwM2FlNTViLi40YjMzNDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKQEAgLTE2MywxMSArMTYzLDYgQEAKIAlBQ0NFU1NfRkJJTkZPKGh3KS5jcnRjMi5jdGwgPSAweDAwMDAwMDA0OwogfQogCi1zdGF0aWMgdm9pZCBtYXRyb3hmYl9kaF9jZmJYX2luaXQoc3RydWN0IG1hdHJveGZiX2RoX2ZiX2luZm8qIG0yaW5mbykgewotCS8qIG5vIGFjY2VsZXJhdGlvbiBmb3Igc2Vjb25kYXJ5IGhlYWQuLi4gKi8KLQltMmluZm8tPmNtYXBbMTZdID0gMHhGRkZGRkZGRjsKLX0KLQogc3RhdGljIHZvaWQgbWF0cm94ZmJfZGhfcGFuX3ZhcihzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5mbyogbTJpbmZvLAogCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qIHZhcikgewogCXVuc2lnbmVkIGludCBwb3M7CkBAIC0zODUsNyArMzgwLDYgQEAKIAkJCX0KIAkJfQogCQl1cF9yZWFkKCZBQ0NFU1NfRkJJTkZPKGFsdG91dCkubG9jayk7Ci0JCW1hdHJveGZiX2RoX2NmYlhfaW5pdChtMmluZm8pOwogCX0KIAltMmluZm8tPmluaXRpYWxpemVkID0gMTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmggYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5oCmluZGV4IDE3NzE3NzYuLjEwMDU1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmgKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuaApAQCAtMjgsNyArMjgsNyBAQAogCiAJdW5zaWduZWQgaW50CQlpbnRlcmxhY2VkOjE7CiAKLQl1X2ludDMyX3QgY21hcFsxN107CisJdV9pbnQzMl90IGNtYXBbMTZdOwogfTsKIAogI2VuZGlmIC8qIF9fTUFUUk9YRkJfQ1JUQzJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwppbmRleCBhZmYxMWJiLi5kMWExMDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKQEAgLTE1MCw4ICsxNTAsNyBAQAogCQlNID0gcGxsICYgMHhGRjsKIAkJTiA9IChwbGwgPj4gOCkgJiAweEZGOwogCQlpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkgfHwKLQkJCSgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzOTApIHx8Ci0JCQkoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMkUwKSkgeworCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkpIHsKIAkJCU1CID0gMTsKIAkJCU5CID0gMTsKIAkJfSBlbHNlIHsKQEAgLTE2MSw3ICsxNjAsNyBAQAogCQkqTUNsayA9ICgoTiAqIE5CICogcGFyLT5DcnlzdGFsRnJlcUtIeikgLyAoTSAqIE1CKSkgPj4gUDsKIAogCQlwbGwgPSBOVl9SRDMyKHBhci0+UE1DLCAweDQwMDApOwotCQlQID0gKHBsbCA+PiAxNikgJiAweDAzOworCQlQID0gKHBsbCA+PiAxNikgJiAweDA3OwogCQlwbGwgPSBOVl9SRDMyKHBhci0+UE1DLCAweDQwMDQpOwogCQlNID0gcGxsICYgMHhGRjsKIAkJTiA9IChwbGwgPj4gOCkgJiAweEZGOwpAQCAtODkyLDExICs4OTEsMTcgQEAKIAkJc3RhdGUtPmdlbmVyYWwgPSBicHAgPT0gMTYgPyAweDAwMTAxMTAwIDogMHgwMDEwMDEwMDsKIAkJc3RhdGUtPnJlcGFpbnQxID0gaERpc3BsYXlTaXplIDwgMTI4MCA/IDB4MDQgOiAweDAwOwogCQlicmVhazsKKwljYXNlIE5WX0FSQ0hfNDA6CisJCWlmICghcGFyLT5GbGF0UGFuZWwpCisJCQlzdGF0ZS0+Y29udHJvbCA9IE5WX1JEMzIocGFyLT5QUkFNREFDMCwgMHgwNTgwKSAmCisJCQkJMHhlZmZmZmVmZjsKKwkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIE5WX0FSQ0hfMTA6CiAJY2FzZSBOVl9BUkNIXzIwOgogCWNhc2UgTlZfQVJDSF8zMDoKIAlkZWZhdWx0OgotCQlpZiAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjQwKSB7CisJCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyNDAgfHwKKwkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDNkMCkgewogCQkJc3RhdGUtPmFyYml0cmF0aW9uMCA9IDI1NjsKIAkJCXN0YXRlLT5hcmJpdHJhdGlvbjEgPSAweDA0ODA7CiAJCX0gZWxzZSBpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZmYpID09IDB4MDFBMCkgfHwKQEAgLTkzOSw3ICs5NDQsNyBAQAogCiB2b2lkIE5WTG9hZFN0YXRlRXh0KHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIFJJVkFfSFdfU1RBVEUgKiBzdGF0ZSkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAogCU5WX1dSMzIocGFyLT5QTUMsIDB4MDE0MCwgMHgwMDAwMDAwMCk7CiAJTlZfV1IzMihwYXItPlBNQywgMHgwMjAwLCAweEZGRkYwMEZGKTsKQEAgLTk1MSw3ICs5NTYsOCBAQAogCU5WX1dSMzIocGFyLT5QVElNRVIsIDB4MDEwMCAqIDQsIDB4RkZGRkZGRkYpOwogCiAJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID09IE5WX0FSQ0hfMDQpIHsKLQkJTlZfV1IzMihwYXItPlBGQiwgMHgwMjAwLCBzdGF0ZS0+Y29uZmlnKTsKKwkJaWYgKHN0YXRlKQorCQkJTlZfV1IzMihwYXItPlBGQiwgMHgwMjAwLCBzdGF0ZS0+Y29uZmlnKTsKIAl9IGVsc2UgaWYgKChwYXItPkFyY2hpdGVjdHVyZSA8IE5WX0FSQ0hfNDApIHx8CiAJCSAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA0MCkgewogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CkBAIC05NjQsOCArOTcwLDkgQEAKIAogCQlpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA5MCkgfHwKIAkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAxRDApIHx8Ci0JCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMkUwKSB8fAotCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkpCisJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB8fAorCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgfHwKKwkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzRDApKQogCQkJcmVnaW9ucyA9IDE1OwogCQlmb3IoaSA9IDA7IGkgPCByZWdpb25zOyBpKyspIHsKIAkJCU5WX1dSMzIocGFyLT5QRkIsIDB4MDYwMCArIChpICogMHgxMCksIDApOwpAQCAtMTIwNiwxNiArMTIxMywyMCBAQAogCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwNjA4LCAweEZGRkZGRkZGKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzQwKSB7Ci0JCQkJdTMyIHRtcDsKLQogCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDA4NCwgMHg0MDEyODdjMCk7CiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwMDhDLCAweDYwZGU4MDUxKTsKIAkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDAwOTAsIDB4MDAwMDgwMDApOwogCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDYxMCwgMHgwMGJlM2M1Zik7CisJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwYmM0LAorCQkJCQlOVl9SRDMyKHBhci0+UEdSQVBILCAweDBiYzQpIHwKKwkJCQkJMHgwMDAwODAwMCk7CiAKLQkJCQl0bXAgPSBOVl9SRDMyKHBhci0+UkVHUywgMHgxNTQwKSAmIDB4ZmY7Ci0JCQkJZm9yKGkgPSAwOyB0bXAgJiYgISh0bXAgJiAxKTsgdG1wID4+PSAxLCBpKyspOwotCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4NTAwMCwgaSk7CisJCQkJaiA9IE5WX1JEMzIocGFyLT5SRUdTLCAweDE1NDApICYgMHhmZjsKKworCQkJCWlmIChqKSB7CisJCQkJCWZvciAoaSA9IDA7ICEoaiAmIDEpOyBqID4+PSAxLCBpKyspOworCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDUwMDAsIGkpOworCQkJCX0KIAogCQkJCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwNDApIHsKIAkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwOWIwLApAQCAtMTI1MCw2ICsxMjYxLDcgQEAKIAkJCQljYXNlIDB4MDE2MDoKIAkJCQljYXNlIDB4MDFEMDoKIAkJCQljYXNlIDB4MDI0MDoKKwkJCQljYXNlIDB4MDNEMDoKIAkJCQkJTlZfV1IzMihwYXItPlBNQywgMHgxNzAwLAogCQkJCQkJTlZfUkQzMihwYXItPlBGQiwgMHgwMjBDKSk7CiAJCQkJCU5WX1dSMzIocGFyLT5QTUMsIDB4MTcwNCwgMCk7CkBAIC0xMjY5LDcgKzEyODEsNiBAQAogCQkJCQkJMHgwMDAwMDEwOCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMHgwMjIwOgotCQkJCWNhc2UgMHgwMjMwOgogCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA4NjAsIDApOwogCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA4NjQsIDApOwogCQkJCQlOVl9XUjMyKHBhci0+UFJBTURBQywgMHgwNjA4LApAQCAtMTI3Nyw4ICsxMjg4LDggQEAKIAkJCQkJCTB4MDAxMDAwMDApOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDB4MDA5MDoKLQkJCQljYXNlIDB4MDJFMDoKIAkJCQljYXNlIDB4MDI5MDoKKwkJCQljYXNlIDB4MDM5MDoKIAkJCQkJTlZfV1IzMihwYXItPlBSQU1EQUMsIDB4MDYwOCwKIAkJCQkJCU5WX1JEMzIocGFyLT5QUkFNREFDLCAweDA2MDgpIHwKIAkJCQkJCTB4MDAxMDAwMDApOwpAQCAtMTM1NSw4ICsxMzY2LDkgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwOTApIHx8CiAJCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAxRDApIHx8Ci0JCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyRTApIHx8Ci0JCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApKSB7CisJCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHx8CisJCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzOTApIHx8CisJCQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzRDApKSB7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCA2MDsgaSsrKSB7CiAJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILAogCQkJCQkJCTB4MEQwMCArIGkqNCwKQEAgLTE0MDcsOCArMTQxOSw4IEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA5MCB8fAogCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMUQwIHx8Ci0JCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyRTAgfHwKLQkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkgeworCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwIHx8CisJCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzOTApIHsKIAkJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MERGMCwKIAkJCQkJCQlOVl9SRDMyKHBhci0+UEZCLCAweDAyMDApKTsKIAkJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MERGNCwKQEAgLTE0OTUsNiArMTUwNywxMiBAQAogCU5WX1dSMzIocGFyLT5QRklGTywgMHgwNDk0ICogNCwgMHgwMDAwMDAwMSk7CiAJTlZfV1IzMihwYXItPlBGSUZPLCAweDA0OTUgKiA0LCAweDAwMDAwMDAxKTsKIAlOVl9XUjMyKHBhci0+UEZJRk8sIDB4MDE0MCAqIDQsIDB4MDAwMDAwMDEpOworCisgICAgaWYgKCFzdGF0ZSkgeworCSAgICBwYXItPkN1cnJlbnRTdGF0ZSA9IE5VTEw7CisJICAgIHJldHVybjsKKyAgICB9CisKIAlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF8xMCkgewogCQlpZiAocGFyLT50d29IZWFkcykgewogCQkJTlZfV1IzMihwYXItPlBDUlRDMCwgMHgwODYwLCBzdGF0ZS0+aGVhZCk7CkBAIC0xNTY2LDYgKzE1ODQsOSBAQAogCVZHQV9XUjA4KHBhci0+UENJTywgMHgwM0Q1LCBzdGF0ZS0+aW50ZXJsYWNlKTsKIAogCWlmICghcGFyLT5GbGF0UGFuZWwpIHsKKwkJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDApCisJCQlOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDU4MCwgc3RhdGUtPmNvbnRyb2wpOworCiAJCU5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNTBDLCBzdGF0ZS0+cGxsc2VsKTsKIAkJTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA1MDgsIHN0YXRlLT52cGxsKTsKIAkJaWYgKHBhci0+dHdvSGVhZHMpCkBAIC0xNjMxLDYgKzE2NTIsOSBAQAogCXN0YXRlLT5zY2FsZSA9IE5WX1JEMzIocGFyLT5QUkFNREFDLCAweDA4NDgpOwogCXN0YXRlLT5jb25maWcgPSBOVl9SRDMyKHBhci0+UEZCLCAweDAyMDApOwogCisJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDAgJiYgIXBhci0+RmxhdFBhbmVsKQorCQlzdGF0ZS0+Y29udHJvbCAgPSBOVl9SRDMyKHBhci0+UFJBTURBQzAsIDB4MDU4MCk7CisKIAlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF8xMCkgewogCQlpZiAocGFyLT50d29IZWFkcykgewogCQkJc3RhdGUtPmhlYWQgPSBOVl9SRDMyKHBhci0+UENSVEMwLCAweDA4NjApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKaW5kZXggNzA3ZTJjOC4uODI1NzlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCkBAIC0xNjYsMTEgKzE2NiwxMyBAQAogc3RhdGljIGludCBOVklzQ29ubmVjdGVkKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIGludCBvdXRwdXQpCiB7CiAJdm9sYXRpbGUgdTMyIF9faW9tZW0gKlBSQU1EQUMgPSBwYXItPlBSQU1EQUMwOwotCXUzMiByZWc1MkMsIHJlZzYwODsKKwl1MzIgcmVnNTJDLCByZWc2MDgsIGRhYzBfcmVnNjA4ID0gMDsKIAlpbnQgcHJlc2VudDsKIAotCWlmIChvdXRwdXQpCi0JCVBSQU1EQUMgKz0gMHg4MDA7CisJaWYgKG91dHB1dCkgeworCSAgICBkYWMwX3JlZzYwOCA9IE5WX1JEMzIoUFJBTURBQywgMHgwNjA4KTsKKwkgICAgUFJBTURBQyArPSAweDgwMDsKKwl9CiAKIAlyZWc1MkMgPSBOVl9SRDMyKFBSQU1EQUMsIDB4MDUyQyk7CiAJcmVnNjA4ID0gTlZfUkQzMihQUkFNREFDLCAweDA2MDgpOwpAQCAtMTk0LDggKzE5Niw4IEBACiAJZWxzZQogCQlwcmludGsoIm52aWRpYWZiOiBDUlRDJWkgYW5hbG9nIG5vdCBmb3VuZFxuIiwgb3V0cHV0KTsKIAotCU5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNjA4LCBOVl9SRDMyKHBhci0+UFJBTURBQzAsIDB4MDYwOCkgJgotCQkweDAwMDBFRkZGKTsKKwlpZiAob3V0cHV0KQorCSAgICBOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDYwOCwgZGFjMF9yZWc2MDgpOwogCiAJTlZfV1IzMihQUkFNREFDLCAweDA1MkMsIHJlZzUyQyk7CiAJTlZfV1IzMihQUkFNREFDLCAweDA2MDgsIHJlZzYwOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKaW5kZXggMzhmN2NjMC4uMmZkZjc3ZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oCkBAIC04Niw2ICs4Niw3IEBACiAJdTMyIHRpbWluZ1Y7CiAJdTMyIGRpc3BsYXlWOwogCXUzMiBjcnRjU3luYzsKKwl1MzIgY29udHJvbDsKIH0gUklWQV9IV19TVEFURTsKIAogc3RydWN0IHJpdmFfcmVncyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCmluZGV4IDQxZjYzNjUuLmE3ZmUyMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jCkBAIC02NzQsNiArNjc0LDcgQEAKIAkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBudmlkaWFmYl9zeW5jOwogCQlpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDQ7CiAJCWluZm8tPmZsYWdzICY9IH5GQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX1JFQURTX0ZBU1Q7CiAJCU5WUmVzZXRHcmFwaGljcyhpbmZvKTsKIAl9IGVsc2UgewogCQlpbmZvLT5mYm9wcy0+ZmJfaW1hZ2VibGl0ID0gY2ZiX2ltYWdlYmxpdDsKQEAgLTY4Miw2ICs2ODMsNyBAQAogCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IE5VTEw7CiAJCWluZm8tPnBpeG1hcC5zY2FuX2FsaWduID0gMTsKIAkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJCWluZm8tPmZsYWdzICY9IH5GQklORk9fUkVBRFNfRkFTVDsKIAl9CiAKIAlwYXItPmN1cnNvcl9yZXNldCA9IDE7CkBAIC0xMTkzLDcgKzExOTUsOCBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRldmljZSBJRDogJXggXG4iLCBpZCk7CiAKLQlpZiAoKGlkICYgMHhmZmYwKSA9PSAweDAwZjApIHsKKwlpZiAoKGlkICYgMHhmZmYwKSA9PSAweDAwZjAgfHwKKwkgICAgKGlkICYgMHhmZmYwKSA9PSAweDAyZTApIHsKIAkJLyogcGNpLWUgKi8KIAkJaWQgPSBOVl9SRDMyKHBhci0+UkVHUywgMHgxODAwKTsKIApAQCAtMTIzOCwxOCArMTI0MSwxNiBAQAogCWNhc2UgMHgwMDQwOgkJLyogR2VGb3JjZSA2ODAwICovCiAJY2FzZSAweDAwQzA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KIAljYXNlIDB4MDEyMDoJCS8qIEdlRm9yY2UgNjgwMCAqLwotCWNhc2UgMHgwMTMwOgogCWNhc2UgMHgwMTQwOgkJLyogR2VGb3JjZSA2NjAwICovCiAJY2FzZSAweDAxNjA6CQkvKiBHZUZvcmNlIDYyMDAgKi8KIAljYXNlIDB4MDFEMDoJCS8qIEdlRm9yY2UgNzIwMCwgNzMwMCwgNzQwMCAqLwotCWNhc2UgMHgwMkUwOgkJLyogR2VGb3JjZSA3MzAwIEdUICovCiAJY2FzZSAweDAwOTA6CQkvKiBHZUZvcmNlIDc4MDAgKi8KIAljYXNlIDB4MDIxMDoJCS8qIEdlRm9yY2UgNjgwMCAqLwogCWNhc2UgMHgwMjIwOgkJLyogR2VGb3JjZSA2MjAwICovCi0JY2FzZSAweDAyMzA6CiAJY2FzZSAweDAyNDA6CQkvKiBHZUZvcmNlIDYxMDAgKi8KIAljYXNlIDB4MDI5MDoJCS8qIEdlRm9yY2UgNzkwMCAqLwogCWNhc2UgMHgwMzkwOgkJLyogR2VGb3JjZSA3NjAwICovCisJY2FzZSAweDAzRDA6CiAJCWFyY2ggPSBOVl9BUkNIXzQwOwogCQlicmVhazsKIAljYXNlIDB4MDAyMDoJCS8qIFROVCwgVE5UMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vZmZiLmMgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwppbmRleCA4ODViNDI4Li40NTI0MzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29mZmIuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSArIHNpemVvZih1MzIpICogMTc7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmJfaW5mbykgKyBzaXplb2YodTMyKSAqIDE2OwogCiAJaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNGQyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZwpAQCAtMCwwICsxLDU4IEBACitjb25maWcgRkJfT01BUAorCXRyaXN0YXRlICJPTUFQIGZyYW1lIGJ1ZmZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRkIKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJaGVscAorICAgICAgICAgIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIE9NQVAgYmFzZWQgYm9hcmRzLgorCitjb25maWcgRkJfT01BUF9CT09UTE9BREVSX0lOSVQKKwlib29sICJDaGVjayBib290bG9hZGVyIGluaXRpYWxpemFpb24iCisJZGVwZW5kcyBvbiBGQl9PTUFQCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgY2hlY2tpbmcgaWYgdGhlIGJvb3Rsb2FkZXIgaGFzCisJICBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIuIEluIHRoaXMgY2FzZSB0aGUKKwkgIGRyaXZlciB3aWxsIHNraXAgdGhlIGluaXRpYWxpemF0aW9uLgorCitjb25maWcgRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFCisJaW50ICJDb25zaXN0ZW50IERNQSBtZW1vcnkgc2l6ZSAoTUIpIgorCWRlcGVuZHMgb24gRkJfT01BUAorCXJhbmdlIDEgMTQKKwlkZWZhdWx0IDIKKwloZWxwCisJICBJbmNyZWFzZSB0aGUgRE1BIGNvbnNpc3RlbnQgbWVtb3J5IHNpemUgYWNjb3JkaW5nIHRvIHlvdXIgdmlkZW8KKwkgIG1lbW9yeSBuZWVkcywgZm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gdXNlIG11bHRpcGxlIHBsYW5lcy4KKwkgIFRoZSBzaXplIG11c3QgYmUgMk1CIGFsaWduZWQuCisJICBJZiB1bnN1cmUgc2F5IDEuCisKK2NvbmZpZyBGQl9PTUFQX0RNQV9UVU5FCisgICAgICAgIGJvb2wgIlNldCBETUEgU0RSQU0gYWNjZXNzIHByaW9yaXR5IGhpZ2giCisgICAgICAgIGRlcGVuZHMgb24gRkJfT01BUCAmJiBBUkNIX09NQVAxCisgICAgICAgIGhlbHAKKyAgICAgICAgICBPbiBzeXN0ZW1zIGluIHdoaWNoIHZpZGVvIG1lbW9yeSBpcyBpbiBzeXN0ZW0gbWVtb3J5CisgICAgICAgICAgKFNEUkFNKSB0aGlzIHdpbGwgc3BlZWQgdXAgZ3JhcGhpY3MgRE1BIG9wZXJhdGlvbnMuCisgICAgICAgICAgSWYgeW91IGhhdmUgc3VjaCBhIHN5c3RlbSBhbmQgd2FudCB0byB1c2Ugcm90YXRpb24KKyAgICAgICAgICBhbnN3ZXIgeWVzLiBBbnN3ZXIgbm8gaWYgeW91IGhhdmUgYSBkZWRpY2F0ZWQgdmlkZW8KKyAgICAgICAgICBtZW1vcnksIG9yIGRvbid0IHVzZSBhbnkgb2YgdGhlIGFjY2VsZXJhdGVkIGZlYXR1cmVzLgorCitjb25maWcgRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJYm9vbCAiRXh0ZXJuYWwgTENEIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCX09NQVAKKwloZWxwCisJICBTYXkgWSBoZXJlLCBpZiB5b3Ugd2FudCB0byBoYXZlIHN1cHBvcnQgZm9yIGJvYXJkcyB3aXRoIGFuCisJICBleHRlcm5hbCBMQ0QgY29udHJvbGxlciBjb25uZWN0ZWQgdG8gdGhlIFNvU1NJL1JGQkkgaW50ZXJmYWNlLgorCitjb25maWcgRkJfT01BUF9MQ0RDX0hXQTc0MgorCWJvb2wgIkVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkJfT01BUCAmJiBGQl9PTUFQX0xDRENfRVhURVJOQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgdGhlIGV4dGVybmFsCisJICBFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIuCisKK2NvbmZpZyBGQl9PTUFQX0xDRENfQkxJWlpBUkQKKwlib29sICJFcHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkJfT01BUCAmJiBGQl9PTUFQX0xDRENfRVhURVJOQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgdGhlIGV4dGVybmFsCisJICBFcHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRhOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBuZXcgT01BUCBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19GQl9PTUFQKSArPSBvbWFwZmIubworCitvYmpzLXl5IDo9IG9tYXBmYl9tYWluLm8KKworb2Jqcy15JChDT05GSUdfQVJDSF9PTUFQMSkgKz0gbGNkYy5vCitvYmpzLXkkKENPTkZJR19BUkNIX09NQVAyKSArPSBkaXNwYy5vCisKK29ianMtJChDT05GSUdfQVJDSF9PTUFQMSkkKENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwpICs9IHNvc3NpLm8KK29ianMtJChDT05GSUdfQVJDSF9PTUFQMikkKENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwpICs9IHJmYmkubworCitvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfSFdBNzQyKSArPSBod2E3NDIubworb2Jqcy15JChDT05GSUdfRkJfT01BUF9MQ0RDX0JMSVpaQVJEKSArPSBibGl6emFyZC5vCisKK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9INCkgKz0gbGNkX2g0Lm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9IMykgKz0gbGNkX2gzLm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9QQUxNVEUpICs9IGxjZF9wYWxtdGUubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1UVCkgKz0gbGNkX3BhbG10dC5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVo3MSkgKz0gbGNkX3BhbG16NzEubworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAxNlhYKSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGxjZF9pbm4xNjEwLm8KK29ianMtJChDT05GSUdfQVJDSF9PTUFQMTVYWCkkKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBsY2RfaW5uMTUxMC5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfT1NLKSArPSBsY2Rfb3NrLm8KK29ianMteSQoQ09ORklHX01BQ0hfU1gxKSArPSBsY2Rfc3gxLm8KKworb21hcGZiLW9ianMgOj0gJChvYmpzLXl5KQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODI5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYwpAQCAtMCwwICsxLDE1NjggQEAKKy8qCisgKiBFcHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogICAgIEp1aGEgWXJqb2xhICAgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgICAgICAgSW1yZSBEZWFrICAgICA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIFlVViBzdXBwb3J0OiBKdXNzaSBMYWFrbyAgIDxqdXNzaS5sYWFrb0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JsaXp6YXJkLmg+CisKKyNpbmNsdWRlICJkaXNwYy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJCSJibGl6emFyZCIKKworI2RlZmluZSBCTElaWkFSRF9SRVZfQ09ERQkJCTB4MDAKKyNkZWZpbmUgQkxJWlpBUkRfQ09ORklHCQkJCTB4MDIKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0RJVgkJCTB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0xPQ0tfUkFOR0UJCQkweDA2CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8wCQkweDA4CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xCQkweDBhCisjZGVmaW5lIEJMSVpaQVJEX1BMTF9NT0RFCQkJMHgwYworI2RlZmluZSBCTElaWkFSRF9DTEtfU1JDCQkJMHgwZQorI2RlZmluZSBCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUJCTB4MTAKKyNkZWZpbmUgQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUwkJMHgxNAorI2RlZmluZSBCTElaWkFSRF9IRElTUAkJCQkweDJhCisjZGVmaW5lIEJMSVpaQVJEX0hORFAJCQkJMHgyYworI2RlZmluZSBCTElaWkFSRF9WRElTUDAJCQkJMHgyZQorI2RlZmluZSBCTElaWkFSRF9WRElTUDEJCQkJMHgzMAorI2RlZmluZSBCTElaWkFSRF9WTkRQCQkJCTB4MzIKKyNkZWZpbmUgQkxJWlpBUkRfSFNXCQkJCTB4MzQKKyNkZWZpbmUgQkxJWlpBUkRfVlNXCQkJCTB4MzgKKyNkZWZpbmUgQkxJWlpBUkRfRElTUExBWV9NT0RFCQkJMHg2OAorI2RlZmluZSBCTElaWkFSRF9JTlBVVF9XSU5fWF9TVEFSVF8wCQkweDZjCisjZGVmaW5lIEJMSVpaQVJEX0RBVEFfU09VUkNFX1NFTEVDVAkJMHg4ZQorI2RlZmluZSBCTElaWkFSRF9ESVNQX01FTV9EQVRBX1BPUlQJCTB4OTAKKyNkZWZpbmUgQkxJWlpBUkRfRElTUF9NRU1fUkVBRF9BRERSMAkJMHg5MgorI2RlZmluZSBCTElaWkFSRF9QT1dFUl9TQVZFCQkJMHhFNgorI2RlZmluZSBCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUwkJMHhFOAorCisvKiBEYXRhIHNvdXJjZSBzZWxlY3QgKi8KKy8qIEZvciBTMUQxMzc0NSAqLworI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0JBQ0tHUk9VTkQJMHgwMAorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0RFU1RSVUNUSVZFCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFCTB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWQkJMHgwNQorLyogRm9yIFMxRDEzNzQ0ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0QJCQkweDAwCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19CTFRfTENECQkJMHgwNgorCisjZGVmaW5lIEJMSVpaQVJEX0NPTE9SX1JHQjU2NQkJCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfWVVWNDIwCQkJMHgwOQorCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDUJCTB4MDEJLyogSGFpbHN0b3JtICovCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQJCTB4MDIJLyogQmxpenphcmQgKi8KKworI2RlZmluZSBCTElaWkFSRF9BVVRPX1VQREFURV9USU1FCQkoSFogLyAyMCkKKworLyogUmVzZXJ2ZSA0IHJlcXVlc3Qgc2xvdHMgZm9yIHJlcXVlc3RzIGluIGlycSBjb250ZXh0ICovCisjZGVmaW5lIFJFUV9QT09MX1NJWkUJCQkyNAorI2RlZmluZSBJUlFfUkVRX1BPT0xfU0laRQkJNAorCisjZGVmaW5lIFJFUV9GUk9NX0lSUV9QT09MIDB4MDEKKworI2RlZmluZSBSRVFfQ09NUExFVEUJMAorI2RlZmluZSBSRVFfUEVORElORwkxCisKK3N0cnVjdCBibGl6emFyZF9yZWdfbGlzdCB7CisJaW50CXN0YXJ0OworCWludAllbmQ7Cit9OworCisvKiBUaGVzZSBuZWVkIHRvIGJlIHNhdmVkIC8gcmVzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZSByZXN0LiAqLworc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9wbGxfcmVnc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwNCwJCS8qIERvbid0IHNhdmUgUExMIGN0cmwgKDB4MEMpICovCisJCS5lbmQJPSAweDBhLAorCX0sCisJeworCQkuc3RhcnQJPSAweDBlLAkJLyogQ2xvY2sgY29uZmlndXJhdGlvbiAqLworCQkuZW5kCT0gMHgwZSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9nZW5fcmVnc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgxOCwJCS8qIFNEUkFNIGNvbnRyb2wgKi8KKwkJLmVuZAk9IDB4MjAsCisJfSwKKwl7CisJCS5zdGFydAk9IDB4MjgsCQkvKiBMQ0QgUGFuZWwgY29uZmlndXJhdGlvbiAqLworCQkuZW5kCT0gMHg1YSwJCS8qIEhTU0kgaW50ZXJmYWNlLCBUViBjb25maWd1cmF0aW9uICovCisJfSwKK307CisKK3N0YXRpYyB1OCBibGl6emFyZF9yZWdfY2FjaGVbMHg1YSAvIDJdOworCitzdHJ1Y3QgdXBkYXRlX3BhcmFtIHsKKwlpbnQJcGxhbmU7CisJaW50CXgsIHksIHdpZHRoLCBoZWlnaHQ7CisJaW50CW91dF94LCBvdXRfeTsKKwlpbnQJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OworCWludAljb2xvcl9tb2RlOworCWludAlicHA7CisJaW50CWZsYWdzOworfTsKKworc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdW5zaWduZWQgaW50CSBmbGFnczsKKworCWludAkJICgqaGFuZGxlcikoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSk7CisJdm9pZAkJICgqY29tcGxldGUpKHZvaWQgKmRhdGEpOworCXZvaWQJCSAqY29tcGxldGVfZGF0YTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHVwZGF0ZV9wYXJhbQl1cGRhdGU7CisJCXN0cnVjdCBjb21wbGV0aW9uCSpzeW5jOworCX0gcGFyOworfTsKKworc3RydWN0IHBsYW5lX2luZm8geworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBwb3NfeCwgcG9zX3k7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IG91dF93aWR0aCwgb3V0X2hlaWdodDsKKwlpbnQgc2NyX3dpZHRoOworCWludCBjb2xvcl9tb2RlOworCWludCBicHA7Cit9OworCitzdHJ1Y3QgYmxpenphcmRfc3RydWN0IHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZDsKKworCXN0cnVjdCB0aW1lcl9saXN0CWF1dG9fdXBkYXRlX3RpbWVyOworCWludAkJCXN0b3BfYXV0b191cGRhdGU7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CWF1dG9fdXBkYXRlX3dpbmRvdzsKKwlpbnQJCQllbmFibGVkX3BsYW5lczsKKwlpbnQJCQl2aWRfbm9uc3RkX2NvbG9yOworCWludAkJCXZpZF9zY2FsZWQ7CisJaW50CQkJbGFzdF9jb2xvcl9tb2RlOworCWludAkJCXpvb21fb247CisJaW50CQkJc2NyZWVuX3dpZHRoOworCWludAkJCXNjcmVlbl9oZWlnaHQ7CisJdW5zaWduZWQJCXRlX2Nvbm5lY3RlZDoxOworCXVuc2lnbmVkCQl2c3luY19vbmx5OjE7CisKKwlzdHJ1Y3QgcGxhbmVfaW5mbwlwbGFuZVtPTUFQRkJfUExBTkVfTlVNXTsKKworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0CXJlcV9wb29sW1JFUV9QT09MX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZGluZ19yZXFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfcmVxX2xpc3Q7CisJc3RydWN0IHNlbWFwaG9yZQlyZXFfc2VtYTsKKwlzcGlubG9ja190CQlyZXFfbG9jazsKKworCXVuc2lnbmVkIGxvbmcJCXN5c19ja19yYXRlOworCXN0cnVjdCBleHRpZl90aW1pbmdzCXJlZ190aW1pbmdzLCBsdXRfdGltaW5nczsKKworCXUzMgkJCW1heF90cmFuc21pdF9zaXplOworCXUzMgkJCWV4dGlmX2Nsa19wZXJpb2Q7CisJaW50CQkJZXh0aWZfY2xrX2RpdjsKKwl1bnNpZ25lZCBsb25nCQlwaXhfdHhfdGltZTsKKwl1bnNpZ25lZCBsb25nCQlsaW5lX3VwZF90aW1lOworCisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCXN0cnVjdCBsY2RfY3RybF9leHRpZgkqZXh0aWY7CisJc3RydWN0IGxjZF9jdHJsCQkqaW50X2N0cmw7CisKKwl2b2lkCQkJKCpwb3dlcl91cCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkCQkJKCpwb3dlcl9kb3duKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisJaW50CQkJdmVyc2lvbjsKK30gYmxpenphcmQ7CisKK3N0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsOworCitzdGF0aWMgdTggYmxpenphcmRfcmVhZF9yZWcodTggcmVnKQoreworCXU4IGRhdGE7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWJsaXp6YXJkLmV4dGlmLT5yZWFkX2RhdGEoJmRhdGEsIDEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3dyaXRlX3JlZyh1OCByZWcsIHU4IHZhbCkKK3sKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9kYXRhKCZ2YWwsIDEpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0YXJ0X3NkcmFtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX0FDVElWQVRFLCAwKTsKKwl1ZGVsYXkoNTApOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUsIDEpOworCXRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMCk7CisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUykgJiAweDAxKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJCSJzMWQxMzc0eDogU0RSQU0gbm90IHJlYWR5Iik7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zdG9wX3NkcmFtKHZvaWQpCit7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSwgMCk7Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIGxhc3Qgd2luZG93IHdhcyBjb21wbGV0ZWx5IHdyaXR0ZW4gaW50byB0aGUgY29udHJvbGxlcnMKKyAqIFNEUkFNIGFuZCB3ZSBjYW4gc3RhcnQgdHJhbnNmZXJyaW5nIHRoZSBuZXh0IHdpbmRvdy4KKyAqLworc3RhdGljIHZvaWQgYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzApOworCisJd2hpbGUgKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKSAmICgxIDw8IDcpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCQkiczFkMTM3NHg6IGxpbmUgYnVmZmVyIG5vdCByZWFkeVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogV2FpdCB1bnRpbCB0aGUgWVlDIGNvbG9yIHNwYWNlIGNvbnZlcnRlciBpcyBpZGxlLiAqLworc3RhdGljIHZvaWQgYmxpenphcmRfd2FpdF95eWModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDMwKTsKKworCXdoaWxlIChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUykgJiAoMSA8PCA0KSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkJInMxZDEzNzR4OiBZWUMgbm90IHJlYWR5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX292ZXJsYXkodm9pZCkKK3sKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfREFUQV9TT1VSQ0VfU0VMRUNULAorCQkJCUJMSVpaQVJEX1NSQ19ESVNBQkxFX09WRVJMQVkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfd2luZG93X3JlZ3MoaW50IHhfc3RhcnQsIGludCB5X3N0YXJ0LCBpbnQgeF9lbmQsIGludCB5X2VuZCwKKwkJCSAgICBpbnQgeF9vdXRfc3RhcnQsIGludCB5X291dF9zdGFydCwKKwkJCSAgICBpbnQgeF9vdXRfZW5kLCBpbnQgeV9vdXRfZW5kLCBpbnQgY29sb3JfbW9kZSwKKwkJCSAgICBpbnQgem9vbV9vZmYsIGludCBmbGFncykKK3sKKwl1OCB0bXBbMThdOworCXU4IGNtZDsKKworCXhfZW5kLS07CisJeV9lbmQtLTsKKwl0bXBbMF0gPSB4X3N0YXJ0OworCXRtcFsxXSA9IHhfc3RhcnQgPj4gODsKKwl0bXBbMl0gPSB5X3N0YXJ0OworCXRtcFszXSA9IHlfc3RhcnQgPj4gODsKKwl0bXBbNF0gPSB4X2VuZDsKKwl0bXBbNV0gPSB4X2VuZCA+PiA4OworCXRtcFs2XSA9IHlfZW5kOworCXRtcFs3XSA9IHlfZW5kID4+IDg7CisKKwl4X291dF9lbmQtLTsKKwl5X291dF9lbmQtLTsKKwl0bXBbOF0gID0geF9vdXRfc3RhcnQ7CisJdG1wWzldICA9IHhfb3V0X3N0YXJ0ID4+IDg7CisJdG1wWzEwXSA9IHlfb3V0X3N0YXJ0OworCXRtcFsxMV0gPSB5X291dF9zdGFydCA+PiA4OworCXRtcFsxMl0gPSB4X291dF9lbmQ7CisJdG1wWzEzXSA9IHhfb3V0X2VuZCA+PiA4OworCXRtcFsxNF0gPSB5X291dF9lbmQ7CisJdG1wWzE1XSA9IHlfb3V0X2VuZCA+PiA4OworCisJdG1wWzE2XSA9IGNvbG9yX21vZGU7CisJaWYgKHpvb21fb2ZmICYmIGJsaXp6YXJkLnZlcnNpb24gPT0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NSkKKwkJdG1wWzE3XSA9IEJMSVpaQVJEX1NSQ19XUklURV9MQ0RfQkFDS0dST1VORDsKKwllbHNlIGlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19FTkFCTEVfT1ZFUkxBWSkKKwkJdG1wWzE3XSA9IEJMSVpaQVJEX1NSQ19XUklURV9PVkVSTEFZX0VOQUJMRTsKKwllbHNlCisJCXRtcFsxN10gPSBibGl6emFyZC52ZXJzaW9uID09IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQgPworCQkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0QgOgorCQkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkU7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWNtZCA9IEJMSVpaQVJEX0lOUFVUX1dJTl9YX1NUQVJUXzA7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJmNtZCwgMSk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2RhdGEodG1wLCAxOCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV90ZWFyc3luYyhpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuX2hlaWdodCwKKwkJCSAgICBpbnQgb3V0X2hlaWdodCwgaW50IGZvcmNlX3ZzeW5jKQoreworCXU4IGI7CisKKwliID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworCWIgfD0gMSA8PCAzOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisKKwlpZiAobGlrZWx5KGJsaXp6YXJkLnZzeW5jX29ubHkgfHwgZm9yY2VfdnN5bmMpKSB7CisJCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod2lkdGggKiBibGl6emFyZC5waXhfdHhfdGltZSA8IGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUpIHsKKwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgod2lkdGggKiBibGl6emFyZC5waXhfdHhfdGltZSAvIDEwMDApICogaGVpZ2h0IDwKKwkgICAgKHkgKyBvdXRfaGVpZ2h0KSAqIChibGl6emFyZC5saW5lX3VwZF90aW1lIC8gMTAwMCkpIHsKKwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgeSArIDEpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3RlYXJzeW5jKHZvaWQpCit7CisJdTggYjsKKworCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMCwgMCk7CisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKKwliICY9IH4oMSA8PCAzKTsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMsIGIpOworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXh0aWZfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmFsbG9jX3JlcSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwlpbnQgcmVxX2ZsYWdzID0gMDsKKworCWlmICghaW5faW50ZXJydXB0KCkpCisJCWRvd24oJmJsaXp6YXJkLnJlcV9zZW1hKTsKKwllbHNlCisJCXJlcV9mbGFncyA9IFJFUV9GUk9NX0lSUV9QT09MOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisJQlVHX09OKGxpc3RfZW1wdHkoJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpKTsKKwlyZXEgPSBsaXN0X2VudHJ5KGJsaXp6YXJkLmZyZWVfcmVxX2xpc3QubmV4dCwKKwkJCSBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+ZW50cnkpOworCXJlcS0+ZmxhZ3MgPSByZXFfZmxhZ3M7CisKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9yZXEoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZibGl6emFyZC5mcmVlX3JlcV9saXN0KTsKKwlpZiAoIShyZXEtPmZsYWdzICYgUkVRX0ZST01fSVJRX1BPT0wpKQorCQl1cCgmYmxpenphcmQucmVxX3NlbWEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0KSkgeworCQlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCQl2b2lkICgqY29tcGxldGUpKHZvaWQgKik7CisJCXZvaWQgKmNvbXBsZXRlX2RhdGE7CisKKwkJcmVxID0gbGlzdF9lbnRyeShibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0Lm5leHQsCisJCQkJIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJlcS0+aGFuZGxlcihyZXEpID09IFJFUV9QRU5ESU5HKQorCQkJcmV0dXJuOworCisJCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwkJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKwkJZnJlZV9yZXEocmVxKTsKKworCQlpZiAoY29tcGxldGUpCisJCQljb21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfcmVxX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcm9jZXNzID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QpKSkKKwkJcHJvY2VzcyA9IDA7CisJbGlzdF9zcGxpY2VfaW5pdChoZWFkLCBibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0LnByZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvY2VzcykKKwkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdAkqcmVxID0gKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICopZGF0YTsKKwl2b2lkCQkJKCpjb21wbGV0ZSkodm9pZCAqKTsKKwl2b2lkCQkJKmNvbXBsZXRlX2RhdGE7CisKKwljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKworCWZyZWVfcmVxKHJlcSk7CisKKwlpZiAoY29tcGxldGUpCisJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKKworc3RhdGljIGludCBkb19mdWxsX3NjcmVlbl91cGRhdGUoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgaTsKKwlpbnQgZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW2ldOworCQlpZiAoIShibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmICgxIDw8IGkpKSkgeworCQkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInB3ICVkIHBoICVkXG4iLAorCQkJcC0+d2lkdGgsIHAtPmhlaWdodCk7CisJCWJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9wbGFuZShpLAorCQkJCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QsIHAtPm9mZnNldCwKKwkJCQlwLT5zY3Jfd2lkdGgsIHAtPnBvc194LCBwLT5wb3NfeSwKKwkJCQlwLT53aWR0aCwgcC0+aGVpZ2h0LAorCQkJCXAtPmNvbG9yX21vZGUpOworCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDEpOworCX0KKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInN3ICVkIHNoICVkXG4iLAorCQlibGl6emFyZC5zY3JlZW5fd2lkdGgsIGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQpOworCWJsaXp6YXJkX3dhaXRfbGluZV9idWZmZXIoKTsKKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpCisJCWVuYWJsZV90ZWFyc3luYygwLCBibGl6emFyZC5zY3JlZW5fd2lkdGgsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQlibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UKKwkJZGlzYWJsZV90ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKDAsIDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCTAsIDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCUJMSVpaQVJEX0NPTE9SX1JHQjU2NSwgYmxpenphcmQuem9vbV9vbiwgZmxhZ3MpOworCWJsaXp6YXJkLnpvb21fb24gPSAwOworCisJYmxpenphcmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSgxNik7CisJLyogc2V0X3dpbmRvd19yZWdzIGhhcyBsZWZ0IHRoZSByZWdpc3RlciBpbmRleCBhdCB0aGUgcmlnaHQKKwkgKiBwbGFjZSwgc28gbm8gbmVlZCB0byBzZXQgaXQgaGVyZS4KKwkgKi8KKwlibGl6emFyZC5leHRpZi0+dHJhbnNmZXJfYXJlYShibGl6emFyZC5zY3JlZW5fd2lkdGgsCisJCQkJICAgICAgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQkgICAgICByZXF1ZXN0X2NvbXBsZXRlLCByZXEpOworCXJldHVybiBSRVFfUEVORElORzsKK30KKworLyogU2V0dXAgYWxsIHBsYW5lcyB3aXRoIGFuIG92ZXJsYXBwaW5nIGFyZWEgd2l0aCB0aGUgdXBkYXRlIHdpbmRvdy4gKi8KK3N0YXRpYyBpbnQgZG9fcGFydGlhbF91cGRhdGUoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSwgaW50IHBsYW5lLAorCQkJICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJCSAgICAgaW50IHhfb3V0LCBpbnQgeV9vdXQsIGludCB3X291dCwgaW50IGhfb3V0LAorCQkJICAgICBpbnQgd25kX2NvbG9yX21vZGUsIGludCBicHApCit7CisJaW50IGk7CisJaW50IGd4MSwgZ3kxLCBneDIsIGd5MjsKKwlpbnQgZ3gxX291dCwgZ3kxX291dCwgZ3gyX291dCwgZ3kyX291dDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgZmxhZ3M7CisJaW50IHpvb21fb2ZmOworCisJLyogR2xvYmFsIGNvb3JkaW5hdGVzLCByZWxhdGl2ZSB0byBwaXhlbCAwLDAgb2YgdGhlIExDRCAqLworCWd4MSA9IHggKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3g7CisJZ3kxID0geSArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeTsKKwlneDIgPSBneDEgKyB3OworCWd5MiA9IGd5MSArIGg7CisKKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRE9VQkxFKSB7CisJCWd4MV9vdXQgPSBneDE7CisJCWd5MV9vdXQgPSBneTE7CisJCWd4Ml9vdXQgPSBneDEgKyB3ICogMjsKKwkJZ3kyX291dCA9IGd5MSArIGggKiAyOworCX0gZWxzZSB7CisJCWd4MV9vdXQgPSB4X291dCArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeDsKKwkJZ3kxX291dCA9IHlfb3V0ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc195OworCQlneDJfb3V0ID0gZ3gxX291dCArIHdfb3V0OworCQlneTJfb3V0ID0gZ3kxX291dCArIGhfb3V0OworCX0KKwl6b29tX29mZiA9IGJsaXp6YXJkLnpvb21fb24gJiYgZ3gxID09IDAgJiYgZ3kxID09IDAgJiYKKwkJdyA9PSBibGl6emFyZC5zY3JlZW5fd2lkdGggJiYgaCA9PSBibGl6emFyZC5zY3JlZW5faGVpZ2h0OworCWJsaXp6YXJkLnpvb21fb24gPSAoIXpvb21fb2ZmICYmIGJsaXp6YXJkLnpvb21fb24pIHx8CisJCQkgICAodyA8IHdfb3V0IHx8IGggPCBoX291dCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUEZCX1BMQU5FX05VTTsgaSsrKSB7CisJCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW2ldOworCQlpbnQgcHgxLCBweTE7CisJCWludCBweDIsIHB5MjsKKwkJaW50IHB3LCBwaDsKKwkJaW50IHBwb3N4LCBwcG9zeTsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwkJaWYgKCEoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiAoMSA8PCBpKSkgIHx8CisJCSAgICAod25kX2NvbG9yX21vZGUgJiYgaSAhPSBwbGFuZSkpIHsKKwkJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBQbGFuZSBjb29yZGluYXRlcyAqLworCQlpZiAoaSA9PSBwbGFuZSkgeworCQkJLyogUGxhbmUgaW4gd2hpY2ggd2UgYXJlIGRvaW5nIHRoZSB1cGRhdGUuCisJCQkgKiBMb2NhbCBjb29yZGluYXRlcyBhcmUgdGhlIG9uZSBpbiB0aGUgdXBkYXRlCisJCQkgKiByZXF1ZXN0LgorCQkJICovCisJCQlweDEgPSB4OworCQkJcHkxID0geTsKKwkJCXB4MiA9IHggKyB3OworCQkJcHkyID0geSArIGg7CisJCQlwcG9zeCA9IDA7CisJCQlwcG9zeSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBpZiB0aGlzIHBsYW5lIGhhcyBhbiBvdmVybGFwcGluZyBwYXJ0ICovCisJCQlweDEgPSBneDEgLSBwLT5wb3NfeDsKKwkJCXB5MSA9IGd5MSAtIHAtPnBvc195OworCQkJcHgyID0gZ3gyIC0gcC0+cG9zX3g7CisJCQlweTIgPSBneTIgLSBwLT5wb3NfeTsKKwkJCWlmIChweDEgPj0gcC0+d2lkdGggfHwgcHkxID49IHAtPmhlaWdodCB8fAorCQkJICAgIHB4MiA8PSAwIHx8IHB5MiA8PSAwKSB7CisJCQkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIENhbGN1bGF0ZSB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBvdmVybGFwcGluZworCQkJICogcGFydCBpbiB0aGUgcGxhbmUncyBsb2NhbCBjb29yZGluYXRlcy4KKwkJCSAqLworCQkJcHBvc3ggPSAtcHgxOworCQkJcHBvc3kgPSAtcHkxOworCQkJaWYgKHB4MSA8IDApCisJCQkJcHgxID0gMDsKKwkJCWlmIChweTEgPCAwKQorCQkJCXB5MSA9IDA7CisJCQlpZiAocHgyID4gcC0+d2lkdGgpCisJCQkJcHgyID0gcC0+d2lkdGg7CisJCQlpZiAocHkyID4gcC0+aGVpZ2h0KQorCQkJCXB5MiA9IHAtPmhlaWdodDsKKwkJCWlmIChwcG9zeCA8IDApCisJCQkJcHBvc3ggPSAwOworCQkJaWYgKHBwb3N5IDwgMCkKKwkJCQlwcG9zeSA9IDA7CisJCX0KKwkJcHcgPSBweDIgLSBweDE7CisJCXBoID0gcHkyIC0gcHkxOworCQlvZmZzZXQgPSBwLT5vZmZzZXQgKyAocC0+c2NyX3dpZHRoICogcHkxICsgcHgxKSAqIHAtPmJwcCAvIDg7CisJCWlmICh3bmRfY29sb3JfbW9kZSkKKwkJCS8qIFdpbmRvdyBlbWJlZGRlZCBpbiB0aGUgcGxhbmUgd2l0aCBhIGRpZmZlcmluZworCQkJICogY29sb3IgbW9kZSAvIGJwcC4gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgRE1BCisJCQkgKiB0cmFuc2ZlciBlbGVtZW50cyBpbiB0ZXJtcyBvZiB0aGUgcGxhbmUncyBicHAuCisJCQkgKi8KKwkJCXB3ID0gKHB3ICsgMSkgKiBicHAgLyBwLT5icHA7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkicGxhbmUgJWQgb2Zmc2V0ICUjMDhseCBwcG9zeCAlZCBwcG9zeSAlZCAiCisJCQkicHgxICVkIHB5MSAlZCBwdyAlZCBwaCAlZFxuIiwKKwkJCWksIG9mZnNldCwgcHBvc3gsIHBwb3N5LCBweDEsIHB5MSwgcHcsIHBoKTsKKyNlbmRpZgorCQlibGl6emFyZC5pbnRfY3RybC0+c2V0dXBfcGxhbmUoaSwKKwkJCQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENELCBvZmZzZXQsCisJCQkJcC0+c2NyX3dpZHRoLAorCQkJCXBwb3N4LCBwcG9zeSwgcHcsIHBoLAorCQkJCXAtPmNvbG9yX21vZGUpOworCisJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMSk7CisJfQorCisJc3dpdGNoICh3bmRfY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJY29sb3JfbW9kZSA9IEJMSVpaQVJEX0NPTE9SX1lVVjQyMDsKKwkJLyogQ3VycmVudGx5IG9ubHkgdGhlIDE2IGJpdHMvcGl4ZWwgY3ljbGUgZm9ybWF0IGlzCisJCSAqIHN1cHBvcnRlZCBvbiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLiBBZGp1c3QgdGhlIG51bWJlcgorCQkgKiBvZiB0cmFuc2ZlciBlbGVtZW50cyBwZXIgbGluZSBmb3IgMTJicHAgZm9ybWF0LgorCQkgKi8KKwkJdyA9ICh3ICsgMSkgKiAzIC8gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29sb3JfbW9kZSA9IEJMSVpaQVJEX0NPTE9SX1JHQjU2NTsKKwkJYnJlYWs7CisJfQorCisJYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcigpOworCWlmIChibGl6emFyZC5sYXN0X2NvbG9yX21vZGUgPT0gQkxJWlpBUkRfQ09MT1JfWVVWNDIwKQorCQlibGl6emFyZF93YWl0X3l5YygpOworCWJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKQorCQllbmFibGVfdGVhcnN5bmMoZ3kxLCB3LCBoLAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJaF9vdXQsCisJCQkJZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UKKwkJZGlzYWJsZV90ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKGd4MSwgZ3kxLCBneDIsIGd5MiwgZ3gxX291dCwgZ3kxX291dCwgZ3gyX291dCwgZ3kyX291dCwKKwkJCWNvbG9yX21vZGUsIHpvb21fb2ZmLCBmbGFncyk7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDE2KTsKKwkvKiBzZXRfd2luZG93X3JlZ3MgaGFzIGxlZnQgdGhlIHJlZ2lzdGVyIGluZGV4IGF0IHRoZSByaWdodAorCSAqIHBsYWNlLCBzbyBubyBuZWVkIHRvIHNldCBpdCBoZXJlLgorCSAqLworCWJsaXp6YXJkLmV4dGlmLT50cmFuc2Zlcl9hcmVhKHcsIGgsIHJlcXVlc3RfY29tcGxldGUsIHJlcSk7CisKKwlyZXR1cm4gUkVRX1BFTkRJTkc7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHVwZGF0ZV9wYXJhbSAqcGFyID0gJnJlcS0+cGFyLnVwZGF0ZTsKKwlpbnQgcGxhbmUgPSBwYXItPnBsYW5lOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInNlbmRfZnJhbWU6IHggJWQgeSAlZCB3ICVkIGggJWQgIgorCQkieF9vdXQgJWQgeV9vdXQgJWQgd19vdXQgJWQgaF9vdXQgJWQgIgorCQkiY29sb3JfbW9kZSAlMDR4IGZsYWdzICUwNHggcGxhbmVzICUwMXhcbiIsCisJCXBhci0+eCwgcGFyLT55LCBwYXItPndpZHRoLCBwYXItPmhlaWdodCwKKwkJcGFyLT5vdXRfeCwgcGFyLT5vdXRfeSwgcGFyLT5vdXRfd2lkdGgsIHBhci0+b3V0X2hlaWdodCwKKwkJcGFyLT5jb2xvcl9tb2RlLCBwYXItPmZsYWdzLCBibGl6emFyZC5lbmFibGVkX3BsYW5lcyk7CisjZW5kaWYKKwlpZiAocGFyLT5mbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ESVNBQkxFX09WRVJMQVkpCisJCWRpc2FibGVfb3ZlcmxheSgpOworCisJaWYgKChibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmIGJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IpIHx8CisJICAgICAoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiBibGl6emFyZC52aWRfc2NhbGVkKSkKKwkJcmV0dXJuIGRvX2Z1bGxfc2NyZWVuX3VwZGF0ZShyZXEpOworCisJcmV0dXJuIGRvX3BhcnRpYWxfdXBkYXRlKHJlcSwgcGxhbmUsIHBhci0+eCwgcGFyLT55LAorCQkJCSBwYXItPndpZHRoLCBwYXItPmhlaWdodCwKKwkJCQkgcGFyLT5vdXRfeCwgcGFyLT5vdXRfeSwKKwkJCQkgcGFyLT5vdXRfd2lkdGgsIHBhci0+b3V0X2hlaWdodCwKKwkJCQkgcGFyLT5jb2xvcl9tb2RlLCBwYXItPmJwcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZnJhbWVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKK30KKworI2RlZmluZSBBRERfUFJFUShfeCwgX3ksIF93LCBfaCwgX3hfb3V0LCBfeV9vdXQsIF93X291dCwgX2hfb3V0KSBkbyB7CVwKKwlyZXEgPSBhbGxvY19yZXEoKTsJCQlcCisJcmVxLT5oYW5kbGVyCT0gc2VuZF9mcmFtZV9oYW5kbGVyOwlcCisJcmVxLT5jb21wbGV0ZQk9IHNlbmRfZnJhbWVfY29tcGxldGU7CVwKKwlyZXEtPnBhci51cGRhdGUucGxhbmUgPSBwbGFuZV9pZHg7CVwKKwlyZXEtPnBhci51cGRhdGUueCA9IF94OwkJCVwKKwlyZXEtPnBhci51cGRhdGUueSA9IF95OwkJCVwKKwlyZXEtPnBhci51cGRhdGUud2lkdGggID0gX3c7CQlcCisJcmVxLT5wYXIudXBkYXRlLmhlaWdodCA9IF9oOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfeCA9IF94X291dDsJCVwKKwlyZXEtPnBhci51cGRhdGUub3V0X3kgPSBfeV9vdXQ7CQlcCisJcmVxLT5wYXIudXBkYXRlLm91dF93aWR0aCA9IF93X291dDsJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfaGVpZ2h0ID0gX2hfb3V0OwlcCisJcmVxLT5wYXIudXBkYXRlLmJwcCA9IGJwcDsJCVwKKwlyZXEtPnBhci51cGRhdGUuY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7XAorCXJlcS0+cGFyLnVwZGF0ZS5mbGFncwkgID0gZmxhZ3M7CVwKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCByZXFfaGVhZCk7CVwKK30gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgY3JlYXRlX3JlcV9saXN0KGludCBwbGFuZV9pZHgsCisJCQkgICAgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqcmVxX2hlYWQpCit7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwlpbnQgeCA9IHdpbi0+eDsKKwlpbnQgeSA9IHdpbi0+eTsKKwlpbnQgd2lkdGggPSB3aW4tPndpZHRoOworCWludCBoZWlnaHQgPSB3aW4tPmhlaWdodDsKKwlpbnQgeF9vdXQgPSB3aW4tPm91dF94OworCWludCB5X291dCA9IHdpbi0+b3V0X3k7CisJaW50IHdpZHRoX291dCA9IHdpbi0+b3V0X3dpZHRoOworCWludCBoZWlnaHRfb3V0ID0gd2luLT5vdXRfaGVpZ2h0OworCWludCBjb2xvcl9tb2RlOworCWludCBicHA7CisJaW50IGZsYWdzOworCXVuc2lnbmVkIGludCB5c3RhcnQgPSB5OworCXVuc2lnbmVkIGludCB5c3BhbiA9IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgeXN0YXJ0X291dCA9IHlfb3V0OworCXVuc2lnbmVkIGludCB5c3Bhbl9vdXQgPSBoZWlnaHRfb3V0OworCisJZmxhZ3MgPSB3aW4tPmZvcm1hdCAmIH5PTUFQRkJfRk9STUFUX01BU0s7CisJY29sb3JfbW9kZSA9IHdpbi0+Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9NQVNLOworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJLyogRW1iZWRkZWQgd2luZG93IHdpdGggZGlmZmVyZW50IGNvbG9yIG1vZGUgKi8KKwkJYnBwID0gMTI7CisJCS8qIFgsIFksIGhlaWdodCBtdXN0IGJlIGFsaWduZWQgYXQgMiwgd2lkdGggYXQgNCBwaXhlbHMgKi8KKwkJeCAmPSB+MTsKKwkJeSAmPSB+MTsKKwkJaGVpZ2h0ID0geXNwYW4gPSBoZWlnaHQgJiB+MTsKKwkJd2lkdGggPSB3aWR0aCAmIH4zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTYW1lIGFzIHRoZSBwbGFuZSBjb2xvciBtb2RlICovCisJCWJwcCA9IGJsaXp6YXJkLnBsYW5lW3BsYW5lX2lkeF0uYnBwOworCQlicmVhazsKKwl9CisJaWYgKHdpZHRoICogaGVpZ2h0ICogYnBwIC8gOCA+IGJsaXp6YXJkLm1heF90cmFuc21pdF9zaXplKSB7CisJCXlzcGFuID0gYmxpenphcmQubWF4X3RyYW5zbWl0X3NpemUgLyAod2lkdGggKiBicHAgLyA4KTsKKwkJeXNwYW5fb3V0ID0geXNwYW4gKiBoZWlnaHRfb3V0IC8gaGVpZ2h0OworCQlBRERfUFJFUSh4LCB5c3RhcnQsIHdpZHRoLCB5c3BhbiwgeF9vdXQsIHlzdGFydF9vdXQsCisJCQkgd2lkdGhfb3V0LCB5c3Bhbl9vdXQpOworCQl5c3RhcnQgKz0geXNwYW47CisJCXlzdGFydF9vdXQgKz0geXNwYW5fb3V0OworCQl5c3BhbiA9IGhlaWdodCAtIHlzcGFuOworCQl5c3Bhbl9vdXQgPSBoZWlnaHRfb3V0IC0geXNwYW5fb3V0OworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCX0KKworCUFERF9QUkVRKHgsIHlzdGFydCwgd2lkdGgsIHlzcGFuLCB4X291dCwgeXN0YXJ0X291dCwKKwkJIHdpZHRoX291dCwgeXNwYW5fb3V0KTsKK30KKworc3RhdGljIHZvaWQgYXV0b191cGRhdGVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlpZiAoIWJsaXp6YXJkLnN0b3BfYXV0b191cGRhdGUpCisJCW1vZF90aW1lcigmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIsCisJCQkgIGppZmZpZXMgKyBCTElaWkFSRF9BVVRPX1VQREFURV9USU1FKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfdXBkYXRlX3dpbmRvd19hdXRvKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmxhc3Q7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lOworCisJcGxhbmUgPSBibGl6emFyZC5mYmRldi0+ZmJfaW5mb1swXS0+cGFyOworCWNyZWF0ZV9yZXFfbGlzdChwbGFuZS0+aWR4LAorCQkJJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdywgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBhdXRvX3VwZGF0ZV9jb21wbGV0ZTsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gTlVMTDsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworfQorCitpbnQgYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCSBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkgdm9pZCAoKmNvbXBsZXRlX2NhbGxiYWNrKSh2b2lkICphcmcpLAorCQkJCSB2b2lkICpjb21wbGV0ZV9jYWxsYmFja19kYXRhKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmxhc3Q7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisKKwlpZiAodW5saWtlbHkoYmxpenphcmQudXBkYXRlX21vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoIWJsaXp6YXJkLnRlX2Nvbm5lY3RlZCAmJgorCQkgICAgICh3aW4tPmZvcm1hdCAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyZWF0ZV9yZXFfbGlzdChwbGFuZS0+aWR4LCB3aW4sICZyZXFfbGlzdCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gY29tcGxldGVfY2FsbGJhY2s7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9ICh2b2lkICopY29tcGxldGVfY2FsbGJhY2tfZGF0YTsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMgaW50IHVwZGF0ZV9mdWxsX3NjcmVlbih2b2lkKQoreworCXJldHVybiBibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5jKGJsaXp6YXJkLmZiZGV2LT5mYl9pbmZvWzBdLAorCQkJCSAgICAgJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdywgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCXN0cnVjdCBwbGFuZV9pbmZvICpwOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICAgICJwbGFuZSAlZCBjaF9vdXQgJWQgb2Zmc2V0ICUjMDhseCBzY3Jfd2lkdGggJWQgIgorCQkgICAgInBvc194ICVkIHBvc195ICVkIHdpZHRoICVkIGhlaWdodCAlZCBjb2xvcl9tb2RlICVkXG4iLAorCQkgICAgcGxhbmUsIGNoYW5uZWxfb3V0LCBvZmZzZXQsIHNjcmVlbl93aWR0aCwKKwkJICAgIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwgY29sb3JfbW9kZSk7CisjZW5kaWYKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcCA9ICZibGl6emFyZC5wbGFuZVtwbGFuZV07CisKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlwLT5icHAgPSAxNjsKKwkJYmxpenphcmQudmlkX25vbnN0ZF9jb2xvciAmPSB+KDEgPDwgcGxhbmUpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCXAtPmJwcCA9IDEyOworCQlibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yIHw9IDEgPDwgcGxhbmU7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJcC0+YnBwID0gMTY7CisJCWJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IgJj0gfigxIDw8IHBsYW5lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcC0+b2Zmc2V0ID0gb2Zmc2V0OworCXAtPnBvc194ID0gcG9zX3g7CisJcC0+cG9zX3kgPSBwb3NfeTsKKwlwLT53aWR0aCA9IHdpZHRoOworCXAtPmhlaWdodCA9IGhlaWdodDsKKwlwLT5zY3Jfd2lkdGggPSBzY3JlZW5fd2lkdGg7CisJaWYgKCFwLT5vdXRfd2lkdGgpCisJCXAtPm91dF93aWR0aCA9IHdpZHRoOworCWlmICghcC0+b3V0X2hlaWdodCkKKwkJcC0+b3V0X2hlaWdodCA9IGhlaWdodDsKKworCXAtPmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0X3NjYWxlKGludCBwbGFuZSwgaW50IG9yaWdfdywgaW50IG9yaWdfaCwKKwkJCSAgICAgIGludCBvdXRfdywgaW50IG91dF9oKQoreworCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW3BsYW5lXTsKKwlpbnQgcjsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInBsYW5lICVkIG9yaWdfdyAlZCBvcmlnX2ggJWQgb3V0X3cgJWQgb3V0X2ggJWRcbiIsCisJCXBsYW5lLCBvcmlnX3csIG9yaWdfaCwgb3V0X3csIG91dF9oKTsKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyID0gYmxpenphcmQuaW50X2N0cmwtPnNldF9zY2FsZShwbGFuZSwgb3JpZ193LCBvcmlnX2gsIG91dF93LCBvdXRfaCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXAtPndpZHRoID0gb3JpZ193OworCXAtPmhlaWdodCA9IG9yaWdfaDsKKwlwLT5vdXRfd2lkdGggPSBvdXRfdzsKKwlwLT5vdXRfaGVpZ2h0ID0gb3V0X2g7CisJaWYgKG9yaWdfdyA9PSBvdXRfdyAmJiBvcmlnX2ggPT0gb3V0X2gpCisJCWJsaXp6YXJkLnZpZF9zY2FsZWQgJj0gfigxIDw8IHBsYW5lKTsKKwllbHNlCisJCWJsaXp6YXJkLnZpZF9zY2FsZWQgfD0gMSA8PCBwbGFuZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX2VuYWJsZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgfD0gMSA8PCBwbGFuZTsKKwllbHNlCisJCWJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICY9IH4oMSA8PCBwbGFuZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW5jX2hhbmRsZXIoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwljb21wbGV0ZShyZXEtPnBhci5zeW5jKTsKKwlyZXR1cm4gUkVRX0NPTVBMRVRFOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zeW5jKHZvaWQpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisKKwlyZXEgPSBhbGxvY19yZXEoKTsKKworCXJlcS0+aGFuZGxlciA9IHN5bmNfaGFuZGxlcjsKKwlyZXEtPmNvbXBsZXRlID0gTlVMTDsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXApOworCXJlcS0+cGFyLnN5bmMgPSAmY29tcDsKKworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmcmVxX2xpc3QpOworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7Cit9CisKKworc3RhdGljIHZvaWQgYmxpenphcmRfYmluZF9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIpCit7CisJaWYgKGJsaXp6YXJkLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9NQU5VQUxfVVBEQVRFKSB7CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaWYgKHVubGlrZWx5KG1vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUgJiYKKwkJICAgICBtb2RlICE9IE9NQVBGQl9BVVRPX1VQREFURSAmJgorCQkgICAgIG1vZGUgIT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1vZGUgPT0gYmxpenphcmQudXBkYXRlX21vZGUpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oYmxpenphcmQuZmJkZXYtPmRldiwgInMxZDEzNzR4OiBzZXR0aW5nIHVwZGF0ZSBtb2RlIHRvICVzXG4iLAorCQkJbW9kZSA9PSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEID8gImRpc2FibGVkIiA6CisJCQkobW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUgPyAiYXV0byIgOiAibWFudWFsIikpOworCisJc3dpdGNoIChibGl6emFyZC51cGRhdGVfbW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01BUEZCX0VWRU5UX0RJU0FCTEVEKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWJsaXp6YXJkLnN0b3BfYXV0b191cGRhdGUgPSAxOworCQlkZWxfdGltZXJfc3luYygmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCWJsaXp6YXJkLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwlibGl6emFyZF9zeW5jKCk7CisJYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0ZSA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoYmxpenphcmQuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlibGl6emFyZF91cGRhdGVfd2luZG93X2F1dG8oMCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBibGl6emFyZF9nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gYmxpenphcmQudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXh0aWZfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwlibGl6emFyZC5leHRpZi0+c2V0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByb3VuZF90b19leHRpZl90aWNrcyh1bnNpZ25lZCBsb25nIHBzLCBpbnQgZGl2KQoreworCWludCBidXNfdGljayA9IGJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QgKiBkaXY7CisJcmV0dXJuIChwcyArIGJ1c190aWNrIC0gMSkgLyBidXNfdGljayAqIGJ1c190aWNrOworfQorCitzdGF0aWMgaW50IGNhbGNfcmVnX3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgMTIuMiBucyAocmVncyksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgMTIgbnMgKHJlZ3MpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyAyKlNZU0NMSyAgKHJlZ3MpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMgKi8KKworCXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgICJCbGl6emFyZCBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgZGl2ICVkXG4iLAorCQkgIHN5c3RpbSwgYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmYmxpenphcmQucmVnX3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgMTIyMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMzAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ11jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltyZWddd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ11yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBibGl6emFyZC5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfbHV0X3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgNCAqIFNZU0NMSyArIDI2IChsdXQpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucyAqLworCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJCbGl6emFyZCBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgZGl2ICVkXG4iLAorCQlzeXN0aW0sIGJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmJsaXp6YXJkLmx1dF90aW1pbmdzOworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKworCXQtPmNsa19kaXYgPSBkaXY7CisKKwl0LT5jc19vbl90aW1lID0gMDsKKwl0LT53ZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+cmVfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPmFjY2Vzc190aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyMDAwICsgNCAqIHN5c3RpbSArIDI2MDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAiW2x1dF1jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICJbbHV0XXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJCSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQtPndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltsdXRdcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93aWR0aCk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2V4dGlmX3RpbWluZ3ModW5zaWduZWQgbG9uZyBzeXNjbGssIGludCAqZXh0aWZfbWVtX2RpdikKK3sKKwlpbnQgbWF4X2Nsa19kaXY7CisJaW50IGRpdjsKKworCWJsaXp6YXJkLmV4dGlmLT5nZXRfY2xrX2luZm8oJmJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QsICZtYXhfY2xrX2Rpdik7CisJZm9yIChkaXYgPSAxOyBkaXYgPD0gbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX3JlZ190aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KSB7CisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInJlZyB0aW1pbmcgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCSpleHRpZl9tZW1fZGl2ID0gZGl2OworCisJZm9yIChkaXYgPSAxOyBkaXYgPD0gbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX2x1dF90aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJYmxpenphcmQuZXh0aWZfY2xrX2RpdiA9IGRpdjsKKworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwgImNhbid0IHNldHVwIHRpbWluZ3NcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2FsY19ibGl6emFyZF9jbGtfcmF0ZXModW5zaWduZWQgbG9uZyBleHRfY2xrLAorCQkJCXVuc2lnbmVkIGxvbmcgKnN5c19jbGssIHVuc2lnbmVkIGxvbmcgKnBpeF9jbGspCit7CisJaW50IHBpeF9jbGtfc3JjOworCWludCBzeXNfZGl2ID0gMCwgc3lzX211bCA9IDA7CisJaW50IHBpeF9kaXY7CisKKwlwaXhfY2xrX3NyYyA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0NMS19TUkMpOworCXBpeF9kaXYgPSAoKHBpeF9jbGtfc3JjID4+IDMpICYgMHgxZikgKyAxOworCWlmICgocGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpKSA9PSAwKSB7CisJCS8qIFNvdXJjZSBpcyB0aGUgUExMICovCisJCXN5c19kaXYgPSAoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAweDNmKSArIDE7CisJCXN5c19tdWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMCk7CisJCXN5c19tdWwgfD0gKChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMSkKKwkJCQkmIDB4MGYpCTw8IDExKTsKKwkJKnN5c19jbGsgPSBleHRfY2xrICogc3lzX211bCAvIHN5c19kaXY7CisJfSBlbHNlCS8qIGVsc2Ugc291cmNlIGlzIGV4dCBjbGssIG9yIG9zY2lsbGF0b3IgKi8KKwkJKnN5c19jbGsgPSBleHRfY2xrOworCisJKnBpeF9jbGsgPSAqc3lzX2NsayAvIHBpeF9kaXY7CQkJLyogSFogKi8KKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJleHRfY2xrICVsZCBwaXhfc3JjICVkIHBpeF9kaXYgJWQgc3lzX2RpdiAlZCBzeXNfbXVsICVkXG4iLAorCQlleHRfY2xrLCBwaXhfY2xrX3NyYyAmICgweDMgPDwgMSksIHBpeF9kaXYsIHN5c19kaXYsIHN5c19tdWwpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInN5c19jbGsgJWxkIHBpeF9jbGsgJWxkXG4iLAorCQkqc3lzX2NsaywgKnBpeF9jbGspOworfQorCitzdGF0aWMgaW50IHNldHVwX3RlYXJzeW5jKHVuc2lnbmVkIGxvbmcgcGl4X2NsaywgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaGRpc3AsIHZkaXNwOworCWludCBobmRwLCB2bmRwOworCWludCBoc3csIHZzdzsKKwlpbnQgaHMsIHZzOworCWludCBoc19wb2xfaW52LCB2c19wb2xfaW52OworCWludCB1c2VfaHN2cywgdXNlX25kcDsKKwl1OCAgYjsKKworCWhzdyA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hTVyk7CisJdnN3ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVlNXKTsKKwloc19wb2xfaW52ID0gIShoc3cgJiAweDgwKTsKKwl2c19wb2xfaW52ID0gISh2c3cgJiAweDgwKTsKKwloc3cgPSBoc3cgJiAweDdmOworCXZzdyA9IHZzdyAmIDB4M2Y7CisKKwloZGlzcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hESVNQKSAqIDg7CisJdmRpc3AgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WRElTUDApICsKKwkJKChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WRElTUDEpICYgMHgzKSA8PCA4KTsKKworCWhuZHAgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ITkRQKSAmIDB4M2Y7CisJdm5kcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZORFApOworCisJLyogdGltZSB0byB0cmFuc2ZlciBvbmUgcGl4ZWwgKDE2YnBwKSBpbiBwcyAqLworCWJsaXp6YXJkLnBpeF90eF90aW1lID0gYmxpenphcmQucmVnX3RpbWluZ3Mud2VfY3ljbGVfdGltZTsKKwlpZiAoYmxpenphcmQuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSAhPSBOVUxMKSB7CisJCS8qIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgbWlnaHQgaGF2ZSBhIHJhdGUgbGltaXRhdGlvbiwKKwkJICogaWYgc28sIHdlIGhhdmUgdG8gbWF4aW1pemUgb3VyIHRyYW5zZmVyIHJhdGUuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIG1pbl90eF90aW1lOworCQl1bnNpZ25lZCBsb25nIG1heF90eF9yYXRlID0gYmxpenphcmQuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSgpOworCisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIm1heF90eF9yYXRlICVsZCBIWlxuIiwKKwkJCW1heF90eF9yYXRlKTsKKwkJbWluX3R4X3RpbWUgPSAxMDAwMDAwMDAwIC8gKG1heF90eF9yYXRlIC8gMTAwMCk7ICAvKiBwcyAqLworCQlpZiAoYmxpenphcmQucGl4X3R4X3RpbWUgPCBtaW5fdHhfdGltZSkKKwkJCWJsaXp6YXJkLnBpeF90eF90aW1lID0gbWluX3R4X3RpbWU7CisJfQorCisJLyogdGltZSB0byB1cGRhdGUgb25lIGxpbmUgaW4gcHMgKi8KKwlibGl6emFyZC5saW5lX3VwZF90aW1lID0gKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsKKwlibGl6emFyZC5saW5lX3VwZF90aW1lICo9IDEwMDA7CisJaWYgKGhkaXNwICogYmxpenphcmQucGl4X3R4X3RpbWUgPiBibGl6emFyZC5saW5lX3VwZF90aW1lKQorCQkvKiB0cmFuc2ZlciBzcGVlZCB0b28gbG93LCB3ZSBtaWdodCBoYXZlIHRvIHVzZSBib3RoCisJCSAqIEhTIGFuZCBWUyAqLworCQl1c2VfaHN2cyA9IDE7CisJZWxzZQorCQkvKiBkZWNlbnQgdHJhbnNmZXIgc3BlZWQsIHdlJ2xsIGFsd2F5cyB1c2Ugb25seSBWUyAqLworCQl1c2VfaHN2cyA9IDA7CisKKwlpZiAodXNlX2hzdnMgJiYgKGhzX3BvbF9pbnYgfHwgdnNfcG9sX2ludikpIHsKKwkJLyogSFMgb3InZWQgd2l0aCBWUyBkb2Vzbid0IHdvcmssIHVzZSB0aGUgYWN0aXZlIGhpZ2gKKwkJICogVEUgc2lnbmFsIGJhc2VkIG9uIEhORFAgLyBWTkRQICovCisJCXVzZV9uZHAgPSAxOworCQloc19wb2xfaW52ID0gMDsKKwkJdnNfcG9sX2ludiA9IDA7CisJCWhzID0gaG5kcDsKKwkJdnMgPSB2bmRwOworCX0gZWxzZSB7CisJCS8qIFVzZSBIUyBvcidlZCB3aXRoIFZTIGFzIGEgVEUgc2lnbmFsIGlmIGJvdGggYXJlIG5lZWRlZAorCQkgKiBvciBWTkRQIGlmIG9ubHkgdnN5bmMgaXMgbmVlZGVkLiAqLworCQl1c2VfbmRwID0gMDsKKwkJaHMgPSBoc3c7CisJCXZzID0gdnN3OworCQlpZiAoIXVzZV9oc3ZzKSB7CisJCQloc19wb2xfaW52ID0gMDsKKwkJCXZzX3BvbF9pbnYgPSAwOworCQl9CisJfQorCisJaHMgPSBocyAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkJICAvKiBwcyAqLworCWhzICo9IDEwMDA7CisKKwl2cyA9IHZzICogKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsgLyogcHMgKi8KKwl2cyAqPSAxMDAwOworCisJaWYgKHZzIDw9IGhzKQorCQlyZXR1cm4gLUVET007CisJLyogc2V0IFZTIHRvIDEyMCUgb2YgSFMgdG8gbWluaW1pemUgVlMgZGV0ZWN0aW9uIHRpbWUgKi8KKwl2cyA9IGhzICogMTIgLyAxMDsKKwkvKiBtaW5pbWl6ZSBIUyB0b28gKi8KKwlpZiAoaHMgPiAxMDAwMCkKKwkJaHMgPSAxMDAwMDsKKworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7CisJYiAmPSB+MHgzOworCWIgfD0gdXNlX2hzdnMgPyAxIDogMDsKKwliIHw9ICh1c2VfbmRwICYmIHVzZV9oc3ZzKSA/IDAgOiAyOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisKKwlibGl6emFyZC52c3luY19vbmx5ID0gIXVzZV9oc3ZzOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkicGl4X2NsayAlbGQgSFogcGl4X3R4X3RpbWUgJWxkIHBzIGxpbmVfdXBkX3RpbWUgJWxkIHBzXG4iLAorCQlwaXhfY2xrLCBibGl6emFyZC5waXhfdHhfdGltZSwgYmxpenphcmQubGluZV91cGRfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkiaHMgJWQgcHMgdnMgJWQgcHMgbW9kZSAlZCB2c3luY19vbmx5ICVkXG4iLAorCQlocywgdnMsIGIgJiAweDMsICF1c2VfaHN2cyk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPnNldHVwX3RlYXJzeW5jKDEsIGhzLCB2cywKKwkJCQkJICAgICAgaHNfcG9sX2ludiwgdnNfcG9sX2ludiwKKwkJCQkJICAgICAgZXh0aWZfZGl2KTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJYmxpenphcmQuaW50X2N0cmwtPmdldF9jYXBzKHBsYW5lLCBjYXBzKTsKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX01BTlVBTF9VUERBVEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFIHwKKwkJT01BUEZCX0NBUFNfV0lORE9XX1NDQUxFIHwKKwkJT01BUEZCX0NBUFNfV0lORE9XX09WRVJMQVk7CisJaWYgKGJsaXp6YXJkLnRlX2Nvbm5lY3RlZCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19URUFSU1lOQzsKKwljYXBzLT53bmRfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSkgfAorCQkJICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zYXZlX3JlZ3Moc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0ICpsaXN0LCBpbnQgY250KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBsaXN0KyspIHsKKwkJaW50IHJlZzsKKwkJZm9yIChyZWcgPSBsaXN0LT5zdGFydDsgcmVnIDw9IGxpc3QtPmVuZDsgcmVnICs9IDIpCisJCQlibGl6emFyZF9yZWdfY2FjaGVbcmVnIC8gMl0gPSBibGl6emFyZF9yZWFkX3JlZyhyZWcpOworCX0KK30KKworc3RhdGljIHZvaWQgX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgKmxpc3QsIGludCBjbnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGxpc3QrKykgeworCQlpbnQgcmVnOworCQlmb3IgKHJlZyA9IGxpc3QtPnN0YXJ0OyByZWcgPD0gbGlzdC0+ZW5kOyByZWcgKz0gMikKKwkJCWJsaXp6YXJkX3dyaXRlX3JlZyhyZWcsIGJsaXp6YXJkX3JlZ19jYWNoZVtyZWcgLyAyXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zYXZlX2FsbF9yZWdzKHZvaWQpCit7CisJX3NhdmVfcmVncyhibGl6emFyZF9wbGxfcmVncywgQVJSQVlfU0laRShibGl6emFyZF9wbGxfcmVncykpOworCV9zYXZlX3JlZ3MoYmxpenphcmRfZ2VuX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfZ2VuX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdG9yZV9wbGxfcmVncyh2b2lkKQoreworCV9yZXN0b3JlX3JlZ3MoYmxpenphcmRfcGxsX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfcGxsX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdG9yZV9nZW5fcmVncyh2b2lkKQoreworCV9yZXN0b3JlX3JlZ3MoYmxpenphcmRfZ2VuX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfZ2VuX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfc3VzcGVuZCh2b2lkKQoreworCXUzMiBsOworCXVuc2lnbmVkIGxvbmcgdG1vOworCisJaWYgKGJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSkgeworCQl1cGRhdGVfZnVsbF9zY3JlZW4oKTsKKwkJYmxpenphcmRfc3luYygpOworCX0KKwlibGl6emFyZC51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCA9IGJsaXp6YXJkLnVwZGF0ZV9tb2RlOworCS8qIHRoZSBmb2xsb3dpbmcgd2lsbCBkaXNhYmxlIGNsb2NrcyBhcyB3ZWxsICovCisJYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCisJYmxpenphcmRfc2F2ZV9hbGxfcmVncygpOworCisJYmxpenphcmRfc3RvcF9zZHJhbSgpOworCisJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUpOworCS8qIFN0YW5kYnksIFNsZWVwLiBXZSBhc3N1bWUgd2UgdXNlIGFuIGV4dGVybmFsIGNsb2NrLiAqLworCWwgfD0gMHgwMzsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSwgbCk7CisKKwl0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICghKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9NT0RFKSAmICgxIDw8IDEpKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJInMxZDEzNzR4OiBzbGVlcCB0aW1lb3V0LCBzdG9wcGluZyBQTEwgbWFudWFsbHlcbiIpOworCQkJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9NT0RFKTsKKwkJCWwgJj0gfjB4MDM7CisJCQkvKiBEaXNhYmxlIFBMTCwgY291bnRlciBmdW5jdGlvbiAqLworCQkJbCB8PSAweDI7CisJCQlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUExMX01PREUsIGwpOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDEpOworCX0KKworCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oYmxpenphcmQuZmJkZXYtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3VtZSh2b2lkKQoreworCXUzMiBsOworCisJaWYgKGJsaXp6YXJkLnBvd2VyX3VwICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX3VwKGJsaXp6YXJkLmZiZGV2LT5kZXYpOworCisJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUpOworCS8qIFN0YW5kYnksIFNsZWVwICovCisJbCAmPSB+MHgwMzsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSwgbCk7CisKKwlibGl6emFyZF9yZXN0b3JlX3BsbF9yZWdzKCk7CisJbCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9NT0RFKTsKKwlsICY9IH4weDAzOworCS8qIEVuYWJsZSBQTEwsIGNvdW50ZXIgZnVuY3Rpb24gKi8KKwlsIHw9IDB4MTsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUExMX01PREUsIGwpOworCisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAoMSA8PCA3KSkpCisJCW1zbGVlcCgxKTsKKworCWJsaXp6YXJkX3Jlc3RhcnRfc2RyYW0oKTsKKworCWJsaXp6YXJkX3Jlc3RvcmVfZ2VuX3JlZ3MoKTsKKworCS8qIEVuYWJsZSBkaXNwbGF5ICovCisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX0RJU1BMQVlfTU9ERSwgMHgwMSk7CisKKwkvKiB0aGUgZm9sbG93aW5nIHdpbGwgZW5hYmxlIGNsb2NrcyBhcyBuZWNlc3NhcnkgKi8KKwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoYmxpenphcmQudXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQpOworCisJLyogRm9yY2UgYSBiYWNrZ3JvdW5kIHVwZGF0ZSAqLworCWJsaXp6YXJkLnpvb21fb24gPSAxOworCXVwZGF0ZV9mdWxsX3NjcmVlbigpOworCWJsaXp6YXJkX3N5bmMoKTsKK30KKworc3RhdGljIGludCBibGl6emFyZF9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IGV4dF9tb2RlLAorCQkJIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByID0gMCwgaTsKKwl1OCByZXYsIGNvbmY7CisJdW5zaWduZWQgbG9uZyBleHRfY2xrOworCWludCBleHRpZl9kaXY7CisJdW5zaWduZWQgbG9uZyBzeXNfY2xrLCBwaXhfY2xrOworCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqb21hcGZiX2NvbmY7CisJc3RydWN0IGJsaXp6YXJkX3BsYXRmb3JtX2RhdGEgKmN0cmxfY29uZjsKKworCWJsaXp6YXJkLmZiZGV2ID0gZmJkZXY7CisKKwlCVUdfT04oIWZiZGV2LT5leHRfaWYgfHwgIWZiZGV2LT5pbnRfY3RybCk7CisKKwlibGl6emFyZC5mYmRldiA9IGZiZGV2OworCWJsaXp6YXJkLmV4dGlmID0gZmJkZXYtPmV4dF9pZjsKKwlibGl6emFyZC5pbnRfY3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKworCW9tYXBmYl9jb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwljdHJsX2NvbmYgPSBvbWFwZmJfY29uZi0+Y3RybF9wbGF0Zm9ybV9kYXRhOworCWlmIChjdHJsX2NvbmYgPT0gTlVMTCB8fCBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlID09IE5VTEwpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiczFkMTM3NHg6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQorCisJYmxpenphcmQucG93ZXJfZG93biA9IGN0cmxfY29uZi0+cG93ZXJfZG93bjsKKwlibGl6emFyZC5wb3dlcl91cCA9IGN0cmxfY29uZi0+cG93ZXJfdXA7CisKKwlzcGluX2xvY2tfaW5pdCgmYmxpenphcmQucmVxX2xvY2spOworCisJaWYgKChyID0gYmxpenphcmQuaW50X2N0cmwtPmluaXQoZmJkZXYsIDEsIHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGVycjE7CisKKwlpZiAoKHIgPSBibGl6emFyZC5leHRpZi0+aW5pdChmYmRldikpIDwgMCkKKwkJZ290byBlcnIyOworCisJYmxpenphcmRfY3RybC5zZXRfY29sb3Jfa2V5ID0gYmxpenphcmQuaW50X2N0cmwtPnNldF9jb2xvcl9rZXk7CisJYmxpenphcmRfY3RybC5nZXRfY29sb3Jfa2V5ID0gYmxpenphcmQuaW50X2N0cmwtPmdldF9jb2xvcl9rZXk7CisJYmxpenphcmRfY3RybC5zZXR1cF9tZW0gPSBibGl6emFyZC5pbnRfY3RybC0+c2V0dXBfbWVtOworCWJsaXp6YXJkX2N0cmwubW1hcCA9IGJsaXp6YXJkLmludF9jdHJsLT5tbWFwOworCisJZXh0X2NsayA9IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUoZmJkZXYtPmRldik7CisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKGV4dF9jbGssICZleHRpZl9kaXYpKSA8IDApCisJCWdvdG8gZXJyMzsKKworCXNldF9leHRpZl90aW1pbmdzKCZibGl6emFyZC5yZWdfdGltaW5ncyk7CisKKwlpZiAoYmxpenphcmQucG93ZXJfdXAgIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfdXAoZmJkZXYtPmRldik7CisKKwljYWxjX2JsaXp6YXJkX2Nsa19yYXRlcyhleHRfY2xrLCAmc3lzX2NsaywgJnBpeF9jbGspOworCisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKHN5c19jbGssICZleHRpZl9kaXYpKSA8IDApCisJCWdvdG8gZXJyMzsKKwlzZXRfZXh0aWZfdGltaW5ncygmYmxpenphcmQucmVnX3RpbWluZ3MpOworCisJaWYgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAweDgwKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkiY29udHJvbGxlciBub3QgaW5pdGlhbGl6ZWQgYnkgdGhlIGJvb3Rsb2FkZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIzOworCX0KKworCWlmIChjdHJsX2NvbmYtPnRlX2Nvbm5lY3RlZCkgeworCQlpZiAoKHIgPSBzZXR1cF90ZWFyc3luYyhwaXhfY2xrLCBleHRpZl9kaXYpKSA8IDApCisJCQlnb3RvIGVycjM7CisJCWJsaXp6YXJkLnRlX2Nvbm5lY3RlZCA9IDE7CisJfQorCisJcmV2ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUkVWX0NPREUpOworCWNvbmYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9DT05GSUcpOworCisJc3dpdGNoIChyZXYgJiAweGZjKSB7CisJY2FzZSAweDljOgorCQlibGl6emFyZC52ZXJzaW9uID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NDsKKwkJcHJfaW5mbygib21hcGZiOiBzMWQxMzc0NCBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKwkJYnJlYWs7CisJY2FzZSAweGE0OgorCQlibGl6emFyZC52ZXJzaW9uID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NTsKKwkJcHJfaW5mbygib21hcGZiOiBzMWQxMzc0NSBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiaW52YWxpZCBzMWQxMzc0eCByZXZpc2lvbiAlMDJ4XG4iLAorCQkJcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMzsKKwl9CisKKwlibGl6emFyZC5tYXhfdHJhbnNtaXRfc2l6ZSA9IGJsaXp6YXJkLmV4dGlmLT5tYXhfdHJhbnNtaXRfc2l6ZTsKKworCWJsaXp6YXJkLnVwZGF0ZV9tb2RlID0gT01BUEZCX1VQREFURV9ESVNBQkxFRDsKKworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy54ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cueSA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LndpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cuaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X3ggPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfeCA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF93aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5mb3JtYXQgPSAwOworCisJYmxpenphcmQuc2NyZWVuX3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5zY3JlZW5faGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKworCWluaXRfdGltZXIoJmJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyKTsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lci5mdW5jdGlvbiA9IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXV0bzsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lci5kYXRhID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZibGl6emFyZC5mcmVlX3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYmxpenphcmQucGVuZGluZ19yZXFfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmxpenphcmQucmVxX3Bvb2wpOyBpKyspCisJCWxpc3RfYWRkKCZibGl6emFyZC5yZXFfcG9vbFtpXS5lbnRyeSwgJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpOworCUJVR19PTihpIDw9IElSUV9SRVFfUE9PTF9TSVpFKTsKKwlzZW1hX2luaXQoJmJsaXp6YXJkLnJlcV9zZW1hLCBpIC0gSVJRX1JFUV9QT09MX1NJWkUpOworCisJcmV0dXJuIDA7CitlcnIzOgorCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oZmJkZXYtPmRldik7CisJYmxpenphcmQuZXh0aWYtPmNsZWFudXAoKTsKK2VycjI6CisJYmxpenphcmQuaW50X2N0cmwtPmNsZWFudXAoKTsKK2VycjE6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX2NsZWFudXAodm9pZCkKK3sKKwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJYmxpenphcmQuZXh0aWYtPmNsZWFudXAoKTsKKwlibGl6emFyZC5pbnRfY3RybC0+Y2xlYW51cCgpOworCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oYmxpenphcmQuZmJkZXYtPmRldik7Cit9CisKK3N0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsID0geworCS5uYW1lCQkJPSAiYmxpenphcmQiLAorCS5pbml0CQkJPSBibGl6emFyZF9pbml0LAorCS5jbGVhbnVwCQk9IGJsaXp6YXJkX2NsZWFudXAsCisJLmJpbmRfY2xpZW50CQk9IGJsaXp6YXJkX2JpbmRfY2xpZW50LAorCS5nZXRfY2FwcwkJPSBibGl6emFyZF9nZXRfY2FwcywKKwkuc2V0X3VwZGF0ZV9tb2RlCT0gYmxpenphcmRfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBibGl6emFyZF9nZXRfdXBkYXRlX21vZGUsCisJLnNldHVwX3BsYW5lCQk9IGJsaXp6YXJkX3NldHVwX3BsYW5lLAorCS5zZXRfc2NhbGUJCT0gYmxpenphcmRfc2V0X3NjYWxlLAorCS5lbmFibGVfcGxhbmUJCT0gYmxpenphcmRfZW5hYmxlX3BsYW5lLAorCS51cGRhdGVfd2luZG93CQk9IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMsCisJLnN5bmMJCQk9IGJsaXp6YXJkX3N5bmMsCisJLnN1c3BlbmQJCT0gYmxpenphcmRfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBibGl6emFyZF9yZXN1bWUsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzIzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYwpAQCAtMCwwICsxLDE1MDIgQEAKKy8qCisgKiBPTUFQMiBkaXNwbGF5IGNvbnRyb2xsZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc3JhbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisKKyNpbmNsdWRlICJkaXNwYy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJImRpc3BjIgorCisjZGVmaW5lIERTU19CQVNFCQkJMHg0ODA1MDAwMAorI2RlZmluZSBEU1NfU1lTQ09ORklHCQkJMHgwMDEwCisKKyNkZWZpbmUgRElTUENfQkFTRQkJCTB4NDgwNTA0MDAKKworLyogRElTUEMgY29tbW9uICovCisjZGVmaW5lIERJU1BDX1JFVklTSU9OCQkJMHgwMDAwCisjZGVmaW5lIERJU1BDX1NZU0NPTkZJRwkJCTB4MDAxMAorI2RlZmluZSBESVNQQ19TWVNTVEFUVVMJCQkweDAwMTQKKyNkZWZpbmUgRElTUENfSVJRU1RBVFVTCQkJMHgwMDE4CisjZGVmaW5lIERJU1BDX0lSUUVOQUJMRQkJCTB4MDAxQworI2RlZmluZSBESVNQQ19DT05UUk9MCQkJMHgwMDQwCisjZGVmaW5lIERJU1BDX0NPTkZJRwkJCTB4MDA0NAorI2RlZmluZSBESVNQQ19DQVBBQkxFCQkJMHgwMDQ4CisjZGVmaW5lIERJU1BDX0RFRkFVTFRfQ09MT1IwCQkweDAwNEMKKyNkZWZpbmUgRElTUENfREVGQVVMVF9DT0xPUjEJCTB4MDA1MAorI2RlZmluZSBESVNQQ19UUkFOU19DT0xPUjAJCTB4MDA1NAorI2RlZmluZSBESVNQQ19UUkFOU19DT0xPUjEJCTB4MDA1OAorI2RlZmluZSBESVNQQ19MSU5FX1NUQVRVUwkJMHgwMDVDCisjZGVmaW5lIERJU1BDX0xJTkVfTlVNQkVSCQkweDAwNjAKKyNkZWZpbmUgRElTUENfVElNSU5HX0gJCQkweDAwNjQKKyNkZWZpbmUgRElTUENfVElNSU5HX1YJCQkweDAwNjgKKyNkZWZpbmUgRElTUENfUE9MX0ZSRVEJCQkweDAwNkMKKyNkZWZpbmUgRElTUENfRElWSVNPUgkJCTB4MDA3MAorI2RlZmluZSBESVNQQ19TSVpFX0RJRwkJCTB4MDA3OAorI2RlZmluZSBESVNQQ19TSVpFX0xDRAkJCTB4MDA3QworCisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUxCQkweDAxRDQKKyNkZWZpbmUgRElTUENfREFUQV9DWUNMRTIJCTB4MDFEOAorI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMwkJMHgwMURDCisKKy8qIERJU1BDIEdGWCBwbGFuZSAqLworI2RlZmluZSBESVNQQ19HRlhfQkEwCQkJMHgwMDgwCisjZGVmaW5lIERJU1BDX0dGWF9CQTEJCQkweDAwODQKKyNkZWZpbmUgRElTUENfR0ZYX1BPU0lUSU9OCQkweDAwODgKKyNkZWZpbmUgRElTUENfR0ZYX1NJWkUJCQkweDAwOEMKKyNkZWZpbmUgRElTUENfR0ZYX0FUVFJJQlVURVMJCTB4MDBBMAorI2RlZmluZSBESVNQQ19HRlhfRklGT19USFJFU0hPTEQJMHgwMEE0CisjZGVmaW5lIERJU1BDX0dGWF9GSUZPX1NJWkVfU1RBVFVTCTB4MDBBOAorI2RlZmluZSBESVNQQ19HRlhfUk9XX0lOQwkJMHgwMEFDCisjZGVmaW5lIERJU1BDX0dGWF9QSVhFTF9JTkMJCTB4MDBCMAorI2RlZmluZSBESVNQQ19HRlhfV0lORE9XX1NLSVAJCTB4MDBCNAorI2RlZmluZSBESVNQQ19HRlhfVEFCTEVfQkEJCTB4MDBCOAorCisvKiBESVNQQyBWaWRlbyBwbGFuZSAxLzIgKi8KKyNkZWZpbmUgRElTUENfVklEMV9CQVNFCQkJMHgwMEJDCisjZGVmaW5lIERJU1BDX1ZJRDJfQkFTRQkJCTB4MDE0QworCisvKiBPZmZzZXRzIGludG8gRElTUENfVklEMS8yX0JBU0UgKi8KKyNkZWZpbmUgRElTUENfVklEX0JBMAkJCTB4MDAwMAorI2RlZmluZSBESVNQQ19WSURfQkExCQkJMHgwMDA0CisjZGVmaW5lIERJU1BDX1ZJRF9QT1NJVElPTgkJMHgwMDA4CisjZGVmaW5lIERJU1BDX1ZJRF9TSVpFCQkJMHgwMDBDCisjZGVmaW5lIERJU1BDX1ZJRF9BVFRSSUJVVEVTCQkweDAwMTAKKyNkZWZpbmUgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xECTB4MDAxNAorI2RlZmluZSBESVNQQ19WSURfRklGT19TSVpFX1NUQVRVUwkweDAwMTgKKyNkZWZpbmUgRElTUENfVklEX1JPV19JTkMJCTB4MDAxQworI2RlZmluZSBESVNQQ19WSURfUElYRUxfSU5DCQkweDAwMjAKKyNkZWZpbmUgRElTUENfVklEX0ZJUgkJCTB4MDAyNAorI2RlZmluZSBESVNQQ19WSURfUElDVFVSRV9TSVpFCQkweDAwMjgKKyNkZWZpbmUgRElTUENfVklEX0FDQ1UwCQkJMHgwMDJDCisjZGVmaW5lIERJU1BDX1ZJRF9BQ0NVMQkJCTB4MDAzMAorCisvKiA4IGVsZW1lbnRzIGluIDggYnl0ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIERJU1BDX1ZJRF9GSVJfQ09FRl9IMAkJMHgwMDM0CisvKiA4IGVsZW1lbnRzIGluIDggYnl0ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIERJU1BDX1ZJRF9GSVJfQ09FRl9IVjAJCTB4MDAzOAorLyogNSBlbGVtZW50cyBpbiA0IGJ5dGUgaW5jcmVtZW50cyAqLworI2RlZmluZSBESVNQQ19WSURfQ09OVl9DT0VGMAkJMHgwMDc0CisKKyNkZWZpbmUgRElTUENfSVJRX0ZSQU1FTUFTSwkJMHgwMDAxCisjZGVmaW5lIERJU1BDX0lSUV9WU1lOQwkJCTB4MDAwMgorI2RlZmluZSBESVNQQ19JUlFfRVZTWU5DX0VWRU4JCTB4MDAwNAorI2RlZmluZSBESVNQQ19JUlFfRVZTWU5DX09ERAkJMHgwMDA4CisjZGVmaW5lIERJU1BDX0lSUV9BQ0JJQVNfQ09VTlRfU1RBVAkweDAwMTAKKyNkZWZpbmUgRElTUENfSVJRX1BST0dfTElORV9OVU0JCTB4MDAyMAorI2RlZmluZSBESVNQQ19JUlFfR0ZYX0ZJRk9fVU5ERVJGTE9XCTB4MDA0MAorI2RlZmluZSBESVNQQ19JUlFfR0ZYX0VORF9XSU4JCTB4MDA4MAorI2RlZmluZSBESVNQQ19JUlFfUEFMX0dBTU1BX01BU0sJMHgwMTAwCisjZGVmaW5lIERJU1BDX0lSUV9PQ1BfRVJSCQkweDAyMDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDFfRklGT19VTkRFUkZMT1cJMHgwNDAwCisjZGVmaW5lIERJU1BDX0lSUV9WSUQxX0VORF9XSU4JCTB4MDgwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMl9GSUZPX1VOREVSRkxPVwkweDEwMDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDJfRU5EX1dJTgkJMHgyMDAwCisjZGVmaW5lIERJU1BDX0lSUV9TWU5DX0xPU1QJCTB4NDAwMAorCisjZGVmaW5lIERJU1BDX0lSUV9NQVNLX0FMTAkJMHg3ZmZmCisKKyNkZWZpbmUgRElTUENfSVJRX01BU0tfRVJST1IJCShESVNQQ19JUlFfR0ZYX0ZJRk9fVU5ERVJGTE9XIHwJXAorCQkJCQkgICAgIERJU1BDX0lSUV9WSUQxX0ZJRk9fVU5ERVJGTE9XIHwgXAorCQkJCQkgICAgIERJU1BDX0lSUV9WSUQyX0ZJRk9fVU5ERVJGTE9XIHwgXAorCQkJCQkgICAgIERJU1BDX0lSUV9TWU5DX0xPU1QpCisKKyNkZWZpbmUgUkZCSV9DT05UUk9MCQkJMHg0ODA1MDA0MAorCisjZGVmaW5lIE1BWF9QQUxFVFRFX1NJWkUJCSgyNTYgKiAxNikKKworI2RlZmluZSBGTERfTUFTSyhwb3MsIGxlbikJKCgoMSA8PCBsZW4pIC0gMSkgPDwgcG9zKQorCisjZGVmaW5lIE1PRF9SRUdfRkxEKHJlZywgbWFzaywgdmFsKSBcCisJZGlzcGNfd3JpdGVfcmVnKChyZWcpLCAoZGlzcGNfcmVhZF9yZWcocmVnKSAmIH4obWFzaykpIHwgKHZhbCkpOworCisjZGVmaW5lIE9NQVAyX1NSQU1fU1RBUlQJCTB4NDAyMDAwMDAKKy8qIE1heGltdW0gc2l6ZSwgaW4gcmVhbGl0eSB0aGlzIGlzIHNtYWxsZXIgaWYgU1JBTSBpcyBwYXJ0aWFsbHkgbG9ja2VkLiAqLworI2RlZmluZSBPTUFQMl9TUkFNX1NJWkUJCQkweGEwMDAwCQkvKiA2NDBrICovCisKKy8qIFdlIHN1cHBvcnQgdGhlIFNEUkFNIC8gU1JBTSB0eXBlcy4gU2VlIE9NQVBGQl9QTEFORV9NRU1UWVBFXyogaW4gb21hcGZiLmggKi8KKyNkZWZpbmUgRElTUENfTUVNVFlQRV9OVU0JCTIKKworI2RlZmluZSBSRVNNQVBfU0laRShfcGFnZV9jbnQpCQkJCQkJXAorCSgoX3BhZ2VfY250ICsgKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpIC0gMSkgLyA4KQorI2RlZmluZSBSRVNNQVBfUFRSKF9yZXNfbWFwLCBfcGFnZV9ucikJCQkJCVwKKwkoKChfcmVzX21hcCktPm1hcCkgKyAoX3BhZ2VfbnIpIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpKQorI2RlZmluZSBSRVNNQVBfTUFTSyhfcGFnZV9ucikJCQkJCQlcCisJKDEgPDwgKChfcGFnZV9ucikgJiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCAtIDEpKSkKKworc3RydWN0IHJlc21hcCB7CisJdW5zaWduZWQgbG9uZwlzdGFydDsKKwl1bnNpZ25lZAlwYWdlX2NudDsKKwl1bnNpZ25lZCBsb25nCSptYXA7Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwl1MzIJCWJhc2U7CisKKwlzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjCW1lbV9kZXNjOworCXN0cnVjdCByZXNtYXAJCSpyZXNfbWFwW0RJU1BDX01FTVRZUEVfTlVNXTsKKwlhdG9taWNfdAkJbWFwX2NvdW50W09NQVBGQl9QTEFORV9OVU1dOworCisJZG1hX2FkZHJfdAlwYWxldHRlX3BhZGRyOworCXZvaWQJCSpwYWxldHRlX3ZhZGRyOworCisJaW50CQlleHRfbW9kZTsKKworCXVuc2lnbmVkIGxvbmcJZW5hYmxlZF9pcnFzOworCXZvaWQJCSgqaXJxX2NhbGxiYWNrKSh2b2lkICopOworCXZvaWQJCSppcnFfY2FsbGJhY2tfZGF0YTsKKwlzdHJ1Y3QgY29tcGxldGlvbglmcmFtZV9kb25lOworCisJaW50CQlmaXJfaGluY1tPTUFQRkJfUExBTkVfTlVNXTsKKwlpbnQJCWZpcl92aW5jW09NQVBGQl9QTEFORV9OVU1dOworCisJc3RydWN0IGNsawkqZHNzX2ljaywgKmRzczFfZmNrOworCXN0cnVjdCBjbGsJKmRzc181NG1fZmNrOworCisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCisJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkJY29sb3Jfa2V5OworfSBkaXNwYzsKKworc3RhdGljIHZvaWQgZW5hYmxlX2xjZF9jbG9ja3MoaW50IGVuYWJsZSk7CisKK3N0YXRpYyB2b2lkIGlubGluZSBkaXNwY193cml0ZV9yZWcoaW50IGlkeCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBkaXNwYy5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIHUzMiBpbmxpbmUgZGlzcGNfcmVhZF9yZWcoaW50IGlkeCkKK3sKKwl1MzIgbCA9IF9fcmF3X3JlYWRsKGRpc3BjLmJhc2UgKyBpZHgpOworCXJldHVybiBsOworfQorCisvKiBTZWxlY3QgUkZCSSBvciBieXBhc3MgbW9kZSAqLworc3RhdGljIHZvaWQgZW5hYmxlX3JmYmlfbW9kZShpbnQgZW5hYmxlKQoreworCXUzMiBsOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCS8qIEVuYWJsZSBSRkJJLCBHUElPMC8xICovCisJbCAmPSB+KCgxIDw8IDExKSB8ICgxIDw8IDE1KSB8ICgxIDw8IDE2KSk7CisJbCB8PSBlbmFibGUgPyAoMSA8PCAxMSkgOiAwOworCS8qIFJGQkkgRW46IEdQSU8wLzE9MTAgIFJGQkkgRGlzOiBHUElPMC8xPTExICovCisJbCB8PSAxIDw8IDE1OworCWwgfD0gZW5hYmxlID8gMCA6ICgxIDw8IDE2KTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfQ09OVFJPTCwgbCk7CisKKwkvKiBTZXQgYnlwYXNzIG1vZGUgaW4gUkZCSSBtb2R1bGUgKi8KKwlsID0gX19yYXdfcmVhZGwoaW9fcDJ2KFJGQklfQ09OVFJPTCkpOworCWwgfD0gZW5hYmxlID8gMCA6ICgxIDw8IDEpOworCV9fcmF3X3dyaXRlbChsLCBpb19wMnYoUkZCSV9DT05UUk9MKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sY2RfZGF0YV9saW5lcyhpbnQgZGF0YV9saW5lcykKK3sKKwl1MzIgbDsKKwlpbnQgY29kZSA9IDA7CisKKwlzd2l0Y2ggKGRhdGFfbGluZXMpIHsKKwljYXNlIDEyOgorCQljb2RlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJY29kZSA9IDE7CisJCWJyZWFrOworCWNhc2UgMTg6CisJCWNvZGUgPSAyOworCQlicmVhazsKKwljYXNlIDI0OgorCQljb2RlID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCWwgJj0gfigweDAzIDw8IDgpOworCWwgfD0gY29kZSA8PCA4OworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xvYWRfbW9kZShpbnQgbW9kZSkKK3sKKwlCVUdfT04obW9kZSAmIH4oRElTUENfTE9BRF9DTFVUX09OTFkgfCBESVNQQ19MT0FEX0ZSQU1FX09OTFkgfAorCQkJRElTUENfTE9BRF9DTFVUX09OQ0VfRlJBTUUpKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05GSUcsIDB4MDMgPDwgMSwgbW9kZSA8PCAxKTsKK30KKwordm9pZCBvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZShpbnQgeCwgaW50IHkpCit7CisJQlVHX09OKCh4ID4gKDEgPDwgMTEpKSB8fCAoeSA+ICgxIDw8IDExKSkpOworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX1NJWkVfTENELCBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkJKCh5IC0gMSkgPDwgMTYpIHwgKHggLSAxKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKTsKKwordm9pZCBvbWFwX2Rpc3BjX3NldF9kaWdpdF9zaXplKGludCB4LCBpbnQgeSkKK3sKKwlCVUdfT04oKHggPiAoMSA8PCAxMSkpIHx8ICh5ID4gKDEgPDwgMTEpKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfU0laRV9ESUcsIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksCisJCQkoKHkgLSAxKSA8PCAxNikgfCAoeCAtIDEpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19zZXRfZGlnaXRfc2l6ZSk7CisKK3N0YXRpYyB2b2lkIHNldHVwX3BsYW5lX2ZpZm8oaW50IHBsYW5lLCBpbnQgZXh0X21vZGUpCit7CisJY29uc3QgdTMyIGZ0cnNfcmVnW10gPSB7IERJU1BDX0dGWF9GSUZPX1RIUkVTSE9MRCwKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklGT19USFJFU0hPTEQsCisJCQkgICAgICAgIERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1RIUkVTSE9MRCB9OworCWNvbnN0IHUzMiBmc3pfcmVnW10gPSB7IERJU1BDX0dGWF9GSUZPX1NJWkVfU1RBVFVTLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTIH07CisJaW50IGxvdywgaGlnaDsKKwl1MzIgbDsKKworCUJVR19PTihwbGFuZSA+IDIpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKGZzel9yZWdbcGxhbmVdKTsKKwlsICY9IEZMRF9NQVNLKDAsIDkpOworCWlmIChleHRfbW9kZSkgeworCQlsb3cgPSBsICogMyAvIDQ7CisJCWhpZ2ggPSBsOworCX0gZWxzZSB7CisJCWxvdyA9IGwgLyA0OworCQloaWdoID0gbCAqIDMgLyA0OworCX0KKwlNT0RfUkVHX0ZMRChmdHJzX3JlZ1twbGFuZV0sIEZMRF9NQVNLKDE2LCA5KSB8IEZMRF9NQVNLKDAsIDkpLAorCQkJKGhpZ2ggPDwgMTYpIHwgbG93KTsKK30KKwordm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KGludCBlbmFibGUpCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfQ09OVFJPTCwgMSwgZW5hYmxlID8gMSA6IDApOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KTsKKwordm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9kaWdpdF9vdXQoaW50IGVuYWJsZSkKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05UUk9MLCAxIDw8IDEsIGVuYWJsZSA/IDEgPDwgMSA6IDApOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2VuYWJsZV9kaWdpdF9vdXQpOworCitzdGF0aWMgaW5saW5lIGludCBfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1MzIgcGFkZHIsIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJY29uc3QgdTMyIGF0X3JlZ1tdID0geyBESVNQQ19HRlhfQVRUUklCVVRFUywKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUywKKwkJCSAgICAgICAgRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMgfTsKKwljb25zdCB1MzIgYmFfcmVnW10gPSB7IERJU1BDX0dGWF9CQTAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9CQTAsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0JBMCB9OworCWNvbnN0IHUzMiBwc19yZWdbXSA9IHsgRElTUENfR0ZYX1BPU0lUSU9OLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9QT1NJVElPTiwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfUE9TSVRJT04gfTsKKwljb25zdCB1MzIgc3pfcmVnW10gPSB7IERJU1BDX0dGWF9TSVpFLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1BJQ1RVUkVfU0laRSB9OworCWNvbnN0IHUzMiByaV9yZWdbXSA9IHsgRElTUENfR0ZYX1JPV19JTkMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1JPV19JTkMsCisJCQkgICAgICAgIERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9ST1dfSU5DIH07CisJY29uc3QgdTMyIHZzX3JlZ1tdID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfU0laRSwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfU0laRSB9OworCisJaW50IGNob3V0X3NoaWZ0LCBidXJzdF9zaGlmdDsKKwlpbnQgY2hvdXRfdmFsOworCWludCBjb2xvcl9jb2RlOworCWludCBicHA7CisJaW50IGNjb252X2VuOworCWludCBzZXRfdnNpemU7CisJdTMyIGw7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAicGxhbmUgJWQgY2hhbm5lbCAlZCBwYWRkciAlIzA4eCBzY3Jfd2lkdGggJWQiCisJCSAgICAiIHBvc194ICVkIHBvc195ICVkIHdpZHRoICVkIGhlaWdodCAlZCBjb2xvcl9tb2RlICVkXG4iLAorCQkgICAgcGxhbmUsIGNoYW5uZWxfb3V0LCBwYWRkciwgc2NyZWVuX3dpZHRoLCBwb3NfeCwgcG9zX3ksCisJCSAgICB3aWR0aCwgaGVpZ2h0LCBjb2xvcl9tb2RlKTsKKyNlbmRpZgorCisJc2V0X3ZzaXplID0gMDsKKwlzd2l0Y2ggKHBsYW5lKSB7CisJY2FzZSBPTUFQRkJfUExBTkVfR0ZYOgorCQlidXJzdF9zaGlmdCA9IDY7CisJCWNob3V0X3NoaWZ0ID0gODsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfUExBTkVfVklEMToKKwljYXNlIE9NQVBGQl9QTEFORV9WSUQyOgorCQlidXJzdF9zaGlmdCA9IDE0OworCQljaG91dF9zaGlmdCA9IDE2OworCQlzZXRfdnNpemUgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGNoYW5uZWxfb3V0KSB7CisJY2FzZSBPTUFQRkJfQ0hBTk5FTF9PVVRfTENEOgorCQljaG91dF92YWwgPSAwOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9ESUdJVDoKKwkJY2hvdXRfdmFsID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2NvbnZfZW4gPSAwOworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJY29sb3JfY29kZSA9IERJU1BDX1JHQl8xNl9CUFA7CisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCWlmIChwbGFuZSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNvbG9yX2NvZGUgPSBESVNQQ19VWVZZXzQyMjsKKwkJY2NvbnZfZW4gPSAxOworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlpZiAocGxhbmUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQljb2xvcl9jb2RlID0gRElTUENfWVVWMl80MjI7CisJCWNjb252X2VuID0gMTsKKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWwgPSBkaXNwY19yZWFkX3JlZyhhdF9yZWdbcGxhbmVdKTsKKworCWwgJj0gfigweDBmIDw8IDEpOworCWwgfD0gY29sb3JfY29kZSA8PCAxOworCWwgJj0gfigxIDw8IDkpOworCWwgfD0gY2NvbnZfZW4gPDwgOTsKKworCWwgJj0gfigweDAzIDw8IGJ1cnN0X3NoaWZ0KTsKKwlsIHw9IERJU1BDX0JVUlNUXzh4MzIgPDwgYnVyc3Rfc2hpZnQ7CisKKwlsICY9IH4oMSA8PCBjaG91dF9zaGlmdCk7CisJbCB8PSBjaG91dF92YWwgPDwgY2hvdXRfc2hpZnQ7CisKKwlkaXNwY193cml0ZV9yZWcoYXRfcmVnW3BsYW5lXSwgbCk7CisKKwlkaXNwY193cml0ZV9yZWcoYmFfcmVnW3BsYW5lXSwgcGFkZHIpOworCU1PRF9SRUdfRkxEKHBzX3JlZ1twbGFuZV0sCisJCSAgICBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLCAocG9zX3kgPDwgMTYpIHwgcG9zX3gpOworCisJTU9EX1JFR19GTEQoc3pfcmVnW3BsYW5lXSwgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJCSgoaGVpZ2h0IC0gMSkgPDwgMTYpIHwgKHdpZHRoIC0gMSkpOworCisJaWYgKHNldF92c2l6ZSkgeworCQkvKiBTZXQgdmlkZW8gc2l6ZSBpZiBzZXRfc2NhbGUgaGFzbid0IHNldCBpdCAqLworCQlpZiAoIWRpc3BjLmZpcl92aW5jW3BsYW5lXSkKKwkJCU1PRF9SRUdfRkxEKHZzX3JlZ1twbGFuZV0sCisJCQkJRkxEX01BU0soMTYsIDExKSwgKGhlaWdodCAtIDEpIDw8IDE2KTsKKwkJaWYgKCFkaXNwYy5maXJfaGluY1twbGFuZV0pCisJCQlNT0RfUkVHX0ZMRCh2c19yZWdbcGxhbmVdLAorCQkJCUZMRF9NQVNLKDAsIDExKSwgd2lkdGggLSAxKTsKKwl9CisKKwlkaXNwY193cml0ZV9yZWcocmlfcmVnW3BsYW5lXSwgKHNjcmVlbl93aWR0aCAtIHdpZHRoKSAqIGJwcCAvIDggKyAxKTsKKworCXJldHVybiBoZWlnaHQgKiBzY3JlZW5fd2lkdGggKiBicHAgLyA4OworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJdTMyIHBhZGRyOworCWludCByOworCisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCXBhZGRyID0gZGlzcGMubWVtX2Rlc2MucmVnaW9uW3BsYW5lXS5wYWRkciArIG9mZnNldDsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlyID0gX3NldHVwX3BsYW5lKHBsYW5lLCBjaGFubmVsX291dCwgcGFkZHIsCisJCQlzY3JlZW5fd2lkdGgsCisJCQlwb3NfeCwgcG9zX3ksIHdpZHRoLCBoZWlnaHQsIGNvbG9yX21vZGUpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9maXJoX3JlZyhpbnQgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgYmFzZTsKKworCWlmIChwbGFuZSA9PSAxKQorCQliYXNlID0gRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0gwOworCWVsc2UKKwkJYmFzZSA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IMDsKKwlkaXNwY193cml0ZV9yZWcoYmFzZSArIHJlZyAqIDgsCXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZmlyaHZfcmVnKGludCBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCXUzMiBiYXNlOworCisJaWYgKHBsYW5lID09IDEpCisJCWJhc2UgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklSX0NPRUZfSFYwOworCWVsc2UKKwkJYmFzZSA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IVjA7CisJZGlzcGNfd3JpdGVfcmVnKGJhc2UgKyByZWcgKiA4LAl2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF91cHNhbXBsaW5nX2NvZWZfdGFibGUoaW50IHBsYW5lKQoreworCWNvbnN0IHUzMiBjb2VmW11bMl0gPSB7CisJCXsgMHgwMDgwMDAwMCwgMHgwMDgwMDAwMCB9LAorCQl7IDB4MEQ3Q0Y4MDAsIDB4MDM3QjAyRkYgfSwKKwkJeyAweDFFNzBGNUZGLCAweDBDNkYwNUZFIH0sCisJCXsgMHgzMzVGRjVGRSwgMHgyMDU5MDdGQiB9LAorCQl7IDB4Rjc0OTQ5RjcsIDB4MDA0MDQwMDAgfSwKKwkJeyAweEY1NUYzM0ZCLCAweDA3NTkyMEZFIH0sCisJCXsgMHhGNTcwMUVGRSwgMHgwNTZGMENGRiB9LAorCQl7IDB4Rjg3QzBERkYsIDB4MDI3QjAzMDAgfSwKKwl9OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl3cml0ZV9maXJoX3JlZyhwbGFuZSwgaSwgY29lZltpXVswXSk7CisJCXdyaXRlX2Zpcmh2X3JlZyhwbGFuZSwgaSwgY29lZltpXVsxXSk7CisJfQorfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0X3NjYWxlKGludCBwbGFuZSwKKwkJCQlpbnQgb3JpZ193aWR0aCwgaW50IG9yaWdfaGVpZ2h0LAorCQkJCWludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0KQoreworCWNvbnN0IHUzMiBhdF9yZWdbXSAgPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTIH07CisJY29uc3QgdTMyIHZzX3JlZ1tdICA9IHsgMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1NJWkUsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1NJWkUgfTsKKwljb25zdCB1MzIgZmlyX3JlZ1tdID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklSLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9GSVIgfTsKKworCXUzMiBsOworCWludCBmaXJfaGluYzsKKwlpbnQgZmlyX3ZpbmM7CisKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGxhbmUgPT0gT01BUEZCX1BMQU5FX0dGWCAmJgorCSAgICAob3V0X3dpZHRoICE9IG9yaWdfd2lkdGggfHwgb3V0X2hlaWdodCAhPSBvcmlnX2hlaWdodCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJaWYgKG9yaWdfd2lkdGggPCBvdXRfd2lkdGgpIHsKKwkJLyoKKwkJICogVXBzYW1wbGluZy4KKwkJICogQ3VycmVudGx5IHlvdSBjYW4gb25seSBzY2FsZSBib3RoIGRpbWVuc2lvbnMgaW4gb25lIHdheS4KKwkJICovCisJCWlmIChvcmlnX2hlaWdodCA+IG91dF9oZWlnaHQgfHwKKwkJICAgIG9yaWdfd2lkdGggKiA4IDwgb3V0X3dpZHRoIHx8CisJCSAgICBvcmlnX2hlaWdodCAqIDggPCBvdXRfaGVpZ2h0KSB7CisJCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNldF91cHNhbXBsaW5nX2NvZWZfdGFibGUocGxhbmUpOworCX0gZWxzZSBpZiAob3JpZ193aWR0aCA+IG91dF93aWR0aCkgeworCQkvKiBEb3duc2FtcGxpbmcgbm90IHlldCBzdXBwb3J0ZWQKKwkJKi8KKworCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghb3JpZ193aWR0aCB8fCBvcmlnX3dpZHRoID09IG91dF93aWR0aCkKKwkJZmlyX2hpbmMgPSAwOworCWVsc2UKKwkJZmlyX2hpbmMgPSAxMDI0ICogb3JpZ193aWR0aCAvIG91dF93aWR0aDsKKwlpZiAoIW9yaWdfaGVpZ2h0IHx8IG9yaWdfaGVpZ2h0ID09IG91dF9oZWlnaHQpCisJCWZpcl92aW5jID0gMDsKKwllbHNlCisJCWZpcl92aW5jID0gMTAyNCAqIG9yaWdfaGVpZ2h0IC8gb3V0X2hlaWdodDsKKwlkaXNwYy5maXJfaGluY1twbGFuZV0gPSBmaXJfaGluYzsKKwlkaXNwYy5maXJfdmluY1twbGFuZV0gPSBmaXJfdmluYzsKKworCU1PRF9SRUdfRkxEKGZpcl9yZWdbcGxhbmVdLAorCQkgICAgRkxEX01BU0soMTYsIDEyKSB8IEZMRF9NQVNLKDAsIDEyKSwKKwkJICAgICgoZmlyX3ZpbmMgJiA0MDk1KSA8PCAxNikgfAorCQkgICAgKGZpcl9oaW5jICYgNDA5NSkpOworCisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAib3V0X3dpZHRoICVkIG91dF9oZWlnaHQgJWQgb3JpZ193aWR0aCAlZCAiCisJCSJvcmlnX2hlaWdodCAlZCBmaXJfaGluYyAgJWQgZmlyX3ZpbmMgJWRcbiIsCisJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsCisJCWZpcl9oaW5jLCBmaXJfdmluYyk7CisKKwlNT0RfUkVHX0ZMRCh2c19yZWdbcGxhbmVdLAorCQkgICAgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJICAgICgob3V0X2hlaWdodCAtIDEpIDw8IDE2KSB8IChvdXRfd2lkdGggLSAxKSk7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoYXRfcmVnW3BsYW5lXSk7CisJbCAmPSB+KDB4MDMgPDwgNSk7CisJbCB8PSBmaXJfaGluYyA/ICgxIDw8IDUpIDogMDsKKwlsIHw9IGZpcl92aW5jID8gKDEgPDwgNikgOiAwOworCWRpc3BjX3dyaXRlX3JlZyhhdF9yZWdbcGxhbmVdLCBsKTsKKworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwljb25zdCB1MzIgYXRfcmVnW10gPSB7IERJU1BDX0dGWF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTIH07CisJaWYgKCh1bnNpZ25lZCBpbnQpcGxhbmUgPiBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKGF0X3JlZ1twbGFuZV0sIDEsIGVuYWJsZSA/IDEgOiAwKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJdTMyIGRmX3JlZywgdHJfcmVnOworCWludCBzaGlmdCwgdmFsOworCisJc3dpdGNoIChjay0+Y2hhbm5lbF9vdXQpIHsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9MQ0Q6CisJCWRmX3JlZyA9IERJU1BDX0RFRkFVTFRfQ09MT1IwOworCQl0cl9yZWcgPSBESVNQQ19UUkFOU19DT0xPUjA7CisJCXNoaWZ0ID0gMTA7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0RJR0lUOgorCQlkZl9yZWcgPSBESVNQQ19ERUZBVUxUX0NPTE9SMTsKKwkJdHJfcmVnID0gRElTUENfVFJBTlNfQ09MT1IxOworCQlzaGlmdCA9IDEyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3dpdGNoIChjay0+a2V5X3R5cGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9LRVlfRElTQUJMRUQ6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9HRlhfRFNUOgorCQl2YWwgPSAxOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9LRVlfVklEX1NSQzoKKwkJdmFsID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTkZJRywgRkxEX01BU0soc2hpZnQsIDIpLCB2YWwgPDwgc2hpZnQpOworCisJaWYgKHZhbCAhPSAwKQorCQlkaXNwY193cml0ZV9yZWcodHJfcmVnLCBjay0+dHJhbnNfa2V5KTsKKwlkaXNwY193cml0ZV9yZWcoZGZfcmVnLCBjay0+YmFja2dyb3VuZCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisKKwlkaXNwYy5jb2xvcl9rZXkgPSAqY2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX2dldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCSpjayA9IGRpc3BjLmNvbG9yX2tleTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9wYWxldHRlKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAobW9kZSAhPSBkaXNwYy51cGRhdGVfbW9kZSkgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCQllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwkJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMSk7CisJCQlkaXNwYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQlicmVhazsKKwkJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQkJaW5pdF9jb21wbGV0aW9uKCZkaXNwYy5mcmFtZV9kb25lKTsKKwkJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMCk7CisJCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGlzcGMuZnJhbWVfZG9uZSwKKwkJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkgeworCQkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwKKwkJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworCQkJfQorCQkJZGlzcGMudXBkYXRlX21vZGUgPSBtb2RlOworCQkJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXIgPSAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19QTEFORV9SRUxPQ0FURV9NRU07CisJaWYgKHBsYW5lID4gMCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19QTEFORV9TQ0FMRTsKKwljYXBzLT5wbGFuZV9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1KSB8CisJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjIpIHwKKwkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVWTQyMik7CisJaWYgKHBsYW5lID09IDApCisJCWNhcHMtPnBsYW5lX2NvbG9yIHw9ICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzRCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzJCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzFCUFApIHwKKwkJCQkgICAgICgxIDw8IE9NQVBGQl9DT0xPUl9SR0I0NDQpOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgb21hcF9kaXNwY19nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gZGlzcGMudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NvbG9yX2NvbnZfY29lZih2b2lkKQoreworCXUzMiBtYXNrID0gRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKTsKKwlpbnQgY2YxX3JlZyA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9DT05WX0NPRUYwOworCWludCBjZjJfcmVnID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0NPTlZfQ09FRjA7CisJaW50IGF0MV9yZWcgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUzsKKwlpbnQgYXQyX3JlZyA9IERJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTOworCWNvbnN0IHN0cnVjdCBjb2xvcl9jb252X2NvZWYgeworCQlpbnQgIHJ5LCAgcmNyLCAgcmNiLCAgIGd5LCAgZ2NyLCAgZ2NiLCAgIGJ5LCAgYmNyLCAgYmNiOworCQlpbnQgIGZ1bGxfcmFuZ2U7CisJfSAgY3RibF9idDYwMV81ID0geworCQkgICAgMjk4LCAgNDA5LCAgICAwLCAgMjk4LCAtMjA4LCAtMTAwLCAgMjk4LCAgICAwLCAgNTE3LCAwLAorCX07CisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZfY29lZiAqY3Q7CisjZGVmaW5lIENWQUwoeCwgeSkJKCgoeCAmIDIwNDcpIDw8IDE2KSB8ICh5ICYgMjA0NykpCisKKwljdCA9ICZjdGJsX2J0NjAxXzU7CisKKwlNT0RfUkVHX0ZMRChjZjFfcmVnLAkJbWFzaywJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgNCwJbWFzaywJQ1ZBTChjdC0+Z3ksICBjdC0+cmNiKSk7CisJTU9EX1JFR19GTEQoY2YxX3JlZyArIDgsCW1hc2ssCUNWQUwoY3QtPmdjYiwgY3QtPmdjcikpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyAxMiwJbWFzaywJQ1ZBTChjdC0+YmNyLCBjdC0+YnkpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgMTYsCW1hc2ssCUNWQUwoMCwJICAgICAgY3QtPmJjYikpOworCisJTU9EX1JFR19GTEQoY2YyX3JlZywJCW1hc2ssCUNWQUwoY3QtPnJjciwgY3QtPnJ5KSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDQsCW1hc2ssCUNWQUwoY3QtPmd5LCAgY3QtPnJjYikpOworCU1PRF9SRUdfRkxEKGNmMl9yZWcgKyA4LAltYXNrLAlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgMTIsCW1hc2ssCUNWQUwoY3QtPmJjciwgY3QtPmJ5KSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDE2LAltYXNrLAlDVkFMKDAsCSAgICAgIGN0LT5iY2IpKTsKKyN1bmRlZiBDVkFMCisKKwlNT0RfUkVHX0ZMRChhdDFfcmVnLCAoMSA8PCAxMSksIGN0LT5mdWxsX3JhbmdlKTsKKwlNT0RfUkVHX0ZMRChhdDJfcmVnLCAoMSA8PCAxMSksIGN0LT5mdWxsX3JhbmdlKTsKK30KKworc3RhdGljIHZvaWQgY2FsY19ja19kaXYoaW50IGlzX3RmdCwgaW50IHBjaywgaW50ICpsY2tfZGl2LCBpbnQgKnBja19kaXYpCit7CisJdW5zaWduZWQgbG9uZyBmY2ssIGxjazsKKworCSpsY2tfZGl2ID0gMTsKKwlwY2sgPSBtYXgoMSwgcGNrKTsKKwlmY2sgPSBjbGtfZ2V0X3JhdGUoZGlzcGMuZHNzMV9mY2spOworCWxjayA9IGZjazsKKwkqcGNrX2RpdiA9IChsY2sgKyBwY2sgLSAxKSAvIHBjazsKKwlpZiAoaXNfdGZ0KQorCQkqcGNrX2RpdiA9IG1heCgyLCAqcGNrX2Rpdik7CisJZWxzZQorCQkqcGNrX2RpdiA9IG1heCgzLCAqcGNrX2Rpdik7CisJaWYgKCpwY2tfZGl2ID4gMjU1KSB7CisJCSpwY2tfZGl2ID0gMjU1OworCQlsY2sgPSBwY2sgKiAqcGNrX2RpdjsKKwkJKmxja19kaXYgPSBmY2sgLyBsY2s7CisJCUJVR19PTigqbGNrX2RpdiA8IDEpOworCQlpZiAoKmxja19kaXYgPiAyNTUpIHsKKwkJCSpsY2tfZGl2ID0gMjU1OworCQkJZGV2X3dhcm4oZGlzcGMuZmJkZXYtPmRldiwgInBpeGNsb2NrICVkIGtIeiB0b28gbG93LlxuIiwKKwkJCQkgcGNrIC8gMTAwMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sY2RfdGZ0X21vZGUoaW50IGVuYWJsZSkKK3sKKwl1MzIgbWFzazsKKworCW1hc2sgPSAxIDw8IDM7CisJTU9EX1JFR19GTEQoRElTUENfQ09OVFJPTCwgbWFzaywgZW5hYmxlID8gbWFzayA6IDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGNkX3RpbWluZ3Modm9pZCkKK3sKKwl1MzIgbDsKKwlpbnQgbGNrX2RpdiwgcGNrX2RpdjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGRpc3BjLmZiZGV2LT5wYW5lbDsKKwlpbnQgaXNfdGZ0ID0gcGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19QQU5FTF9URlQ7CisJdW5zaWduZWQgbG9uZyBmY2s7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfVElNSU5HX0gpOworCWwgJj0gfihGTERfTUFTSygwLCA2KSB8IEZMRF9NQVNLKDgsIDgpIHwgRkxEX01BU0soMjAsIDgpKTsKKwlsIHw9ICggbWF4KDEsIChtaW4oNjQsICBwYW5lbC0+aHN3KSkpIC0gMSApIDw8IDA7CisJbCB8PSAoIG1heCgxLCAobWluKDI1NiwgcGFuZWwtPmhmcCkpKSAtIDEgKSA8PCA4OworCWwgfD0gKCBtYXgoMSwgKG1pbigyNTYsIHBhbmVsLT5oYnApKSkgLSAxICkgPDwgMjA7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19ILCBsKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19USU1JTkdfVik7CisJbCAmPSB+KEZMRF9NQVNLKDAsIDYpIHwgRkxEX01BU0soOCwgOCkgfCBGTERfTUFTSygyMCwgOCkpOworCWwgfD0gKCBtYXgoMSwgKG1pbig2NCwgIHBhbmVsLT52c3cpKSkgLSAxICkgPDwgMDsKKwlsIHw9ICggbWF4KDAsIChtaW4oMjU1LCBwYW5lbC0+dmZwKSkpIC0gMCApIDw8IDg7CisJbCB8PSAoIG1heCgwLCAobWluKDI1NSwgcGFuZWwtPnZicCkpKSAtIDAgKSA8PCAyMDsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVElNSU5HX1YsIGwpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1BPTF9GUkVRKTsKKwlsICY9IH5GTERfTUFTSygxMiwgNik7CisJbCB8PSAocGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19TSUdOQUxfTUFTSykgPDwgMTI7CisJbCB8PSBwYW5lbC0+YWNiICYgMHhmZjsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfUE9MX0ZSRVEsIGwpOworCisJY2FsY19ja19kaXYoaXNfdGZ0LCBwYW5lbC0+cGl4ZWxfY2xvY2sgKiAxMDAwLCAmbGNrX2RpdiwgJnBja19kaXYpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOworCWwgJj0gfihGTERfTUFTSygxNiwgOCkgfCBGTERfTUFTSygwLCA4KSk7CisJbCB8PSAobGNrX2RpdiA8PCAxNikgfCAocGNrX2RpdiA8PCAwKTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfRElWSVNPUiwgbCk7CisKKwkvKiB1cGRhdGUgcGFuZWwgaW5mbyB3aXRoIHRoZSBleGFjdCBjbG9jayAqLworCWZjayA9IGNsa19nZXRfcmF0ZShkaXNwYy5kc3MxX2Zjayk7CisJcGFuZWwtPnBpeGVsX2Nsb2NrID0gZmNrIC8gbGNrX2RpdiAvIHBja19kaXYgLyAxMDAwOworfQorCitpbnQgb21hcF9kaXNwY19yZXF1ZXN0X2lycSh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCWludCByID0gMDsKKworCUJVR19PTihjYWxsYmFjayA9PSBOVUxMKTsKKworCWlmIChkaXNwYy5pcnFfY2FsbGJhY2spCisJCXIgPSAtRUJVU1k7CisJZWxzZSB7CisJCWRpc3BjLmlycV9jYWxsYmFjayA9IGNhbGxiYWNrOworCQlkaXNwYy5pcnFfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJfQorCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEpOworCit2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2lycXMoaW50IGlycV9tYXNrKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCWRpc3BjLmVuYWJsZWRfaXJxcyA9IGlycV9tYXNrOworCWlycV9tYXNrIHw9IERJU1BDX0lSUV9NQVNLX0VSUk9SOworCU1PRF9SRUdfRkxEKERJU1BDX0lSUUVOQUJMRSwgMHg3ZmZmLCBpcnFfbWFzayk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZW5hYmxlX2lycXMpOworCit2b2lkIG9tYXBfZGlzcGNfZGlzYWJsZV9pcnFzKGludCBpcnFfbWFzaykKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlkaXNwYy5lbmFibGVkX2lycXMgJj0gfmlycV9tYXNrOworCWlycV9tYXNrICY9IH5ESVNQQ19JUlFfTUFTS19FUlJPUjsKKwlNT0RfUkVHX0ZMRChESVNQQ19JUlFFTkFCTEUsIDB4N2ZmZiwgaXJxX21hc2spOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX2Rpc2FibGVfaXJxcyk7CisKK3ZvaWQgb21hcF9kaXNwY19mcmVlX2lycSh2b2lkKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCW9tYXBfZGlzcGNfZGlzYWJsZV9pcnFzKERJU1BDX0lSUV9NQVNLX0FMTCk7CisJZGlzcGMuaXJxX2NhbGxiYWNrID0gTlVMTDsKKwlkaXNwYy5pcnFfY2FsbGJhY2tfZGF0YSA9IE5VTEw7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZnJlZV9pcnEpOworCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9kaXNwY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJdTMyIHN0YXQgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFTVEFUVVMpOworCisJaWYgKHN0YXQgJiBESVNQQ19JUlFfRlJBTUVNQVNLKQorCQljb21wbGV0ZSgmZGlzcGMuZnJhbWVfZG9uZSk7CisKKwlpZiAoc3RhdCAmIERJU1BDX0lSUV9NQVNLX0VSUk9SKSB7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImlycSBlcnJvciBzdGF0dXMgJTA0eFxuIiwKKwkJCQlzdGF0ICYgMHg3ZmZmKTsKKwkJfQorCX0KKworCWlmICgoc3RhdCAmIGRpc3BjLmVuYWJsZWRfaXJxcykgJiYgZGlzcGMuaXJxX2NhbGxiYWNrKQorCQlkaXNwYy5pcnFfY2FsbGJhY2soZGlzcGMuaXJxX2NhbGxiYWNrX2RhdGEpOworCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0lSUVNUQVRVUywgc3RhdCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Rzc19jbG9ja3Modm9pZCkKK3sKKwlpZiAoSVNfRVJSKChkaXNwYy5kc3NfaWNrID0gY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiZHNzX2ljayIpKSkpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc19pY2siKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzX2ljayk7CisJfQorCisJaWYgKElTX0VSUigoZGlzcGMuZHNzMV9mY2sgPSBjbGtfZ2V0KGRpc3BjLmZiZGV2LT5kZXYsICJkc3MxX2ZjayIpKSkpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzczFfZmNrIik7CisJCWNsa19wdXQoZGlzcGMuZHNzX2ljayk7CisJCXJldHVybiBQVFJfRVJSKGRpc3BjLmRzczFfZmNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChkaXNwYy5kc3NfNTRtX2ZjayA9CisJCQkJY2xrX2dldChkaXNwYy5mYmRldi0+ZGV2LCAiZHNzXzU0bV9mY2siKSkpKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBkc3NfNTRtX2ZjayIpOworCQljbGtfcHV0KGRpc3BjLmRzc19pY2spOworCQljbGtfcHV0KGRpc3BjLmRzczFfZmNrKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzXzU0bV9mY2spOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfZHNzX2Nsb2Nrcyh2b2lkKQoreworCWNsa19wdXQoZGlzcGMuZHNzXzU0bV9mY2spOworCWNsa19wdXQoZGlzcGMuZHNzMV9mY2spOworCWNsa19wdXQoZGlzcGMuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9sY2RfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJY2xrX2VuYWJsZShkaXNwYy5kc3MxX2Zjayk7CisJZWxzZQorCQljbGtfZGlzYWJsZShkaXNwYy5kc3MxX2Zjayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJY2xrX2VuYWJsZShkaXNwYy5kc3NfaWNrKTsKKwllbHNlCisJCWNsa19kaXNhYmxlKGRpc3BjLmRzc19pY2spOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfZGlnaXRfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJY2xrX2VuYWJsZShkaXNwYy5kc3NfNTRtX2Zjayk7CisJZWxzZQorCQljbGtfZGlzYWJsZShkaXNwYy5kc3NfNTRtX2Zjayk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfc3VzcGVuZCh2b2lkKQoreworCWlmIChkaXNwYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJaW5pdF9jb21wbGV0aW9uKCZkaXNwYy5mcmFtZV9kb25lKTsKKwkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgwKTsKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRpc3BjLmZyYW1lX2RvbmUsCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkgeworCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LAorCQkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworCQl9CisJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19yZXN1bWUodm9pZCkKK3sKKwlpZiAoZGlzcGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCQlpZiAoIWRpc3BjLmV4dF9tb2RlKSB7CisJCQlzZXRfbGNkX3RpbWluZ3MoKTsKKwkJCWxvYWRfcGFsZXR0ZSgpOworCQl9CisJCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMSk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY191cGRhdGVfd2luZG93KHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCSB2b2lkICgqY29tcGxldGVfY2FsbGJhY2spKHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmNvbXBsZXRlX2NhbGxiYWNrX2RhdGEpCit7CisJcmV0dXJuIGRpc3BjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9VUERBVEVfRElTQUJMRUQgPyAtRU5PREVWIDogMDsKK30KKworc3RhdGljIGludCBtbWFwX2tlcm4oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJc3RydWN0IHZtX3N0cnVjdAkqa3ZtYTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QJdm1hOworCXBncHJvdF90CQlwZ3Byb3Q7CisJdW5zaWduZWQgbG9uZwkJdmFkZHI7CisKKwlrdm1hID0gZ2V0X3ZtX2FyZWEocmVnaW9uLT5zaXplLCBWTV9JT1JFTUFQKTsKKwlpZiAoa3ZtYSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBrZXJuZWwgdm0gYXJlYVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2bWEudm1fbW0gPSAmaW5pdF9tbTsKKworCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpa3ZtYS0+YWRkcjsKKworCXBncHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUocGdwcm90X2tlcm5lbCk7CisJdm1hLnZtX3N0YXJ0ID0gdmFkZHI7CisJdm1hLnZtX2VuZCA9IHZhZGRyICsgcmVnaW9uLT5zaXplOworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2UoJnZtYSwgdmFkZHIsIHJlZ2lvbi0+cGFkZHIgPj4gUEFHRV9TSElGVCwKKwkJCSAgIHJlZ2lvbi0+c2l6ZSwgcGdwcm90KSA8IDApIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAia2VybmVsIG1tYXAgZm9yIEZCTUVNIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZWdpb24tPnZhZGRyID0gKHZvaWQgKil2YWRkcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbWFwX3VzZXJfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcGxhbmUgPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJYXRvbWljX2luYygmZGlzcGMubWFwX2NvdW50W3BsYW5lXSk7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfdXNlcl9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcGxhbmUgPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJYXRvbWljX2RlYygmZGlzcGMubWFwX2NvdW50W3BsYW5lXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbW1hcF91c2VyX29wcyA9IHsKKwkub3BlbiA9IG1tYXBfdXNlcl9vcGVuLAorCS5jbG9zZSA9IG1tYXBfdXNlcl9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19tbWFwX3VzZXIoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGxvbmcgb2ZmOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdTMyIGxlbjsKKworCWlmICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHZtYS0+dm1fcGdvZmYgPiAofjBVTCA+PiBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJb2ZmID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCisJc3RhcnQgPSBpbmZvLT5maXguc21lbV9zdGFydDsKKwlsZW4gPSBpbmZvLT5maXguc21lbV9sZW47CisJaWYgKG9mZiA+PSBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICsgb2ZmKSA+IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJb2ZmICs9IHN0YXJ0OworCXZtYS0+dm1fcGdvZmYgPSBvZmYgPj4gUEFHRV9TSElGVDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwl2bWEtPnZtX29wcyA9ICZtbWFwX3VzZXJfb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gKHZvaWQgKilwbGFuZS0+aWR4OworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBvZmYgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCXJldHVybiAtRUFHQUlOOworCS8qIHZtX29wcy5vcGVuIHdvbid0IGJlIGNhbGxlZCBmb3IgbW1hcCBpdHNlbGYuICovCisJYXRvbWljX2luYygmZGlzcGMubWFwX2NvdW50W3BsYW5lLT5pZHhdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5tYXBfa2VybihzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwl2dW5tYXAocmVnaW9uLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcGFsZXR0ZV9yYW0odm9pZCkKK3sKKwlkaXNwYy5wYWxldHRlX3ZhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LAorCQlNQVhfUEFMRVRURV9TSVpFLCAmZGlzcGMucGFsZXR0ZV9wYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKGRpc3BjLnBhbGV0dGVfdmFkZHIgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgcGFsZXR0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYWxldHRlX3JhbSh2b2lkKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LCBNQVhfUEFMRVRURV9TSVpFLAorCQkJZGlzcGMucGFsZXR0ZV92YWRkciwgZGlzcGMucGFsZXR0ZV9wYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJcmVnaW9uLT52YWRkciA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoZGlzcGMuZmJkZXYtPmRldiwKKwkJCXJlZ2lvbi0+c2l6ZSwgJnJlZ2lvbi0+cGFkZHIsIEdGUF9LRVJORUwpOworCisJaWYgKHJlZ2lvbi0+dmFkZHIgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgRkIgRE1BIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LCByZWdpb24tPnNpemUsCisJCQkgICAgICByZWdpb24tPnZhZGRyLCByZWdpb24tPnBhZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNtYXAgKmluaXRfcmVzbWFwKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIHBhZ2VfY250OworCXN0cnVjdCByZXNtYXAgKnJlc19tYXA7CisKKwlwYWdlX2NudCA9IFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJcmVzX21hcCA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNtYXApICsgUkVTTUFQX1NJWkUocGFnZV9jbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzX21hcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXNfbWFwLT5zdGFydCA9IHN0YXJ0OworCXJlc19tYXAtPnBhZ2VfY250ID0gcGFnZV9jbnQ7CisJcmVzX21hcC0+bWFwID0gKHVuc2lnbmVkIGxvbmcgKikocmVzX21hcCArIDEpOworCXJldHVybiByZXNfbWFwOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX3Jlc21hcChzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwKQoreworCWtmcmVlKHJlc19tYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNtYXBfbWVtX3R5cGUodW5zaWduZWQgbG9uZyBzdGFydCkKK3sKKwlpZiAoc3RhcnQgPj0gT01BUDJfU1JBTV9TVEFSVCAmJgorCSAgICBzdGFydCA8IE9NQVAyX1NSQU1fU1RBUlQgKyBPTUFQMl9TUkFNX1NJWkUpCisJCXJldHVybiBPTUFQRkJfTUVNVFlQRV9TUkFNOworCWVsc2UKKwkJcmV0dXJuIE9NQVBGQl9NRU1UWVBFX1NEUkFNOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNtYXBfcGFnZV9yZXNlcnZlZChzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwLCB1bnNpZ25lZCBwYWdlX25yKQoreworCXJldHVybiAqUkVTTUFQX1BUUihyZXNfbWFwLCBwYWdlX25yKSAmIFJFU01BUF9NQVNLKHBhZ2VfbnIpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNtYXBfcmVzZXJ2ZV9wYWdlKHN0cnVjdCByZXNtYXAgKnJlc19tYXAsIHVuc2lnbmVkIHBhZ2VfbnIpCit7CisJQlVHX09OKHJlc21hcF9wYWdlX3Jlc2VydmVkKHJlc19tYXAsIHBhZ2VfbnIpKTsKKwkqUkVTTUFQX1BUUihyZXNfbWFwLCBwYWdlX25yKSB8PSBSRVNNQVBfTUFTSyhwYWdlX25yKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc21hcF9mcmVlX3BhZ2Uoc3RydWN0IHJlc21hcCAqcmVzX21hcCwgdW5zaWduZWQgcGFnZV9ucikKK3sKKwlCVUdfT04oIXJlc21hcF9wYWdlX3Jlc2VydmVkKHJlc19tYXAsIHBhZ2VfbnIpKTsKKwkqUkVTTUFQX1BUUihyZXNfbWFwLCBwYWdlX25yKSAmPSB+UkVTTUFQX01BU0socGFnZV9ucik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc21hcF9yZXNlcnZlX3JlZ2lvbih1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3Qgc2l6ZSkKK3sKKworCXN0cnVjdCByZXNtYXAJKnJlc19tYXA7CisJdW5zaWduZWQJc3RhcnRfcGFnZTsKKwl1bnNpZ25lZAllbmRfcGFnZTsKKwlpbnQJCW10eXBlOworCXVuc2lnbmVkCWk7CisKKwltdHlwZSA9IHJlc21hcF9tZW1fdHlwZShzdGFydCk7CisJcmVzX21hcCA9IGRpc3BjLnJlc19tYXBbbXR5cGVdOworCWRldl9kYmcoZGlzcGMuZmJkZXYtPmRldiwgInJlc2VydmUgbWVtIHR5cGUgJWQgc3RhcnQgJTA4bHggc2l6ZSAlZFxuIiwKKwkJbXR5cGUsIHN0YXJ0LCBzaXplKTsKKwlzdGFydF9wYWdlID0gKHN0YXJ0IC0gcmVzX21hcC0+c3RhcnQpIC8gUEFHRV9TSVpFOworCWVuZF9wYWdlID0gc3RhcnRfcGFnZSArIFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspCisJCXJlc21hcF9yZXNlcnZlX3BhZ2UocmVzX21hcCwgaSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc21hcF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcmVzbWFwCSpyZXNfbWFwOworCXVuc2lnbmVkCXN0YXJ0X3BhZ2U7CisJdW5zaWduZWQJZW5kX3BhZ2U7CisJdW5zaWduZWQJaTsKKwlpbnQJCW10eXBlOworCisJbXR5cGUgPSByZXNtYXBfbWVtX3R5cGUoc3RhcnQpOworCXJlc19tYXAgPSBkaXNwYy5yZXNfbWFwW210eXBlXTsKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJmcmVlIG1lbSB0eXBlICVkIHN0YXJ0ICUwOGx4IHNpemUgJWRcbiIsCisJCW10eXBlLCBzdGFydCwgc2l6ZSk7CisJc3RhcnRfcGFnZSA9IChzdGFydCAtIHJlc19tYXAtPnN0YXJ0KSAvIFBBR0VfU0laRTsKKwllbmRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBlbmRfcGFnZTsgaSsrKQorCQlyZXNtYXBfZnJlZV9wYWdlKHJlc19tYXAsIGkpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNtYXBfYWxsb2NfcmVnaW9uKGludCBtdHlwZSwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCB0b3RhbDsKKwl1bnNpZ25lZCBzdGFydF9wYWdlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJc3RydWN0IHJlc21hcCAqcmVzX21hcCA9IGRpc3BjLnJlc19tYXBbbXR5cGVdOworCisJQlVHX09OKG10eXBlID49IERJU1BDX01FTVRZUEVfTlVNIHx8IHJlc19tYXAgPT0gTlVMTCB8fCAhc2l6ZSk7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlzdGFydF9wYWdlID0gMDsKKwl0b3RhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJlc19tYXAtPnBhZ2VfY250OyBpKyspIHsKKwkJaWYgKHJlc21hcF9wYWdlX3Jlc2VydmVkKHJlc19tYXAsIGkpKSB7CisJCQlzdGFydF9wYWdlID0gaSArIDE7CisJCQl0b3RhbCA9IDA7CisJCX0gZWxzZSBpZiAoKyt0b3RhbCA9PSBzaXplKQorCQkJYnJlYWs7CisJfQorCWlmICh0b3RhbCA8IHNpemUpCisJCXJldHVybiAwOworCisJc3RhcnQgPSByZXNfbWFwLT5zdGFydCArIHN0YXJ0X3BhZ2UgKiBQQUdFX1NJWkU7CisJcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHN0YXJ0LCBzaXplICogUEFHRV9TSVpFKTsKKworCXJldHVybiBzdGFydDsKK30KKworLyogTm90ZSB0aGF0IHRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIHVzZXIgbWFwcGluZ3MsIHdlIGRvbid0IGRlYWwgd2l0aAorICoga2VybmVsIG1hcHBpbmdzIGhlcmUsIHNvIGZiY29uIHdpbGwga2VlcCB1c2luZyB0aGUgb2xkIHJlZ2lvbi4KKyAqLworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldHVwX21lbShpbnQgcGxhbmUsIHNpemVfdCBzaXplLCBpbnQgbWVtX3R5cGUsCisJCQkJdW5zaWduZWQgbG9uZyAqcGFkZHIpCit7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKwl1bnNpZ25lZCBsb25nIG5ld19hZGRyID0gMDsKKworCWlmICgodW5zaWduZWQpcGxhbmUgPiBkaXNwYy5tZW1fZGVzYy5yZWdpb25fY250KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobWVtX3R5cGUgPj0gRElTUENfTUVNVFlQRV9OVU0pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkaXNwYy5yZXNfbWFwW21lbV90eXBlXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZyA9ICZkaXNwYy5tZW1fZGVzYy5yZWdpb25bcGxhbmVdOworCWlmIChzaXplID09IHJnLT5zaXplICYmIG1lbV90eXBlID09IHJnLT50eXBlKQorCQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX3JlYWQoJmRpc3BjLm1hcF9jb3VudFtwbGFuZV0pKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChyZy0+c2l6ZSAhPSAwKQorCQlyZXNtYXBfZnJlZV9yZWdpb24ocmctPnBhZGRyLCByZy0+c2l6ZSk7CisJaWYgKHNpemUgIT0gMCkgeworCQluZXdfYWRkciA9IHJlc21hcF9hbGxvY19yZWdpb24obWVtX3R5cGUsIHNpemUpOworCQlpZiAoIW5ld19hZGRyKSB7CisJCQkvKiBSZWFsbG9jYXRlIG9sZCByZWdpb24uICovCisJCQlyZXNtYXBfcmVzZXJ2ZV9yZWdpb24ocmctPnBhZGRyLCByZy0+c2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZy0+cGFkZHIgPSBuZXdfYWRkcjsKKwlyZy0+c2l6ZSA9IHNpemU7CisJcmctPnR5cGUgPSBtZW1fdHlwZTsKKworCSpwYWRkciA9IG5ld19hZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX21kKQoreworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbgkqcmc7CisJaW50IGk7CisJaW50IHI7CisJdW5zaWduZWQgbG9uZwkJCW1lbV9zdGFydFtESVNQQ19NRU1UWVBFX05VTV07CisJdW5zaWduZWQgbG9uZwkJCW1lbV9lbmRbRElTUENfTUVNVFlQRV9OVU1dOworCisJaWYgKCFyZXFfbWQtPnJlZ2lvbl9jbnQpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAibm8gbWVtb3J5IHJlZ2lvbnMgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXJnID0gJnJlcV9tZC0+cmVnaW9uWzBdOworCW1lbXNldChtZW1fc3RhcnQsIDB4ZmYsIHNpemVvZihtZW1fc3RhcnQpKTsKKwltZW1zZXQobWVtX2VuZCwgMCwgc2l6ZW9mKG1lbV9lbmQpKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXFfbWQtPnJlZ2lvbl9jbnQ7IGkrKywgcmcrKykgeworCQlpbnQgbXR5cGU7CisJCWlmIChyZy0+cGFkZHIpIHsKKwkJCXJnLT5hbGxvYyA9IDA7CisJCQlpZiAocmctPnZhZGRyID09IE5VTEwpIHsKKwkJCQlyZy0+bWFwID0gMTsKKwkJCQlpZiAoKHIgPSBtbWFwX2tlcm4ocmcpKSA8IDApCisJCQkJCXJldHVybiByOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJnLT50eXBlICE9IE9NQVBGQl9NRU1UWVBFX1NEUkFNKSB7CisJCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LAorCQkJCQkidW5zdXBwb3J0ZWQgbWVtb3J5IHR5cGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmctPmFsbG9jID0gcmctPm1hcCA9IDE7CisJCQlpZiAoKHIgPSBhbGxvY19mYm1lbShyZykpIDwgMCkKKwkJCQlyZXR1cm4gcjsKKwkJfQorCQltdHlwZSA9IHJnLT50eXBlOworCisJCWlmIChyZy0+cGFkZHIgPCBtZW1fc3RhcnRbbXR5cGVdKQorCQkJbWVtX3N0YXJ0W210eXBlXSA9IHJnLT5wYWRkcjsKKwkJaWYgKHJnLT5wYWRkciArIHJnLT5zaXplID4gbWVtX2VuZFttdHlwZV0pCisJCQltZW1fZW5kW210eXBlXSA9IHJnLT5wYWRkciArIHJnLT5zaXplOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NRU1UWVBFX05VTTsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCXNpemVfdCBzaXplOworCQlpZiAobWVtX2VuZFtpXSA9PSAwKQorCQkJY29udGludWU7CisJCXN0YXJ0ID0gbWVtX3N0YXJ0W2ldOworCQlzaXplID0gbWVtX2VuZFtpXSAtIHN0YXJ0OworCQlkaXNwYy5yZXNfbWFwW2ldID0gaW5pdF9yZXNtYXAoc3RhcnQsIHNpemUpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKGRpc3BjLnJlc19tYXBbaV0gPT0gTlVMTCkKKwkJCWdvdG8gZmFpbDsKKwkJLyogSW5pdGlhbCBzdGF0ZSBpcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgcmVzZXJ2ZWQuIFRoaXMKKwkJICogaW5jbHVkZXMgcG9zc2libGUgaG9sZXMgYXMgd2VsbCwgd2hpY2ggd2lsbCBuZXZlciBiZQorCQkgKiBmcmVlZC4KKwkJICovCisJCXJlc21hcF9yZXNlcnZlX3JlZ2lvbihzdGFydCwgc2l6ZSk7CisJfQorCisJZGlzcGMubWVtX2Rlc2MgPSAqcmVxX21kOworCisJcmV0dXJuIDA7CitmYWlsOgorCWZvciAoaSA9IDA7IGkgPCBESVNQQ19NRU1UWVBFX05VTTsgaSsrKSB7CisJCWlmIChkaXNwYy5yZXNfbWFwW2ldICE9IE5VTEwpCisJCQljbGVhbnVwX3Jlc21hcChkaXNwYy5yZXNfbWFwW2ldKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZmJtZW0odm9pZCkKK3sKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01FTVRZUEVfTlVNOyBpKyspIHsKKwkJaWYgKGRpc3BjLnJlc19tYXBbaV0gIT0gTlVMTCkKKwkJCWNsZWFudXBfcmVzbWFwKGRpc3BjLnJlc19tYXBbaV0pOworCX0KKwlyZyA9ICZkaXNwYy5tZW1fZGVzYy5yZWdpb25bMF07CisJZm9yIChpID0gMDsgaSA8IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKywgcmcrKykgeworCQlpZiAocmctPmFsbG9jKQorCQkJZnJlZV9mYm1lbShyZyk7CisJCWVsc2UgeworCQkJaWYgKHJnLT5tYXApCisJCQkJdW5tYXBfa2VybihyZyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgaW50IGV4dF9tb2RlLAorCQkJICAgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHI7CisJdTMyIGw7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJaW50IHRtbyA9IDEwMDAwOworCWludCBza2lwX2luaXQgPSAwOworCWludCBpOworCisJbWVtc2V0KCZkaXNwYywgMCwgc2l6ZW9mKGRpc3BjKSk7CisKKwlkaXNwYy5iYXNlID0gaW9fcDJ2KERJU1BDX0JBU0UpOworCWRpc3BjLmZiZGV2ID0gZmJkZXY7CisJZGlzcGMuZXh0X21vZGUgPSBleHRfbW9kZTsKKworCWluaXRfY29tcGxldGlvbigmZGlzcGMuZnJhbWVfZG9uZSk7CisKKwlpZiAoKHIgPSBnZXRfZHNzX2Nsb2NrcygpKSA8IDApCisJCXJldHVybiByOworCisJZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoMSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9CT09UTE9BREVSX0lOSVQKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJLyogTENEIGVuYWJsZWQgPyAqLworCWlmIChsICYgMSkgeworCQlwcl9pbmZvKCJvbWFwZmI6IHNraXBwaW5nIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uXG4iKTsKKwkJc2tpcF9pbml0ID0gMTsKKwl9CisjZW5kaWYKKworCWlmICghc2tpcF9pbml0KSB7CisJCS8qIFJlc2V0IG1vbml0b3Jpbmcgd29ya3Mgb25seSB3LyB0aGUgNTRNIGNsayAqLworCQllbmFibGVfZGlnaXRfY2xvY2tzKDEpOworCisJCS8qIFNvZnQgcmVzZXQgKi8KKwkJTU9EX1JFR19GTEQoRElTUENfU1lTQ09ORklHLCAxIDw8IDEsIDEgPDwgMSk7CisKKwkJd2hpbGUgKCEoZGlzcGNfcmVhZF9yZWcoRElTUENfU1lTU1RBVFVTKSAmIDEpKSB7CisJCQlpZiAoIS0tdG1vKSB7CisJCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAic29mdCByZXNldCBmYWlsZWRcbiIpOworCQkJCXIgPSAtRU5PREVWOworCQkJCWVuYWJsZV9kaWdpdF9jbG9ja3MoMCk7CisJCQkJZ290byBmYWlsMTsKKwkJCX0KKwkJfQorCisJCWVuYWJsZV9kaWdpdF9jbG9ja3MoMCk7CisJfQorCisJLyogRW5hYmxlIHNtYXJ0IGlkbGUgYW5kIGF1dG9pZGxlICovCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCWwgJj0gfigoMyA8PCAxMikgfCAoMyA8PCAzKSk7CisJbCB8PSAoMiA8PCAxMikgfCAoMiA8PCAzKSB8ICgxIDw8IDApOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TWVNDT05GSUcsIGwpOworCW9tYXBfd3JpdGVsKDEgPDwgMCwgRFNTX0JBU0UgKyBEU1NfU1lTQ09ORklHKTsKKworCS8qIFNldCBmdW5jdGlvbmFsIGNsb2NrIGF1dG9nYXRpbmcgKi8KKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09ORklHKTsKKwlsIHw9IDEgPDwgOTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfQ09ORklHLCBsKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFTVEFUVVMpOworCWRpc3BjX3dyaXRlX3JlZyhsLCBESVNQQ19JUlFTVEFUVVMpOworCisJLyogRW5hYmxlIHRob3NlIHRoYXQgd2UgaGFuZGxlIGFsd2F5cyAqLworCW9tYXBfZGlzcGNfZW5hYmxlX2lycXMoRElTUENfSVJRX0ZSQU1FTUFTSyk7CisKKwlpZiAoKHIgPSByZXF1ZXN0X2lycShJTlRfMjRYWF9EU1NfSVJRLCBvbWFwX2Rpc3BjX2lycV9oYW5kbGVyLAorCQkJICAgMCwgTU9EVUxFX05BTUUsIGZiZGV2KSkgPCAwKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBEU1MgSVJRXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwkvKiBMMyBmaXJld2FsbCBzZXR0aW5nOiBlbmFibGUgYWNjZXNzIHRvIE9DTSBSQU0gKi8KKwlfX3Jhd193cml0ZWwoMHg0MDIwMDBiMCwgaW9fcDJ2KDB4NjgwMDUwYTApKTsKKworCWlmICgociA9IGFsbG9jX3BhbGV0dGVfcmFtKCkpIDwgMCkKKwkJZ290byBmYWlsMjsKKworCWlmICgociA9IHNldHVwX2ZibWVtKHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGZhaWwzOworCisJaWYgKCFza2lwX2luaXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQkJbWVtc2V0KGRpc3BjLm1lbV9kZXNjLnJlZ2lvbltpXS52YWRkciwgMCwKKwkJCQlkaXNwYy5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZSk7CisJCX0KKworCQkvKiBTZXQgbG9naWMgY2xvY2sgdG8gZmNrLCBwaXhlbCBjbG9jayB0byBmY2svMiBmb3Igbm93ICovCisJCU1PRF9SRUdfRkxEKERJU1BDX0RJVklTT1IsIEZMRF9NQVNLKDE2LCA4KSwgMSA8PCAxNik7CisJCU1PRF9SRUdfRkxEKERJU1BDX0RJVklTT1IsIEZMRF9NQVNLKDAsIDgpLCAyIDw8IDApOworCisJCXNldHVwX3BsYW5lX2ZpZm8oMCwgZXh0X21vZGUpOworCQlzZXR1cF9wbGFuZV9maWZvKDEsIGV4dF9tb2RlKTsKKwkJc2V0dXBfcGxhbmVfZmlmbygyLCBleHRfbW9kZSk7CisKKwkJc2V0dXBfY29sb3JfY29udl9jb2VmKCk7CisKKwkJc2V0X2xjZF90ZnRfbW9kZShwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1BBTkVMX1RGVCk7CisJCXNldF9sb2FkX21vZGUoRElTUENfTE9BRF9GUkFNRV9PTkxZKTsKKworCQlpZiAoIWV4dF9tb2RlKSB7CisJCQlzZXRfbGNkX2RhdGFfbGluZXMocGFuZWwtPmRhdGFfbGluZXMpOworCQkJb21hcF9kaXNwY19zZXRfbGNkX3NpemUocGFuZWwtPnhfcmVzLCBwYW5lbC0+eV9yZXMpOworCQkJc2V0X2xjZF90aW1pbmdzKCk7CisJCX0gZWxzZQorCQkJc2V0X2xjZF9kYXRhX2xpbmVzKHBhbmVsLT5icHApOworCQllbmFibGVfcmZiaV9tb2RlKGV4dF9tb2RlKTsKKwl9CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfUkVWSVNJT04pOworCXByX2luZm8oIm9tYXBmYjogRElTUEMgdmVyc2lvbiAlZC4lZCBpbml0aWFsaXplZFxuIiwKKwkJIGwgPj4gNCAmIDB4MGYsIGwgJiAweDBmKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworZmFpbDM6CisJZnJlZV9wYWxldHRlX3JhbSgpOworZmFpbDI6CisJZnJlZV9pcnEoSU5UXzI0WFhfRFNTX0lSUSwgZmJkZXYpOworZmFpbDE6CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoMCk7CisJcHV0X2Rzc19jbG9ja3MoKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rpc3BjX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCW9tYXBfZGlzcGNfc2V0X3VwZGF0ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCS8qIFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgY2xvY2tzIHRoYXQgYXJlIG9uICovCisJZm9yIChpID0gMDsgaSA8IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykKKwkJb21hcF9kaXNwY19lbmFibGVfcGxhbmUoaSwgMCk7CisJY2xlYW51cF9mYm1lbSgpOworCWZyZWVfcGFsZXR0ZV9yYW0oKTsKKwlmcmVlX2lycShJTlRfMjRYWF9EU1NfSVJRLCBkaXNwYy5mYmRldik7CisJZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoMCk7CisJcHV0X2Rzc19jbG9ja3MoKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsIG9tYXAyX2ludF9jdHJsID0geworCS5uYW1lCQkJPSAiaW50ZXJuYWwiLAorCS5pbml0CQkJPSBvbWFwX2Rpc3BjX2luaXQsCisJLmNsZWFudXAJCT0gb21hcF9kaXNwY19jbGVhbnVwLAorCS5nZXRfY2FwcwkJPSBvbWFwX2Rpc3BjX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBvbWFwX2Rpc3BjX3NldF91cGRhdGVfbW9kZSwKKwkuZ2V0X3VwZGF0ZV9tb2RlCT0gb21hcF9kaXNwY19nZXRfdXBkYXRlX21vZGUsCisJLnVwZGF0ZV93aW5kb3cJCT0gb21hcF9kaXNwY191cGRhdGVfd2luZG93LAorCS5zdXNwZW5kCQk9IG9tYXBfZGlzcGNfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBvbWFwX2Rpc3BjX3Jlc3VtZSwKKwkuc2V0dXBfcGxhbmUJCT0gb21hcF9kaXNwY19zZXR1cF9wbGFuZSwKKwkuc2V0dXBfbWVtCQk9IG9tYXBfZGlzcGNfc2V0dXBfbWVtLAorCS5zZXRfc2NhbGUJCT0gb21hcF9kaXNwY19zZXRfc2NhbGUsCisJLmVuYWJsZV9wbGFuZQkJPSBvbWFwX2Rpc3BjX2VuYWJsZV9wbGFuZSwKKwkuc2V0X2NvbG9yX2tleQkJPSBvbWFwX2Rpc3BjX3NldF9jb2xvcl9rZXksCisJLmdldF9jb2xvcl9rZXkJCT0gb21hcF9kaXNwY19nZXRfY29sb3Jfa2V5LAorCS5tbWFwCQkJPSBvbWFwX2Rpc3BjX21tYXBfdXNlciwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaCBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTUxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIF9ESVNQQ19ICisjZGVmaW5lIF9ESVNQQ19ICisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2RlZmluZSBESVNQQ19QTEFORV9HRlgJCQkwCisjZGVmaW5lIERJU1BDX1BMQU5FX1ZJRDEJCTEKKyNkZWZpbmUgRElTUENfUExBTkVfVklEMgkJMgorCisjZGVmaW5lIERJU1BDX1JHQl8xX0JQUAkJCTB4MDAKKyNkZWZpbmUgRElTUENfUkdCXzJfQlBQCQkJMHgwMQorI2RlZmluZSBESVNQQ19SR0JfNF9CUFAJCQkweDAyCisjZGVmaW5lIERJU1BDX1JHQl84X0JQUAkJCTB4MDMKKyNkZWZpbmUgRElTUENfUkdCXzEyX0JQUAkJMHgwNAorI2RlZmluZSBESVNQQ19SR0JfMTZfQlBQCQkweDA2CisjZGVmaW5lIERJU1BDX1JHQl8yNF9CUFAJCTB4MDgKKyNkZWZpbmUgRElTUENfUkdCXzI0X0JQUF9VTlBBQ0tfMzIJMHgwOQorI2RlZmluZSBESVNQQ19ZVVYyXzQyMgkJCTB4MGEKKyNkZWZpbmUgRElTUENfVVlWWV80MjIJCQkweDBiCisKKyNkZWZpbmUgRElTUENfQlVSU1RfNHgzMgkJMAorI2RlZmluZSBESVNQQ19CVVJTVF84eDMyCQkxCisjZGVmaW5lIERJU1BDX0JVUlNUXzE2eDMyCQkyCisKKyNkZWZpbmUgRElTUENfTE9BRF9DTFVUX0FORF9GUkFNRQkweDAwCisjZGVmaW5lIERJU1BDX0xPQURfQ0xVVF9PTkxZCQkweDAxCisjZGVmaW5lIERJU1BDX0xPQURfRlJBTUVfT05MWQkJMHgwMgorI2RlZmluZSBESVNQQ19MT0FEX0NMVVRfT05DRV9GUkFNRQkweDAzCisKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMTIJCTAKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMTYJCTEKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMTgJCTIKKyNkZWZpbmUgRElTUENfVEZUX0RBVEFfTElORVNfMjQJCTMKKworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19zZXRfbGNkX3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19lbmFibGVfbGNkX291dChpbnQgZW5hYmxlKTsKK2V4dGVybiB2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2RpZ2l0X291dChpbnQgZW5hYmxlKTsKKworZXh0ZXJuIGludCAgb21hcF9kaXNwY19yZXF1ZXN0X2lycSh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIG9tYXBfZGlzcGNfZnJlZV9pcnEodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jIGIvZHJpdmVycy92aWRlby9vbWFwL2h3YTc0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDhlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMKQEAgLTAsMCArMSwxMDc3IEBACisvKgorICogRXBzb24gSFdBNzQyIExDRCBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3JzOiAgICAgSnVoYSBZcmrDtmzDpCAgIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgkgICAgICAgIEltcmUgRGVhayAgICAgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBZVVYgc3VwcG9ydDogSnVzc2kgTGFha28gICA8anVzc2kubGFha29Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9od2E3NDIuaD4KKworI2RlZmluZSBIV0E3NDJfUkVWX0NPREVfUkVHICAgICAgIDB4MAorI2RlZmluZSBIV0E3NDJfQ09ORklHX1JFRyAgICAgICAgIDB4MgorI2RlZmluZSBIV0E3NDJfUExMX0RJVl9SRUcgICAgICAgIDB4NAorI2RlZmluZSBIV0E3NDJfUExMXzBfUkVHICAgICAgICAgIDB4NgorI2RlZmluZSBIV0E3NDJfUExMXzFfUkVHICAgICAgICAgIDB4OAorI2RlZmluZSBIV0E3NDJfUExMXzJfUkVHICAgICAgICAgIDB4YQorI2RlZmluZSBIV0E3NDJfUExMXzNfUkVHICAgICAgICAgIDB4YworI2RlZmluZSBIV0E3NDJfUExMXzRfUkVHICAgICAgICAgIDB4ZQorI2RlZmluZSBIV0E3NDJfQ0xLX1NSQ19SRUcgICAgICAgIDB4MTIKKyNkZWZpbmUgSFdBNzQyX1BBTkVMX1RZUEVfUkVHICAgICAweDE0CisjZGVmaW5lIEhXQTc0Ml9IX0RJU1BfUkVHICAgICAgICAgMHgxNgorI2RlZmluZSBIV0E3NDJfSF9ORFBfUkVHICAgICAgICAgIDB4MTgKKyNkZWZpbmUgSFdBNzQyX1ZfRElTUF8xX1JFRyAgICAgICAweDFhCisjZGVmaW5lIEhXQTc0Ml9WX0RJU1BfMl9SRUcgICAgICAgMHgxYworI2RlZmluZSBIV0E3NDJfVl9ORFBfUkVHICAgICAgICAgIDB4MWUKKyNkZWZpbmUgSFdBNzQyX0hTX1dfUkVHICAgICAgICAgICAweDIwCisjZGVmaW5lIEhXQTc0Ml9IUF9TX1JFRyAgICAgICAgICAgMHgyMgorI2RlZmluZSBIV0E3NDJfVlNfV19SRUcgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgSFdBNzQyX1ZQX1NfUkVHICAgICAgICAgICAweDI2CisjZGVmaW5lIEhXQTc0Ml9QQ0xLX1BPTF9SRUcgICAgICAgMHgyOAorI2RlZmluZSBIV0E3NDJfSU5QVVRfTU9ERV9SRUcgICAgIDB4MmEKKyNkZWZpbmUgSFdBNzQyX1RSQU5TTF9NT0RFX1JFRzEgICAweDJlCisjZGVmaW5lIEhXQTc0Ml9ESVNQX01PREVfUkVHICAgICAgMHgzNAorI2RlZmluZSBIV0E3NDJfV0lORE9XX1RZUEUgICAgICAgIDB4MzYKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX1NUQVJUXzAgICAweDM4CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9TVEFSVF8xICAgMHgzYQorI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfU1RBUlRfMCAgIDB4M2MKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX1NUQVJUXzEgICAweDNlCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9FTkRfMCAgICAgMHg0MAorI2RlZmluZSBIV0E3NDJfV0lORE9XX1hfRU5EXzEgICAgIDB4NDIKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX0VORF8wICAgICAweDQ0CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWV9FTkRfMSAgICAgMHg0NgorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1dSSVRFX0xTQiAgIDB4NDgKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9XUklURV9NU0IgICAweDQ5CisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfUkVBRF8wICAgICAgMHg0YQorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1JFQURfMSAgICAgIDB4NGMKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9SRUFEXzIgICAgICAweDRlCisjZGVmaW5lIEhXQTc0Ml9QT1dFUl9TQVZFICAgICAgICAgMHg1NgorI2RlZmluZSBIV0E3NDJfTkRQX0NUUkwgICAgICAgICAgIDB4NTgKKworI2RlZmluZSBIV0E3NDJfQVVUT19VUERBVEVfVElNRQkJKEhaIC8gMjApCisKKy8qIFJlc2VydmUgNCByZXF1ZXN0IHNsb3RzIGZvciByZXF1ZXN0cyBpbiBpcnEgY29udGV4dCAqLworI2RlZmluZSBSRVFfUE9PTF9TSVpFCQkJMjQKKyNkZWZpbmUgSVJRX1JFUV9QT09MX1NJWkUJCTQKKworI2RlZmluZSBSRVFfRlJPTV9JUlFfUE9PTCAweDAxCisKKyNkZWZpbmUgUkVRX0NPTVBMRVRFCTAKKyNkZWZpbmUgUkVRX1BFTkRJTkcJMQorCitzdHJ1Y3QgdXBkYXRlX3BhcmFtIHsKKwlpbnQJeCwgeSwgd2lkdGgsIGhlaWdodDsKKwlpbnQJY29sb3JfbW9kZTsKKwlpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdW5zaWduZWQgaW50CSBmbGFnczsKKworCWludAkJICgqaGFuZGxlcikoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpOworCXZvaWQJCSAoKmNvbXBsZXRlKSh2b2lkICpkYXRhKTsKKwl2b2lkCQkgKmNvbXBsZXRlX2RhdGE7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB1cGRhdGVfcGFyYW0JdXBkYXRlOworCQlzdHJ1Y3QgY29tcGxldGlvbgkqc3luYzsKKwl9IHBhcjsKK307CisKK3N0cnVjdCB7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAlhdXRvX3VwZGF0ZV90aW1lcjsKKwlpbnQJCQlzdG9wX2F1dG9fdXBkYXRlOworCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdwlhdXRvX3VwZGF0ZV93aW5kb3c7CisJdW5zaWduZWQJCXRlX2Nvbm5lY3RlZDoxOworCXVuc2lnbmVkCQl2c3luY19vbmx5OjE7CisKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QJcmVxX3Bvb2xbUkVRX1BPT0xfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX3JlcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9yZXFfbGlzdDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXJlcV9zZW1hOworCXNwaW5sb2NrX3QJCXJlcV9sb2NrOworCisJc3RydWN0IGV4dGlmX3RpbWluZ3MJcmVnX3RpbWluZ3MsIGx1dF90aW1pbmdzOworCisJaW50CQkJcHJldl9jb2xvcl9tb2RlOworCWludAkJCXByZXZfZmxhZ3M7CisJaW50CQkJd2luZG93X3R5cGU7CisKKwl1MzIJCQltYXhfdHJhbnNtaXRfc2l6ZTsKKwl1MzIJCQlleHRpZl9jbGtfcGVyaW9kOworCXVuc2lnbmVkIGxvbmcJCXBpeF90eF90aW1lOworCXVuc2lnbmVkIGxvbmcJCWxpbmVfdXBkX3RpbWU7CisKKworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKKwlzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYJKmV4dGlmOworCXN0cnVjdCBsY2RfY3RybAkJKmludF9jdHJsOworCisJdm9pZAkJCSgqcG93ZXJfdXApKHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZAkJCSgqcG93ZXJfZG93bikoc3RydWN0IGRldmljZSAqZGV2KTsKK30gaHdhNzQyOworCitzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmw7CisKK3N0YXRpYyB1OCBod2E3NDJfcmVhZF9yZWcodTggcmVnKQoreworCXU4IGRhdGE7CisKKwlod2E3NDIuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSg4KTsKKwlod2E3NDIuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJaHdhNzQyLmV4dGlmLT5yZWFkX2RhdGEoJmRhdGEsIDEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml93cml0ZV9yZWcodTggcmVnLCB1OCBkYXRhKQoreworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWh3YTc0Mi5leHRpZi0+d3JpdGVfY29tbWFuZCgmcmVnLCAxKTsKKwlod2E3NDIuZXh0aWYtPndyaXRlX2RhdGEoJmRhdGEsIDEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfd2luZG93X3JlZ3MoaW50IHhfc3RhcnQsIGludCB5X3N0YXJ0LCBpbnQgeF9lbmQsIGludCB5X2VuZCkKK3sKKwl1OCB0bXBbOF07CisJdTggY21kOworCisJeF9lbmQtLTsKKwl5X2VuZC0tOworCXRtcFswXSA9IHhfc3RhcnQ7CisJdG1wWzFdID0geF9zdGFydCA+PiA4OworCXRtcFsyXSA9IHlfc3RhcnQ7CisJdG1wWzNdID0geV9zdGFydCA+PiA4OworCXRtcFs0XSA9IHhfZW5kOworCXRtcFs1XSA9IHhfZW5kID4+IDg7CisJdG1wWzZdID0geV9lbmQ7CisJdG1wWzddID0geV9lbmQgPj4gODsKKworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWNtZCA9IEhXQTc0Ml9XSU5ET1dfWF9TVEFSVF8wOworCisJaHdhNzQyLmV4dGlmLT53cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCisJaHdhNzQyLmV4dGlmLT53cml0ZV9kYXRhKHRtcCwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mb3JtYXRfcmVncyhpbnQgY29udiwgaW50IHRyYW5zbCwgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUpIHsKKwkJaHdhNzQyLndpbmRvd190eXBlID0gKChod2E3NDIud2luZG93X3R5cGUgJiAweGZjKSB8IDB4MDEpOworI2lmZGVmIFZFUkJPU0UKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgImh3YTc0MjogZW5hYmxlZCBwaXhlbCBkb3VibGluZ1xuIik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlod2E3NDIud2luZG93X3R5cGUgPSAoaHdhNzQyLndpbmRvd190eXBlICYgMHhmYyk7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaHdhNzQyOiBkaXNhYmxlZCBwaXhlbCBkb3VibGluZ1xuIik7CisjZW5kaWYKKwl9CisKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9JTlBVVF9NT0RFX1JFRywgY29udik7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfVFJBTlNMX01PREVfUkVHMSwgdHJhbnNsKTsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9XSU5ET1dfVFlQRSwgaHdhNzQyLndpbmRvd190eXBlKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3RlYXJzeW5jKGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzY3JlZW5faGVpZ2h0LAorCQkJICAgIGludCBmb3JjZV92c3luYykKK3sKKwl1OCBiOworCisJYiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfTkRQX0NUUkwpOworCWIgfD0gMSA8PCAyOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX05EUF9DVFJMLCBiKTsKKworCWlmIChsaWtlbHkoaHdhNzQyLnZzeW5jX29ubHkgfHwgZm9yY2VfdnN5bmMpKSB7CisJCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHdpZHRoICogaHdhNzQyLnBpeF90eF90aW1lIDwgaHdhNzQyLmxpbmVfdXBkX3RpbWUpIHsKKwkJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHdpZHRoICogaHdhNzQyLnBpeF90eF90aW1lIC8gMTAwMCkgKiBoZWlnaHQgPAorCSAgICAoeSArIGhlaWdodCkgKiAoaHdhNzQyLmxpbmVfdXBkX3RpbWUgLyAxMDAwKSkgeworCQlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIHkgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV90ZWFyc3luYyh2b2lkKQoreworCXU4IGI7CisKKwlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygwLCAwKTsKKworCWIgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX05EUF9DVFJMKTsKKwliICY9IH4oMSA8PCAyKTsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9ORFBfQ1RSTCwgYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICphbGxvY19yZXEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCWludCByZXFfZmxhZ3MgPSAwOworCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJZG93bigmaHdhNzQyLnJlcV9zZW1hKTsKKwllbHNlCisJCXJlcV9mbGFncyA9IFJFUV9GUk9NX0lSUV9QT09MOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCUJVR19PTihsaXN0X2VtcHR5KCZod2E3NDIuZnJlZV9yZXFfbGlzdCkpOworCXJlcSA9IGxpc3RfZW50cnkoaHdhNzQyLmZyZWVfcmVxX2xpc3QubmV4dCwKKwkJCSBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5lbnRyeSk7CisJcmVxLT5mbGFncyA9IHJlcV9mbGFnczsKKworCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3JlcShzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJbGlzdF9kZWwoJnJlcS0+ZW50cnkpOworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmaHdhNzQyLmZyZWVfcmVxX2xpc3QpOworCWlmICghKHJlcS0+ZmxhZ3MgJiBSRVFfRlJPTV9JUlFfUE9PTCkpCisJCXVwKCZod2E3NDIucmVxX3NlbWEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0KSkgeworCQlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwkJdm9pZCAoKmNvbXBsZXRlKSh2b2lkICopOworCQl2b2lkICpjb21wbGV0ZV9kYXRhOworCisJCXJlcSA9IGxpc3RfZW50cnkoaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QubmV4dCwKKwkJCQkgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0LCBlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJCWlmIChyZXEtPmhhbmRsZXIocmVxKSA9PSBSRVFfUEVORElORykKKwkJCXJldHVybjsKKworCQljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJCWNvbXBsZXRlX2RhdGEgPSByZXEtPmNvbXBsZXRlX2RhdGE7CisJCWZyZWVfcmVxKHJlcSk7CisKKwkJaWYgKGNvbXBsZXRlKQorCQkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfcmVxX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcm9jZXNzID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZod2E3NDIucGVuZGluZ19yZXFfbGlzdCkpKQorCQlwcm9jZXNzID0gMDsKKwlsaXN0X3NwbGljZV9pbml0KGhlYWQsIGh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0LnByZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCisJaWYgKHByb2Nlc3MpCisJCXByb2Nlc3NfcGVuZGluZ19yZXF1ZXN0cygpOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0CSpyZXEgPSAoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICopZGF0YTsKKwl2b2lkCQkJKCpjb21wbGV0ZSkodm9pZCAqKTsKKwl2b2lkCQkJKmNvbXBsZXRlX2RhdGE7CisKKwljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKworCWZyZWVfcmVxKHJlcSk7CisKKwlpZiAoY29tcGxldGUpCisJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB1cGRhdGVfcGFyYW0gKnBhciA9ICZyZXEtPnBhci51cGRhdGU7CisJaW50IHggPSBwYXItPng7CisJaW50IHkgPSBwYXItPnk7CisJaW50IHcgPSBwYXItPndpZHRoOworCWludCBoID0gcGFyLT5oZWlnaHQ7CisJaW50IGJwcDsKKwlpbnQgY29udiwgdHJhbnNsOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBjb2xvcl9tb2RlID0gcGFyLT5jb2xvcl9tb2RlOworCWludCBmbGFncyA9IHBhci0+ZmxhZ3M7CisJaW50IHNjcl93aWR0aCA9IGh3YTc0Mi5mYmRldi0+cGFuZWwtPnhfcmVzOworCWludCBzY3JfaGVpZ2h0ID0gaHdhNzQyLmZiZGV2LT5wYW5lbC0+eV9yZXM7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgInggJWQgeSAlZCB3ICVkIGggJWQgc2NyX3dpZHRoICVkICIKKwkJImNvbG9yX21vZGUgJWQgZmxhZ3MgJWRcbiIsCisJCXgsIHksIHcsIGgsIHNjcl93aWR0aCwgY29sb3JfbW9kZSwgZmxhZ3MpOworI2VuZGlmCisKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCWJwcCA9IDE2OworCQljb252ID0gMHgwODsKKwkJdHJhbnNsID0gMHgyNTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQlicHAgPSAxMjsKKwkJY29udiA9IDB4MDk7CisJCXRyYW5zbCA9IDB4MjU7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJYnBwID0gMTY7CisJCWNvbnYgPSAweDAxOworCQl0cmFuc2wgPSAweDA1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaHdhNzQyLnByZXZfZmxhZ3MgIT0gZmxhZ3MgfHwKKwkgICAgaHdhNzQyLnByZXZfY29sb3JfbW9kZSAhPSBjb2xvcl9tb2RlKSB7CisJCXNldF9mb3JtYXRfcmVncyhjb252LCB0cmFuc2wsIGZsYWdzKTsKKwkJaHdhNzQyLnByZXZfY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisJCWh3YTc0Mi5wcmV2X2ZsYWdzID0gZmxhZ3M7CisJfQorCWZsYWdzID0gcmVxLT5wYXIudXBkYXRlLmZsYWdzOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykKKwkJZW5hYmxlX3RlYXJzeW5jKHksIHNjcl93aWR0aCwgaCwgc2NyX2hlaWdodCwKKwkJCQlmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQyk7CisJZWxzZQorCQlkaXNhYmxlX3RlYXJzeW5jKCk7CisKKwlzZXRfd2luZG93X3JlZ3MoeCwgeSwgeCArIHcsIHkgKyBoKTsKKworCW9mZnNldCA9IChzY3Jfd2lkdGggKiB5ICsgeCkgKiBicHAgLyA4OworCisJaHdhNzQyLmludF9jdHJsLT5zZXR1cF9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLAorCQkJT01BUEZCX0NIQU5ORUxfT1VUX0xDRCwgb2Zmc2V0LCBzY3Jfd2lkdGgsIDAsIDAsIHcsIGgsCisJCQljb2xvcl9tb2RlKTsKKworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDE2KTsKKworCWh3YTc0Mi5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKE9NQVBGQl9QTEFORV9HRlgsIDEpOworCWh3YTc0Mi5leHRpZi0+dHJhbnNmZXJfYXJlYSh3LCBoLCByZXF1ZXN0X2NvbXBsZXRlLCByZXEpOworCisJcmV0dXJuIFJFUV9QRU5ESU5HOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJaHdhNzQyLmludF9jdHJsLT5lbmFibGVfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwgMCk7Cit9CisKKyNkZWZpbmUgQUREX1BSRVEoX3gsIF95LCBfdywgX2gpIGRvIHsJCVwKKwlyZXEgPSBhbGxvY19yZXEoKTsJCQlcCisJcmVxLT5oYW5kbGVyCT0gc2VuZF9mcmFtZV9oYW5kbGVyOwlcCisJcmVxLT5jb21wbGV0ZQk9IHNlbmRfZnJhbWVfY29tcGxldGU7CVwKKwlyZXEtPnBhci51cGRhdGUueCA9IF94OwkJCVwKKwlyZXEtPnBhci51cGRhdGUueSA9IF95OwkJCVwKKwlyZXEtPnBhci51cGRhdGUud2lkdGggID0gX3c7CQlcCisJcmVxLT5wYXIudXBkYXRlLmhlaWdodCA9IF9oOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTtcCisJcmVxLT5wYXIudXBkYXRlLmZsYWdzCSAgPSBmbGFnczsJXAorCWxpc3RfYWRkX3RhaWwoJnJlcS0+ZW50cnksIHJlcV9oZWFkKTsJXAorfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcmVxX2xpc3Qoc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqcmVxX2hlYWQpCit7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXE7CisJaW50IHggPSB3aW4tPng7CisJaW50IHkgPSB3aW4tPnk7CisJaW50IHdpZHRoID0gd2luLT53aWR0aDsKKwlpbnQgaGVpZ2h0ID0gd2luLT5oZWlnaHQ7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGZsYWdzOworCisJZmxhZ3MgPSB3aW4tPmZvcm1hdCAmIH5PTUFQRkJfRk9STUFUX01BU0s7CisJY29sb3JfbW9kZSA9IHdpbi0+Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9NQVNLOworCisJaWYgKHggJiAxKSB7CisJCUFERF9QUkVRKHgsIHksIDEsIGhlaWdodCk7CisJCXdpZHRoLS07CisJCXgrKzsKKwkJZmxhZ3MgJj0gfk9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQzsKKwl9CisJaWYgKHdpZHRoICYgfjEpIHsKKwkJdW5zaWduZWQgaW50IHhzcGFuID0gd2lkdGggJiB+MTsKKwkJdW5zaWduZWQgaW50IHlzdGFydCA9IHk7CisJCXVuc2lnbmVkIGludCB5c3BhbiA9IGhlaWdodDsKKworCQlpZiAoeHNwYW4gKiBoZWlnaHQgKiAyID4gaHdhNzQyLm1heF90cmFuc21pdF9zaXplKSB7CisJCQl5c3BhbiA9IGh3YTc0Mi5tYXhfdHJhbnNtaXRfc2l6ZSAvICh4c3BhbiAqIDIpOworCQkJQUREX1BSRVEoeCwgeXN0YXJ0LCB4c3BhbiwgeXNwYW4pOworCQkJeXN0YXJ0ICs9IHlzcGFuOworCQkJeXNwYW4gPSBoZWlnaHQgLSB5c3BhbjsKKwkJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJCX0KKworCQlBRERfUFJFUSh4LCB5c3RhcnQsIHhzcGFuLCB5c3Bhbik7CisJCXggKz0geHNwYW47CisJCXdpZHRoIC09IHhzcGFuOworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCX0KKwlpZiAod2lkdGgpCisJCUFERF9QUkVRKHgsIHksIDEsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGF1dG9fdXBkYXRlX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJaWYgKCFod2E3NDIuc3RvcF9hdXRvX3VwZGF0ZSkKKwkJbW9kX3RpbWVyKCZod2E3NDIuYXV0b191cGRhdGVfdGltZXIsCisJCQkgIGppZmZpZXMgKyBIV0E3NDJfQVVUT19VUERBVEVfVElNRSk7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml91cGRhdGVfd2luZG93X2F1dG8odW5zaWduZWQgbG9uZyBhcmcpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKmxhc3Q7CisKKwljcmVhdGVfcmVxX2xpc3QoJmh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3csICZyZXFfbGlzdCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGh3YTc0Ml9yZXF1ZXN0LCBlbnRyeSk7CisKKwlsYXN0LT5jb21wbGV0ZSA9IGF1dG9fdXBkYXRlX2NvbXBsZXRlOworCWxhc3QtPmNvbXBsZXRlX2RhdGEgPSBOVUxMOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7Cit9CisKK2ludCBod2E3NDJfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCSBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkgdm9pZCAoKmNvbXBsZXRlX2NhbGxiYWNrKSh2b2lkICphcmcpLAorCQkJCSB2b2lkICpjb21wbGV0ZV9jYWxsYmFja19kYXRhKQoreworCUxJU1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpsYXN0OworCWludCByID0gMDsKKworCWlmIChod2E3NDIudXBkYXRlX21vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgImludmFsaWQgdXBkYXRlIG1vZGVcbiIpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmICh1bmxpa2VseSh3aW4tPmZvcm1hdCAmCisJICAgIH4oMHgwMyB8IE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUgfAorCSAgICBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMgfCBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpKSkgeworCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaW52YWxpZCB3aW5kb3cgZmxhZyIpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJY3JlYXRlX3JlcV9saXN0KHdpbiwgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gY29tcGxldGVfY2FsbGJhY2s7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9ICh2b2lkICopY29tcGxldGVfY2FsbGJhY2tfZGF0YTsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCitvdXQ6CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKGh3YTc0Ml91cGRhdGVfd2luZG93X2FzeW5jKTsKKworc3RhdGljIGludCBod2E3NDJfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwlpZiAocGxhbmUgIT0gT01BUEZCX1BMQU5FX0dGWCB8fAorCSAgICBjaGFubmVsX291dCAhPSBPTUFQRkJfQ0hBTk5FTF9PVVRfTENEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh3YTc0Ml9lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWlmIChwbGFuZSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3YTc0Mi5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKHBsYW5lLCBlbmFibGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3luY19oYW5kbGVyKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKQoreworCWNvbXBsZXRlKHJlcS0+cGFyLnN5bmMpOworCXJldHVybiBSRVFfQ09NUExFVEU7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9zeW5jKHZvaWQpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCisJcmVxID0gYWxsb2NfcmVxKCk7CisKKwlyZXEtPmhhbmRsZXIgPSBzeW5jX2hhbmRsZXI7CisJcmVxLT5jb21wbGV0ZSA9IE5VTEw7CisJaW5pdF9jb21wbGV0aW9uKCZjb21wKTsKKwlyZXEtPnBhci5zeW5jID0gJmNvbXA7CisKKwlsaXN0X2FkZCgmcmVxLT5lbnRyeSwgJnJlcV9saXN0KTsKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXApOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfYmluZF9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqbmIpCit7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgInVwZGF0ZV9tb2RlICVkXG4iLCBod2E3NDIudXBkYXRlX21vZGUpOworCWlmIChod2E3NDIudXBkYXRlX21vZGUgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGh3YTc0Mi5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHdhNzQyX3NldF91cGRhdGVfbW9kZShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWlmIChtb2RlICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFICYmIG1vZGUgIT0gT01BUEZCX0FVVE9fVVBEQVRFICYmCisJICAgIG1vZGUgIT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobW9kZSA9PSBod2E3NDIudXBkYXRlX21vZGUpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oaHdhNzQyLmZiZGV2LT5kZXYsICJIV0E3NDI6IHNldHRpbmcgdXBkYXRlIG1vZGUgdG8gJXNcbiIsCisJCQltb2RlID09IE9NQVBGQl9VUERBVEVfRElTQUJMRUQgPyAiZGlzYWJsZWQiIDoKKwkJCShtb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSA/ICJhdXRvIiA6ICJtYW51YWwiKSk7CisKKwlzd2l0Y2ggKGh3YTc0Mi51cGRhdGVfbW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhod2E3NDIuZmJkZXYsIE9NQVBGQl9FVkVOVF9ESVNBQkxFRCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlod2E3NDIuc3RvcF9hdXRvX3VwZGF0ZSA9IDE7CisJCWRlbF90aW1lcl9zeW5jKCZod2E3NDIuYXV0b191cGRhdGVfdGltZXIpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCWh3YTc0Mi51cGRhdGVfbW9kZSA9IG1vZGU7CisJaHdhNzQyX3N5bmMoKTsKKwlod2E3NDIuc3RvcF9hdXRvX3VwZGF0ZSA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgorCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoaHdhNzQyLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXV0bygwKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIGh3YTc0Ml9nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gaHdhNzQyLnVwZGF0ZV9tb2RlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByb3VuZF90b19leHRpZl90aWNrcyh1bnNpZ25lZCBsb25nIHBzLCBpbnQgZGl2KQoreworCWludCBidXNfdGljayA9IGh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kICogZGl2OworCXJldHVybiAocHMgKyBidXNfdGljayAtIDEpIC8gYnVzX3RpY2sgKiBidXNfdGljazsKK30KKworc3RhdGljIGludCBjYWxjX3JlZ190aW1pbmcodW5zaWduZWQgbG9uZyBzeXNjbGssIGludCBkaXYpCit7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQ7CisJdW5zaWduZWQgbG9uZyBzeXN0aW07CisKKwkvKiBDU09uVGltZSAwLCBXRU9uVGltZSAyIG5zLCBSRU9uVGltZSAyIG5zLAorCSAqIEFjY2Vzc1RpbWUgMiBucyArIDEyLjIgbnMgKHJlZ3MpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDE2IG5zIChyZWdzKSwKKwkgKiBDU09mZlRpbWUgPSBSRU9mZlRpbWUgKyAxIG5zCisJICogUmVhZEN5Y2xlID0gMm5zICsgMipTWVNDTEsgIChyZWdzKSwKKwkgKiBXcml0ZUN5Y2xlID0gMipTWVNDTEsgKyAyIG5zLAorCSAqIENTUHVsc2VXaWR0aCA9IDEwIG5zICovCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiSFdBNzQyIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBwcyIKKwkJICAiZXh0aWZfY2xrX2RpdiAlZFxuIiwgc3lzdGltLCBod2E3NDIuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmaHdhNzQyLnJlZ190aW1pbmdzOworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKwl0LT5jbGtfZGl2ID0gZGl2OworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgMTIyMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxNjAwMCwgZGl2KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltyZWddY3NvbiAlZCBjc29mZiAlZCByZW9uICVkIHJlb2ZmICVkXG4iLAorCQkgdC0+Y3Nfb25fdGltZSwgdC0+Y3Nfb2ZmX3RpbWUsIHQtPnJlX29uX3RpbWUsIHQtPnJlX29mZl90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW3JlZ113ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW3JlZ11yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBod2E3NDIuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2x1dF90aW1pbmcodW5zaWduZWQgbG9uZyBzeXNjbGssIGludCBkaXYpCit7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQ7CisJdW5zaWduZWQgbG9uZyBzeXN0aW07CisKKwkvKiBDU09uVGltZSAwLCBXRU9uVGltZSAyIG5zLCBSRU9uVGltZSAyIG5zLAorCSAqIEFjY2Vzc1RpbWUgMiBucyArIDQgKiBTWVNDTEsgKyAyNiAobHV0KSwKKwkgKiBXRU9mZlRpbWUgPSBXRU9uVGltZSArIDEgbnMsCisJICogUkVPZmZUaW1lID0gUkVPblRpbWUgKyA0KlNZU0NMSyArIDI2IG5zIChsdXQpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyA0KlNZU0NMSyArIDI2IG5zIChsdXQpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMKKwkgKi8KKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJIV0E3NDIgc3lzdGltICVsdSBwcyBleHRpZl9jbGtfcGVyaW9kICV1IHBzIgorCQkgICJleHRpZl9jbGtfZGl2ICVkXG4iLCBzeXN0aW0sIGh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZod2E3NDIubHV0X3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPndlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2Vfb25fdGltZSArIDEwMDAsIGRpdik7CisJdC0+cmVfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIwMDAgKyA0ICogc3lzdGltICsgMjYwMDAsIGRpdik7CisJaWYgKHQtPnJlX2N5Y2xlX3RpbWUgPCB0LT5yZV9vZmZfdGltZSkKKwkJdC0+cmVfY3ljbGVfdGltZSA9IHQtPnJlX29mZl90aW1lOworCXQtPmNzX3B1bHNlX3dpZHRoID0gMDsKKworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbbHV0XWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltsdXRdd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltsdXRdcmRhY2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93aWR0aCk7CisKKwlyZXR1cm4gaHdhNzQyLmV4dGlmLT5jb252ZXJ0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19leHRpZl90aW1pbmdzKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgKmV4dGlmX21lbV9kaXYpCit7CisJaW50IG1heF9jbGtfZGl2OworCWludCBkaXY7CisKKwlod2E3NDIuZXh0aWYtPmdldF9jbGtfaW5mbygmaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QsICZtYXhfY2xrX2Rpdik7CisJZm9yIChkaXYgPSAxOyBkaXYgPCBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfcmVnX3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJKmV4dGlmX21lbV9kaXYgPSBkaXY7CisKKwlmb3IgKGRpdiA9IDE7IGRpdiA8IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19sdXRfdGltaW5nKHN5c2NsaywgZGl2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJZGV2X2Vycihod2E3NDIuZmJkZXYtPmRldiwgImNhbid0IHNldHVwIHRpbWluZ3NcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgY2FsY19od2E3NDJfY2xrX3JhdGVzKHVuc2lnbmVkIGxvbmcgZXh0X2NsaywKKwkJCQl1bnNpZ25lZCBsb25nICpzeXNfY2xrLCB1bnNpZ25lZCBsb25nICpwaXhfY2xrKQoreworCWludCBwaXhfY2xrX3NyYzsKKwlpbnQgc3lzX2RpdiA9IDAsIHN5c19tdWwgPSAwOworCWludCBwaXhfZGl2OworCisJcGl4X2Nsa19zcmMgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0NMS19TUkNfUkVHKTsKKwlwaXhfZGl2ID0gKChwaXhfY2xrX3NyYyA+PiAzKSAmIDB4MWYpICsgMTsKKwlpZiAoKHBpeF9jbGtfc3JjICYgKDB4MyA8PCAxKSkgPT0gMCkgeworCQkvKiBTb3VyY2UgaXMgdGhlIFBMTCAqLworCQlzeXNfZGl2ID0gKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMX0RJVl9SRUcpICYgMHgzZikgKyAxOworCQlzeXNfbXVsID0gKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMXzRfUkVHKSAmIDB4N2YpICsgMTsKKwkJKnN5c19jbGsgPSBleHRfY2xrICogc3lzX211bCAvIHN5c19kaXY7CisJfSBlbHNlCS8qIGVsc2Ugc291cmNlIGlzIGV4dCBjbGssIG9yIG9zY2lsbGF0b3IgKi8KKwkJKnN5c19jbGsgPSBleHRfY2xrOworCisJKnBpeF9jbGsgPSAqc3lzX2NsayAvIHBpeF9kaXY7CQkJLyogSFogKi8KKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkiZXh0X2NsayAlbGQgcGl4X3NyYyAlZCBwaXhfZGl2ICVkIHN5c19kaXYgJWQgc3lzX211bCAlZFxuIiwKKwkJZXh0X2NsaywgcGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpLCBwaXhfZGl2LCBzeXNfZGl2LCBzeXNfbXVsKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAic3lzX2NsayAlbGQgcGl4X2NsayAlbGRcbiIsCisJCSpzeXNfY2xrLCAqcGl4X2Nsayk7Cit9CisKKworc3RhdGljIGludCBzZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBsb25nIHBpeF9jbGssIGludCBleHRpZl9kaXYpCit7CisJaW50IGhkaXNwLCB2ZGlzcDsKKwlpbnQgaG5kcCwgdm5kcDsKKwlpbnQgaHN3LCB2c3c7CisJaW50IGhzLCB2czsKKwlpbnQgaHNfcG9sX2ludiwgdnNfcG9sX2ludjsKKwlpbnQgdXNlX2hzdnMsIHVzZV9uZHA7CisJdTggIGI7CisKKwloc3cgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0hTX1dfUkVHKTsKKwl2c3cgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZTX1dfUkVHKTsKKwloc19wb2xfaW52ID0gIShoc3cgJiAweDgwKTsKKwl2c19wb2xfaW52ID0gISh2c3cgJiAweDgwKTsKKwloc3cgPSBoc3cgJiAweDdmOworCXZzdyA9IHZzdyAmIDB4M2Y7CisKKwloZGlzcCA9IChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0hfRElTUF9SRUcpICYgMHg3ZikgKiA4OworCXZkaXNwID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9WX0RJU1BfMV9SRUcpICsKKwkJKChod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZfRElTUF8yX1JFRykgJiAweDMpIDw8IDgpOworCisJaG5kcCA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfSF9ORFBfUkVHKSAmIDB4N2Y7CisJdm5kcCA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVl9ORFBfUkVHKTsKKworCS8qIHRpbWUgdG8gdHJhbnNmZXIgb25lIHBpeGVsICgxNmJwcCkgaW4gcHMgKi8KKwlod2E3NDIucGl4X3R4X3RpbWUgPSBod2E3NDIucmVnX3RpbWluZ3Mud2VfY3ljbGVfdGltZTsKKwlpZiAoaHdhNzQyLmV4dGlmLT5nZXRfbWF4X3R4X3JhdGUgIT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGUgZXh0ZXJuYWwgaW50ZXJmYWNlIG1pZ2h0IGhhdmUgYSByYXRlIGxpbWl0YXRpb24sCisJCSAqIGlmIHNvLCB3ZSBoYXZlIHRvIG1heGltaXplIG91ciB0cmFuc2ZlciByYXRlLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBtaW5fdHhfdGltZTsKKwkJdW5zaWduZWQgbG9uZyBtYXhfdHhfcmF0ZSA9IGh3YTc0Mi5leHRpZi0+Z2V0X21heF90eF9yYXRlKCk7CisKKwkJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIm1heF90eF9yYXRlICVsZCBIWlxuIiwKKwkJCW1heF90eF9yYXRlKTsKKwkJbWluX3R4X3RpbWUgPSAxMDAwMDAwMDAwIC8gKG1heF90eF9yYXRlIC8gMTAwMCk7ICAvKiBwcyAqLworCQlpZiAoaHdhNzQyLnBpeF90eF90aW1lIDwgbWluX3R4X3RpbWUpCisJCQlod2E3NDIucGl4X3R4X3RpbWUgPSBtaW5fdHhfdGltZTsKKwl9CisKKwkvKiB0aW1lIHRvIHVwZGF0ZSBvbmUgbGluZSBpbiBwcyAqLworCWh3YTc0Mi5saW5lX3VwZF90aW1lID0gKGhkaXNwICsgaG5kcCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsKKwlod2E3NDIubGluZV91cGRfdGltZSAqPSAxMDAwOworCWlmIChoZGlzcCAqIGh3YTc0Mi5waXhfdHhfdGltZSA+IGh3YTc0Mi5saW5lX3VwZF90aW1lKQorCQkvKgorCQkgKiB0cmFuc2ZlciBzcGVlZCB0b28gbG93LCB3ZSBtaWdodCBoYXZlIHRvIHVzZSBib3RoCisJCSAqIEhTIGFuZCBWUworCQkgKi8KKwkJdXNlX2hzdnMgPSAxOworCWVsc2UKKwkJLyogZGVjZW50IHRyYW5zZmVyIHNwZWVkLCB3ZSdsbCBhbHdheXMgdXNlIG9ubHkgVlMgKi8KKwkJdXNlX2hzdnMgPSAwOworCisJaWYgKHVzZV9oc3ZzICYmIChoc19wb2xfaW52IHx8IHZzX3BvbF9pbnYpKSB7CisJCS8qCisJCSAqIEhTIG9yJ2VkIHdpdGggVlMgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGFjdGl2ZSBoaWdoCisJCSAqIFRFIHNpZ25hbCBiYXNlZCBvbiBITkRQIC8gVk5EUAorCQkgKi8KKwkJdXNlX25kcCA9IDE7CisJCWhzX3BvbF9pbnYgPSAwOworCQl2c19wb2xfaW52ID0gMDsKKwkJaHMgPSBobmRwOworCQl2cyA9IHZuZHA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVXNlIEhTIG9yJ2VkIHdpdGggVlMgYXMgYSBURSBzaWduYWwgaWYgYm90aCBhcmUgbmVlZGVkCisJCSAqIG9yIFZORFAgaWYgb25seSB2c3luYyBpcyBuZWVkZWQuCisJCSAqLworCQl1c2VfbmRwID0gMDsKKwkJaHMgPSBoc3c7CisJCXZzID0gdnN3OworCQlpZiAoIXVzZV9oc3ZzKSB7CisJCQloc19wb2xfaW52ID0gMDsKKwkJCXZzX3BvbF9pbnYgPSAwOworCQl9CisJfQorCisJaHMgPSBocyAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkJCS8qIHBzICovCisJaHMgKj0gMTAwMDsKKworCXZzID0gdnMgKiAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkvKiBwcyAqLworCXZzICo9IDEwMDA7CisKKwlpZiAodnMgPD0gaHMpCisJCXJldHVybiAtRURPTTsKKwkvKiBzZXQgVlMgdG8gMTIwJSBvZiBIUyB0byBtaW5pbWl6ZSBWUyBkZXRlY3Rpb24gdGltZSAqLworCXZzID0gaHMgKiAxMiAvIDEwOworCS8qIG1pbmltaXplIEhTIHRvbyAqLworCWhzID0gMTAwMDA7CisKKwliID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9ORFBfQ1RSTCk7CisJYiAmPSB+MHgzOworCWIgfD0gdXNlX2hzdnMgPyAxIDogMDsKKwliIHw9ICh1c2VfbmRwICYmIHVzZV9oc3ZzKSA/IDAgOiAyOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX05EUF9DVFJMLCBiKTsKKworCWh3YTc0Mi52c3luY19vbmx5ID0gIXVzZV9oc3ZzOworCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwKKwkJInBpeF9jbGsgJWxkIEhaIHBpeF90eF90aW1lICVsZCBwcyBsaW5lX3VwZF90aW1lICVsZCBwc1xuIiwKKwkJcGl4X2NsaywgaHdhNzQyLnBpeF90eF90aW1lLCBod2E3NDIubGluZV91cGRfdGltZSk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwKKwkJImhzICVkIHBzIHZzICVkIHBzIG1vZGUgJWQgdnN5bmNfb25seSAlZFxuIiwKKwkJaHMsIHZzLCAoYiAmIDB4MyksICF1c2VfaHN2cyk7CisKKwlyZXR1cm4gaHdhNzQyLmV4dGlmLT5zZXR1cF90ZWFyc3luYygxLCBocywgdnMsCisJCQkJCSAgICBoc19wb2xfaW52LCB2c19wb2xfaW52LCBleHRpZl9kaXYpOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfZ2V0X2NhcHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJaHdhNzQyLmludF9jdHJsLT5nZXRfY2FwcyhwbGFuZSwgY2Fwcyk7CisJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFIHwKKwkJICAgICAgT01BUEZCX0NBUFNfV0lORE9XX1BJWEVMX0RPVUJMRTsKKwlpZiAoaHdhNzQyLnRlX2Nvbm5lY3RlZCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQU19URUFSU1lOQzsKKwljYXBzLT53bmRfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2NSkgfAorCQkJICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMCk7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9zdXNwZW5kKHZvaWQpCit7CisJaHdhNzQyLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kID0gaHdhNzQyLnVwZGF0ZV9tb2RlOworCWh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJLyogRW5hYmxlIHNsZWVwIG1vZGUgKi8KKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9QT1dFUl9TQVZFLCAxIDw8IDEpOworCWlmIChod2E3NDIucG93ZXJfZG93biAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfZG93bihod2E3NDIuZmJkZXYtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9yZXN1bWUodm9pZCkKK3sKKwlpZiAoaHdhNzQyLnBvd2VyX3VwICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl91cChod2E3NDIuZmJkZXYtPmRldik7CisJLyogRGlzYWJsZSBzbGVlcCBtb2RlICovCisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfUE9XRVJfU0FWRSwgMCk7CisJd2hpbGUgKDEpIHsKKwkJLyogTG9vcCB1bnRpbCBQTEwgb3V0cHV0IGlzIHN0YWJpbGl6ZWQgKi8KKwkJaWYgKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMX0RJVl9SRUcpICYgKDEgPDwgNykpCisJCQlicmVhazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoNSkpOworCX0KKwlod2E3NDJfc2V0X3VwZGF0ZV9tb2RlKGh3YTc0Mi51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCk7Cit9CisKK3N0YXRpYyBpbnQgaHdhNzQyX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCSAgICAgICBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfdnJhbSkKK3sKKwlpbnQgciA9IDAsIGk7CisJdTggcmV2LCBjb25mOworCXVuc2lnbmVkIGxvbmcgZXh0X2NsazsKKwl1bnNpZ25lZCBsb25nIHN5c19jbGssIHBpeF9jbGs7CisJaW50IGV4dGlmX21lbV9kaXY7CisJc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpvbWFwZmJfY29uZjsKKwlzdHJ1Y3QgaHdhNzQyX3BsYXRmb3JtX2RhdGEgKmN0cmxfY29uZjsKKworCUJVR19PTighZmJkZXYtPmV4dF9pZiB8fCAhZmJkZXYtPmludF9jdHJsKTsKKworCWh3YTc0Mi5mYmRldiA9IGZiZGV2OworCWh3YTc0Mi5leHRpZiA9IGZiZGV2LT5leHRfaWY7CisJaHdhNzQyLmludF9jdHJsID0gZmJkZXYtPmludF9jdHJsOworCisJb21hcGZiX2NvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWN0cmxfY29uZiA9IG9tYXBmYl9jb25mLT5jdHJsX3BsYXRmb3JtX2RhdGE7CisKKwlpZiAoY3RybF9jb25mID09IE5VTEwgfHwgY3RybF9jb25mLT5nZXRfY2xvY2tfcmF0ZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgIkhXQTc0MjogbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlod2E3NDIucG93ZXJfZG93biA9IGN0cmxfY29uZi0+cG93ZXJfZG93bjsKKwlod2E3NDIucG93ZXJfdXAgPSBjdHJsX2NvbmYtPnBvd2VyX3VwOworCisJc3Bpbl9sb2NrX2luaXQoJmh3YTc0Mi5yZXFfbG9jayk7CisKKwlpZiAoKHIgPSBod2E3NDIuaW50X2N0cmwtPmluaXQoZmJkZXYsIDEsIHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGVycjE7CisKKwlpZiAoKHIgPSBod2E3NDIuZXh0aWYtPmluaXQoZmJkZXYpKSA8IDApCisJCWdvdG8gZXJyMjsKKworCWV4dF9jbGsgPSBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlKGZiZGV2LT5kZXYpOworCWlmICgociA9IGNhbGNfZXh0aWZfdGltaW5ncyhleHRfY2xrLCAmZXh0aWZfbWVtX2RpdikpIDwgMCkKKwkJZ290byBlcnIzOworCWh3YTc0Mi5leHRpZi0+c2V0X3RpbWluZ3MoJmh3YTc0Mi5yZWdfdGltaW5ncyk7CisJaWYgKGh3YTc0Mi5wb3dlcl91cCAhPSBOVUxMKQorCQlod2E3NDIucG93ZXJfdXAoZmJkZXYtPmRldik7CisKKwljYWxjX2h3YTc0Ml9jbGtfcmF0ZXMoZXh0X2NsaywgJnN5c19jbGssICZwaXhfY2xrKTsKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3Moc3lzX2NsaywgJmV4dGlmX21lbV9kaXYpKSA8IDApCisJCWdvdG8gZXJyNDsKKwlod2E3NDIuZXh0aWYtPnNldF90aW1pbmdzKCZod2E3NDIucmVnX3RpbWluZ3MpOworCisJcmV2ID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9SRVZfQ09ERV9SRUcpOworCWlmICgocmV2ICYgMHhmYykgIT0gMHg4MCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJIV0E3NDI6IGludmFsaWQgcmV2aXNpb24gJTAyeFxuIiwgcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyNDsKKwl9CisKKworCWlmICghKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfUExMX0RJVl9SRUcpICYgMHg4MCkpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkgICAgICAiSFdBNzQyOiBjb250cm9sbGVyIG5vdCBpbml0aWFsaXplZCBieSB0aGUgYm9vdGxvYWRlclxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjQ7CisJfQorCisJaWYgKGN0cmxfY29uZi0+dGVfY29ubmVjdGVkKSB7CisJCWlmICgociA9IHNldHVwX3RlYXJzeW5jKHBpeF9jbGssIGV4dGlmX21lbV9kaXYpKSA8IDApIHsKKwkJCWRldl9lcnIoaHdhNzQyLmZiZGV2LT5kZXYsCisJCQkgICAgICAgIkhXQTc0MjogY2FuJ3Qgc2V0dXAgdGVhcmluZyBzeW5jaHJvbml6YXRpb25cbiIpOworCQkJZ290byBlcnI0OworCQl9CisJCWh3YTc0Mi50ZV9jb25uZWN0ZWQgPSAxOworCX0KKworCWh3YTc0Mi5tYXhfdHJhbnNtaXRfc2l6ZSA9IGh3YTc0Mi5leHRpZi0+bWF4X3RyYW5zbWl0X3NpemU7CisKKwlod2E3NDIudXBkYXRlX21vZGUgPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOworCisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy54ID0gMDsKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LnkgPSAwOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cud2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cuaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LmZvcm1hdCA9IDA7CisKKwlpbml0X3RpbWVyKCZod2E3NDIuYXV0b191cGRhdGVfdGltZXIpOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lci5mdW5jdGlvbiA9IGh3YTc0Ml91cGRhdGVfd2luZG93X2F1dG87CisJaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyLmRhdGEgPSAwOworCisJaHdhNzQyLnByZXZfY29sb3JfbW9kZSA9IC0xOworCWh3YTc0Mi5wcmV2X2ZsYWdzID0gMDsKKworCWh3YTc0Mi5mYmRldiA9IGZiZGV2OworCisJSU5JVF9MSVNUX0hFQUQoJmh3YTc0Mi5mcmVlX3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh3YTc0Mi5yZXFfcG9vbCk7IGkrKykKKwkJbGlzdF9hZGQoJmh3YTc0Mi5yZXFfcG9vbFtpXS5lbnRyeSwgJmh3YTc0Mi5mcmVlX3JlcV9saXN0KTsKKwlCVUdfT04oaSA8PSBJUlFfUkVRX1BPT0xfU0laRSk7CisJc2VtYV9pbml0KCZod2E3NDIucmVxX3NlbWEsIGkgLSBJUlFfUkVRX1BPT0xfU0laRSk7CisKKwljb25mID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9DT05GSUdfUkVHKTsKKwlkZXZfaW5mbyhmYmRldi0+ZGV2LCAiOiBFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIgcmV2ICVkICIKKwkJCSJpbml0aWFsaXplZCAoQ05GIHBpbnMgJXgpXG4iLCByZXYgJiAweDAzLCBjb25mICYgMHgwNyk7CisKKwlyZXR1cm4gMDsKK2VycjQ6CisJaWYgKGh3YTc0Mi5wb3dlcl9kb3duICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl9kb3duKGZiZGV2LT5kZXYpOworZXJyMzoKKwlod2E3NDIuZXh0aWYtPmNsZWFudXAoKTsKK2VycjI6CisJaHdhNzQyLmludF9jdHJsLT5jbGVhbnVwKCk7CitlcnIxOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBod2E3NDJfY2xlYW51cCh2b2lkKQoreworCWh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJaHdhNzQyLmV4dGlmLT5jbGVhbnVwKCk7CisJaHdhNzQyLmludF9jdHJsLT5jbGVhbnVwKCk7CisJaWYgKGh3YTc0Mi5wb3dlcl9kb3duICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl9kb3duKGh3YTc0Mi5mYmRldi0+ZGV2KTsKK30KKworc3RydWN0IGxjZF9jdHJsIGh3YTc0Ml9jdHJsID0geworCS5uYW1lCQkJPSAiaHdhNzQyIiwKKwkuaW5pdAkJCT0gaHdhNzQyX2luaXQsCisJLmNsZWFudXAJCT0gaHdhNzQyX2NsZWFudXAsCisJLmJpbmRfY2xpZW50CQk9IGh3YTc0Ml9iaW5kX2NsaWVudCwKKwkuZ2V0X2NhcHMJCT0gaHdhNzQyX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBod2E3NDJfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBod2E3NDJfZ2V0X3VwZGF0ZV9tb2RlLAorCS5zZXR1cF9wbGFuZQkJPSBod2E3NDJfc2V0dXBfcGxhbmUsCisJLmVuYWJsZV9wbGFuZQkJPSBod2E3NDJfZW5hYmxlX3BsYW5lLAorCS51cGRhdGVfd2luZG93CQk9IGh3YTc0Ml91cGRhdGVfd2luZG93X2FzeW5jLAorCS5zeW5jCQkJPSBod2E3NDJfc3luYywKKwkuc3VzcGVuZAkJPSBod2E3NDJfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBod2E3NDJfcmVzdW1lLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODA3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAgSDMgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90cHM2NTAxMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmItbGNkX2gzIgorCisjZGVmaW5lIHByX2VycihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiAiIGZtdCwgIyMgYXJncykKKworc3RhdGljIGludCBoM19wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGgzX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCWludCByID0gMDsKKworCS8qIEdQSU8xIGFuZCBHUElPMiBvZiBUUFM2NTAxMCBzZW5kIExDRF9FTkJLTCBhbmQgTENEX0VOVkREIHNpZ25hbHMgKi8KKwlyID0gdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8xLCBISUdIKTsKKwlpZiAoIXIpCisJCXIgPSB0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzIsIEhJR0gpOworCWlmIChyKQorCQlwcl9lcnIoIlVuYWJsZSB0byB0dXJuIG9uIExDRCBwYW5lbFxuIik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgaDNfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlpbnQgciA9IDA7CisKKwkvKiBHUElPMSBhbmQgR1BJTzIgb2YgVFBTNjUwMTAgc2VuZCBMQ0RfRU5CS0wgYW5kIExDRF9FTlZERCBzaWduYWxzICovCisJciA9IHRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMSwgTE9XKTsKKwlpZiAoIXIpCisJCXRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMiwgTE9XKTsKKwlpZiAocikKKwkJcHJfZXJyKCJVbmFibGUgdG8gdHVybiBvZmYgTENEIHBhbmVsXG4iKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaDNfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaDNfcGFuZWwgPSB7CisJLm5hbWUJCT0gImgzIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuZGF0YV9saW5lcwk9IDE2LAorCS5icHAJCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDEyMDAwLAorCS5oc3cJCT0gMTIsCisJLmhmcAkJPSAxNCwKKwkuaGJwCQk9IDcyIC0gMTIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gaDNfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGgzX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBoM19wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBoM19wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGgzX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBoM19wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaDNfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgzX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgzX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaDNfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBoM19wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGgzX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGgzX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBoM19wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9oMyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGgzX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaDNfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgaDNfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaDNfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaDNfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoaDNfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2ZjBlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBINCBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoNF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IGg0X3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaDRfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaDRfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaDRfcGFuZWwgPSB7CisJLm5hbWUJCT0gImg0IiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDYyNTAsCisJLmhzdwkJPSAxNSwKKwkuaGZwCQk9IDE1LAorCS5oYnAJCT0gNjAsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDEsCisKKwkuaW5pdAkJPSBoNF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaDRfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGg0X3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGg0X3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaDRfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGg0X3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZoNF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoNF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGg0X3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaDRfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaDRfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGg0X3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2g0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoNF9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBoNF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoNF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoNF9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChoNF9wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTUxMC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxZjM4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTUxMC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQMTUxMCBJbm5vdmF0b3IgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCQkgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNTEwX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJZnBnYV93cml0ZSgweDcsIE9NQVAxNTEwX0ZQR0FfTENEX1BBTkVMX0NPTlRST0wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNTEwX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJZnBnYV93cml0ZSgweDAsIE9NQVAxNTEwX0ZQR0FfTENEX1BBTkVMX0NPTlRST0wpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbm5vdmF0b3IxNTEwX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIGlubm92YXRvcjE1MTBfcGFuZWwgPSB7CisJLm5hbWUJCT0gImlubjE1MTAiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTI1MDAsCisJLmhzdwkJPSA0MCwKKwkuaGZwCQk9IDQwLAorCS5oYnAJCT0gNzIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAxMiwKKworCS5pbml0CQk9IGlubm92YXRvcjE1MTBfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGlubm92YXRvcjE1MTBfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGlubm92YXRvcjE1MTBfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmlubm92YXRvcjE1MTBfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlubm92YXRvcjE1MTBfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaW5uMTUxMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbm5vdmF0b3IxNTEwX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbm5vdmF0b3IxNTEwX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjA0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUDE2MTAgSW5ub3ZhdG9yIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNkZWZpbmUgTU9EVUxFX05BTUUJIm9tYXBmYi1sY2RfaDMiCisKKyNkZWZpbmUgcHJfZXJyKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIE1PRFVMRV9OQU1FICI6ICIgZm10LCAjIyBhcmdzKQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCQkgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByID0gMDsKKworCWlmIChvbWFwX3JlcXVlc3RfZ3BpbygxNCkpIHsKKwkJcHJfZXJyKCJjYW4ndCByZXF1ZXN0IEdQSU8gMTRcbiIpOworCQlyID0gLTE7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKDE1KSkgeworCQlwcl9lcnIoImNhbid0IHJlcXVlc3QgR1BJTyAxNVxuIik7CisJCW9tYXBfZnJlZV9ncGlvKDE0KTsKKwkJciA9IC0xOworCQlnb3RvIGV4aXQ7CisJfQorCS8qIGNvbmZpZ3VyZSBHUElPKDE0LCAxNSkgYXMgb3V0cHV0cyAqLworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDE0LCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxNSwgMCk7CitleGl0OgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJb21hcF9mcmVlX2dwaW8oMTUpOworCW9tYXBfZnJlZV9ncGlvKDE0KTsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBzZXQgR1BJTzE0IGFuZCBHUElPMTUgaGlnaCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNCwgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE1LCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIHNldCBHUElPMTMsIEdQSU8xNCBhbmQgR1BJTzE1IGxvdyAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE1LCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5ub3ZhdG9yMTYxMF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBpbm5vdmF0b3IxNjEwX3BhbmVsID0geworCS5uYW1lCQk9ICJpbm4xNjEwIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMjQwLAorCS5waXhlbF9jbG9jawk9IDEyNTAwLAorCS5oc3cJCT0gNDAsCisJLmhmcAkJPSA0MCwKKwkuaGJwCQk9IDcyLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAwLAorCS5wY2QJCT0gMTIsCisKKwkuaW5pdAkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGlubm92YXRvcjE2MTBfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZpbm5vdmF0b3IxNjEwX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgICBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlubm92YXRvcjE2MTBfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2lubjE2MTAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlubm92YXRvcjE2MTBfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4MDM4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAgT1NLIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIEFkYXB0ZWQgZm9yIE9TSyBieSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IG9za19wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9za19wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJLyogY29uZmlndXJlIFBXTCBwaW4gKi8KKwlvbWFwX2NmZ19yZWcoUFdMKTsKKworCS8qIEVuYWJsZSBQV0wgdW5pdCAqLworCW9tYXBfd3JpdGViKDB4MDEsIE9NQVBfUFdMX0NMS19FTkFCTEUpOworCisJLyogU2V0IFBXTCBsZXZlbCAqLworCW9tYXBfd3JpdGViKDB4RkYsIE9NQVBfUFdMX0VOQUJMRSk7CisKKwkvKiBjb25maWd1cmUgR1BJTzIgYXMgb3V0cHV0ICovCisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMiwgMCk7CisKKwkvKiBzZXQgR1BJTzIgaGlnaCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgyLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvc2tfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBTZXQgUFdMIGxldmVsIHRvIHplcm8gKi8KKwlvbWFwX3dyaXRlYigweDAwLCBPTUFQX1BXTF9FTkFCTEUpOworCisJLyogRGlzYWJsZSBQV0wgdW5pdCAqLworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfUFdMX0NMS19FTkFCTEUpOworCisJLyogc2V0IEdQSU8yIGxvdyAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgyLCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3NrX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIG9za19wYW5lbCA9IHsKKwkubmFtZQkJPSAib3NrIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCisKKwkuYnBwCQk9IDE2LAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLnhfcmVzCQk9IDI0MCwKKwkueV9yZXMJCT0gMzIwLAorCS5waXhlbF9jbG9jawk9IDEyNTAwLAorCS5oc3cJCT0gNDAsCisJLmhmcAkJPSA0MCwKKwkuaGJwCQk9IDcyLAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAwLAorCS5wY2QJCT0gMTIsCisKKwkuaW5pdAkJPSBvc2tfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IG9za19wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gb3NrX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IG9za19wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IG9za19wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZvc2tfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc2tfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc2tfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3NrX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb3NrX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gb3NrX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IG9za19wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb3NrX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX29zayIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IG9za19wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9za19wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBvc2tfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3NrX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9za19wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChvc2tfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJkZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdGUuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgUGFsbSBUdW5nc3RlbiBFCisgKgorICogT3JpZ2luYWwgdmVyc2lvbiA6IFJvbWFpbiBHb3lldCA8ci5nb3lldEBnbWFpbC5jb20+CisgKiBDdXJyZW50IHZlcnNpb24gOiBMYXVyZW50IEdvbnphbGV6IDxwYWxtdGUubGludXhAZnJlZS5mcj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10ZV9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10ZV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdGVfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgcGFsbXRlX3BhbmVsID0geworCS5uYW1lCQk9ICJwYWxtdGUiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJICBPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgfAorCQkJICBPTUFQX0xDRENfSFNWU19PUFBPU0lURSwKKworCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSA4LAorCS5waXhlbF9jbG9jawk9IDEyMDAwLAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDMyMCwKKwkuaHN3CQk9IDQsCisJLmhmcAkJPSA4LAorCS5oYnAJCT0gMjgsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gOCwKKwkudmJwCQk9IDcsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gcGFsbXRlX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBwYWxtdGVfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHBhbG10ZV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwYWxtdGVfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBwYWxtdGVfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmcGFsbXRlX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBhbG10ZV9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBhbG10ZV9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHBhbG10ZV9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBwYWxtdGVfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBhbG10ZV9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9wYWxtdGUiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwYWxtdGVfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGFsbXRlX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhbG10ZV9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYWxtdGVfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQocGFsbXRlX3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgUGFsbSBUdW5nc3RlbnxUCisgKiBDdXJyZW50IHZlcnNpb24gOiBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIE1vZGlmaWVkIGZyb20gbGNkX2lubjE1MTAuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qCitHUElPMTEgLSBiYWNrbGlnaHQKK0dQSU8xMiAtIHNjcmVlbiBibGFua2luZworR1BJTzEzIC0gc2NyZWVuIGJsYW5raW5nCisqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10dF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10dF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdHRfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQ7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgcGFsbXR0X3BhbmVsID0geworCS5uYW1lCQk9ICJwYWxtdHQiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19IU1ZTX1JJU0lOR19FREdFIHwKKwkJCU9NQVBfTENEQ19IU1ZTX09QUE9TSVRFLAorCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMzIwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTAwMDAsCisJLmhzdwkJPSA0LAorCS5oZnAJCT0gOCwKKwkuaGJwCQk9IDI4LAorCS52c3cJCT0gMSwKKwkudmZwCQk9IDgsCisJLnZicAkJPSA3LAorCS5wY2QJCT0gMCwKKworCS5pbml0CQk9IHBhbG10dF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gcGFsbXR0X3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBwYWxtdHRfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gcGFsbXR0X3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gcGFsbXR0X3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJnBhbG10dF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYWxtdHRfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBwYWxtdHRfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBwYWxtdHRfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFsbXR0X3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYWxtdHRfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfcGFsbXR0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGFsbXR0X3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG10dF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYWxtdHRfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFsbXR0X3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHBhbG10dF9wYW5lbF9kcnZfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG16NzEuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjE3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG16NzEuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgUGFsbSBaaXJlNzEKKyAqCisgKiBPcmlnaW5hbCB2ZXJzaW9uIDogUm9tYWluIEdveWV0CisgKiBDdXJyZW50IHZlcnNpb24gOiBMYXVyZW50IEdvbnphbGV6CisgKiBNb2RpZmllZCBmb3IgemlyZTcxIDogTWFyZWsgVmFzdXQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKKwkJCSAgICAgIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3MV9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzFfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFsbXo3MV9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBwYWxtejcxX3BhbmVsID0geworCS5uYW1lCQk9ICJwYWxtejcxIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19IU1ZTX1JJU0lOR19FREdFIHwKKwkJCSAgT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDE2LAorCS5waXhlbF9jbG9jawk9IDI0MDAwLAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDMyMCwKKwkuaHN3CQk9IDQsCisJLmhmcAkJPSA4LAorCS5oYnAJCT0gMjgsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gOCwKKwkudmJwCQk9IDcsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gcGFsbXo3MV9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gcGFsbXo3MV9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gcGFsbXo3MV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwYWxtejcxX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gcGFsbXo3MV9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmcGFsbXo3MV9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYWxtejcxX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFsbXo3MV9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHBhbG16NzFfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFsbXo3MV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFsbXo3MV9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9wYWxtejcxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBhbG16NzFfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3MV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYWxtejcxX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbG16NzFfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQocGFsbXo3MV9wYW5lbF9kcnZfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9zeDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGYzMDZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9zeDEuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgU2llbWVucyBTWDEgbW9iaWxlIHBob25lCisgKgorICogQ3VycmVudCB2ZXJzaW9uIDogVm92YW44ODhAZ21haWwuY29tLCBncmVhdCBoZWxwIGZyb20gRkNBMDAwMDAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21jYnNwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisKKy8qCisgKiBPTUFQMzEwIEdQSU8gcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgR1BJT19EQVRBX0lOUFVUCQkweGZmZmNlMDAwCisjZGVmaW5lIEdQSU9fREFUQV9PVVRQVVQJMHhmZmZjZTAwNAorI2RlZmluZSBHUElPX0RJUl9DT05UUk9MCTB4ZmZmY2UwMDgKKyNkZWZpbmUgR1BJT19JTlRfQ09OVFJPTAkweGZmZmNlMDBjCisjZGVmaW5lIEdQSU9fSU5UX01BU0sJCTB4ZmZmY2UwMTAKKyNkZWZpbmUgR1BJT19JTlRfU1RBVFVTCQkweGZmZmNlMDE0CisjZGVmaW5lIEdQSU9fUElOX0NPTlRST0wJMHhmZmZjZTAxOAorCisKKyNkZWZpbmUgQV9MQ0RfU1NDX1JECTMKKyNkZWZpbmUgQV9MQ0RfU1NDX1NECTcKKyNkZWZpbmUgX0FfTENEX1JFU0VUCTkKKyNkZWZpbmUgX0FfTENEX1NTQ19DUwkxMgorI2RlZmluZSBfQV9MQ0RfU1NDX0EwCTEzCisKKyNkZWZpbmUgRFNQX1JFRwkJMHhFMTAxNzAyNAorCitjb25zdCB1bnNpZ25lZCBjaGFyIElOSVRfMVsxMl0gPSB7CisJMHgxQywgMHgwMiwgMHg4OCwgMHgwMCwgMHgxRSwgMHhFMCwgMHgwMCwgMHhEQywgMHgwMCwgMHgwMiwgMHgwMAorfTsKKworY29uc3QgdW5zaWduZWQgY2hhciBJTklUXzJbMTI3XSA9IHsKKwkweDE1LCAweDAwLCAweDI5LCAweDAwLCAweDNFLCAweDAwLCAweDUxLCAweDAwLAorCTB4NjUsIDB4MDAsIDB4N0EsIDB4MDAsIDB4OEQsIDB4MDAsIDB4QTEsIDB4MDAsCisJMHhCNiwgMHgwMCwgMHhDNywgMHgwMCwgMHhEOCwgMHgwMCwgMHhFQiwgMHgwMCwKKwkweEZCLCAweDAwLCAweDBCLCAweDAxLCAweDFCLCAweDAxLCAweDI3LCAweDAxLAorCTB4MzQsIDB4MDEsIDB4NDEsIDB4MDEsIDB4NEMsIDB4MDEsIDB4NTUsIDB4MDEsCisJMHg1RiwgMHgwMSwgMHg2OCwgMHgwMSwgMHg3MCwgMHgwMSwgMHg3OCwgMHgwMSwKKwkweDdFLCAweDAxLCAweDg2LCAweDAxLCAweDhDLCAweDAxLCAweDk0LCAweDAxLAorCTB4OUIsIDB4MDEsIDB4QTEsIDB4MDEsIDB4QTQsIDB4MDEsIDB4QTksIDB4MDEsCisJMHhBRCwgMHgwMSwgMHhCMiwgMHgwMSwgMHhCNywgMHgwMSwgMHhCQywgMHgwMSwKKwkweEMwLCAweDAxLCAweEM0LCAweDAxLCAweEM4LCAweDAxLCAweENCLCAweDAxLAorCTB4Q0YsIDB4MDEsIDB4RDIsIDB4MDEsIDB4RDUsIDB4MDEsIDB4RDgsIDB4MDEsCisJMHhEQiwgMHgwMSwgMHhFMCwgMHgwMSwgMHhFMywgMHgwMSwgMHhFNiwgMHgwMSwKKwkweEU4LCAweDAxLCAweEVCLCAweDAxLCAweEVFLCAweDAxLCAweEYxLCAweDAxLAorCTB4RjMsIDB4MDEsIDB4RjgsIDB4MDEsIDB4RjksIDB4MDEsIDB4RkMsIDB4MDEsCisJMHgwMCwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNywgMHgwMiwgMHgwOSwgMHgwMiwKKwkweDBFLCAweDAyLCAweDEzLCAweDAyLCAweDFDLCAweDAyLCAweDAwCit9OworCitjb25zdCB1bnNpZ25lZCBjaGFyIElOSVRfM1sxNV0gPSB7CisJMHgxNCwgMHgyNiwgMHgzMywgMHgzRCwgMHg0NSwgMHg0RCwgMHg1MywgMHg1OSwKKwkweDVFLCAweDYzLCAweDY3LCAweDZELCAweDcxLCAweDc4LCAweEZGCit9OworCitzdGF0aWMgdm9pZCBlcHNvbl9zZW5kYnl0ZShpbnQgZmxhZywgdW5zaWduZWQgY2hhciBieXRlKQoreworCWludCBpLCBzaGlmdGVyID0gMHg4MDsKKworCWlmICghZmxhZykKKwkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQTAsIDApOworCW1kZWxheSgyKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1JELCAxKTsKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIGZsYWcpOworCisJT01BUF9NQ0JTUF9XUklURShPTUFQMTUxMF9NQ0JTUDNfQkFTRSwgUENSMCwgMHgyMjAwKTsKKwlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJT01BUF9NQ0JTUF9XUklURShPTUFQMTUxMF9NQ0JTUDNfQkFTRSwgUENSMCwgMHgyMjAwKTsKKwkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgc2hpZnRlciAmIGJ5dGUpOworCQlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDIpOworCQlzaGlmdGVyID4+PSAxOworCX0KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19BMCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc3lzdGVtKHZvaWQpCit7CisJb21hcF9tY2JzcF9yZXF1ZXN0KE9NQVBfTUNCU1AzKTsKKwlvbWFwX21jYnNwX3N0b3AoT01BUF9NQ0JTUDMpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9HUElPKHZvaWQpCit7CisJLyogbmV3IHdhdmUgKi8KKwlvbWFwX3JlcXVlc3RfZ3BpbyhBX0xDRF9TU0NfUkQpOworCW9tYXBfcmVxdWVzdF9ncGlvKEFfTENEX1NTQ19TRCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oX0FfTENEX1JFU0VUKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhfQV9MQ0RfU1NDX0NTKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhfQV9MQ0RfU1NDX0EwKTsKKworCS8qIHNldCBhbGwgR1BJT3MgdG8gb3V0cHV0ICovCisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oQV9MQ0RfU1NDX1JELCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihBX0xDRF9TU0NfU0QsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKF9BX0xDRF9SRVNFVCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1NTQ19DUywgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1NTQ19BMCwgMCk7CisKKwkvKiBzZXQgR1BJTyBkYXRhICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19SRCwgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0EwLCAxKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlvbWFwX2NmZ19yZWcoTUNCU1AzX0NMS1gpOworCisJbWRlbGF5KDIpOworCXNldHVwX0dQSU8oKTsKKwltZGVsYXkoMik7CisKKwkvKiByZXNldCBMQ0QgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCAxKTsKKwllcHNvbl9zZW5kYnl0ZSgwLCAweDI1KTsKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfUkVTRVQsIDApOworCW1kZWxheSgxMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMSk7CisKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJbWRlbGF5KDIpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENELCBwaGFzZSAxICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQSk7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfMVtpXSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDIgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweENCKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI1OyBpKyspCisJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfMltpXSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDJhICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQyk7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfM1tpXSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDMgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweEJDKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDA4KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNCAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4MDcpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDUpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA1ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHg5NCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDYgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweEM2KTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDgwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJbWRlbGF5KDEwMCk7IC8qIHVzZWQgdG8gYmUgMTAwMCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDcgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweDE2KTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAyKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweEIxKTsKKwllcHNvbl9zZW5kYnl0ZSgxLCAweDAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgOCAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4NzYpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCWVwc29uX3NlbmRieXRlKDEsIDB4REIpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA5ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhBRik7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN4MV9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdm9pZCBzeDFfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJTWDE6IExDRCBwYW5lbCBkaXNhYmxlXG4iKTsKKwlzeDFfc2V0bW1pcG93ZXIoMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCisJZXBzb25fc2VuZGJ5dGUoMCwgMHgyNSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJZXBzb25fc2VuZGJ5dGUoMCwgMHhBRSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW1kZWxheSgxMDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCWVwc29uX3NlbmRieXRlKDAsIDB4OTUpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXByaW50ayhLRVJOX0lORk8gImxjZF9zeDE6IExDRCBwYW5lbCBlbmFibGVcbiIpOworCWluaXRfc3lzdGVtKCk7CisJZGlzcGxheV9pbml0KCk7CisKKwlzeDFfc2V0bW1pcG93ZXIoMSk7CisJc3gxX3NldGJhY2tsaWdodCgweDE4KTsKKwlzeDFfc2V0a2V5bGlnaHQgKDB4MDYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN4MV9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBzeDFfcGFuZWwgPSB7CisJLm5hbWUJCT0gInN4MSIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMgfCBPTUFQX0xDRENfSU5WX1BJWF9DTE9DSyB8CisJCQkgIE9NQVBfTENEQ19JTlZfT1VUUFVUX0VOLAorCisJLnhfcmVzCQk9IDE3NiwKKwkueV9yZXMJCT0gMjIwLAorCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSAxNiwKKwkuaHN3CQk9IDUsCisJLmhmcAkJPSA1LAorCS5oYnAJCT0gNSwKKwkudnN3CQk9IDIsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMSwKKwkucGl4ZWxfY2xvY2sJPSAxNTAwLAorCisJLmluaXQJCT0gc3gxX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBzeDFfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHN4MV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBzeDFfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBzeDFfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHN4MV9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmc3gxX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN4MV9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHN4MV9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHN4MV9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBzeDFfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHN4MV9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAibGNkX3N4MSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IHN4MV9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnN4MV9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBzeDFfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3gxX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN4MV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChzeDFfcGFuZWxfZHJ2X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4NTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKQEAgLTAsMCArMSw4OTMgQEAKKy8qCisgKiBPTUFQMSBpbnRlcm5hbCBMQ0QgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRQkJCSJsY2RjIgorCisjZGVmaW5lIE9NQVBfTENEQ19CQVNFCQkJMHhmZmZlYzAwMAorI2RlZmluZSBPTUFQX0xDRENfU0laRQkJCTI1NgorI2RlZmluZSBPTUFQX0xDRENfSVJRCQkJSU5UX0xDRF9DVFJMCisKKyNkZWZpbmUgT01BUF9MQ0RDX0NPTlRST0wJCShPTUFQX0xDRENfQkFTRSArIDB4MDApCisjZGVmaW5lIE9NQVBfTENEQ19USU1JTkcwCQkoT01BUF9MQ0RDX0JBU0UgKyAweDA0KQorI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMQkJKE9NQVBfTENEQ19CQVNFICsgMHgwOCkKKyNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzIJCShPTUFQX0xDRENfQkFTRSArIDB4MGMpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUVVMJCShPTUFQX0xDRENfQkFTRSArIDB4MTApCisjZGVmaW5lIE9NQVBfTENEQ19TVUJQQU5FTAkJKE9NQVBfTENEQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgT01BUF9MQ0RDX0xJTkVfSU5UCQkoT01BUF9MQ0RDX0JBU0UgKyAweDE4KQorI2RlZmluZSBPTUFQX0xDRENfRElTUExBWV9TVEFUVVMJKE9NQVBfTENEQ19CQVNFICsgMHgxYykKKworI2RlZmluZSBPTUFQX0xDRENfU1RBVF9ET05FCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9WU1lOQwkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfU1lOQ19MT1NUCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0FCQwkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfTElORV9JTlQJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0ZVRgkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUJKDEgPDwgNikKKworI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MQ0RfRU4JCSgxIDw8IDApCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xDRF9URlQJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xJTkVfSVJRX0NMUl9TRUwJKDEgPDwgMTApCisKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9WU1lOQwkJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9ET05FCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xPQURFRF9QQUxFVFRFCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTElORV9OSVJRCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xJTkUJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTUFTSwkJKCgoMSA8PCA1KSAtIDEpIDw8IDIpCisKKyNkZWZpbmUgTUFYX1BBTEVUVEVfU0laRQkJUEFHRV9TSVpFCisKK2VudW0gbGNkY19sb2FkX21vZGUgeworCU9NQVBfTENEQ19MT0FEX1BBTEVUVEUsCisJT01BUF9MQ0RDX0xPQURfRlJBTUUsCisJT01BUF9MQ0RDX0xPQURfUEFMRVRURV9BTkRfRlJBTUUKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29udHJvbGxlciB7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJdXBkYXRlX21vZGU7CisJaW50CQkJZXh0X21vZGU7CisKKwl1bnNpZ25lZCBsb25nCQlmcmFtZV9vZmZzZXQ7CisJaW50CQkJc2NyZWVuX3dpZHRoOworCWludAkJCXhyZXM7CisJaW50CQkJeXJlczsKKworCWVudW0gb21hcGZiX2NvbG9yX2Zvcm1hdAljb2xvcl9tb2RlOworCWludAkJCWJwcDsKKwl2b2lkCQkJKnBhbGV0dGVfdmlydDsKKwlkbWFfYWRkcl90CQlwYWxldHRlX3BoeXM7CisJaW50CQkJcGFsZXR0ZV9jb2RlOworCWludAkJCXBhbGV0dGVfc2l6ZTsKKworCXVuc2lnbmVkIGludAkJaXJxX21hc2s7CisJc3RydWN0IGNvbXBsZXRpb24JbGFzdF9mcmFtZV9jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglwYWxldHRlX2xvYWRfY29tcGxldGU7CisJc3RydWN0IGNsawkJKmxjZF9jazsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisKKwl2b2lkCQkJKCpkbWFfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCQkqZG1hX2NhbGxiYWNrX2RhdGE7CisKKwlpbnQJCQlmYm1lbV9hbGxvY2F0ZWQ7CisJZG1hX2FkZHJfdAkJdnJhbV9waHlzOworCXZvaWQJCQkqdnJhbV92aXJ0OworCXVuc2lnbmVkIGxvbmcJCXZyYW1fc2l6ZTsKK30gbGNkYzsKKworc3RhdGljIHZvaWQgaW5saW5lIGVuYWJsZV9pcnFzKGludCBtYXNrKQoreworCWxjZGMuaXJxX21hc2sgfD0gbWFzazsKK30KKworc3RhdGljIHZvaWQgaW5saW5lIGRpc2FibGVfaXJxcyhpbnQgbWFzaykKK3sKKwlsY2RjLmlycV9tYXNrICY9IH5tYXNrOworfQorCitzdGF0aWMgdm9pZCBzZXRfbG9hZF9tb2RlKGVudW0gbGNkY19sb2FkX21vZGUgbW9kZSkKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwlsICY9IH4oMyA8PCAyMCk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBPTUFQX0xDRENfTE9BRF9QQUxFVFRFOgorCQlsIHw9IDEgPDwgMjA7CisJCWJyZWFrOworCWNhc2UgT01BUF9MQ0RDX0xPQURfRlJBTUU6CisJCWwgfD0gMiA8PCAyMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0xDRENfTE9BRF9QQUxFVFRFX0FORF9GUkFNRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2NvbnRyb2xsZXIodm9pZCkKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwlsIHw9IE9NQVBfTENEQ19DVFJMX0xDRF9FTjsKKwlsICY9IH5PTUFQX0xDRENfSVJRX01BU0s7CisJbCB8PSBsY2RjLmlycV9tYXNrIHwgT01BUF9MQ0RDX0lSUV9ET05FOwkvKiBlbmFibGVkIElSUXMgKi8KKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29udHJvbGxlcl9hc3luYyh2b2lkKQoreworCXUzMiBsOworCXUzMiBtYXNrOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCW1hc2sgPSBPTUFQX0xDRENfQ1RSTF9MQ0RfRU4gfCBPTUFQX0xDRENfSVJRX01BU0s7CisJLyoKKwkgKiBQcmVzZXJ2ZSB0aGUgRE9ORSBtYXNrLCBzaW5jZSB3ZSBzdGlsbCB3YW50IHRvIGdldCB0aGUKKwkgKiBmaW5hbCBET05FIGlycS4gSXQgd2lsbCBiZSBkaXNhYmxlZCBpbiB0aGUgSVJRIGhhbmRsZXIuCisJICovCisJbWFzayAmPSB+T01BUF9MQ0RDX0lSUV9ET05FOworCWwgJj0gfm1hc2s7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbnRyb2xsZXIodm9pZCkKK3sKKwlpbml0X2NvbXBsZXRpb24oJmxjZGMubGFzdF9mcmFtZV9jb21wbGV0ZSk7CisJZGlzYWJsZV9jb250cm9sbGVyX2FzeW5jKCk7CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmxjZGMubGFzdF9mcmFtZV9jb21wbGV0ZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKQorCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2NvbnRyb2xsZXIodTMyIHN0YXR1cykKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisKKwlkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmMoKTsKKwlyZXNldF9jb3VudCsrOworCWlmIChyZXNldF9jb3VudCA9PSAxIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF9qaWZmaWVzICsgSFopKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LAorCQkJICAicmVzZXR0aW5nIChzdGF0dXMgJSMwMTB4LHJlc2V0IGNvdW50ICVsdSlcbiIsCisJCQkgIHN0YXR1cywgcmVzZXRfY291bnQpOworCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCX0KKwlpZiAocmVzZXRfY291bnQgPCAxMDApIHsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9IGVsc2UgeworCQlyZXNldF9jb3VudCA9IDA7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LAorCQkJInRvbyBtYW55IHJlc2V0IGF0dGVtcHRzLCBnaXZpbmcgdXAuXG4iKTsKKwl9Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIExDRCBETUEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IG1vZGUgc3BlY2lmaWVkIGJ5IHBhcmFtZXRlcnMKKyAqIGluIGxjZGMuZmJkZXYgYW5kIGZiZGV2LT52YXIuCisgKi8KK3N0YXRpYyB2b2lkIHNldHVwX2xjZF9kbWEodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IGRtYV9lbGVtX3R5cGVbXSA9IHsKKwkJMCwKKwkJT01BUF9ETUFfREFUQV9UWVBFX1M4LAorCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAorCQkwLAorCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzMyLAorCX07CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gbGNkYy5mYmRldi0+ZmJfaW5mb1swXS0+cGFyOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmxjZGMuZmJkZXYtPmZiX2luZm9bMF0tPnZhcjsKKwl1bnNpZ25lZCBsb25nCXNyYzsKKwlpbnQJCWVzaXplLCB4ZWxlbSwgeWVsZW07CisKKwlzcmMgPSBsY2RjLnZyYW1fcGh5cyArIGxjZGMuZnJhbWVfb2Zmc2V0OworCisJc3dpdGNoICh2YXItPnJvdGF0ZSkgeworCWNhc2UgMDoKKwkJaWYgKHBsYW5lLT5pbmZvLm1pcnJvciB8fCAoc3JjICYgMykgfHwKKwkJICAgIGxjZGMuY29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfWVVWNDIwIHx8CisJCSAgICAobGNkYy54cmVzICYgMSkpCisJCQllc2l6ZSA9IDI7CisJCWVsc2UKKwkJCWVzaXplID0gNDsKKwkJeGVsZW0gPSBsY2RjLnhyZXMgKiBsY2RjLmJwcCAvIDggLyBlc2l6ZTsKKwkJeWVsZW0gPSBsY2RjLnlyZXM7CisJCWJyZWFrOworCWNhc2UgOTA6CisJY2FzZSAxODA6CisJY2FzZSAyNzA6CisJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJQlVHKCk7CisJCX0KKwkJZXNpemUgPSAyOworCQl4ZWxlbSA9IGxjZGMueXJlcyAqIGxjZGMuYnBwIC8gMTY7CisJCXllbGVtID0gbGNkYy54cmVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsCisJCSAic2V0dXBfZG1hOiBzcmMgJSMwMTBseCBlc2l6ZSAlZCB4ZWxlbSAlZCB5ZWxlbSAlZFxuIiwKKwkJIHNyYywgZXNpemUsIHhlbGVtLCB5ZWxlbSk7CisjZW5kaWYKKwlvbWFwX3NldF9sY2RfZG1hX2IxKHNyYywgeGVsZW0sIHllbGVtLCBkbWFfZWxlbV90eXBlW2VzaXplXSk7CisJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkgeworCQlpbnQgYnBwID0gbGNkYy5icHA7CisKKwkJLyoKKwkJICogWVVWIHN1cHBvcnQgaXMgb25seSBmb3IgZXh0ZXJuYWwgbW9kZSB3aGVuIHdlIGhhdmUgdGhlCisJCSAqIFlVViB3aW5kb3cgZW1iZWRkZWQgaW4gYSAxNmJwcCBmcmFtZSBidWZmZXIuCisJCSAqLworCQlpZiAobGNkYy5jb2xvcl9tb2RlID09IE9NQVBGQl9DT0xPUl9ZVVY0MjApCisJCQlicHAgPSAxNjsKKwkJLyogU2V0IHZpcnR1YWwgeHJlcyBlbGVtIHNpemUgKi8KKwkJb21hcF9zZXRfbGNkX2RtYV9iMV92eHJlcygKKwkJCWxjZGMuc2NyZWVuX3dpZHRoICogYnBwIC8gOCAvIGVzaXplKTsKKwkJLyogU2V0dXAgdHJhbnNmb3JtYXRpb25zICovCisJCW9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24odmFyLT5yb3RhdGUpOworCQlvbWFwX3NldF9sY2RfZG1hX2IxX21pcnJvcihwbGFuZS0+aW5mby5taXJyb3IpOworCX0KKwlvbWFwX3NldHVwX2xjZF9kbWEoKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxjZGNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19TVEFUVVMpOworCisJaWYgKHN0YXR1cyAmIChPTUFQX0xDRENfU1RBVF9GVUYgfCBPTUFQX0xDRENfU1RBVF9TWU5DX0xPU1QpKQorCQlyZXNldF9jb250cm9sbGVyKHN0YXR1cyk7CisJZWxzZSB7CisJCWlmIChzdGF0dXMgJiBPTUFQX0xDRENfU1RBVF9ET05FKSB7CisJCQl1MzIgbDsKKworCQkJLyoKKwkJCSAqIERpc2FibGUgSVJRX0RPTkUuIFRoZSBzdGF0dXMgYml0IHdpbGwgYmUgY2xlYXJlZAorCQkJICogb25seSB3aGVuIHRoZSBjb250cm9sbGVyIGlzIHJlZW5hYmxlZCBhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gZ2V0IG1vcmUgaW50ZXJydXB0cy4KKwkJCSAqLworCQkJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCQkJbCAmPSB+T01BUF9MQ0RDX0lSUV9ET05FOworCQkJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworCQkJY29tcGxldGUoJmxjZGMubGFzdF9mcmFtZV9jb21wbGV0ZSk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIE9NQVBfTENEQ19TVEFUX0xPQURFRF9QQUxFVFRFKSB7CisJCQlkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmMoKTsKKwkJCWNvbXBsZXRlKCZsY2RjLnBhbGV0dGVfbG9hZF9jb21wbGV0ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZXNlIGludGVycnVwdCBzdGF0dXMgYml0cy4KKwkgKiBTeW5jX2xvc3QsIEZVRiBiaXRzIHdlcmUgY2xlYXJlZCBieSBkaXNhYmxpbmcgdGhlIExDRCBjb250cm9sbGVyCisJICogTE9BREVEX1BBTEVUVEUgY2FuIGJlIGNsZWFyZWQgdGhpcyB3YXkgb25seSBpbiBwYWxldHRlIG9ubHkKKwkgKiBsb2FkIG1vZGUuIEluIG90aGVyIGxvYWQgbW9kZXMgaXQncyBjbGVhcmVkIGJ5IGRpc2FibGluZyB0aGUKKwkgKiBjb250cm9sbGVyLgorCSAqLworCXN0YXR1cyAmPSB+KE9NQVBfTENEQ19TVEFUX1ZTWU5DIHwKKwkJICAgIE9NQVBfTENEQ19TVEFUX0xPQURFRF9QQUxFVFRFIHwKKwkJICAgIE9NQVBfTENEQ19TVEFUX0FCQyB8CisJCSAgICBPTUFQX0xDRENfU1RBVF9MSU5FX0lOVCk7CisJb21hcF93cml0ZWwoc3RhdHVzLCBPTUFQX0xDRENfU1RBVFVTKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBDaGFuZ2UgdG8gYSBuZXcgdmlkZW8gbW9kZS4gV2UgZGVmZXIgdGhpcyB0byBhIGxhdGVyIHRpbWUgdG8gYXZvaWQgYW55CisgKiBmbGlja2VyIGFuZCBub3QgdG8gbWVzcyB1cCB0aGUgY3VycmVudCBMQ0QgRE1BIGNvbnRleHQuIEZvciB0aGlzIHdlIGRpc2FibGUKKyAqIHRoZSBMQ0QgY29udHJvbGVyLCB3aGljaCB3aWxsIGdlbmVyYXRlIGEgRE9ORSBpcnEgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgaGFzCisgKiBiZWVuIHRyYW5zZmVycmVkLiBUaGVuIGl0J2xsIGJlIHNhZmUgdG8gcmVjb25maWd1cmUgYm90aCB0aGUgTENEIGNvbnRyb2xsZXIKKyAqIGFzIHdlbGwgYXMgdGhlIExDRCBETUEuCisgKi8KK3N0YXRpYyBpbnQgb21hcF9sY2RjX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgaW50IGNvbG9yX21vZGUpCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmbGNkYy5mYmRldi0+ZmJfaW5mb1swXS0+dmFyOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gbGNkYy5mYmRldi0+cGFuZWw7CisJaW50IHJvdF94LCByb3RfeTsKKworCWlmICh2YXItPnJvdGF0ZSA9PSAwKSB7CisJCXJvdF94ID0gcGFuZWwtPnhfcmVzOworCQlyb3RfeSA9IHBhbmVsLT55X3JlczsKKwl9IGVsc2UgeworCQlyb3RfeCA9IHBhbmVsLT55X3JlczsKKwkJcm90X3kgPSBwYW5lbC0+eF9yZXM7CisJfQorCWlmIChwbGFuZSAhPSAwIHx8IGNoYW5uZWxfb3V0ICE9IDAgfHwgcG9zX3ggIT0gMCB8fCBwb3NfeSAhPSAwIHx8CisJICAgIHdpZHRoID4gcm90X3ggfHwgaGVpZ2h0ID4gcm90X3kpIHsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LAorCQkJImludmFsaWQgcGxhbmUgcGFyYW1zIHBsYW5lICVkIHBvc194ICVkIHBvc195ICVkICIKKwkJCSJ3ICVkIGggJWRcbiIsIHBsYW5lLCBwb3NfeCwgcG9zX3ksIHdpZHRoLCBoZWlnaHQpOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxjZGMuZnJhbWVfb2Zmc2V0ID0gb2Zmc2V0OworCWxjZGMueHJlcyA9IHdpZHRoOworCWxjZGMueXJlcyA9IGhlaWdodDsKKwlsY2RjLnNjcmVlbl93aWR0aCA9IHNjcmVlbl93aWR0aDsKKwlsY2RjLmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlOworCisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOgorCQlsY2RjLmJwcCA9IDg7CisJCWxjZGMucGFsZXR0ZV9jb2RlID0gMHgzMDAwOworCQlsY2RjLnBhbGV0dGVfc2l6ZSA9IDUxMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQlsY2RjLmJwcCA9IDE2OworCQlsY2RjLnBhbGV0dGVfY29kZSA9IDB4NDAwMDsKKwkJbGNkYy5wYWxldHRlX3NpemUgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNDQ0OgorCQlsY2RjLmJwcCA9IDE2OworCQlsY2RjLnBhbGV0dGVfY29kZSA9IDB4NDAwMDsKKwkJbGNkYy5wYWxldHRlX3NpemUgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQlpZiAobGNkYy5leHRfbW9kZSkgeworCQkJbGNkYy5icHAgPSAxMjsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQlpZiAobGNkYy5leHRfbW9kZSkgeworCQkJbGNkYy5icHAgPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJLyogRklYTUU6IG90aGVyIEJQUHMuCisJCSAqIGJwcDE6IGNvZGUgIDAsICAgICBzaXplIDI1NgorCQkgKiBicHAyOiBjb2RlICAweDEwMDAgc2l6ZSAyNTYKKwkJICogYnBwNDogY29kZSAgMHgyMDAwIHNpemUgMjU2CisJCSAqIGJwcDEyOiBjb2RlIDB4NDAwMCBzaXplIDMyCisJCSAqLworCQlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwgImludmFsaWQgY29sb3IgbW9kZSAlZFxuIiwgY29sb3JfbW9kZSk7CisJCUJVRygpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxjZGMuZXh0X21vZGUpIHsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGNkYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJCXNldHVwX2xjZF9kbWEoKTsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2xjZGNfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwKKwkJInBsYW5lICVkIGVuYWJsZSAlZCB1cGRhdGVfbW9kZSAlZCBleHRfbW9kZSAlZFxuIiwKKwkJcGxhbmUsIGVuYWJsZSwgbGNkYy51cGRhdGVfbW9kZSwgbGNkYy5leHRfbW9kZSk7CisJaWYgKHBsYW5lICE9IE9NQVBGQl9QTEFORV9HRlgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIExDRCBETUEgZm9yIGEgcGFsZXR0ZSBsb2FkIG9wZXJhdGlvbiBhbmQgZG8gdGhlIHBhbGV0dGUKKyAqIGRvd25sb2FkaW5nIHN5bmNocm9ub3VzbHkuIFdlIGRvbid0IHVzZSB0aGUgZnJhbWUrcGFsZXR0ZSBsb2FkIG1vZGUgb2YKKyAqIHRoZSBjb250cm9sbGVyLCBzaW5jZSB0aGUgcGFsZXR0ZSBjYW4gYWx3YXlzIGJlIGRvd25sb2FkZWQgc2VwZXJhdGVseS4KKyAqLworc3RhdGljIHZvaWQgbG9hZF9wYWxldHRlKHZvaWQpCit7CisJdTE2CSpwYWxldHRlOworCisJcGFsZXR0ZSA9ICh1MTYgKilsY2RjLnBhbGV0dGVfdmlydDsKKworCSoodTE2ICopcGFsZXR0ZSAmPSAweDBmZmY7CisJKih1MTYgKilwYWxldHRlIHw9IGxjZGMucGFsZXR0ZV9jb2RlOworCisJb21hcF9zZXRfbGNkX2RtYV9iMShsY2RjLnBhbGV0dGVfcGh5cywKKwkJbGNkYy5wYWxldHRlX3NpemUgLyA0ICsgMSwgMSwgT01BUF9ETUFfREFUQV9UWVBFX1MzMik7CisKKwlvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcigxKTsKKwlvbWFwX3NldHVwX2xjZF9kbWEoKTsKKworCWluaXRfY29tcGxldGlvbigmbGNkYy5wYWxldHRlX2xvYWRfY29tcGxldGUpOworCWVuYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfTE9BREVEX1BBTEVUVEUpOworCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfUEFMRVRURSk7CisJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbGNkYy5wYWxldHRlX2xvYWRfY29tcGxldGUsCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKSkKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOworCS8qIFRoZSBjb250cm9sbGVyIGdldHMgZGlzYWJsZWQgaW4gdGhlIGlycSBoYW5kbGVyICovCisJZGlzYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfTE9BREVEX1BBTEVUVEUpOworCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisKKwlvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihsY2RjLmV4dF9tb2RlKTsKK30KKworLyogVXNlZCBvbmx5IGluIGludGVybmFsIGNvbnRyb2xsZXIgbW9kZSAqLworc3RhdGljIGludCBvbWFwX2xjZGNfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1MTYgcmVkLCB1MTYgZ3JlZW4sIHUxNiBibHVlLAorCQkJICAgICAgIHUxNiB0cmFuc3AsIGludCB1cGRhdGVfaHdfcGFsKQoreworCXUxNiAqcGFsZXR0ZTsKKworCWlmIChsY2RjLmNvbG9yX21vZGUgIT0gT01BUEZCX0NPTE9SX0NMVVRfOEJQUCB8fCByZWdubyA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYWxldHRlID0gKHUxNiAqKWxjZGMucGFsZXR0ZV92aXJ0OworCisJcGFsZXR0ZVtyZWdub10gJj0gfjB4MGZmZjsKKwlwYWxldHRlW3JlZ25vXSB8PSAoKHJlZCA+PiAxMikgPDwgOCkgfCAoKGdyZWVuID4+IDEyKSA8PCA0ICkgfAorCQkJICAgKGJsdWUgPj4gMTIpOworCisJaWYgKHVwZGF0ZV9od19wYWwpIHsKKwkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJCWxvYWRfcGFsZXR0ZSgpOworCQlzZXR1cF9sY2RfZG1hKCk7CisJCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfRlJBTUUpOworCQllbmFibGVfY29udHJvbGxlcigpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2NrX2RpdihpbnQgaXNfdGZ0LCBpbnQgcGNrLCBpbnQgKnBja19kaXYpCit7CisJdW5zaWduZWQgbG9uZyBsY2s7CisKKwlwY2sgPSBtYXgoMSwgcGNrKTsKKwlsY2sgPSBjbGtfZ2V0X3JhdGUobGNkYy5sY2RfY2spOworCSpwY2tfZGl2ID0gKGxjayArIHBjayAtIDEpIC8gcGNrOworCWlmIChpc190ZnQpCisJCSpwY2tfZGl2ID0gbWF4KDIsICpwY2tfZGl2KTsKKwllbHNlCisJCSpwY2tfZGl2ID0gbWF4KDMsICpwY2tfZGl2KTsKKwlpZiAoKnBja19kaXYgPiAyNTUpIHsKKwkJLyogRklYTUU6IHRyeSB0byBhZGp1c3QgbG9naWMgY2xvY2sgZGl2aWRlciBhcyB3ZWxsICovCisJCSpwY2tfZGl2ID0gMjU1OworCQlkZXZfd2FybihsY2RjLmZiZGV2LT5kZXYsICJwaXhjbG9jayAlZCBrSHogdG9vIGxvdy5cbiIsCisJCQkgcGNrIC8gMTAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgc2V0dXBfcmVncyh2b2lkKQoreworCXUzMiBsOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gbGNkYy5mYmRldi0+cGFuZWw7CisJaW50IGlzX3RmdCA9IHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfUEFORUxfVEZUOworCXVuc2lnbmVkIGxvbmcgbGNrOworCWludCBwY2Q7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJbCAmPSB+T01BUF9MQ0RDX0NUUkxfTENEX1RGVDsKKwlsIHw9IGlzX3RmdCA/IE9NQVBfTENEQ19DVFJMX0xDRF9URlQgOiAwOworI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEFMTVRFCisvKiBGSVhNRTppZiAobWFjaGluZV9pc19vbWFwX3BhbG10ZSgpKSB7ICovCisJCS8qIFBhbG1URSB1c2VzIGFsdGVybmF0ZSBURlQgc2V0dGluZyBpbiA4QlBQIG1vZGUgKi8KKwkJbCB8PSAoaXNfdGZ0ICYmIHBhbmVsLT5icHAgPT0gOCkgPyAweDgxMDAwMCA6IDA7CisvKgl9ICovCisjZW5kaWYKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfVElNSU5HMik7CisJbCAmPSB+KCgoMSA8PCA2KSAtIDEpIDw8IDIwKTsKKwlsIHw9IChwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1NJR05BTF9NQVNLKSA8PCAyMDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMik7CisKKwlsID0gcGFuZWwtPnhfcmVzIC0gMTsKKwlsIHw9IChwYW5lbC0+aHN3IC0gMSkgPDwgMTA7CisJbCB8PSAocGFuZWwtPmhmcCAtIDEpIDw8IDE2OworCWwgfD0gKHBhbmVsLT5oYnAgLSAxKSA8PCAyNDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMCk7CisKKwlsID0gcGFuZWwtPnlfcmVzIC0gMTsKKwlsIHw9IChwYW5lbC0+dnN3IC0gMSkgPDwgMTA7CisJbCB8PSBwYW5lbC0+dmZwIDw8IDE2OworCWwgfD0gcGFuZWwtPnZicCA8PCAyNDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMSk7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfVElNSU5HMik7CisJbCAmPSB+MHhmZjsKKworCWxjayA9IGNsa19nZXRfcmF0ZShsY2RjLmxjZF9jayk7CisKKwlpZiAoIXBhbmVsLT5wY2QpCisJCWNhbGNfY2tfZGl2KGlzX3RmdCwgcGFuZWwtPnBpeGVsX2Nsb2NrICogMTAwMCwgJnBjZCk7CisJZWxzZSB7CisJCWRldl93YXJuKGxjZGMuZmJkZXYtPmRldiwKKwkJICAgICJQaXhlbCBjbG9jayBkaXZpZGVyIHZhbHVlIGlzIG9ic29sZXRlLlxuIgorCQkgICAgIlRyeSB0byBzZXQgcGl4ZWxfY2xvY2sgdG8gJWx1IGFuZCBwY2QgdG8gMCAiCisJCSAgICAiaW4gZHJpdmVycy92aWRlby9vbWFwL2xjZF8lcy5jIGFuZCBzdWJtaXQgYSBwYXRjaC5cbiIsCisJCQlsY2sgLyBwYW5lbC0+cGNkIC8gMTAwMCwgcGFuZWwtPm5hbWUpOworCisJCXBjZCA9IHBhbmVsLT5wY2Q7CisJfQorCWwgfD0gcGNkICYgMHhmZjsKKwlsIHw9IHBhbmVsLT5hY2IgPDwgODsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfVElNSU5HMik7CisKKwkvKiB1cGRhdGUgcGFuZWwgaW5mbyB3aXRoIHRoZSBleGFjdCBjbG9jayAqLworCXBhbmVsLT5waXhlbF9jbG9jayA9IGxjayAvIHBjZCAvIDEwMDA7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIExDRCBjb250cm9sbGVyLCBkb3dubG9hZCB0aGUgY29sb3IgcGFsZXR0ZSBhbmQgc3RhcnQgYSBsb29wZWQKKyAqIERNQSB0cmFuc2ZlciBvZiB0aGUgZnJhbWUgaW1hZ2UgZGF0YS4gQ2FsbGVkIG9ubHkgaW4gaW50ZXJuYWwKKyAqIGNvbnRyb2xsZXIgbW9kZS4KKyAqLworc3RhdGljIGludCBvbWFwX2xjZGNfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaW50IHIgPSAwOworCisJaWYgKG1vZGUgIT0gbGNkYy51cGRhdGVfbW9kZSkgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCQlzZXR1cF9yZWdzKCk7CisJCQlsb2FkX3BhbGV0dGUoKTsKKworCQkJLyogU2V0dXAgYW5kIHN0YXJ0IExDRCBETUEgKi8KKwkJCXNldHVwX2xjZF9kbWEoKTsKKworCQkJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9GUkFNRSk7CisJCQllbmFibGVfaXJxcyhPTUFQX0xDRENfSVJRX0RPTkUpOworCQkJLyogVGhpcyB3aWxsIHN0YXJ0IHRoZSBhY3R1YWwgRE1BIHRyYW5zZmVyICovCisJCQllbmFibGVfY29udHJvbGxlcigpOworCQkJbGNkYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQlicmVhazsKKwkJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQkJZGlzYWJsZV9jb250cm9sbGVyKCk7CisJCQlvbWFwX3N0b3BfbGNkX2RtYSgpOworCQkJbGNkYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXIgPSAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBvbWFwX2xjZGNfZ2V0X3VwZGF0ZV9tb2RlKHZvaWQpCit7CisJcmV0dXJuIGxjZGMudXBkYXRlX21vZGU7Cit9CisKKy8qIFBNIGNvZGUgY2FsbGVkIG9ubHkgaW4gaW50ZXJuYWwgY29udHJvbGxlciBtb2RlICovCitzdGF0aWMgdm9pZCBvbWFwX2xjZGNfc3VzcGVuZCh2b2lkKQoreworCWlmIChsY2RjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19yZXN1bWUodm9pZCkKK3sKKwlpZiAobGNkYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJc2V0dXBfcmVncygpOworCQlsb2FkX3BhbGV0dGUoKTsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQlzZXRfbG9hZF9tb2RlKE9NQVBfTENEQ19MT0FEX0ZSQU1FKTsKKwkJZW5hYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9ET05FKTsKKwkJZW5hYmxlX2NvbnRyb2xsZXIoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwlyZXR1cm47Cit9CisKK2ludCBvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCUJVR19PTihjYWxsYmFjayA9PSBOVUxMKTsKKworCWlmIChsY2RjLmRtYV9jYWxsYmFjaykKKwkJcmV0dXJuIC1FQlVTWTsKKwllbHNlIHsKKwkJbGNkYy5kbWFfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJbGNkYy5kbWFfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayk7CisKK3ZvaWQgb21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKHZvaWQpCit7CisJbGNkYy5kbWFfY2FsbGJhY2sgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2spOworCitzdGF0aWMgdm9pZCBsY2RjX2RtYV9oYW5kbGVyKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJaWYgKGxjZGMuZG1hX2NhbGxiYWNrKQorCQlsY2RjLmRtYV9jYWxsYmFjayhsY2RjLmRtYV9jYWxsYmFja19kYXRhKTsKK30KKworc3RhdGljIGludCBtbWFwX2tlcm4odm9pZCkKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0CSprdm1hOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAl2bWE7CisJcGdwcm90X3QJCXBncHJvdDsKKwl1bnNpZ25lZCBsb25nCQl2YWRkcjsKKworCWt2bWEgPSBnZXRfdm1fYXJlYShsY2RjLnZyYW1fc2l6ZSwgVk1fSU9SRU1BUCk7CisJaWYgKGt2bWEgPT0gTlVMTCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgImNhbid0IGdldCBrZXJuZWwgdm0gYXJlYVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2bWEudm1fbW0gPSAmaW5pdF9tbTsKKworCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpa3ZtYS0+YWRkcjsKKwl2bWEudm1fc3RhcnQgPSB2YWRkcjsKKwl2bWEudm1fZW5kID0gdmFkZHIgKyBsY2RjLnZyYW1fc2l6ZTsKKworCXBncHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUocGdwcm90X2tlcm5lbCk7CisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSgmdm1hLCB2YWRkciwKKwkJCSAgIGxjZGMudnJhbV9waHlzID4+IFBBR0VfU0hJRlQsCisJCQkgICBsY2RjLnZyYW1fc2l6ZSwgcGdwcm90KSA8IDApIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJrZXJuZWwgbW1hcCBmb3IgRkIgbWVtb3J5IGZhaWxlZFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWxjZGMudnJhbV92aXJ0ID0gKHZvaWQgKil2YWRkcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9rZXJuKHZvaWQpCit7CisJdnVubWFwKGxjZGMudnJhbV92aXJ0KTsKK30KKworc3RhdGljIGludCBhbGxvY19wYWxldHRlX3JhbSh2b2lkKQoreworCWxjZGMucGFsZXR0ZV92aXJ0ID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShsY2RjLmZiZGV2LT5kZXYsCisJCU1BWF9QQUxFVFRFX1NJWkUsICZsY2RjLnBhbGV0dGVfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKGxjZGMucGFsZXR0ZV92aXJ0ID09IE5VTEwpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgcGFsZXR0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGxjZGMucGFsZXR0ZV92aXJ0LCAwLCBNQVhfUEFMRVRURV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwgTUFYX1BBTEVUVEVfU0laRSwKKwkJCWxjZGMucGFsZXR0ZV92aXJ0LCBsY2RjLnBhbGV0dGVfcGh5cyk7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJaW50IGJwcDsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGxjZGMuZmJkZXYtPnBhbmVsOworCisJYnBwID0gcGFuZWwtPmJwcDsKKwlpZiAoYnBwID09IDEyKQorCQlicHAgPSAxNjsKKwlmcmFtZV9zaXplID0gUEFHRV9BTElHTihwYW5lbC0+eF9yZXMgKiBicHAgLyA4ICogcGFuZWwtPnlfcmVzKTsKKwlpZiAocmVnaW9uLT5zaXplID4gZnJhbWVfc2l6ZSkKKwkJZnJhbWVfc2l6ZSA9IHJlZ2lvbi0+c2l6ZTsKKwlsY2RjLnZyYW1fc2l6ZSA9IGZyYW1lX3NpemU7CisJbGNkYy52cmFtX3ZpcnQgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwKKwkJCWxjZGMudnJhbV9zaXplLCAmbGNkYy52cmFtX3BoeXMsIEdGUF9LRVJORUwpOworCWlmIChsY2RjLnZyYW1fdmlydCA9PSBOVUxMKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIEZCIERNQSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVnaW9uLT5zaXplID0gZnJhbWVfc2l6ZTsKKwlyZWdpb24tPnBhZGRyID0gbGNkYy52cmFtX3BoeXM7CisJcmVnaW9uLT52YWRkciA9IGxjZGMudnJhbV92aXJ0OworCXJlZ2lvbi0+YWxsb2MgPSAxOworCisJbWVtc2V0KGxjZGMudnJhbV92aXJ0LCAwLCBsY2RjLnZyYW1fc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mYm1lbSh2b2lkKQoreworCWRtYV9mcmVlX3dyaXRlY29tYmluZShsY2RjLmZiZGV2LT5kZXYsIGxjZGMudnJhbV9zaXplLAorCQkJICAgICAgbGNkYy52cmFtX3ZpcnQsIGxjZGMudnJhbV9waHlzKTsKK30KKworc3RhdGljIGludCBzZXR1cF9mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfbWQpCit7CisJaW50IHI7CisKKwlpZiAoIXJlcV9tZC0+cmVnaW9uX2NudCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgIm5vIG1lbW9yeSByZWdpb25zIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVxX21kLT5yZWdpb25fY250ID4gMSkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgIm9ubHkgb25lIHBsYW5lIGlzIHN1cHBvcnRlZFxuIik7CisJCXJlcV9tZC0+cmVnaW9uX2NudCA9IDE7CisJfQorCisJaWYgKHJlcV9tZC0+cmVnaW9uWzBdLnBhZGRyID09IDApIHsKKwkJbGNkYy5mYm1lbV9hbGxvY2F0ZWQgPSAxOworCQlpZiAoKHIgPSBhbGxvY19mYm1lbSgmcmVxX21kLT5yZWdpb25bMF0pKSA8IDApCisJCQlyZXR1cm4gcjsKKwkJcmV0dXJuIDA7CisJfQorCisJbGNkYy52cmFtX3BoeXMgPSByZXFfbWQtPnJlZ2lvblswXS5wYWRkcjsKKwlsY2RjLnZyYW1fc2l6ZSA9IHJlcV9tZC0+cmVnaW9uWzBdLnNpemU7CisKKwlpZiAoKHIgPSBtbWFwX2tlcm4oKSkgPCAwKQorCQlyZXR1cm4gcjsKKworCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LCAidnJhbSBhdCAlMDh4IHNpemUgJTA4bHggbWFwcGVkIHRvIDB4JXBcbiIsCisJCSBsY2RjLnZyYW1fcGh5cywgbGNkYy52cmFtX3NpemUsIGxjZGMudnJhbV92aXJ0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2ZibWVtKHZvaWQpCit7CisJaWYgKGxjZGMuZmJtZW1fYWxsb2NhdGVkKQorCQlmcmVlX2ZibWVtKCk7CisJZWxzZQorCQl1bm1hcF9rZXJuKCk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9sY2RjX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCQkgIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByOworCXUzMiBsOworCWludCByYXRlOworCXN0cnVjdCBjbGsgKnRjX2NrOworCisJbGNkYy5pcnFfbWFzayA9IDA7CisKKwlsY2RjLmZiZGV2ID0gZmJkZXY7CisJbGNkYy5leHRfbW9kZSA9IGV4dF9tb2RlOworCisJbCA9IDA7CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworCisJLyogRklYTUU6CisJICogQWNjb3JkaW5nIHRvIGVycmF0YSBzb21lIHBsYXRmb3JtcyBoYXZlIGEgY2xvY2sgcmF0ZSBsaW1pdGlhdGlvbgorCSAqLworCWxjZGMubGNkX2NrID0gY2xrX2dldChOVUxMLCAibGNkX2NrIik7CisJaWYgKElTX0VSUihsY2RjLmxjZF9jaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFjY2VzcyBMQ0QgY2xvY2tcbiIpOworCQlyID0gUFRSX0VSUihsY2RjLmxjZF9jayk7CisJCWdvdG8gZmFpbDA7CisJfQorCisJdGNfY2sgPSBjbGtfZ2V0KE5VTEwsICJ0Y19jayIpOworCWlmIChJU19FUlIodGNfY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBhY2Nlc3MgVEMgY2xvY2tcbiIpOworCQlyID0gUFRSX0VSUih0Y19jayk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJcmF0ZSA9IGNsa19nZXRfcmF0ZSh0Y19jayk7CisJY2xrX3B1dCh0Y19jayk7CisKKwlpZiAobWFjaGluZV9pc19hbXNfZGVsdGEoKSkKKwkJcmF0ZSAvPSA0OworCWlmIChtYWNoaW5lX2lzX29tYXBfaDMoKSkKKwkJcmF0ZSAvPSAzOworCXIgPSBjbGtfc2V0X3JhdGUobGNkYy5sY2RfY2ssIHJhdGUpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImZhaWxlZCB0byBhZGp1c3QgTENEIHJhdGVcbiIpOworCQlnb3RvIGZhaWwxOworCX0KKwljbGtfZW5hYmxlKGxjZGMubGNkX2NrKTsKKworCXIgPSByZXF1ZXN0X2lycShPTUFQX0xDRENfSVJRLCBsY2RjX2lycV9oYW5kbGVyLCAwLCBNT0RVTEVfTkFNRSwgZmJkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgSVJRXG4iKTsKKwkJZ290byBmYWlsMjsKKwl9CisKKwlyID0gb21hcF9yZXF1ZXN0X2xjZF9kbWEobGNkY19kbWFfaGFuZGxlciwgTlVMTCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBMQ0QgRE1BXG4iKTsKKwkJZ290byBmYWlsMzsKKwl9CisKKwlvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihleHRfbW9kZSk7CisJb21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcihleHRfbW9kZSk7CisKKwlpZiAoIWV4dF9tb2RlKQorCQlpZiAoKHIgPSBhbGxvY19wYWxldHRlX3JhbSgpKSA8IDApCisJCQlnb3RvIGZhaWw0OworCisJaWYgKChyID0gc2V0dXBfZmJtZW0ocmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZmFpbDU7CisKKwlwcl9pbmZvKCJvbWFwZmI6IExDREMgaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CitmYWlsNToKKwlpZiAoIWV4dF9tb2RlKQorCQlmcmVlX3BhbGV0dGVfcmFtKCk7CitmYWlsNDoKKwlvbWFwX2ZyZWVfbGNkX2RtYSgpOworZmFpbDM6CisJZnJlZV9pcnEoT01BUF9MQ0RDX0lSUSwgbGNkYy5mYmRldik7CitmYWlsMjoKKwljbGtfZGlzYWJsZShsY2RjLmxjZF9jayk7CitmYWlsMToKKwljbGtfcHV0KGxjZGMubGNkX2NrKTsKK2ZhaWwwOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2xjZGNfY2xlYW51cCh2b2lkKQoreworCWlmICghbGNkYy5leHRfbW9kZSkKKwkJZnJlZV9wYWxldHRlX3JhbSgpOworCWNsZWFudXBfZmJtZW0oKTsKKwlvbWFwX2ZyZWVfbGNkX2RtYSgpOworCWZyZWVfaXJxKE9NQVBfTENEQ19JUlEsIGxjZGMuZmJkZXYpOworCWNsa19kaXNhYmxlKGxjZGMubGNkX2NrKTsKKwljbGtfcHV0KGxjZGMubGNkX2NrKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsIG9tYXAxX2ludF9jdHJsID0geworCS5uYW1lCQkJPSAiaW50ZXJuYWwiLAorCS5pbml0CQkJPSBvbWFwX2xjZGNfaW5pdCwKKwkuY2xlYW51cAkJPSBvbWFwX2xjZGNfY2xlYW51cCwKKwkuZ2V0X2NhcHMJCT0gb21hcF9sY2RjX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBvbWFwX2xjZGNfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBvbWFwX2xjZGNfZ2V0X3VwZGF0ZV9tb2RlLAorCS51cGRhdGVfd2luZG93CQk9IE5VTEwsCisJLnN1c3BlbmQJCT0gb21hcF9sY2RjX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gb21hcF9sY2RjX3Jlc3VtZSwKKwkuc2V0dXBfcGxhbmUJCT0gb21hcF9sY2RjX3NldHVwX3BsYW5lLAorCS5lbmFibGVfcGxhbmUJCT0gb21hcF9sY2RjX2VuYWJsZV9wbGFuZSwKKwkuc2V0Y29scmVnCQk9IG9tYXBfbGNkY19zZXRjb2xyZWcsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuaCBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiNzMxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIExDRENfSAorI2RlZmluZSBMQ0RDX0gKKworaW50IG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOwordm9pZCBvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQwZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKQEAgLTAsMCArMSwxOTQxIEBACisvKgorICogRnJhbWVidWZmZXIgZHJpdmVyIGZvciBUSSBPTUFQIGJvYXJkcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogQWNrbm93bGVkZ2VtZW50czoKKyAqICAgQWxleCBNY01haW5zIDxhYW1AcmlkZ2VydW4uY29tPiAgICAgICAtIE9yaWdpbmFsIGRyaXZlcgorICogICBKdWhhIFlyam9sYSA8anVoYS55cmpvbGFAbm9raWEuY29tPiAgIC0gT3JpZ2luYWwgZHJpdmVyIGFuZCBpbXByb3ZlbWVudHMKKyAqICAgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+ICAtIGNoYW5nZXMgZm9yIDIuNiBrZXJuZWwgQVBJCisgKiAgIFRleGFzIEluc3RydW1lbnRzICAgICAgICAgICAgICAgICAgICAgLSBIMyBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmIiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJZGVmX2FjY2VsOworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3ZyYW1bT01BUEZCX1BMQU5FX05VTV07CitzdGF0aWMgaW50CQlkZWZfdnJhbV9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnhyZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnlyZXM7CitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9yb3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9taXJyb3I7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9NQU5VQUxfVVBEQVRFCitzdGF0aWMgaW50CQltYW51YWxfdXBkYXRlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50CQltYW51YWxfdXBkYXRlOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpmYmRldl9wZGV2Oworc3RhdGljIHN0cnVjdCBsY2RfcGFuZWwJCSpmYmRldl9wYW5lbDsKK3N0YXRpYyBzdHJ1Y3Qgb21hcGZiX2RldmljZQkqb21hcGZiX2RldjsKKworc3RydWN0IGNhcHNfdGFibGVfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgY3RybF9jYXBzW10gPSB7CisJeyBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFLCAgIm1hbnVhbCB1cGRhdGUiIH0sCisJeyBPTUFQRkJfQ0FQU19URUFSU1lOQywgICAgICAgInRlYXJpbmcgc3luY2hyb25pemF0aW9uIiB9LAorCXsgT01BUEZCX0NBUFNfUExBTkVfUkVMT0NBVEVfTUVNLCAicmVsb2NhdGUgcGxhbmUgbWVtb3J5IiB9LAorCXsgT01BUEZCX0NBUFNfUExBTkVfU0NBTEUsICAgICJzY2FsZSBwbGFuZSIgfSwKKwl7IE9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUsICJwaXhlbCBkb3VibGUgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfV0lORE9XX1NDQUxFLCAgICJzY2FsZSB3aW5kb3ciIH0sCisJeyBPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWSwgIm92ZXJsYXkgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVCwgICJiYWNrbGlnaHQgc2V0dGluZyIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgY29sb3JfY2Fwc1tdID0geworCXsgMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1LAkiUkdCNTY1IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMiwJIllVVjQyMiIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjAsCSJZVVY0MjAiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQLAkiQ0xVVDgiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF80QlBQLAkiQ0xVVDQiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQLAkiQ0xVVDIiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQLAkiQ0xVVDEiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfUkdCNDQ0LAkiUkdCNDQ0IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVWTQyMiwJIllVWTQyMiIsIH0sCit9OworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMQ0QgcGFuZWwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitleHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAxX2ludF9jdHJsOworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBvbWFwMl9pbnRfY3RybDsKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmw7CitleHRlcm4gc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmw7CisKK3N0YXRpYyBzdHJ1Y3QgbGNkX2N0cmwgKmN0cmxzW10gPSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKwkmb21hcDFfaW50X2N0cmwsCisjZWxzZQorCSZvbWFwMl9pbnRfY3RybCwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19IV0E3NDIKKwkmaHdhNzQyX2N0cmwsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0JMSVpaQVJECisJJmJsaXp6YXJkX2N0cmwsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDFfZXh0X2lmOworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDJfZXh0X2lmOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHZvaWQgb21hcGZiX3JxdWV1ZV9sb2NrKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF9sb2NrKCZmYmRldi0+cnF1ZXVlX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX3JxdWV1ZV91bmxvY2soc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCW11dGV4X3VubG9jaygmZmJkZXYtPnJxdWV1ZV9tdXRleCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExDRCBjb250cm9sbGVyIGFuZCBMQ0QgRE1BCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogTG9va3VwIHRhYmxlIHRvIG1hcCBlbGVtIHNpemUgdG8gZWxlbSB0eXBlLiAqLworc3RhdGljIGNvbnN0IGludCBkbWFfZWxlbV90eXBlW10gPSB7CisJMCwKKwlPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCisJT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkwLAorCU9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCit9OworCisvKgorICogQWxsb2NhdGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEgb3BlcmF0aW9ucy4gVmlkZW8KKyAqIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZnJvbSBzeXN0ZW0gbWVtb3J5IGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBkaXNwbGF5CisgKiBzaXplLCBleGNlcHQgaWYgYSBiaWdnZXIgbWVtb3J5IHNpemUgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgYXMgYSBrZXJuZWwKKyAqIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCBjdHJsX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCWludCBpOworCisJLyoga2VybmVsL21vZHVsZSB2cmFtIHBhcmFtZXRlcnMgb3ZlcnJpZGUgYm9vdCB0YWdzL2JvYXJkIGNvbmZpZyAqLworCWlmIChkZWZfdnJhbV9jbnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlZl92cmFtX2NudDsgaSsrKQorCQkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplID0KKwkJCQlQQUdFX0FMSUdOKGRlZl92cmFtW2ldKTsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQgPSBpOworCX0gZWxzZSB7CisJCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqY29uZjsKKworCQljb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwkJZmJkZXYtPm1lbV9kZXNjID0gY29uZi0+bWVtX2Rlc2M7CisJfQorCisJaWYgKCFmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCkgeworCQlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwkJaW50IGRlZl9zaXplOworCQlpbnQgYnBwID0gcGFuZWwtPmJwcDsKKworCQkvKiAxMiBicHAgaXMgcGFja2VkIGluIDE2IGJpdHMgKi8KKwkJaWYgKGJwcCA9PSAxMikKKwkJCWJwcCA9IDE2OworCQlkZWZfc2l6ZSA9IGRlZl92eHJlcyAqIGRlZl92eXJlcyAqIGJwcCAvIDg7CisJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250ID0gMTsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvblswXS5zaXplID0gUEFHRV9BTElHTihkZWZfc2l6ZSk7CisJfQorCXIgPSBmYmRldi0+Y3RybC0+aW5pdChmYmRldiwgMCwgJmZiZGV2LT5tZW1fZGVzYyk7CisJaWYgKHIgPCAwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsCisJCQlyKTsKKwkJcmV0dXJuIHI7CisJfQorCisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJyZWdpb24lZCBwaHlzICUwOHggdmlydCAlcCBzaXplPSVsdVxuIiwKKwkJCSBpLAorCQkJIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0ucGFkZHIsCisJCQkgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS52YWRkciwKKwkJCSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemUpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjdHJsX2NsZWFudXAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWZiZGV2LT5jdHJsLT5jbGVhbnVwKCk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggZmJkZXYtPnJxdWV1ZV9tdXRleCBoZWxkLiAqLworc3RhdGljIGludCBjdHJsX2NoYW5nZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJaW50IHI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOworCisJb2Zmc2V0ID0gdmFyLT55b2Zmc2V0ICogZmJpLT5maXgubGluZV9sZW5ndGggKworCQkgdmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CisKKwlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJciA9IGZiZGV2LT5jdHJsLT5zZXR1cF9wbGFuZShwbGFuZS0+aWR4LCBwbGFuZS0+aW5mby5jaGFubmVsX291dCwKKwkJCQkgb2Zmc2V0LCB2YXItPnhyZXNfdmlydHVhbCwKKwkJCQkgcGxhbmUtPmluZm8ucG9zX3gsIHBsYW5lLT5pbmZvLnBvc195LAorCQkJCSB2YXItPnhyZXMsIHZhci0+eXJlcywgcGxhbmUtPmNvbG9yX21vZGUpOworCWlmIChmYmRldi0+Y3RybC0+c2V0X3NjYWxlICE9IE5VTEwpCisJCXIgPSBmYmRldi0+Y3RybC0+c2V0X3NjYWxlKHBsYW5lLT5pZHgsCisJCQkJICAgdmFyLT54cmVzLCB2YXItPnlyZXMsCisJCQkJICAgcGxhbmUtPmluZm8ub3V0X3dpZHRoLAorCQkJCSAgIHBsYW5lLT5pbmZvLm91dF9oZWlnaHQpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZiZGV2IGZyYW1ld29yayBjYWxsYmFja3MgYW5kIHRoZSBpb2N0bCBpbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSBvbWFwZmIgZGV2aWNlIGlzIG9wZW5lZCAqLworc3RhdGljIGludCBvbWFwZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworLyogQ2FsbGVkIHdoZW4gdGhlIG9tYXBmYiBkZXZpY2UgaXMgY2xvc2VkLiBXZSBtYWtlIHN1cmUgdGhhdCBhbnkgcGVuZGluZworICogZ2Z4IERNQSBvcGVyYXRpb25zIGFyZSBlbmRlZCwgYmVmb3JlIHdlIHJldHVybi4gKi8KK3N0YXRpYyBpbnQgb21hcGZiX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCW9tYXBmYl9zeW5jKGluZm8pOworCXJldHVybiAwOworfQorCisvKiBTdG9yZSBhIHNpbmdsZSBjb2xvciBwYWxldHRlIGVudHJ5IGludG8gYSBwc2V1ZG8gcGFsZXR0ZSBvciB0aGUgaGFyZHdhcmUKKyAqIHBhbGV0dGUgaWYgb25lIGlzIGF2YWlsYWJsZS4gRm9yIG5vdyB3ZSBzdXBwb3J0IG9ubHkgMTZicHAgYW5kIHRodXMgc3RvcmUKKyAqIHRoZSBlbnRyeSBvbmx5IHRvIHRoZSBwc2V1ZG8gcGFsZXR0ZS4KKyAqLworc3RhdGljIGludCBfc2V0Y29scmVnKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKKwkJCXVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwgaW50IHVwZGF0ZV9od19wYWwpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CisJaW50IHIgPSAwOworCisJc3dpdGNoIChwbGFuZS0+Y29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfNEJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzJCUFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQOgorCQlpZiAoZmJkZXYtPmN0cmwtPnNldGNvbHJlZykKKwkJCXIgPSBmYmRldi0+Y3RybC0+c2V0Y29scmVnKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAorCQkJCQkJCXRyYW5zcCwgdXBkYXRlX2h3X3BhbCk7CisJCS8qIEZhbGx0aHJvdWdoICovCisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCWNhc2UgT01BUEZCX0NPTE9SX1JHQjQ0NDoKKwkJaWYgKHIgIT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChyZWdubyA8IDApIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVnbm8gPCAxNikgeworCQkJdTE2IHBhbDsKKwkJCXBhbCA9ICgocmVkID4+ICgxNiAtIHZhci0+cmVkLmxlbmd0aCkpIDw8CisJCQkJCXZhci0+cmVkLm9mZnNldCkgfAorCQkJICAgICAgKChncmVlbiA+PiAoMTYgLSB2YXItPmdyZWVuLmxlbmd0aCkpIDw8CisJCQkJCXZhci0+Z3JlZW4ub2Zmc2V0KSB8CisJCQkgICAgICAoYmx1ZSA+PiAoMTYgLSB2YXItPmJsdWUubGVuZ3RoKSk7CisJCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHBhbDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKKwkJCSAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiBfc2V0Y29scmVnKGluZm8sIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCB0cmFuc3AsIDEpOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRjbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgY291bnQsIGluZGV4LCByOworCXUxNiAqcmVkLCAqZ3JlZW4sICpibHVlLCAqdHJhbnNwOworCXUxNiB0cmFucyA9IDB4ZmZmZjsKKworCXJlZCAgICAgPSBjbWFwLT5yZWQ7CisJZ3JlZW4gICA9IGNtYXAtPmdyZWVuOworCWJsdWUgICAgPSBjbWFwLT5ibHVlOworCXRyYW5zcCAgPSBjbWFwLT50cmFuc3A7CisJaW5kZXggICA9IGNtYXAtPnN0YXJ0OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgY21hcC0+bGVuOyBjb3VudCsrKSB7CisJCWlmICh0cmFuc3ApCisJCQl0cmFucyA9ICp0cmFuc3ArKzsKKwkJciA9IF9zZXRjb2xyZWcoaW5mbywgaW5kZXgrKywgKnJlZCsrLCAqZ3JlZW4rKywgKmJsdWUrKywgdHJhbnMsCisJCQkJY291bnQgPT0gY21hcC0+bGVuIC0gMSk7CisJCWlmIChyICE9IDApCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKHN0cnVjdCBmYl9pbmZvICpmYmkpOworCitzdGF0aWMgaW50IG9tYXBmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCBkb191cGRhdGUgPSAwOworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJc3dpdGNoIChibGFuaykgeworCWNhc2UgVkVTQV9OT19CTEFOS0lORzoKKwkJaWYgKGZiZGV2LT5zdGF0ZSA9PSBPTUFQRkJfU1VTUEVOREVEKSB7CisJCQlpZiAoZmJkZXYtPmN0cmwtPnJlc3VtZSkKKwkJCQlmYmRldi0+Y3RybC0+cmVzdW1lKCk7CisJCQlmYmRldi0+cGFuZWwtPmVuYWJsZShmYmRldi0+cGFuZWwpOworCQkJZmJkZXYtPnN0YXRlID0gT01BUEZCX0FDVElWRTsKKwkJCWlmIChmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgPT0KKwkJCQkJT01BUEZCX01BTlVBTF9VUERBVEUpCisJCQkJZG9fdXBkYXRlID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZFU0FfUE9XRVJET1dOOgorCQlpZiAoZmJkZXYtPnN0YXRlID09IE9NQVBGQl9BQ1RJVkUpIHsKKwkJCWZiZGV2LT5wYW5lbC0+ZGlzYWJsZShmYmRldi0+cGFuZWwpOworCQkJaWYgKGZiZGV2LT5jdHJsLT5zdXNwZW5kKQorCQkJCWZiZGV2LT5jdHJsLT5zdXNwZW5kKCk7CisJCQlmYmRldi0+c3RhdGUgPSBPTUFQRkJfU1VTUEVOREVEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXIgPSAtRUlOVkFMOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlpZiAociA9PSAwICYmIGRvX3VwZGF0ZSkKKwkJciA9IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oZmJpKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKK30KKworLyoKKyAqIFNldCBmYl9pbmZvLmZpeCBmaWVsZHMgYW5kIGFsc28gdXBkYXRlcyBmYmRldi4KKyAqIFdoZW4gY2FsbGluZyB0aGlzIGZiX2luZm8udmFyIG11c3QgYmUgc2V0IHVwIGFscmVhZHkuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9mYl9maXgoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZmYmktPmZpeDsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCWludCBicHA7CisKKwlyZyA9ICZwbGFuZS0+ZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XTsKKwlmYmktPnNjcmVlbl9iYXNlCT0gKGNoYXIgX19pb21lbSAqKXJnLT52YWRkcjsKKwlmaXgtPnNtZW1fc3RhcnQJCT0gcmctPnBhZGRyOworCWZpeC0+c21lbV9sZW4JCT0gcmctPnNpemU7CisKKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpZiAodmFyLT5ub25zdGQpCisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCWVsc2Ugc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxNjoKKwljYXNlIDEyOgorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCS8qIDEyYnBwIGlzIHN0b3JlZCBpbiAxNiBiaXRzICovCisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgNDoKKwljYXNlIDg6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQlicmVhazsKKwl9CisJZml4LT5hY2NlbAkJPSBGQl9BQ0NFTF9PTUFQMTYxMDsKKwlmaXgtPmxpbmVfbGVuZ3RoCT0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgLyA4OworfQorCitzdGF0aWMgaW50IHNldF9jb2xvcl9tb2RlKHN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSwKKwkJCSAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJc3dpdGNoICh2YXItPm5vbnN0ZCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gdmFyLT5ub25zdGQ7CisJCXJldHVybiAwOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDEyOworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IHZhci0+bm9uc3RkOworCQlyZXR1cm4gMDsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSB2YXItPm5vbnN0ZDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxOgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzFCUFA7CisJCXJldHVybiAwOworCWNhc2UgMjoKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDQ6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX0NMVVRfNEJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSA4OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFA7CisJCXJldHVybiAwOworCWNhc2UgMTI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfUkdCNDQ0OworCQlyZXR1cm4gMDsKKwljYXNlIDE2OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9SR0I1NjU7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIENoZWNrIHRoZSB2YWx1ZXMgaW4gdmFyIGFnYWluc3Qgb3VyIGNhcGFiaWxpdGllcyBhbmQgaW4gY2FzZSBvZiBvdXQgb2YKKyAqIGJvdW5kIHZhbHVlcyB0cnkgdG8gYWRqdXN0IHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgc2V0X2ZiX3ZhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlpbnQJCWJwcDsKKwl1bnNpZ25lZCBsb25nCW1heF9mcmFtZV9zaXplOworCXVuc2lnbmVkIGxvbmcJbGluZV9zaXplOworCWludAkJeHJlc19taW4sIHhyZXNfbWF4OworCWludAkJeXJlc19taW4sIHlyZXNfbWF4OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKworCWlmIChzZXRfY29sb3JfbW9kZShwbGFuZSwgdmFyKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpZiAocGxhbmUtPmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1JHQjQ0NCkKKwkJYnBwID0gMTY7CisKKwlzd2l0Y2ggKHZhci0+cm90YXRlKSB7CisJY2FzZSAwOgorCWNhc2UgMTgwOgorCQl4cmVzX21pbiA9IE9NQVBGQl9QTEFORV9YUkVTX01JTjsKKwkJeHJlc19tYXggPSBwYW5lbC0+eF9yZXM7CisJCXlyZXNfbWluID0gT01BUEZCX1BMQU5FX1lSRVNfTUlOOworCQl5cmVzX21heCA9IHBhbmVsLT55X3JlczsKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQl2YXItPnhyZXMgPSBwYW5lbC0+eF9yZXM7CisJCQl2YXItPnlyZXMgPSBwYW5lbC0+eV9yZXM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA5MDoKKwljYXNlIDI3MDoKKwkJeHJlc19taW4gPSBPTUFQRkJfUExBTkVfWVJFU19NSU47CisJCXhyZXNfbWF4ID0gcGFuZWwtPnlfcmVzOworCQl5cmVzX21pbiA9IE9NQVBGQl9QTEFORV9YUkVTX01JTjsKKwkJeXJlc19tYXggPSBwYW5lbC0+eF9yZXM7CisJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJdmFyLT54cmVzID0gcGFuZWwtPnlfcmVzOworCQkJdmFyLT55cmVzID0gcGFuZWwtPnhfcmVzOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YXItPnhyZXMgPCB4cmVzX21pbikKKwkJdmFyLT54cmVzID0geHJlc19taW47CisJaWYgKHZhci0+eXJlcyA8IHlyZXNfbWluKQorCQl2YXItPnlyZXMgPSB5cmVzX21pbjsKKwlpZiAodmFyLT54cmVzID4geHJlc19tYXgpCisJCXZhci0+eHJlcyA9IHhyZXNfbWF4OworCWlmICh2YXItPnlyZXMgPiB5cmVzX21heCkKKwkJdmFyLT55cmVzID0geXJlc19tYXg7CisKKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisJbWF4X2ZyYW1lX3NpemUgPSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdLnNpemU7CisJbGluZV9zaXplID0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgLyA4OworCWlmIChsaW5lX3NpemUgKiB2YXItPnlyZXNfdmlydHVhbCA+IG1heF9mcmFtZV9zaXplKSB7CisJCS8qIFRyeSB0byBrZWVwIHlyZXNfdmlydHVhbCBmaXJzdCAqLworCQlsaW5lX3NpemUgPSBtYXhfZnJhbWVfc2l6ZSAvIHZhci0+eXJlc192aXJ0dWFsOworCQl2YXItPnhyZXNfdmlydHVhbCA9IGxpbmVfc2l6ZSAqIDggLyBicHA7CisJCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykgeworCQkJLyogU3RpbGwgZG9lc24ndCBmaXQuIFNocmluayB5cmVzX3ZpcnR1YWwgdG9vICovCisJCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKKwkJCWxpbmVfc2l6ZSA9IHZhci0+eHJlcyAqIGJwcCAvIDg7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heF9mcmFtZV9zaXplIC8gbGluZV9zaXplOworCQl9CisJCS8qIFJlY2hlY2sgdGhpcywgYXMgdGhlIHZpcnR1YWwgc2l6ZSBjaGFuZ2VkLiAqLworCQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKKwkJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQorCQkJdmFyLT55cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7CisJCWlmICh2YXItPnhyZXMgPCB4cmVzX21pbiB8fCB2YXItPnlyZXMgPCB5cmVzX21pbikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodmFyLT54cmVzICsgdmFyLT54b2Zmc2V0ID4gdmFyLT54cmVzX3ZpcnR1YWwpCisJCXZhci0+eG9mZnNldCA9IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXMgKyB2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCkKKwkJdmFyLT55b2Zmc2V0ID0gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXM7CisJbGluZV9zaXplID0gdmFyLT54cmVzICogYnBwIC8gODsKKworCWlmIChwbGFuZS0+Y29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfUkdCNDQ0KSB7CisJCXZhci0+cmVkLm9mZnNldAkgID0gODsgdmFyLT5yZWQubGVuZ3RoCSA9IDQ7CisJCQkJCQl2YXItPnJlZC5tc2JfcmlnaHQgICA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNDsgdmFyLT5ncmVlbi5sZW5ndGggPSA0OworCQkJCQkJdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOworCQl2YXItPmJsdWUub2Zmc2V0ICA9IDA7IHZhci0+Ymx1ZS5sZW5ndGggID0gNDsKKwkJCQkJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgID0gMDsKKwl9IGVsc2UgeworCQl2YXItPnJlZC5vZmZzZXQJID0gMTE7IHZhci0+cmVkLmxlbmd0aAkgPSA1OworCQkJCQkJdmFyLT5yZWQubXNiX3JpZ2h0ICAgPSAwOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7ICB2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCQkJCQl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOyAgdmFyLT5ibHVlLmxlbmd0aCAgPSA1OworCQkJCQkJdmFyLT5ibHVlLm1zYl9yaWdodCAgPSAwOworCX0KKworCXZhci0+aGVpZ2h0CQk9IC0xOworCXZhci0+d2lkdGgJCT0gLTE7CisJdmFyLT5ncmF5c2NhbGUJCT0gMDsKKworCS8qIHBpeGNsb2NrIGluIHBzLCB0aGUgcmVzdCBpbiBwaXhjbG9jayAqLworCXZhci0+cGl4Y2xvY2sJCT0gMTAwMDAwMDAgLyAocGFuZWwtPnBpeGVsX2Nsb2NrIC8gMTAwKTsKKwl2YXItPmxlZnRfbWFyZ2luCT0gcGFuZWwtPmhmcDsKKwl2YXItPnJpZ2h0X21hcmdpbgk9IHBhbmVsLT5oYnA7CisJdmFyLT51cHBlcl9tYXJnaW4JPSBwYW5lbC0+dmZwOworCXZhci0+bG93ZXJfbWFyZ2luCT0gcGFuZWwtPnZicDsKKwl2YXItPmhzeW5jX2xlbgkJPSBwYW5lbC0+aHN3OworCXZhci0+dnN5bmNfbGVuCQk9IHBhbmVsLT52c3c7CisKKwkvKiBUT0RPOiBnZXQgdGhlc2UgZnJvbSBwYW5lbC0+Y29uZmlnICovCisJdmFyLT52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCXZhci0+c3luYwkJPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyogU2V0IHJvdGF0aW9uICgwLCA5MCwgMTgwLCAyNzAgZGVncmVlKSwgYW5kIHN3aXRjaCB0byB0aGUgbmV3IG1vZGUuICovCitzdGF0aWMgdm9pZCBvbWFwZmJfcm90YXRlKHN0cnVjdCBmYl9pbmZvICpmYmksIGludCByb3RhdGUpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkgJiYgcm90YXRlICE9IGZiaS0+dmFyLnJvdGF0ZSkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisKKwkJbWVtY3B5KG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCW5ld192YXItPnJvdGF0ZSA9IHJvdGF0ZTsKKwkJaWYgKHNldF9mYl92YXIoZmJpLCBuZXdfdmFyKSA9PSAwICYmCisJCSAgICBtZW1jbXAobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKSkgeworCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQljdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCX0KKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworfQorCisvKgorICogU2V0IG5ldyB4LHkgb2Zmc2V0cyBpbiB0aGUgdmlydHVhbCBkaXNwbGF5IGZvciB0aGUgdmlzaWJsZSBhcmVhIGFuZCBzd2l0Y2gKKyAqIHRvIHRoZSBuZXcgbW9kZS4KKyAqLworc3RhdGljIGludCBvbWFwZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAodmFyLT54b2Zmc2V0ICE9IGZiaS0+dmFyLnhvZmZzZXQgfHwKKwkgICAgdmFyLT55b2Zmc2V0ICE9IGZiaS0+dmFyLnlvZmZzZXQpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFyID0gJmZiZGV2LT5uZXdfdmFyOworCisJCW1lbWNweShuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQluZXdfdmFyLT54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCQluZXdfdmFyLT55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OworCQlpZiAoc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpKQorCQkJciA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQljdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCX0KKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIFNldCBtaXJyb3IgdG8gdmVydGljYWwgYXhpcyBhbmQgc3dpdGNoIHRvIHRoZSBuZXcgbW9kZS4gKi8KK3N0YXRpYyBpbnQgb21hcGZiX21pcnJvcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgbWlycm9yKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCW1pcnJvciA9IG1pcnJvciA/IDEgOiAwOworCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKKwkJciA9IC1FSU5WQUw7CisJZWxzZSBpZiAobWlycm9yICE9IHBsYW5lLT5pbmZvLm1pcnJvcikgeworCQlwbGFuZS0+aW5mby5taXJyb3IgPSBtaXJyb3I7CisJCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogQ2hlY2sgdmFsdWVzIGluIHZhciwgdHJ5IHRvIGFkanVzdCB0aGVtIGluIGNhc2Ugb2Ygb3V0IG9mIGJvdW5kIHZhbHVlcyBpZgorICogcG9zc2libGUsIG9yIHJldHVybiBlcnJvci4KKyAqLworc3RhdGljIGludCBvbWFwZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jICE9IE5VTEwpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJciA9IHNldF9mYl92YXIoZmJpLCB2YXIpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogU3dpdGNoIHRvIGEgbmV3IG1vZGUuIFRoZSBwYXJhbWV0ZXJzIGZvciBpdCBoYXMgYmVlbiBjaGVjayBhbHJlYWR5IGJ5CisgKiBvbWFwZmJfY2hlY2tfdmFyLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJc2V0X2ZiX2ZpeChmYmkpOworCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwKKwkJCQl2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKKworCXZhciA9ICZmYmktPnZhcjsKKwlpZiAod2luLT54ID49IHZhci0+eHJlcyB8fCB3aW4tPnkgPj0gdmFyLT55cmVzIHx8CisJICAgIHdpbi0+b3V0X3ggPiB2YXItPnhyZXMgfHwgd2luLT5vdXRfeSA+PSB2YXItPnlyZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyB8fAorCSAgICBmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHdpbi0+eCArIHdpbi0+d2lkdGggPj0gdmFyLT54cmVzKQorCQl3aW4tPndpZHRoID0gdmFyLT54cmVzIC0gd2luLT54OworCWlmICh3aW4tPnkgKyB3aW4tPmhlaWdodCA+PSB2YXItPnlyZXMpCisJCXdpbi0+aGVpZ2h0ID0gdmFyLT55cmVzIC0gd2luLT55OworCS8qIFRoZSBvdXQgc2l6ZXMgc2hvdWxkIGJlIGNyb3BwZWQgdG8gdGhlIExDRCBzaXplICovCisJaWYgKHdpbi0+b3V0X3ggKyB3aW4tPm91dF93aWR0aCA+IGZiZGV2LT5wYW5lbC0+eF9yZXMpCisJCXdpbi0+b3V0X3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlcyAtIHdpbi0+b3V0X3g7CisJaWYgKHdpbi0+b3V0X3kgKyB3aW4tPm91dF9oZWlnaHQgPiBmYmRldi0+cGFuZWwtPnlfcmVzKQorCQl3aW4tPm91dF9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzIC0gd2luLT5vdXRfeTsKKwlpZiAoIXdpbi0+d2lkdGggfHwgIXdpbi0+aGVpZ2h0IHx8ICF3aW4tPm91dF93aWR0aCB8fCAhd2luLT5vdXRfaGVpZ2h0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyhmYmksIHdpbiwgY2FsbGJhY2ssIGNhbGxiYWNrX2RhdGEpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyk7CisKK3N0YXRpYyBpbnQgb21hcGZiX3VwZGF0ZV93aW4oc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlpbnQgcmV0OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKHBsYW5lLT5mYmRldik7CisJcmV0ID0gb21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMoZmJpLCB3aW4sIE5VTEwsIDApOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKHBsYW5lLT5mYmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHdpbjsKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3cgfHwKKwkgICAgZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdpbi54ID0gMDsKKwl3aW4ueSA9IDA7CisJd2luLndpZHRoID0gZmJpLT52YXIueHJlczsKKwl3aW4uaGVpZ2h0ID0gZmJpLT52YXIueXJlczsKKwl3aW4ub3V0X3ggPSAwOworCXdpbi5vdXRfeSA9IDA7CisJd2luLm91dF93aWR0aCA9IGZiaS0+dmFyLnhyZXM7CisJd2luLm91dF9oZWlnaHQgPSBmYmktPnZhci55cmVzOworCXdpbi5mb3JtYXQgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJpLCAmd2luLCBOVUxMLCAwKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfcGxhbmUoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvICpwaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvIG9sZF9pbmZvOworCWludCByID0gMDsKKworCWlmIChwaS0+cG9zX3ggKyBwaS0+b3V0X3dpZHRoID4gcGFuZWwtPnhfcmVzIHx8CisJICAgIHBpLT5wb3NfeSArIHBpLT5vdXRfaGVpZ2h0ID4gcGFuZWwtPnlfcmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKHBpLT5lbmFibGVkICYmICFmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdLnNpemUpIHsKKwkJLyoKKwkJICogVGhpcyBwbGFuZSdzIG1lbW9yeSB3YXMgZnJlZWQsIGNhbid0IGVuYWJsZSBpdAorCQkgKiB1bnRpbCBpdCdzIHJlYWxsb2NhdGVkLgorCQkgKi8KKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlvbGRfaW5mbyA9IHBsYW5lLT5pbmZvOworCXBsYW5lLT5pbmZvID0gKnBpOworCWlmIChwaS0+ZW5hYmxlZCkgeworCQlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCQlpZiAociA8IDApIHsKKwkJCXBsYW5lLT5pbmZvID0gb2xkX2luZm87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlyID0gZmJkZXYtPmN0cmwtPmVuYWJsZV9wbGFuZShwbGFuZS0+aWR4LCBwaS0+ZW5hYmxlZCk7CisJaWYgKHIgPCAwKSB7CisJCXBsYW5lLT5pbmZvID0gb2xkX2luZm87CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X3BsYW5lKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyAqcGkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisKKwkqcGkgPSBwbGFuZS0+aW5mbzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfbWVtKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfbWVtX2luZm8gKm1pKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnID0gJmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJc2l6ZV90IHNpemU7CisJaW50IHIgPSAwOworCisJaWYgKGZiZGV2LT5jdHJsLT5zZXR1cF9tZW0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG1pLT50eXBlID4gT01BUEZCX01FTVRZUEVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBQQUdFX0FMSUdOKG1pLT5zaXplKTsKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChwbGFuZS0+aW5mby5lbmFibGVkKSB7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmctPnNpemUgIT0gc2l6ZSB8fCByZy0+dHlwZSAhPSBtaS0+dHlwZSkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisJCXVuc2lnbmVkIGxvbmcgb2xkX3NpemUgPSByZy0+c2l6ZTsKKwkJdTgJICAgICAgb2xkX3R5cGUgPSByZy0+dHlwZTsKKwkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQlyZy0+c2l6ZSA9IHNpemU7CisJCXJnLT50eXBlID0gbWktPnR5cGU7CisJCS8qCisJCSAqIHNpemUgPT0gMCBpcyBhIHNwZWNpYWwgY2FzZSwgZm9yIHdoaWNoIHdlCisJCSAqIGRvbid0IGNoZWNrIC8gYWRqdXN0IHRoZSBzY3JlZW4gcGFyYW1ldGVycy4KKwkJICogVGhpcyBpc24ndCBhIHByb2JsZW0gc2luY2UgdGhlIHBsYW5lIGNhbid0CisJCSAqIGJlIHJlZW5hYmxlZCB1bmxlc3MgaXRzIHNpemUgaXMgPiAwLgorCQkgKi8KKwkJaWYgKG9sZF9zaXplICE9IHNpemUgJiYgc2l6ZSkgeworCQkJaWYgKHNpemUpIHsKKwkJCQltZW1jcHkobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJCQlyID0gc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpOworCQkJCWlmIChyIDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCQlmYmRldi0+Y3RybC0+c3luYygpOworCQlyID0gZmJkZXYtPmN0cmwtPnNldHVwX21lbShwbGFuZS0+aWR4LCBzaXplLCBtaS0+dHlwZSwgJnBhZGRyKTsKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiBSZXZlcnQgY2hhbmdlcy4gKi8KKwkJCXJnLT5zaXplID0gb2xkX3NpemU7CisJCQlyZy0+dHlwZSA9IG9sZF90eXBlOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmctPnBhZGRyID0gcGFkZHI7CisKKwkJaWYgKG9sZF9zaXplICE9IHNpemUpIHsKKwkJCWlmIChzaXplKSB7CisJCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKGZiaS0+dmFyKSk7CisJCQkJc2V0X2ZiX2ZpeChmYmkpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNldCB0aGVzZSBleHBsaWNpdGx5IHRvIGluZGljYXRlIHRoYXQgdGhlCisJCQkJICogcGxhbmUgbWVtb3J5IGlzIGRlYWxsb2NlJ2QsIHRoZSBvdGhlcgorCQkJCSAqIHNjcmVlbiBwYXJhbWV0ZXJzIGluIHZhciAvIGZpeCBhcmUgaW52YWxpZC4KKwkJCQkgKi8KKwkJCQlmYmktPmZpeC5zbWVtX3N0YXJ0ID0gMDsKKwkJCQlmYmktPmZpeC5zbWVtX2xlbiA9IDA7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X21lbShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvICptaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKworCXJnID0gJmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJbWVtc2V0KG1pLCAwLCBzaXplb2YoKm1pKSk7CisJbWktPnNpemUgPSByZy0+c2l6ZTsKKwltaS0+dHlwZSA9IHJnLT50eXBlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LAorCQkJCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPnNldF9jb2xvcl9rZXkpCisJCXJldHVybiAtRU5PREVWOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldF9jb2xvcl9rZXkoY2spOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9nZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT5nZXRfY29sb3Jfa2V5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5nZXRfY29sb3Jfa2V5KGNrKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG9tYXBmYl9jbGllbnRfbGlzdFtPTUFQRkJfUExBTkVfTlVNXTsKK3N0YXRpYyBpbnQgbm90aWZpZXJfaW5pdGVkOworCitzdGF0aWMgdm9pZCBvbWFwZmJfaW5pdF9ub3RpZmllcih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE9NQVBGQl9QTEFORV9OVU07IGkrKykKKwkJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZvbWFwZmJfY2xpZW50X2xpc3RbaV0pOworfQorCitpbnQgb21hcGZiX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpvbWFwZmJfbmIsCisJCQkJb21hcGZiX25vdGlmaWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCQkJdm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlpbnQgcjsKKworCWlmICgodW5zaWduZWQpb21hcGZiX25iLT5wbGFuZV9pZHggPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbm90aWZpZXJfaW5pdGVkKSB7CisJCW9tYXBmYl9pbml0X25vdGlmaWVyKCk7CisJCW5vdGlmaWVyX2luaXRlZCA9IDE7CisJfQorCisJb21hcGZiX25iLT5uYi5ub3RpZmllcl9jYWxsID0gKGludCAoKikoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosCisJCQkJCXVuc2lnbmVkIGxvbmcsIHZvaWQgKikpY2FsbGJhY2s7CisJb21hcGZiX25iLT5kYXRhID0gY2FsbGJhY2tfZGF0YTsKKwlyID0gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoCisJCQkJJm9tYXBmYl9jbGllbnRfbGlzdFtvbWFwZmJfbmItPnBsYW5lX2lkeF0sCisJCQkJJm9tYXBmYl9uYi0+bmIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlpZiAob21hcGZiX2RldiAhPSBOVUxMICYmCisJICAgIG9tYXBmYl9kZXYtPmN0cmwgJiYgb21hcGZiX2Rldi0+Y3RybC0+YmluZF9jbGllbnQpIHsKKwkJb21hcGZiX2Rldi0+Y3RybC0+YmluZF9jbGllbnQob21hcGZiX25iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3JlZ2lzdGVyX2NsaWVudCk7CisKK2ludCBvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqb21hcGZiX25iKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKAorCQkmb21hcGZiX2NsaWVudF9saXN0W29tYXBmYl9uYi0+cGxhbmVfaWR4XSwgJm9tYXBmYl9uYi0+bmIpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQpOworCit2b2lkIG9tYXBmYl9ub3RpZnlfY2xpZW50cyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCit7CisJaW50IGk7CisKKwlpZiAoIW5vdGlmaWVyX2luaXRlZCkKKwkJLyogbm8gY2xpZW50IHJlZ2lzdGVyZWQgeWV0ICovCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKyspCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJm9tYXBmYl9jbGllbnRfbGlzdFtpXSwgZXZlbnQsCisJCQkJICAgIGZiZGV2LT5mYl9pbmZvW2ldKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX25vdGlmeV9jbGllbnRzKTsKKworc3RhdGljIGludCBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQkgICBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldF91cGRhdGVfbW9kZShtb2RlKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfZ2V0X2NhcHMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgcGxhbmUsCisJCQkJICAgICBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJbWVtc2V0KGNhcHMsIDAsIHNpemVvZigqY2FwcykpOworCWZiZGV2LT5jdHJsLT5nZXRfY2FwcyhwbGFuZSwgY2Fwcyk7CisJY2Fwcy0+Y3RybCB8PSBmYmRldi0+cGFuZWwtPmdldF9jYXBzKGZiZGV2LT5wYW5lbCk7Cit9CisKKy8qIEZvciBsY2QgdGVzdGluZyAqLwordm9pZCBvbWFwZmJfd3JpdGVfZmlyc3RfcGl4ZWwoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1MTYgcGl4dmFsKQoreworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJKih1MTYgKilmYmRldi0+bWVtX2Rlc2MucmVnaW9uWzBdLnZhZGRyID0gcGl4dmFsOworCWlmIChmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHdpbjsKKworCQltZW1zZXQoJndpbiwgMCwgc2l6ZW9mKHdpbikpOworCQl3aW4ud2lkdGggPSAyOworCQl3aW4uaGVpZ2h0ID0gMjsKKwkJd2luLm91dF93aWR0aCA9IDI7CisJCXdpbi5vdXRfaGVpZ2h0ID0gMjsKKwkJZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJkZXYtPmZiX2luZm9bMF0sICZ3aW4sIE5VTEwsIDApOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl93cml0ZV9maXJzdF9waXhlbCk7CisKKy8qCisgKiBJb2N0bCBpbnRlcmZhY2UuIFBhcnQgb2YgdGhlIGtlcm5lbCBtb2RlIGZyYW1lIGJ1ZmZlciBBUEkgaXMgZHVwbGljYXRlZAorICogaGVyZSB0byBiZSBhY2Nlc3NpYmxlIGJ5IHVzZXIgbW9kZSBjb2RlLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqZmJpLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl9vcHMJCSpvcHMgPSBmYmktPmZib3BzOworCXVuaW9uIHsKKwkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CXVwZGF0ZV93aW5kb3c7CisJCXN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbwlwbGFuZV9pbmZvOworCQlzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvCQltZW1faW5mbzsKKwkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkJCWNvbG9yX2tleTsKKwkJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJCXVwZGF0ZV9tb2RlOworCQlzdHJ1Y3Qgb21hcGZiX2NhcHMJCWNhcHM7CisJCXVuc2lnbmVkIGludAkJbWlycm9yOworCQlpbnQJCQlwbGFuZV9vdXQ7CisJCWludAkJCWVuYWJsZV9wbGFuZTsKKwl9IHA7CisJaW50IHIgPSAwOworCisJQlVHX09OKCFvcHMpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPTUFQRkJfTUlSUk9SOgorCQlpZiAoZ2V0X3VzZXIocC5taXJyb3IsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlvbWFwZmJfbWlycm9yKGZiaSwgcC5taXJyb3IpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TWU5DX0dGWDoKKwkJb21hcGZiX3N5bmMoZmJpKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVlNZTkM6CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVF9VUERBVEVfTU9ERToKKwkJaWYgKGdldF91c2VyKHAudXBkYXRlX21vZGUsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgcC51cGRhdGVfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9VUERBVEVfTU9ERToKKwkJcC51cGRhdGVfbW9kZSA9IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoZmJkZXYpOworCQlpZiAocHV0X3VzZXIocC51cGRhdGVfbW9kZSwKKwkJCQkJKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX1dJTkRPV19PTEQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC51cGRhdGVfd2luZG93LCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvd19vbGQpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlIHsKKwkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqdSA9ICZwLnVwZGF0ZV93aW5kb3c7CisJCQl1LT5vdXRfeCA9IHUtPng7CisJCQl1LT5vdXRfeSA9IHUtPnk7CisJCQl1LT5vdXRfd2lkdGggPSB1LT53aWR0aDsKKwkJCXUtPm91dF9oZWlnaHQgPSB1LT5oZWlnaHQ7CisJCQltZW1zZXQodS0+cmVzZXJ2ZWQsIDAsIHNpemVvZih1LT5yZXNlcnZlZCkpOworCQkJciA9IG9tYXBmYl91cGRhdGVfd2luKGZiaSwgdSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX1dJTkRPVzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnVwZGF0ZV93aW5kb3csICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC51cGRhdGVfd2luZG93KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl91cGRhdGVfd2luKGZiaSwgJnAudXBkYXRlX3dpbmRvdyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVFVQX1BMQU5FOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAucGxhbmVfaW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLnBsYW5lX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldHVwX3BsYW5lKGZiaSwgJnAucGxhbmVfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1FVRVJZX1BMQU5FOgorCQlpZiAoKHIgPSBvbWFwZmJfcXVlcnlfcGxhbmUoZmJpLCAmcC5wbGFuZV9pbmZvKSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5wbGFuZV9pbmZvLAorCQkJCSAgIHNpemVvZihwLnBsYW5lX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRVUF9NRU06CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5tZW1faW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLm1lbV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXR1cF9tZW0oZmJpLCAmcC5tZW1faW5mbyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1FVRVJZX01FTToKKwkJaWYgKChyID0gb21hcGZiX3F1ZXJ5X21lbShmYmksICZwLm1lbV9pbmZvKSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5tZW1faW5mbywKKwkJCQkgICBzaXplb2YocC5tZW1faW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVF9DT0xPUl9LRVk6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5jb2xvcl9rZXksICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5jb2xvcl9rZXkpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF9jb2xvcl9rZXkoZmJkZXYsICZwLmNvbG9yX2tleSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9DT0xPUl9LRVk6CisJCWlmICgociA9IG9tYXBmYl9nZXRfY29sb3Jfa2V5KGZiZGV2LCAmcC5jb2xvcl9rZXkpKSA8IDApCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLmNvbG9yX2tleSwKKwkJCQkgc2l6ZW9mKHAuY29sb3Jfa2V5KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfR0VUX0NBUFM6CisJCW9tYXBmYl9nZXRfY2FwcyhmYmRldiwgcGxhbmUtPmlkeCwgJnAuY2Fwcyk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5jYXBzLCBzaXplb2YocC5jYXBzKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfTENEX1RFU1Q6CisJCXsKKwkJCWludCB0ZXN0X251bTsKKworCQkJaWYgKGdldF91c2VyKHRlc3RfbnVtLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZmJkZXYtPnBhbmVsLT5ydW5fdGVzdCkgeworCQkJCXIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJciA9IGZiZGV2LT5wYW5lbC0+cnVuX3Rlc3QoZmJkZXYtPnBhbmVsLCB0ZXN0X251bSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT01BUEZCX0NUUkxfVEVTVDoKKwkJeworCQkJaW50IHRlc3RfbnVtOworCisJCQlpZiAoZ2V0X3VzZXIodGVzdF9udW0sIChpbnQgX191c2VyICopYXJnKSkgeworCQkJCXIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFmYmRldi0+Y3RybC0+cnVuX3Rlc3QpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXIgPSBmYmRldi0+Y3RybC0+cnVuX3Rlc3QodGVzdF9udW0pOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5tbWFwKGluZm8sIHZtYSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDYWxsYmFjayB0YWJsZSBmb3IgdGhlIGZyYW1lIGJ1ZmZlciBmcmFtZXdvcmsuIFNvbWUgb2YgdGhlc2UgcG9pbnRlcnMKKyAqIHdpbGwgYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZiBmYl9pbmZvLT5hY2NlbF9mbGFncy4KKyAqLworc3RhdGljIHN0cnVjdCBmYl9vcHMgb21hcGZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX29wZW4gICAgICAgID0gb21hcGZiX29wZW4sCisJLmZiX3JlbGVhc2UgICAgID0gb21hcGZiX3JlbGVhc2UsCisJLmZiX3NldGNvbHJlZwk9IG9tYXBmYl9zZXRjb2xyZWcsCisJLmZiX3NldGNtYXAJPSBvbWFwZmJfc2V0Y21hcCwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAorCS5mYl9ibGFuayAgICAgICA9IG9tYXBmYl9ibGFuaywKKwkuZmJfaW9jdGwJPSBvbWFwZmJfaW9jdGwsCisJLmZiX2NoZWNrX3Zhcgk9IG9tYXBmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBvbWFwZmJfc2V0X3BhciwKKwkuZmJfcm90YXRlCT0gb21hcGZiX3JvdGF0ZSwKKwkuZmJfcGFuX2Rpc3BsYXkgPSBvbWFwZmJfcGFuX2Rpc3BsYXksCit9OworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTeXNmcyBpbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBvbWFwZmJYIHN5c2ZzIGVudHJpZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2NhcHNfbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCBwbGFuZTsKKwlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3Qgb21hcGZiX2NhcHMgY2FwczsKKworCXBsYW5lID0gMDsKKwlzaXplID0gMDsKKwl3aGlsZSAoc2l6ZSA8IFBBR0VfU0laRSAmJiBwbGFuZSA8IE9NQVBGQl9QTEFORV9OVU0pIHsKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZSwgJmNhcHMpOworCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkicGxhbmUjJWQgJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIsCisJCQlwbGFuZSwgY2Fwcy5jdHJsLCBjYXBzLnBsYW5lX2NvbG9yLCBjYXBzLnduZF9jb2xvcik7CisJCXBsYW5lKys7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jYXBzX3RleHQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCBpOworCXN0cnVjdCBvbWFwZmJfY2FwcyBjYXBzOworCWludCBwbGFuZTsKKwlzaXplX3Qgc2l6ZTsKKworCXBsYW5lID0gMDsKKwlzaXplID0gMDsKKwl3aGlsZSAoc2l6ZSA8IFBBR0VfU0laRSAmJiBwbGFuZSA8IE9NQVBGQl9QTEFORV9OVU0pIHsKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZSwgJmNhcHMpOworCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJICJwbGFuZSMlZDpcbiIsIHBsYW5lKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RybF9jYXBzKSAmJgorCQkgICAgIHNpemUgPCBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKGN0cmxfY2Fwc1tpXS5mbGFnICYgY2Fwcy5jdHJsKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAlc1xuIiwgY3RybF9jYXBzW2ldLm5hbWUpOworCQl9CisJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkgIiBwbGFuZSBjb2xvcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjb2xvcl9jYXBzW2ldLmZsYWcgJiBjYXBzLnBsYW5lX2NvbG9yKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAgJXNcbiIsIGNvbG9yX2NhcHNbaV0ubmFtZSk7CisJCX0KKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCSAiIHdpbmRvdyBjb2xvcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjb2xvcl9jYXBzW2ldLmZsYWcgJiBjYXBzLnduZF9jb2xvcikKKwkJCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIgICVzXG4iLCBjb2xvcl9jYXBzW2ldLm5hbWUpOworCQl9CisKKwkJcGxhbmUrKzsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXBzX251bSwgMDQ0NCwgb21hcGZiX3Nob3dfY2Fwc19udW0sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcHNfdGV4dCwgMDQ0NCwgb21hcGZiX3Nob3dfY2Fwc190ZXh0LCBOVUxMKTsKKworLyogcGFuZWwgc3lzZnMgZW50cmllcyAqLworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfcGFuZWxfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiZGV2LT5wYW5lbC0+bmFtZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2JrbGlnaHRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKSB7CisJCXIgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJICAgICBmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKGZiZGV2LT5wYW5lbCkpOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3N0b3JlX2JrbGlnaHRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPnNldF9ia2xpZ2h0X2xldmVsKSB7CisJCXVuc2lnbmVkIGludCBsZXZlbDsKKworCQlpZiAoc3NjYW5mKGJ1ZiwgIiUxMGQiLCAmbGV2ZWwpID09IDEpIHsKKwkJCXIgPSBmYmRldi0+cGFuZWwtPnNldF9ia2xpZ2h0X2xldmVsKGZiZGV2LT5wYW5lbCwKKwkJCQkJCQkgICAgbGV2ZWwpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gciA/IHIgOiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19ia2xpZ2h0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKSB7CisJCXIgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJICAgICBmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X21heChmYmRldi0+cGFuZWwpKTsKKwl9IGVsc2UKKwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9wYW5lbF9uYW1lID0KKwlfX0FUVFIobmFtZSwgMDQ0NCwgb21hcGZiX3Nob3dfcGFuZWxfbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFja2xpZ2h0X2xldmVsLCAwNjY0LAorCQkgICBvbWFwZmJfc2hvd19ia2xpZ2h0X2xldmVsLCBvbWFwZmJfc3RvcmVfYmtsaWdodF9sZXZlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFja2xpZ2h0X21heCwgMDQ0NCwgb21hcGZiX3Nob3dfYmtsaWdodF9tYXgsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGFuZWxfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGFuZWxfbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9iYWNrbGlnaHRfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfYmFja2xpZ2h0X21heC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwYW5lbF9hdHRyX2dycCA9IHsKKwkubmFtZSAgPSAicGFuZWwiLAorCS5hdHRycyA9IHBhbmVsX2F0dHJzLAorfTsKKworLyogY3RybCBzeXNmcyBlbnRyaWVzICovCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jdHJsX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiZGV2LT5jdHJsLT5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2N0cmxfbmFtZSA9CisJX19BVFRSKG5hbWUsIDA0NDQsIG9tYXBmYl9zaG93X2N0cmxfbmFtZSwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjdHJsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2N0cmxfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjdHJsX2F0dHJfZ3JwID0geworCS5uYW1lICA9ICJjdHJsIiwKKwkuYXR0cnMgPSBjdHJsX2F0dHJzLAorfTsKKworc3RhdGljIGludCBvbWFwZmJfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCisJaWYgKChyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSkpKQorCQlnb3RvIGZhaWwwOworCisJaWYgKChyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpKSkKKwkJZ290byBmYWlsMTsKKworCWlmICgociA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKSkpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoKHIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZjdHJsX2F0dHJfZ3JwKSkpCisJCWdvdG8gZmFpbDM7CisKKwlyZXR1cm4gMDsKK2ZhaWwzOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKTsKK2ZhaWwyOgorCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc190ZXh0KTsKK2ZhaWwxOgorCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pOworZmFpbDA6CisJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHN5c2ZzIGludGVyZmFjZVxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZjdHJsX2F0dHJfZ3JwKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMRE0gY2FsbGJhY2tzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogSW5pdGlhbGl6ZSBzeXN0ZW0gZmJfaW5mbyBvYmplY3QgYW5kIHNldCB0aGUgZGVmYXVsdCB2aWRlbyBtb2RlLgorICogVGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgYnkgbGNkZG1hX2luaXQKKyAqLworc3RhdGljIGludCBmYmluZm9faW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbwkqdmFyID0gJmluZm8tPnZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8JKmZpeCA9ICZpbmZvLT5maXg7CisJaW50CQkJCXIgPSAwOworCisJaW5mby0+ZmJvcHMgPSAmb21hcGZiX29wczsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisKKwlzdHJuY3B5KGZpeC0+aWQsIE1PRFVMRV9OQU1FLCBzaXplb2YoZml4LT5pZCkpOworCisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBmYmRldi0+cHNldWRvX3BhbGV0dGU7CisKKwl2YXItPmFjY2VsX2ZsYWdzICA9IGRlZl9hY2NlbCA/IEZCX0FDQ0VMRl9URVhUIDogMDsKKwl2YXItPnhyZXMgPSBkZWZfdnhyZXM7CisJdmFyLT55cmVzID0gZGVmX3Z5cmVzOworCXZhci0+eHJlc192aXJ0dWFsID0gZGVmX3Z4cmVzOworCXZhci0+eXJlc192aXJ0dWFsID0gZGVmX3Z5cmVzOworCXZhci0+cm90YXRlCSAgPSBkZWZfcm90YXRlOworCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmRldi0+cGFuZWwtPmJwcDsKKworCXNldF9mYl92YXIoaW5mbywgdmFyKTsKKwlzZXRfZmJfZml4KGluZm8pOworCisJciA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDE2LCAwKTsKKwlpZiAociAhPSAwKQorCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgY29sb3IgbWFwIG1lbW9yeVxuIik7CisKKwlyZXR1cm4gcjsKK30KKworLyogUmVsZWFzZSB0aGUgZmJfaW5mbyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGZiaW5mb19jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlmYl9kZWFsbG9jX2NtYXAoJmZiaS0+Y21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5lc19jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCWlmIChmYmRldi0+ZmJfaW5mb1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWZiaW5mb19jbGVhbnVwKGZiZGV2LCBmYmRldi0+ZmJfaW5mb1tpXSk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJkZXYtPmZiX2luZm9baV0pOworCX0KK30KKworc3RhdGljIGludCBwbGFuZXNfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmZiaTsKKwlpbnQgaTsKKwlpbnQgcjsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZTsKKwkJZmJpID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0KSwKKwkJCQkJZmJkZXYtPmRldik7CisJCWlmIChmYmkgPT0gTlVMTCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwbGFuZSBpbmZvXG4iKTsKKwkJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXBsYW5lID0gZmJpLT5wYXI7CisJCXBsYW5lLT5pZHggPSBpOworCQlwbGFuZS0+ZmJkZXYgPSBmYmRldjsKKwkJcGxhbmUtPmluZm8ubWlycm9yID0gZGVmX21pcnJvcjsKKwkJZmJkZXYtPmZiX2luZm9baV0gPSBmYmk7CisKKwkJaWYgKChyID0gZmJpbmZvX2luaXQoZmJkZXYsIGZiaSkpIDwgMCkgeworCQkJZnJhbWVidWZmZXJfcmVsZWFzZShmYmkpOworCQkJcGxhbmVzX2NsZWFudXAoZmJkZXYpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJcGxhbmUtPmluZm8ub3V0X3dpZHRoID0gZmJpLT52YXIueHJlczsKKwkJcGxhbmUtPmluZm8ub3V0X2hlaWdodCA9IGZiaS0+dmFyLnlyZXM7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBkcml2ZXIgcmVzb3VyY2VzLiBDYW4gYmUgY2FsbGVkIHRvIHJvbGxiYWNrIGFuIGFib3J0ZWQgaW5pdGlhbGl6YXRpb24KKyAqIHNlcXVlbmNlLgorICovCitzdGF0aWMgdm9pZCBvbWFwZmJfZnJlZV9yZXNvdXJjZXMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgc3RhdGUpCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPTUFQRkJfQUNUSVZFOgorCQlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykKKwkJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYtPmZiX2luZm9baV0pOworCWNhc2UgNzoKKwkJb21hcGZiX3VucmVnaXN0ZXJfc3lzZnMoZmJkZXYpOworCWNhc2UgNjoKKwkJZmJkZXYtPnBhbmVsLT5kaXNhYmxlKGZiZGV2LT5wYW5lbCk7CisJY2FzZSA1OgorCQlvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKGZiZGV2LCBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwljYXNlIDQ6CisJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwljYXNlIDM6CisJCWN0cmxfY2xlYW51cChmYmRldik7CisJY2FzZSAyOgorCQlmYmRldi0+cGFuZWwtPmNsZWFudXAoZmJkZXYtPnBhbmVsKTsKKwljYXNlIDE6CisJCWRldl9zZXRfZHJ2ZGF0YShmYmRldi0+ZGV2LCBOVUxMKTsKKwkJa2ZyZWUoZmJkZXYpOworCWNhc2UgMDoKKwkJLyogbm90aGluZyB0byBmcmVlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIGludCBvbWFwZmJfZmluZF9jdHJsKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmNvbmY7CisJY2hhciBuYW1lWzE3XTsKKwlpbnQgaTsKKworCWNvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJZmJkZXYtPmN0cmwgPSBOVUxMOworCisJc3RybmNweShuYW1lLCBjb25mLT5sY2QuY3RybF9uYW1lLCBzaXplb2YobmFtZSkgLSAxKTsKKwluYW1lW3NpemVvZihuYW1lKSAtIDFdID0gJ1wwJzsKKworCWlmIChzdHJjbXAobmFtZSwgImludGVybmFsIikgPT0gMCkgeworCQlmYmRldi0+Y3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RybHMpOyBpKyspIHsKKwkJZGV2X2RiZyhmYmRldi0+ZGV2LCAiY3RybCAlc1xuIiwgY3RybHNbaV0tPm5hbWUpOworCQlpZiAoc3RyY21wKGN0cmxzW2ldLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlmYmRldi0+Y3RybCA9IGN0cmxzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZmJkZXYtPmN0cmwgPT0gTlVMTCkgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJjdHJsICVzIG5vdCBzdXBwb3J0ZWRcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3JlcXVpcmVkX2NhbGxiYWNrcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisjZGVmaW5lIF9DKHgpIChmYmRldi0+Y3RybC0+eCAhPSBOVUxMKQorI2RlZmluZSBfUCh4KSAoZmJkZXYtPnBhbmVsLT54ICE9IE5VTEwpCisJQlVHX09OKGZiZGV2LT5jdHJsID09IE5VTEwgfHwgZmJkZXYtPnBhbmVsID09IE5VTEwpOworCUJVR19PTighKF9DKGluaXQpICYmIF9DKGNsZWFudXApICYmIF9DKGdldF9jYXBzKSAmJgorCQkgX0Moc2V0X3VwZGF0ZV9tb2RlKSAmJiBfQyhzZXR1cF9wbGFuZSkgJiYgX0MoZW5hYmxlX3BsYW5lKSAmJgorCQkgX1AoaW5pdCkgJiYgX1AoY2xlYW51cCkgJiYgX1AoZW5hYmxlKSAmJiBfUChkaXNhYmxlKSAmJgorCQkgX1AoZ2V0X2NhcHMpKSk7CisjdW5kZWYgX1AKKyN1bmRlZiBfQworfQorCisvKgorICogQ2FsbGVkIGJ5IExETSBiaW5kaW5nIHRvIHByb2JlIGFuZCBhdHRhY2ggYSBuZXcgZGV2aWNlLgorICogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2U6CisgKiAgIDEuIGFsbG9jYXRlIHN5c3RlbSBvbWFwZmJfZGV2aWNlIHN0cnVjdHVyZQorICogICAyLiBzZWxlY3QgY29udHJvbGxlciB0eXBlIGFjY29yZGluZyB0byBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCisgKiAgICAgIGluaXQgTENEIHBhbmVsCisgKiAgIDMuIGluaXQgTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEKKyAqICAgNC4gaW5pdCBzeXN0ZW0gZmJfaW5mbyBzdHJ1Y3R1cmUgZm9yIGFsbCBwbGFuZXMKKyAqICAgNS4gc2V0dXAgdmlkZW8gbW9kZSBmb3IgZmlyc3QgcGxhbmUgYW5kIGVuYWJsZSBpdAorICogICA2LiBlbmFibGUgTENEIHBhbmVsCisgKiAgIDcuIHJlZ2lzdGVyIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqICAgT01BUEZCX0FDVElWRTogcmVnaXN0ZXIgc3lzdGVtIGZiX2luZm8gc3RydWN0dXJlIGZvciBhbGwgcGxhbmVzCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX2RvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2ID0gTlVMTDsKKwlpbnQJCQlpbml0X3N0YXRlOworCXVuc2lnbmVkIGxvbmcJCXBoeiwgaGh6LCB2aHo7CisJdW5zaWduZWQgbG9uZwkJdnJhbTsKKwlpbnQJCQlpOworCWludAkJCXIgPSAwOworCisJaW5pdF9zdGF0ZSA9IDA7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInByb2JlZCBmb3IgYW4gdW5rbm93biBkZXZpY2VcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJZmJkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcGZiX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChmYmRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgaW5mb1xuIik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCWluaXRfc3RhdGUrKzsKKworCWZiZGV2LT5kZXYgPSAmcGRldi0+ZGV2OworCWZiZGV2LT5wYW5lbCA9IHBhbmVsOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZiZGV2KTsKKworCW11dGV4X2luaXQoJmZiZGV2LT5ycXVldWVfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKwlmYmRldi0+aW50X2N0cmwgPSAmb21hcDFfaW50X2N0cmw7CisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTAorCWZiZGV2LT5leHRfaWYgPSAmb21hcDFfZXh0X2lmOworI2VuZGlmCisjZWxzZQkvKiBPTUFQMiAqLworCWZiZGV2LT5pbnRfY3RybCA9ICZvbWFwMl9pbnRfY3RybDsKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJZmJkZXYtPmV4dF9pZiA9ICZvbWFwMl9leHRfaWY7CisjZW5kaWYKKyNlbmRpZgorCWlmIChvbWFwZmJfZmluZF9jdHJsKGZiZGV2KSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJIkxDRCBjb250cm9sbGVyIG5vdCBmb3VuZCwgYm9hcmQgbm90IHN1cHBvcnRlZFxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJciA9IGZiZGV2LT5wYW5lbC0+aW5pdChmYmRldi0+cGFuZWwsIGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJcHJfaW5mbygib21hcGZiOiBjb25maWd1cmVkIGZvciBwYW5lbCAlc1xuIiwgZmJkZXYtPnBhbmVsLT5uYW1lKTsKKworCWRlZl92eHJlcyA9IGRlZl92eHJlcyA/IDogZmJkZXYtPnBhbmVsLT54X3JlczsKKwlkZWZfdnlyZXMgPSBkZWZfdnlyZXMgPyA6IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisKKwlpbml0X3N0YXRlKys7CisKKwlyID0gY3RybF9pbml0KGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWlmIChmYmRldi0+Y3RybC0+bW1hcCAhPSBOVUxMKQorCQlvbWFwZmJfb3BzLmZiX21tYXAgPSBvbWFwZmJfbW1hcDsKKwlpbml0X3N0YXRlKys7CisKKwljaGVja19yZXF1aXJlZF9jYWxsYmFja3MoZmJkZXYpOworCisJciA9IHBsYW5lc19pbml0KGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWluaXRfc3RhdGUrKzsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0RNQV9UVU5FCisJLyogU2V0IERNQSBwcmlvcml0eSBmb3IgRU1JRkYgYWNjZXNzIHRvIGhpZ2hlc3QgKi8KKwlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpCisJCW9tYXBfc2V0X2RtYV9wcmlvcml0eSgwLCBPTUFQX0RNQV9QT1JUX0VNSUZGLCAxNSk7CisjZW5kaWYKKworCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiZGV2LT5mYl9pbmZvWzBdKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJtb2RlIHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEdGWCBwbGFuZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKwlyID0gZmJkZXYtPmN0cmwtPmVuYWJsZV9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLCAxKTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgbWFudWFsX3VwZGF0ZSA/CisJCQkJICAgT01BUEZCX01BTlVBTF9VUERBVEUgOiBPTUFQRkJfQVVUT19VUERBVEUpOworCWluaXRfc3RhdGUrKzsKKworCXIgPSBmYmRldi0+cGFuZWwtPmVuYWJsZShmYmRldi0+cGFuZWwpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisJaW5pdF9zdGF0ZSsrOworCisJciA9IG9tYXBmYl9yZWdpc3Rlcl9zeXNmcyhmYmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpbml0X3N0YXRlKys7CisKKwl2cmFtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYtPmZiX2luZm9baV0pOworCQlpZiAociAhPSAwKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkJInJlZ2lzdGVyaW5nIGZyYW1lYnVmZmVyICVkIGZhaWxlZFxuIiwgaSk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJdnJhbSArPSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemU7CisJfQorCisJZmJkZXYtPnN0YXRlID0gT01BUEZCX0FDVElWRTsKKworCXBhbmVsID0gZmJkZXYtPnBhbmVsOworCXBoeiA9IHBhbmVsLT5waXhlbF9jbG9jayAqIDEwMDA7CisJaGh6ID0gcGh6ICogMTAgLyAocGFuZWwtPmhmcCArIHBhbmVsLT54X3JlcyArIHBhbmVsLT5oYnAgKyBwYW5lbC0+aHN3KTsKKwl2aHogPSBoaHogLyAocGFuZWwtPnZmcCArIHBhbmVsLT55X3JlcyArIHBhbmVsLT52YnAgKyBwYW5lbC0+dnN3KTsKKworCW9tYXBmYl9kZXYgPSBmYmRldjsKKworCXByX2luZm8oIm9tYXBmYjogRnJhbWVidWZmZXIgaW5pdGlhbGl6ZWQuIFRvdGFsIHZyYW0gJWx1IHBsYW5lcyAlZFxuIiwKKwkJCXZyYW0sIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250KTsKKwlwcl9pbmZvKCJvbWFwZmI6IFBpeGNsb2NrICVsdSBrSHogaGZyZXEgJWx1LiVsdSBrSHogIgorCQkJInZmcmVxICVsdS4lbHUgSHpcbiIsCisJCQlwaHogLyAxMDAwLCBoaHogLyAxMDAwMCwgaGh6ICUgMTAsIHZoeiAvIDEwLCB2aHogJSAxMCk7CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlvbWFwZmJfZnJlZV9yZXNvdXJjZXMoZmJkZXYsIGluaXRfc3RhdGUpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJQlVHX09OKGZiZGV2X3BkZXYgIT0gTlVMTCk7CisKKwkvKiBEZWxheSBhY3R1YWwgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhlIExDRCBpcyByZWdpc3RlcmVkICovCisJZmJkZXZfcGRldiA9IHBkZXY7CisJaWYgKGZiZGV2X3BhbmVsICE9IE5VTEwpCisJCW9tYXBmYl9kb19wcm9iZShmYmRldl9wZGV2LCBmYmRldl9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcGZiX3JlZ2lzdGVyX3BhbmVsKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCUJVR19PTihmYmRldl9wYW5lbCAhPSBOVUxMKTsKKworCWZiZGV2X3BhbmVsID0gcGFuZWw7CisJaWYgKGZiZGV2X3BkZXYgIT0gTlVMTCkKKwkJb21hcGZiX2RvX3Byb2JlKGZiZGV2X3BkZXYsIGZiZGV2X3BhbmVsKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWVudW0gb21hcGZiX3N0YXRlIHNhdmVkX3N0YXRlID0gZmJkZXYtPnN0YXRlOworCisJLyogRklYTUU6IHdhaXQgdGlsbCBjb21wbGV0aW9uIG9mIHBlbmRpbmcgZXZlbnRzICovCisKKwlmYmRldi0+c3RhdGUgPSBPTUFQRkJfRElTQUJMRUQ7CisJb21hcGZiX2ZyZWVfcmVzb3VyY2VzKGZiZGV2LCBzYXZlZF9zdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUE0gc3VzcGVuZCAqLworc3RhdGljIGludCBvbWFwZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9tYXBmYl9ibGFuayhWRVNBX1BPV0VSRE9XTiwgZmJkZXYtPmZiX2luZm9bMF0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBNIHJlc3VtZSAqLworc3RhdGljIGludCBvbWFwZmJfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvbWFwZmJfYmxhbmsoVkVTQV9OT19CTEFOS0lORywgZmJkZXYtPmZiX2luZm9bMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwZmJfZHJpdmVyID0geworCS5wcm9iZQkJPSBvbWFwZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBvbWFwZmJfcmVtb3ZlLAorCS5zdXNwZW5kCT0gb21hcGZiX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvbWFwZmJfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IE1PRFVMRV9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworI2lmbmRlZiBNT0RVTEUKKworLyogUHJvY2VzcyBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnRoaXNfb3B0ID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwlwcl9kZWJ1Zygib21hcGZiOiBvcHRpb25zICVzXG4iLCBvcHRpb25zKTsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCFyICYmICh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJhY2NlbCIsIDUpKQorCQkJZGVmX2FjY2VsID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2cmFtOiIsIDUpKSB7CisJCQljaGFyICpzdWZmaXg7CisJCQl1bnNpZ25lZCBsb25nIHZyYW07CisJCQl2cmFtID0gKHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgJnN1ZmZpeCwgMCkpOworCQkJc3dpdGNoIChzdWZmaXhbMF0pIHsKKwkJCWNhc2UgJ1wwJzoKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJY2FzZSAnTSc6CisJCQkJdnJhbSAqPSAxMDI0OworCQkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSAnayc6CisJCQljYXNlICdLJzoKKwkJCQl2cmFtICo9IDEwMjQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByX2RlYnVnKCJvbWFwZmI6IGludmFsaWQgdnJhbSBzdWZmaXggJWNcbiIsCisJCQkJCSBzdWZmaXhbMF0pOworCQkJCXIgPSAtMTsKKwkJCX0KKwkJCWRlZl92cmFtW2RlZl92cmFtX2NudCsrXSA9IHZyYW07CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2eHJlczoiLCA2KSkKKwkJCWRlZl92eHJlcyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnlyZXM6IiwgNikpCisJCQlkZWZfdnlyZXMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInJvdGF0ZToiLCA3KSkKKwkJCWRlZl9yb3RhdGUgPSAoc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWlycm9yOiIsIDcpKQorCQkJZGVmX21pcnJvciA9IChzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtYW51YWxfdXBkYXRlIiwgMTMpKQorCQkJbWFudWFsX3VwZGF0ZSA9IDE7CisJCWVsc2UgeworCQkJcHJfZGVidWcoIm9tYXBmYjogaW52YWxpZCBvcHRpb25cbiIpOworCQkJciA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKKyNlbmRpZgorCisvKiBSZWdpc3RlciBib3RoIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbjsKKworCWlmIChmYl9nZXRfb3B0aW9ucygib21hcGZiIiwgJm9wdGlvbikpCisJCXJldHVybiAtRU5PREVWOworCW9tYXBmYl9zZXR1cChvcHRpb24pOworI2VuZGlmCisJLyogUmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIExETSAqLworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBmYl9kcml2ZXIpKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gcmVnaXN0ZXIgb21hcGZiIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcGZiX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcGZiX2RyaXZlcik7Cit9CisKK21vZHVsZV9wYXJhbV9uYW1lZChhY2NlbCwgZGVmX2FjY2VsLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZCh2cmFtLCBkZWZfdnJhbSwgdWxvbmcsICZkZWZfdnJhbV9jbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHZ4cmVzLCBkZWZfdnhyZXMsIGxvbmcsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHZ5cmVzLCBkZWZfdnlyZXMsIGxvbmcsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHJvdGF0ZSwgZGVmX3JvdGF0ZSwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobWlycm9yLCBkZWZfbWlycm9yLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYW51YWxfdXBkYXRlLCBtYW51YWxfdXBkYXRlLCBib29sLCAwNjY0KTsKKworbW9kdWxlX2luaXQob21hcGZiX2luaXQpOworbW9kdWxlX2V4aXQob21hcGZiX2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIE9NQVAgZnJhbWVidWZmZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQyNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpAQCAtMCwwICsxLDU4OCBAQAorLyoKKyAqIE9NQVAyIFJlbW90ZSBGcmFtZSBCdWZmZXIgSW50ZXJmYWNlIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgIEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjaW5jbHVkZSAiZGlzcGMuaCIKKworLyogVG8gd29yayBhcm91bmQgYW4gUkZCSSB0cmFuc2ZlciByYXRlIGxpbWl0YXRpb24gKi8KKyNkZWZpbmUgT01BUF9SRkJJX1JBVEVfTElNSVQJMQorCisjZGVmaW5lIFJGQklfQkFTRQkJMHg0ODA1MDgwMAorI2RlZmluZSBSRkJJX1JFVklTSU9OCQkweDAwMDAKKyNkZWZpbmUgUkZCSV9TWVNDT05GSUcJCTB4MDAxMAorI2RlZmluZSBSRkJJX1NZU1NUQVRVUwkJMHgwMDE0CisjZGVmaW5lIFJGQklfQ09OVFJPTAkJMHgwMDQwCisjZGVmaW5lIFJGQklfUElYRUxfQ05UCQkweDAwNDQKKyNkZWZpbmUgUkZCSV9MSU5FX05VTUJFUgkweDAwNDgKKyNkZWZpbmUgUkZCSV9DTUQJCTB4MDA0YworI2RlZmluZSBSRkJJX1BBUkFNCQkweDAwNTAKKyNkZWZpbmUgUkZCSV9EQVRBCQkweDAwNTQKKyNkZWZpbmUgUkZCSV9SRUFECQkweDAwNTgKKyNkZWZpbmUgUkZCSV9TVEFUVVMJCTB4MDA1YworI2RlZmluZSBSRkJJX0NPTkZJRzAJCTB4MDA2MAorI2RlZmluZSBSRkJJX09OT0ZGX1RJTUUwCTB4MDA2NAorI2RlZmluZSBSRkJJX0NZQ0xFX1RJTUUwCTB4MDA2OAorI2RlZmluZSBSRkJJX0RBVEFfQ1lDTEUxXzAJMHgwMDZjCisjZGVmaW5lIFJGQklfREFUQV9DWUNMRTJfMAkweDAwNzAKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFM18wCTB4MDA3NAorI2RlZmluZSBSRkJJX1ZTWU5DX1dJRFRICTB4MDA5MAorI2RlZmluZSBSRkJJX0hTWU5DX1dJRFRICTB4MDA5NAorCisjZGVmaW5lIERJU1BDX0JBU0UJCTB4NDgwNTA0MDAKKyNkZWZpbmUgRElTUENfQ09OVFJPTAkJMHgwMDQwCisKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMgkJYmFzZTsKKwl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CisJdW5zaWduZWQgbG9uZwlsNF9raHo7CisJaW50CQliaXRzX3Blcl9jeWNsZTsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGNsawkqZHNzX2ljazsKKwlzdHJ1Y3QgY2xrCSpkc3MxX2ZjazsKKwl1bnNpZ25lZAl0ZWFyc3luY19waW5fY250OworCXVuc2lnbmVkCXRlYXJzeW5jX21vZGU7Cit9IHJmYmk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmJpX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIHJmYmkuYmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJmYmlfcmVhZF9yZWcoaW50IGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocmZiaS5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGludCByZmJpX2dldF9jbG9ja3Modm9pZCkKK3sKKwlpZiAoSVNfRVJSKChyZmJpLmRzc19pY2sgPSBjbGtfZ2V0KHJmYmkuZmJkZXYtPmRldiwgImRzc19pY2siKSkpKSB7CisJCWRldl9lcnIocmZiaS5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc19pY2siKTsKKwkJcmV0dXJuIFBUUl9FUlIocmZiaS5kc3NfaWNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChyZmJpLmRzczFfZmNrID0gY2xrX2dldChyZmJpLmZiZGV2LT5kZXYsICJkc3MxX2ZjayIpKSkpIHsKKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzMV9mY2siKTsKKwkJY2xrX3B1dChyZmJpLmRzc19pY2spOworCQlyZXR1cm4gUFRSX0VSUihyZmJpLmRzczFfZmNrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZiaV9wdXRfY2xvY2tzKHZvaWQpCit7CisJY2xrX3B1dChyZmJpLmRzczFfZmNrKTsKKwljbGtfcHV0KHJmYmkuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZW5hYmxlX2Nsb2NrcyhpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJY2xrX2VuYWJsZShyZmJpLmRzc19pY2spOworCQljbGtfZW5hYmxlKHJmYmkuZHNzMV9mY2spOworCX0gZWxzZSB7CisJCWNsa19kaXNhYmxlKHJmYmkuZHNzMV9mY2spOworCQljbGtfZGlzYWJsZShyZmJpLmRzc19pY2spOworCX0KK30KKworCisjaWZkZWYgVkVSQk9TRQorc3RhdGljIHZvaWQgcmZiaV9wcmludF90aW1pbmdzKHZvaWQpCit7CisJdTMyIGw7CisJdTMyIHRpbWU7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCXRpbWUgPSAxMDAwMDAwMDAwIC8gcmZiaS5sNF9raHo7CisJaWYgKGwgJiAoMSA8PCA0KSkKKwkJdGltZSAqPSAyOworCisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsICJUaWNrIHRpbWUgJXUgcHNcbiIsIHRpbWUpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfT05PRkZfVElNRTApOworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LAorCQkiQ1NPTlRJTUUgJWQsIENTT0ZGVElNRSAlZCwgV0VPTlRJTUUgJWQsIFdFT0ZGVElNRSAlZCwgIgorCQkiUkVPTlRJTUUgJWQsIFJFT0ZGVElNRSAlZFxuIiwKKwkJbCAmIDB4MGYsIChsID4+IDQpICYgMHgzZiwgKGwgPj4gMTApICYgMHgwZiwgKGwgPj4gMTQpICYgMHgzZiwKKwkJKGwgPj4gMjApICYgMHgwZiwgKGwgPj4gMjQpICYgMHgzZik7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NZQ0xFX1RJTUUwKTsKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwKKwkJIldFQ1lDTEVUSU1FICVkLCBSRUNZQ0xFVElNRSAlZCwgQ1NQVUxTRVdJRFRIICVkLCAiCisJCSJBQ0NFU1NUSU1FICVkXG4iLAorCQkobCAmIDB4M2YpLCAobCA+PiA2KSAmIDB4M2YsIChsID4+IDEyKSAmIDB4M2YsCisJCShsID4+IDIyKSAmIDB4M2YpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHJmYmlfcHJpbnRfdGltaW5ncyh2b2lkKSB7fQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJmYmlfc2V0X3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisKKwlCVUdfT04oIXQtPmNvbnZlcnRlZCk7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9PTk9GRl9USU1FMCwgdC0+dGltWzBdKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NZQ0xFX1RJTUUwLCB0LT50aW1bMV0pOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwlsICY9IH4oMSA8PCA0KTsKKwlsIHw9ICh0LT50aW1bMl0gPyAxIDogMCkgPDwgNDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCisJcmZiaV9wcmludF90aW1pbmdzKCk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX2dldF9jbGtfaW5mbyh1MzIgKmNsa19wZXJpb2QsIHUzMiAqbWF4X2Nsa19kaXYpCit7CisJKmNsa19wZXJpb2QgPSAxMDAwMDAwMDAwIC8gcmZiaS5sNF9raHo7CisJKm1heF9jbGtfZGl2ID0gMjsKK30KKworc3RhdGljIGludCBwc190b19yZmJpX3RpY2tzKGludCB0aW1lLCBpbnQgZGl2KQoreworCXVuc2lnbmVkIGxvbmcgdGlja19wczsKKwlpbnQgcmV0OworCisJLyogQ2FsY3VsYXRlIGluIHBpY29zZWNzIHRvIHlpZWxkIG1vcmUgZXhhY3QgcmVzdWx0cyAqLworCXRpY2tfcHMgPSAxMDAwMDAwMDAwIC8gKHJmYmkubDRfa2h6KSAqIGRpdjsKKworCXJldCA9ICh0aW1lICsgdGlja19wcyAtIDEpIC8gdGlja19wczsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBPTUFQX1JGQklfUkFURV9MSU1JVAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmZiaV9nZXRfbWF4X3R4X3JhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCWw0X3JhdGUsIGRzczFfcmF0ZTsKKwlpbnQJCW1pbl9sNF90aWNrcyA9IDA7CisJaW50CQlpOworCisJLyogQWNjb3JkaW5nIHRvIFRJIHRoaXMgY2FuJ3QgYmUgY2FsY3VsYXRlZCBzbyBtYWtlIHRoZQorCSAqIGFkanVzdG1lbnRzIGZvciBhIGNvdXBsZSBvZiBrbm93biBmcmVxdWVuY2llcyBhbmQgd2FybiBmb3IKKwkgKiBvdGhlcnMuCisJICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgbDRfY2xrOwkJLyogSFogKi8KKwkJdW5zaWduZWQgbG9uZyBkc3MxX2NsazsJCS8qIEhaICovCisJCXVuc2lnbmVkIGxvbmcgbWluX2w0X3RpY2tzOworCX0gZnRhYltdID0geworCQl7IDU1LAkxMzIsCTcsIH0sCQkvKiA3Ljg2IE1QaXgvcyAqLworCQl7IDExMCwJMTEwLAkxMiwgfSwJCS8qIDkuMTYgTVBpeC9zICovCisJCXsgMTEwLAkxMzIsCTEwLCB9LAkJLyogMTEgICBNcGl4L3MgKi8KKwkJeyAxMjAsCTEyMCwJMTAsIH0sCQkvKiAxMiAgIE1waXgvcyAqLworCQl7IDEzMywJMTMzLAkxMCwgfSwJCS8qIDEzLjMgTXBpeC9zICovCisJfTsKKworCWw0X3JhdGUgPSByZmJpLmw0X2toeiAvIDEwMDA7CisJZHNzMV9yYXRlID0gY2xrX2dldF9yYXRlKHJmYmkuZHNzMV9mY2spIC8gMTAwMDAwMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ0YWIpOyBpKyspIHsKKwkJLyogVXNlIGEgd2luZG93IGluc3RlYWQgb2YgYW4gZXhhY3QgbWF0Y2gsIHRvIGFjY291bnQKKwkJICogZm9yIGRpZmZlcmVudCBEUExMIG11bHRpcGxpZXIgLyBkaXZpZGVyIHBhaXJzLgorCQkgKi8KKwkJaWYgKGFicyhmdGFiW2ldLmw0X2NsayAtIGw0X3JhdGUpIDwgMyAmJgorCQkgICAgYWJzKGZ0YWJbaV0uZHNzMV9jbGsgLSBkc3MxX3JhdGUpIDwgMykgeworCQkJbWluX2w0X3RpY2tzID0gZnRhYltpXS5taW5fbDRfdGlja3M7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGZ0YWIpKSB7CisJCS8qIENhbid0IGJlIHN1cmUsIHJldHVybiBhbnl3YXkgdGhlIG1heGltdW0gbm90CisJCSAqIHJhdGUtbGltaXRlZC4gVGhpcyBtaWdodCBjYXVzZSBhIHByb2JsZW0gb25seSBmb3IgdGhlCisJCSAqIHRlYXJpbmcgc3luY2hyb25pc2F0aW9uLgorCQkgKi8KKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsCisJCQkiY2FuJ3QgZGV0ZXJtaW5lIG1heGltdW0gUkZCSSB0cmFuc2ZlciByYXRlXG4iKTsKKwkJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKKwl9CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMCAvIG1pbl9sNF90aWNrczsKK30KKyNlbHNlCitzdGF0aWMgaW50IHJmYmlfZ2V0X21heF90eF9yYXRlKHZvaWQpCit7CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgcmZiaV9jb252ZXJ0X3RpbWluZ3Moc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisJaW50IHJlb24sIHJlb2ZmLCB3ZW9uLCB3ZW9mZiwgY3NvbiwgY3NvZmYsIGNzX3B1bHNlOworCWludCBhY3RpbSwgcmVjeWMsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJaWYgKGRpdiA8PSAwIHx8IGRpdiA+IDIpCisJCXJldHVybiAtMTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGFmdGVyIGNvbnZlcnNpb24gaXQgc3RpbGwgaG9sZHMgdGhhdDoKKwkgKiB3ZW9mZiA+IHdlb24sIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIHdlY3ljID49IHdlb2ZmLAorCSAqIGNzb2ZmID4gY3NvbiwgY3NvZmYgPj0gbWF4KHdlb2ZmLCByZW9mZiksIGFjdGltID4gcmVvbgorCSAqLworCXdlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29uX3RpbWUsIGRpdik7CisJd2VvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCWlmICh3ZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmICh3ZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCXJlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29uX3RpbWUsIGRpdik7CisJcmVvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCWlmIChyZW9mZiA8PSByZW9uKQorCQlyZW9mZiA9IHJlb24gKyAxOworCWlmIChyZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChyZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWNzb24gPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29uX3RpbWUsIGRpdik7CisJY3NvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29mZl90aW1lLCBkaXYpOworCWlmIChjc29mZiA8PSBjc29uKQorCQljc29mZiA9IGNzb24gKyAxOworCWlmIChjc29mZiA8IG1heCh3ZW9mZiwgcmVvZmYpKQorCQljc29mZiA9IG1heCh3ZW9mZiwgcmVvZmYpOworCWlmIChjc29uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChjc29mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgY3NvbjsKKwlsIHw9IGNzb2ZmIDw8IDQ7CisJbCB8PSB3ZW9uICA8PCAxMDsKKwlsIHw9IHdlb2ZmIDw8IDE0OworCWwgfD0gcmVvbiAgPDwgMjA7CisJbCB8PSByZW9mZiA8PCAyNDsKKworCXQtPnRpbVswXSA9IGw7CisKKwlhY3RpbSA9IHBzX3RvX3JmYmlfdGlja3ModC0+YWNjZXNzX3RpbWUsIGRpdik7CisJaWYgKGFjdGltIDw9IHJlb24pCisJCWFjdGltID0gcmVvbiArIDE7CisJaWYgKGFjdGltID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHdlY3ljIDwgd2VvZmYpCisJCXdlY3ljID0gd2VvZmY7CisJaWYgKHdlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJcmVjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHJlY3ljIDwgcmVvZmYpCisJCXJlY3ljID0gcmVvZmY7CisJaWYgKHJlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJY3NfcHVsc2UgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX3B1bHNlX3dpZHRoLCBkaXYpOworCWlmIChjc19wdWxzZSA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgd2VjeWM7CisJbCB8PSByZWN5YyAgICA8PCA2OworCWwgfD0gY3NfcHVsc2UgPDwgMTI7CisJbCB8PSBhY3RpbSAgICA8PCAyMjsKKworCXQtPnRpbVsxXSA9IGw7CisKKwl0LT50aW1bMl0gPSBkaXYgLSAxOworCisJdC0+Y29udmVydGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYmlfc2V0dXBfdGVhcnN5bmModW5zaWduZWQgcGluX2NudCwKKwkJCSAgICAgICB1bnNpZ25lZCBoc19wdWxzZV90aW1lLCB1bnNpZ25lZCB2c19wdWxzZV90aW1lLAorCQkJICAgICAgIGludCBoc19wb2xfaW52LCBpbnQgdnNfcG9sX2ludiwgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaHMsIHZzOworCWludCBtaW47CisJdTMyIGw7CisKKwlpZiAocGluX2NudCAhPSAxICYmIHBpbl9jbnQgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocyA9IHBzX3RvX3JmYmlfdGlja3MoaHNfcHVsc2VfdGltZSwgMSk7CisJdnMgPSBwc190b19yZmJpX3RpY2tzKHZzX3B1bHNlX3RpbWUsIDEpOworCWlmIChocyA8IDIpCisJCXJldHVybiAtRURPTTsKKwlpZiAocGluX2NudCA9PSAyKQorCQltaW4gPSAyOworCWVsc2UKKwkJbWluID0gNDsKKwlpZiAodnMgPCBtaW4pCisJCXJldHVybiAtRURPTTsKKwlpZiAodnMgPT0gaHMpCisJCXJldHVybiAtRUlOVkFMOworCXJmYmkudGVhcnN5bmNfcGluX2NudCA9IHBpbl9jbnQ7CisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsCisJCSJzZXR1cF90ZWFyc3luYzogcGlucyAlZCBocyAlZCB2cyAlZCBoc19pbnYgJWQgdnNfaW52ICVkXG4iLAorCQlwaW5fY250LCBocywgdnMsIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfSFNZTkNfV0lEVEgsIGhzKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1ZTWU5DX1dJRFRILCB2cyk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCWlmIChoc19wb2xfaW52KQorCQlsICY9IH4oMSA8PCAyMSk7CisJZWxzZQorCQlsIHw9IDEgPDwgMjE7CisJaWYgKHZzX3BvbF9pbnYpCisJCWwgJj0gfigxIDw8IDIwKTsKKwllbHNlCisJCWwgfD0gMSA8PCAyMDsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmJpX2VuYWJsZV90ZWFyc3luYyhpbnQgZW5hYmxlLCB1bnNpZ25lZCBsaW5lKQoreworCXUzMiBsOworCisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsICJ0ZWFyc3luYyAlZCBsaW5lICVkIG1vZGUgJWRcbiIsCisJCWVuYWJsZSwgbGluZSwgcmZiaS50ZWFyc3luY19tb2RlKTsKKwlpZiAobGluZSA+ICgxIDw8IDExKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDB4MyA8PCAyKTsKKwlpZiAoZW5hYmxlKSB7CisJCXJmYmkudGVhcnN5bmNfbW9kZSA9IHJmYmkudGVhcnN5bmNfcGluX2NudDsKKwkJbCB8PSByZmJpLnRlYXJzeW5jX21vZGUgPDwgMjsKKwl9IGVsc2UKKwkJcmZiaS50ZWFyc3luY19tb2RlID0gMDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfTElORV9OVU1CRVIsIGxpbmUpOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmJpX3dyaXRlX2NvbW1hbmQoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX0NNRCwgKncrKyk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfQ01ELCAqYisrKTsKKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3JlYWRfZGF0YSh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWlmIChyZmJpLmJpdHNfcGVyX2N5Y2xlID09IDE2KSB7CisJCXUxNiAqdyA9IGJ1ZjsKKwkJQlVHX09OKGxlbiAmIH4xKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpIHsKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUkVBRCwgMCk7CisJCQkqdysrID0gcmZiaV9yZWFkX3JlZyhSRkJJX1JFQUQpOworCQl9CisJfSBlbHNlIHsKKwkJdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkgeworCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9SRUFELCAwKTsKKwkJCSpiKysgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVBRCk7CisJCX0KKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1BBUkFNLCAqdysrKTsKKwl9IGVsc2UgeworCQljb25zdCB1OCAqYiA9IGJ1ZjsKKwkJQlVHX09OKHJmYmkuYml0c19wZXJfY3ljbGUgIT0gOCk7CisJCWZvciAoOyBsZW47IGxlbi0tKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9QQVJBTSwgKmIrKyk7CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV90cmFuc2Zlcl9hcmVhKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl2b2lkIChjYWxsYmFjaykodm9pZCAqIGRhdGEpLCB2b2lkICpkYXRhKQoreworCXUzMiB3OworCisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCW9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKHdpZHRoLCBoZWlnaHQpOworCisJcmZiaS5sY2RjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmZiaS5sY2RjX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9QSVhFTF9DTlQsIHdpZHRoICogaGVpZ2h0KTsKKworCXcgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJdyB8PSAxOwkJCQkvKiBlbmFibGUgKi8KKwlpZiAoIXJmYmkudGVhcnN5bmNfbW9kZSkKKwkJdyB8PSAxIDw8IDQ7CQkvKiBpbnRlcm5hbCB0cmlnZ2VyLCByZXNldCBieSBIVyAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09OVFJPTCwgdyk7CisKKwlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3N0b3BfdHJhbnNmZXIodm9pZCkKK3sKKwl1MzIgdzsKKworCXcgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCB3ICYgfigxIDw8IDApKTsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJX3N0b3BfdHJhbnNmZXIoKTsKKwlyZmJpLmxjZGNfY2FsbGJhY2socmZiaS5sY2RjX2NhbGxiYWNrX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCByZmJpX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnBjKQoreworCXUzMiBsOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDB4MDMgPDwgMCk7CisKKwlzd2l0Y2ggKGJwYykgeworCWNhc2UgODoKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJbCB8PSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcwLCBsKTsKKwlyZmJpLmJpdHNfcGVyX2N5Y2xlID0gYnBjOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIGludCByZmJpX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXUzMiBsOworCWludCByOworCisJcmZiaS5mYmRldiA9IGZiZGV2OworCXJmYmkuYmFzZSA9IGlvX3AydihSRkJJX0JBU0UpOworCisJaWYgKChyID0gcmZiaV9nZXRfY2xvY2tzKCkpIDwgMCkKKwkJcmV0dXJuIHI7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCisJcmZiaS5sNF9raHogPSBjbGtfZ2V0X3JhdGUocmZiaS5kc3NfaWNrKSAvIDEwMDA7CisKKwkvKiBSZXNldCAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfU1lTQ09ORklHLCAxIDw8IDEpOworCXdoaWxlICghKHJmYmlfcmVhZF9yZWcoUkZCSV9TWVNTVEFUVVMpICYgKDEgPDwgMCkpKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfU1lTQ09ORklHKTsKKwkvKiBFbmFibGUgYXV0b2lkbGUgYW5kIHNtYXJ0LWlkbGUgKi8KKwlsIHw9ICgxIDw8IDApIHwgKDIgPDwgMyk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9TWVNDT05GSUcsIGwpOworCisJLyogMTYtYml0IGludGVyZmFjZSwgSVRFIHRyaWdnZXIgbW9kZSwgMTYtYml0IGRhdGEgKi8KKwlsID0gKDB4MDMgPDwgMCkgfCAoMHgwMCA8PCAyKSB8ICgweDAxIDw8IDUpIHwgKDB4MDIgPDwgNyk7CisJbCB8PSAoMCA8PCA5KSB8ICgxIDw8IDIwKSB8ICgxIDw8IDIxKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9EQVRBX0NZQ0xFMV8wLCAweDAwMDAwMDEwKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJLyogU2VsZWN0IENTMCwgY2xlYXIgYnlwYXNzIG1vZGUgKi8KKwlsID0gKDB4MDEgPDwgMik7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCBsKTsKKworCWlmICgociA9IG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEocmZiaV9kbWFfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IERJU1BDIGlycVxuIik7CisJCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKwkJcmV0dXJuIHI7CisJfQorCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRVZJU0lPTik7CisJcHJfaW5mbygib21hcGZiOiBSRkJJIHZlcnNpb24gJWQuJWQgaW5pdGlhbGl6ZWRcbiIsCisJCShsID4+IDQpICYgMHgwZiwgbCAmIDB4MGYpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfY2xlYW51cCh2b2lkKQoreworCW9tYXBfZGlzcGNfZnJlZV9pcnEoKTsKKwlyZmJpX3B1dF9jbG9ja3MoKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAyX2V4dF9pZiA9IHsKKwkuaW5pdAkJCT0gcmZiaV9pbml0LAorCS5jbGVhbnVwCQk9IHJmYmlfY2xlYW51cCwKKwkuZ2V0X2Nsa19pbmZvCQk9IHJmYmlfZ2V0X2Nsa19pbmZvLAorCS5nZXRfbWF4X3R4X3JhdGUJPSByZmJpX2dldF9tYXhfdHhfcmF0ZSwKKwkuc2V0X2JpdHNfcGVyX2N5Y2xlCT0gcmZiaV9zZXRfYml0c19wZXJfY3ljbGUsCisJLmNvbnZlcnRfdGltaW5ncwk9IHJmYmlfY29udmVydF90aW1pbmdzLAorCS5zZXRfdGltaW5ncwkJPSByZmJpX3NldF90aW1pbmdzLAorCS53cml0ZV9jb21tYW5kCQk9IHJmYmlfd3JpdGVfY29tbWFuZCwKKwkucmVhZF9kYXRhCQk9IHJmYmlfcmVhZF9kYXRhLAorCS53cml0ZV9kYXRhCQk9IHJmYmlfd3JpdGVfZGF0YSwKKwkudHJhbnNmZXJfYXJlYQkJPSByZmJpX3RyYW5zZmVyX2FyZWEsCisJLnNldHVwX3RlYXJzeW5jCQk9IHJmYmlfc2V0dXBfdGVhcnN5bmMsCisJLmVuYWJsZV90ZWFyc3luYwk9IHJmYmlfZW5hYmxlX3RlYXJzeW5jLAorCisJLm1heF90cmFuc21pdF9zaXplCT0gKHUzMikgfjAsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYwpAQCAtMCwwICsxLDY4NiBAQAorLyoKKyAqIE9NQVAxIFNwZWNpYWwgT3B0aW1pU2VkIFNjcmVlbiBJbnRlcmZhY2Ugc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2luY2x1ZGUgImxjZGMuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQkJIm9tYXBmYi1zb3NzaSIKKworI2RlZmluZSBPTUFQX1NPU1NJX0JBU0UgICAgICAgICAweGZmZmJhYzAwCisjZGVmaW5lIFNPU1NJX0lEX1JFRwkJMHgwMAorI2RlZmluZSBTT1NTSV9JTklUMV9SRUcJCTB4MDQKKyNkZWZpbmUgU09TU0lfSU5JVDJfUkVHCQkweDA4CisjZGVmaW5lIFNPU1NJX0lOSVQzX1JFRwkJMHgwYworI2RlZmluZSBTT1NTSV9GSUZPX1JFRwkJMHgxMAorI2RlZmluZSBTT1NTSV9SRU9UQUJMRV9SRUcJMHgxNAorI2RlZmluZSBTT1NTSV9URUFSSU5HX1JFRwkweDE4CisjZGVmaW5lIFNPU1NJX0lOSVQxQl9SRUcJMHgxYworI2RlZmluZSBTT1NTSV9GSUZPQl9SRUcJCTB4MjAKKworI2RlZmluZSBETUFfR1NDUiAgICAgICAgICAweGZmZmVkYzA0CisjZGVmaW5lIERNQV9MQ0RfQ0NSICAgICAgIDB4ZmZmZWUzYzIKKyNkZWZpbmUgRE1BX0xDRF9DVFJMICAgICAgMHhmZmZlZTNjNAorI2RlZmluZSBETUFfTENEX0xDSF9DVFJMICAweGZmZmVlM2VhCisKKyNkZWZpbmUgQ09ORl9TT1NTSV9SRVNFVF9SICAgICAgKDEgPDwgMjMpCisKKyNkZWZpbmUgUkRfQUNDRVNTCQkwCisjZGVmaW5lIFdSX0FDQ0VTUwkJMQorCisjZGVmaW5lIFNPU1NJX01BWF9YTUlUX0JZVEVTCSg1MTIgKiAxMDI0KQorCitzdGF0aWMgc3RydWN0IHsKKwl2b2lkIF9faW9tZW0JKmJhc2U7CisJc3RydWN0IGNsawkqZmNrOworCXVuc2lnbmVkIGxvbmcJZmNrX2h6OworCXNwaW5sb2NrX3QJbG9jazsKKwlpbnQJCWJ1c19waWNrX2NvdW50OworCWludAkJYnVzX3BpY2tfd2lkdGg7CisJaW50CQl0ZWFyc3luY19tb2RlOworCWludAkJdGVhcnN5bmNfbGluZTsKKwl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CisJaW50CQl2c3luY19kbWFfcGVuZGluZzsKKwkvKiB0aW1pbmcgZm9yIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyAqLworCWludAkJY2xrX2RpdjsKKwl1OAkJY2xrX3R3MFsyXTsKKwl1OAkJY2xrX3R3MVsyXTsKKwkvKgorCSAqIGlmIGxhc3RfYWNjZXNzIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgd2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgKiB0aGUgdGltaW5ncworCSAqLworCWludAkJbGFzdF9hY2Nlc3M7CisKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7Cit9IHNvc3NpOworCitzdGF0aWMgaW5saW5lIHUzMiBzb3NzaV9yZWFkX3JlZyhpbnQgcmVnKQoreworCXJldHVybiByZWFkbChzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgc29zc2lfcmVhZF9yZWcxNihpbnQgcmVnKQoreworCXJldHVybiByZWFkdyhzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1OCBzb3NzaV9yZWFkX3JlZzgoaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGIoc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWcoaW50IHJlZywgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWcxNihpbnQgcmVnLCB1MTYgdmFsdWUpCit7CisJd3JpdGV3KHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvc3NpX3dyaXRlX3JlZzgoaW50IHJlZywgdTggdmFsdWUpCit7CisJd3JpdGViKHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X2JpdHMoaW50IHJlZywgdTMyIGJpdHMpCit7CisJc29zc2lfd3JpdGVfcmVnKHJlZywgc29zc2lfcmVhZF9yZWcocmVnKSB8IGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9jbGVhcl9iaXRzKGludCByZWcsIHUzMiBiaXRzKQoreworCXNvc3NpX3dyaXRlX3JlZyhyZWcsIHNvc3NpX3JlYWRfcmVnKHJlZykgJiB+Yml0cyk7Cit9CisKKyNkZWZpbmUgSFpfVE9fUFMoeCkJKDEwMDAwMDAwMDAgLyAoeCAvIDEwMDApKQorCitzdGF0aWMgdTMyIHBzX3RvX3Nvc3NpX3RpY2tzKHUzMiBwcywgaW50IGRpdikKK3sKKwl1MzIgY2xrX3BlcmlvZCA9IEhaX1RPX1BTKHNvc3NpLmZja19oeikgKiBkaXY7CisJcmV0dXJuIChjbGtfcGVyaW9kICsgcHMgLSAxKSAvIGNsa19wZXJpb2Q7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiB0dzAsIHR3MTsKKwlpbnQgcmVvbiwgcmVvZmYsIHJlY3ljLCBhY3RpbTsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgYWZ0ZXIgY29udmVyc2lvbiBpdCBzdGlsbCBob2xkcyB0aGF0OgorCSAqIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIGFjdGltID4gcmVvbgorCSAqLworCXJlb24gPSBwc190b19zb3NzaV90aWNrcyh0LT5yZV9vbl90aW1lLCBkaXYpOworCS8qIHJlb24gd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaSB0aWNrICovCisJaWYgKHJlb24gPiAxKQorCQlyZXR1cm4gLTE7CisKKwlyZW9mZiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCisJaWYgKHJlb2ZmIDw9IHJlb24pCisJCXJlb2ZmID0gcmVvbiArIDE7CisKKwl0dzAgPSByZW9mZiAtIHJlb247CisJaWYgKHR3MCA+IDB4MTApCisJCXJldHVybiAtMTsKKworCXJlY3ljID0gcHNfdG9fc29zc2lfdGlja3ModC0+cmVfY3ljbGVfdGltZSwgZGl2KTsKKwlpZiAocmVjeWMgPD0gcmVvZmYpCisJCXJlY3ljID0gcmVvZmYgKyAxOworCisJdHcxID0gcmVjeWMgLSB0dzA7CisJLyogdmFsdWVzIGxlc3MgdGhlbiAzIHJlc3VsdCBpbiB0aGUgU09TU0kgYmxvY2sgcmVzZXR0aW5nIGl0c2VsZiAqLworCWlmICh0dzEgPCAzKQorCQl0dzEgPSAzOworCWlmICh0dzEgPiAweDQwKQorCQlyZXR1cm4gLTE7CisKKwlhY3RpbSA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPmFjY2Vzc190aW1lLCBkaXYpOworCWlmIChhY3RpbSA8IHJlb2ZmKQorCQlhY3RpbSsrOworCS8qCisJICogYWNjZXNzIHRpbWUgKGRhdGEgaG9sZCB0aW1lKSB3aWxsIGJlIGV4YWN0bHkgb25lIHNvc3NpCisJICogdGljaworCSAqLworCWlmIChhY3RpbSAtIHJlb2ZmID4gMSkKKwkJcmV0dXJuIC0xOworCisJdC0+dGltWzBdID0gdHcwIC0gMTsKKwl0LT50aW1bMV0gPSB0dzEgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FsY193cl90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiB0dzAsIHR3MTsKKwlpbnQgd2Vvbiwgd2VvZmYsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBhZnRlciBjb252ZXJzaW9uIGl0IHN0aWxsIGhvbGRzIHRoYXQ6CisJICogd2VvZmYgPiB3ZW9uLCB3ZWN5YyA+PSB3ZW9mZgorCSAqLworCXdlb24gPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9vbl90aW1lLCBkaXYpOworCS8qIHdlb24gd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaSB0aWNrICovCisJaWYgKHdlb24gPiAxKQorCQlyZXR1cm4gLTE7CisKKwl3ZW9mZiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCXR3MCA9IHdlb2ZmIC0gd2VvbjsKKwlpZiAodHcwID4gMHgxMCkKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9jeWNsZV90aW1lLCBkaXYpOworCWlmICh3ZWN5YyA8PSB3ZW9mZikKKwkJd2VjeWMgPSB3ZW9mZiArIDE7CisKKwl0dzEgPSB3ZWN5YyAtIHR3MDsKKwkvKiB2YWx1ZXMgbGVzcyB0aGVuIDMgcmVzdWx0IGluIHRoZSBTT1NTSSBibG9jayByZXNldHRpbmcgaXRzZWxmICovCisJaWYgKHR3MSA8IDMpCisJCXR3MSA9IDM7CisJaWYgKHR3MSA+IDB4NDApCisJCXJldHVybiAtMTsKKworCXQtPnRpbVsyXSA9IHR3MCAtIDE7CisJdC0+dGltWzNdID0gdHcxIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfc2V0X3RpbWluZyhpbnQgZGl2LCBpbnQgdHcwLCBpbnQgdHcxKQoreworCXUzMiBsOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoc29zc2kuZmJkZXYtPmRldiwgIlVzaW5nIFRXMCA9ICVkLCBUVzEgPSAlZCwgZGl2ID0gJWRcbiIsCisJCSB0dzAgKyAxLCB0dzEgKyAxLCBkaXYpOworI2VuZGlmCisKKwljbGtfc2V0X3JhdGUoc29zc2kuZmNrLCBzb3NzaS5mY2tfaHogLyBkaXYpOworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDFfUkVHKTsKKwlsICY9IH4oKDB4MGYgPDwgMjApIHwgKDB4M2YgPDwgMjQpKTsKKwlsIHw9ICh0dzAgPDwgMjApIHwgKHR3MSA8PCAyNCk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQxX1JFRywgbCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKK30KKworc3RhdGljIHZvaWQgX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnVzX3BpY2tfY291bnQsIGludCBidXNfcGlja193aWR0aCkKK3sKKwl1MzIgbDsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUM19SRUcpOworCWwgJj0gfjB4M2ZmOworCWwgfD0gKChidXNfcGlja19jb3VudCAtIDEpIDw8IDUpIHwgKChidXNfcGlja193aWR0aCAtIDEpICYgMHgxZik7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQzX1JFRywgbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfdGVhcnN5bmNfbW9kZShpbnQgbW9kZSwgdW5zaWduZWQgbGluZSkKK3sKKwl1MzIgbDsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9URUFSSU5HX1JFRyk7CisJbCAmPSB+KCgoMSA8PCAxMSkgLSAxKSA8PCAxNSk7CisJbCB8PSBsaW5lIDw8IDE1OworCWwgJj0gfigweDMgPDwgMjYpOworCWwgfD0gbW9kZSA8PCAyNjsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfVEVBUklOR19SRUcsIGwpOworCWlmIChtb2RlKQorCQlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNik7CS8qIFRFIGxvZ2ljICovCisJZWxzZQorCQlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF90aW1pbmcoaW50IGFjY2VzcykKK3sKKwlpZiAoYWNjZXNzICE9IHNvc3NpLmxhc3RfYWNjZXNzKSB7CisJCXNvc3NpLmxhc3RfYWNjZXNzID0gYWNjZXNzOworCQlfc2V0X3RpbWluZyhzb3NzaS5jbGtfZGl2LAorCQkJICAgIHNvc3NpLmNsa190dzBbYWNjZXNzXSwgc29zc2kuY2xrX3R3MVthY2Nlc3NdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3N0YXJ0X3RyYW5zZmVyKHZvaWQpCit7CisJLyogV0UgKi8KKwlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA0KTsKKwkvKiBDUyBhY3RpdmUgbG93ICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMzApOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zdG9wX3RyYW5zZmVyKHZvaWQpCit7CisJLyogV0UgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNCk7CisJLyogQ1MgYWN0aXZlIGxvdyAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAzMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfZW5kX29mX3dyaXRlKHZvaWQpCit7CisJLyogQmVmb3JlIHJlYWRpbmcgd2UgbXVzdCBjaGVjayBpZiBzb21lIHdyaXRpbmdzIGFyZSBnb2luZyBvbiAqLworCXdoaWxlICghKHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQyX1JFRykgJiAoMSA8PCAzKSkpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuID49IDQpIHsKKwkJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHUzMiAqKSBkYXRhKTsKKwkJbGVuIC09IDQ7CisJCWRhdGEgKz0gNDsKKwl9CisJd2hpbGUgKGxlbiA+PSAyKSB7CisJCXNvc3NpX3dyaXRlX3JlZzE2KFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHUxNiAqKSBkYXRhKTsKKwkJbGVuIC09IDI7CisJCWRhdGEgKz0gMjsKKwl9CisJd2hpbGUgKGxlbikgeworCQlzb3NzaV93cml0ZV9yZWc4KFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHU4ICopIGRhdGEpOworCQlsZW4tLTsKKwkJZGF0YSsrOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2N5Y2xlcyh1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbnJfY3ljbGVzID0gbGVuIC8gKHNvc3NpLmJ1c19waWNrX3dpZHRoIC8gOCk7CisKKwlCVUdfT04oKG5yX2N5Y2xlcyAtIDEpICYgfjB4M2ZmZmYpOworCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDB4M2ZmZmYpOworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgKG5yX2N5Y2xlcyAtIDEpICYgMHgzZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfY29udmVydF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCWludCByID0gMDsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCXQtPmNvbnZlcnRlZCA9IDA7CisKKwlpZiAoZGl2IDw9IDAgfHwgZGl2ID4gOCkKKwkJcmV0dXJuIC0xOworCisJLyogbm8gQ1Mgb24gU09TU0ksIHNvIGlnbm9yZSBjc29uLCBjc29mZiwgY3NfcHVsc2V3aWR0aCAqLworCWlmICgociA9IGNhbGNfcmRfdGltaW5ncyh0KSkgPCAwKQorCQlyZXR1cm4gcjsKKworCWlmICgociA9IGNhbGNfd3JfdGltaW5ncyh0KSkgPCAwKQorCQlyZXR1cm4gcjsKKworCXQtPnRpbVs0XSA9IGRpdjsKKworCXQtPmNvbnZlcnRlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJQlVHX09OKCF0LT5jb252ZXJ0ZWQpOworCisJc29zc2kuY2xrX3R3MFtSRF9BQ0NFU1NdID0gdC0+dGltWzBdOworCXNvc3NpLmNsa190dzFbUkRfQUNDRVNTXSA9IHQtPnRpbVsxXTsKKworCXNvc3NpLmNsa190dzBbV1JfQUNDRVNTXSA9IHQtPnRpbVsyXTsKKwlzb3NzaS5jbGtfdHcxW1dSX0FDQ0VTU10gPSB0LT50aW1bM107CisKKwlzb3NzaS5jbGtfZGl2ID0gdC0+dGltWzRdOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9nZXRfY2xrX2luZm8odTMyICpjbGtfcGVyaW9kLCB1MzIgKm1heF9jbGtfZGl2KQoreworCSpjbGtfcGVyaW9kID0gSFpfVE9fUFMoc29zc2kuZmNrX2h6KTsKKwkqbWF4X2Nsa19kaXYgPSA4OworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zZXRfYml0c19wZXJfY3ljbGUoaW50IGJwYykKK3sKKwlpbnQgYnVzX3BpY2tfY291bnQsIGJ1c19waWNrX3dpZHRoOworCisJLyoKKwkgKiBXZSBzZXQgZXhwbGljaXRseSB0aGUgdGhlIGJ1c19waWNrX2NvdW50IGFzIHdlbGwsIGFsdGhvdWdoCisJICogd2l0aCByZW1hcHBpbmcvcmVvcmRlcmluZyBkaXNhYmxlZCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgSFcKKwkgKiBhcyAoMzIgLyBidXNfcGlja193aWR0aCkuCisJICovCisJc3dpdGNoIChicGMpIHsKKwljYXNlIDg6CisJCWJ1c19waWNrX2NvdW50ID0gNDsKKwkJYnVzX3BpY2tfd2lkdGggPSA4OworCQlicmVhazsKKwljYXNlIDE2OgorCQlidXNfcGlja19jb3VudCA9IDI7CisJCWJ1c19waWNrX3dpZHRoID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXNvc3NpLmJ1c19waWNrX3dpZHRoID0gYnVzX3BpY2tfd2lkdGg7CisJc29zc2kuYnVzX3BpY2tfY291bnQgPSBidXNfcGlja19jb3VudDsKK30KKworc3RhdGljIGludCBzb3NzaV9zZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBwaW5fY250LAorCQkJCXVuc2lnbmVkIGhzX3B1bHNlX3RpbWUsIHVuc2lnbmVkIHZzX3B1bHNlX3RpbWUsCisJCQkJaW50IGhzX3BvbF9pbnYsIGludCB2c19wb2xfaW52LCBpbnQgZGl2KQoreworCWludCBocywgdnM7CisJdTMyIGw7CisKKwlpZiAocGluX2NudCAhPSAxIHx8IGRpdiA8IDEgfHwgZGl2ID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocyA9IHBzX3RvX3Nvc3NpX3RpY2tzKGhzX3B1bHNlX3RpbWUsIGRpdik7CisJdnMgPSBwc190b19zb3NzaV90aWNrcyh2c19wdWxzZV90aW1lLCBkaXYpOworCWlmICh2cyA8IDggfHwgdnMgPD0gaHMgfHwgdnMgPj0gKDEgPDwgMTIpKQorCQlyZXR1cm4gLUVET007CisJdnMgLz0gODsKKwl2cy0tOworCWlmIChocyA+IDgpCisJCWhzID0gODsKKwlpZiAoaHMpCisJCWhzLS07CisKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsCisJCSJzZXR1cF90ZWFyc3luYzogaHMgJWQgdnMgJWQgaHNfaW52ICVkIHZzX2ludiAlZFxuIiwKKwkJaHMsIHZzLCBoc19wb2xfaW52LCB2c19wb2xfaW52KTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfVEVBUklOR19SRUcpOworCWwgJj0gfigoMSA8PCAxNSkgLSAxKTsKKwlsIHw9IHZzIDw8IDM7CisJbCB8PSBoczsKKwlpZiAoaHNfcG9sX2ludikKKwkJbCB8PSAxIDw8IDI5OworCWVsc2UKKwkJbCAmPSB+KDEgPDwgMjkpOworCWlmICh2c19wb2xfaW52KQorCQlsIHw9IDEgPDwgMjg7CisJZWxzZQorCQlsICY9IH4oMSA8PCAyOCk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX1RFQVJJTkdfUkVHLCBsKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfZW5hYmxlX3RlYXJzeW5jKGludCBlbmFibGUsIHVuc2lnbmVkIGxpbmUpCit7CisJaW50IG1vZGU7CisKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsICJ0ZWFyc3luYyAlZCBsaW5lICVkXG4iLCBlbmFibGUsIGxpbmUpOworCWlmIChsaW5lID49IDEgPDwgMTEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlbmFibGUpIHsKKwkJaWYgKGxpbmUpCisJCQltb2RlID0gMjsJCS8qIEhTIG9yIFZTICovCisJCWVsc2UKKwkJCW1vZGUgPSAzOwkJLyogVlMgb25seSAqLworCX0gZWxzZQorCQltb2RlID0gMDsKKwlzb3NzaS50ZWFyc3luY19saW5lID0gbGluZTsKKwlzb3NzaS50ZWFyc3luY19tb2RlID0gbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV93cml0ZV9jb21tYW5kKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCXNldF90aW1pbmcoV1JfQUNDRVNTKTsKKwlfc2V0X2JpdHNfcGVyX2N5Y2xlKHNvc3NpLmJ1c19waWNrX2NvdW50LCBzb3NzaS5idXNfcGlja193aWR0aCk7CisJLyogQ01EIy9EQVRBICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXNlbmRfZGF0YShkYXRhLCBsZW4pOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwl3YWl0X2VuZF9vZl93cml0ZSgpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJc2V0X3RpbWluZyhXUl9BQ0NFU1MpOworCV9zZXRfYml0c19wZXJfY3ljbGUoc29zc2kuYnVzX3BpY2tfY291bnQsIHNvc3NpLmJ1c19waWNrX3dpZHRoKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXNlbmRfZGF0YShkYXRhLCBsZW4pOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwl3YWl0X2VuZF9vZl93cml0ZSgpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3RyYW5zZmVyX2FyZWEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXZvaWQgKGNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlCVUdfT04oY2FsbGJhY2sgPT0gTlVMTCk7CisKKwlzb3NzaS5sY2RjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJc29zc2kubGNkY19jYWxsYmFja19kYXRhID0gZGF0YTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFdSX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCV9zZXRfdGVhcnN5bmNfbW9kZShzb3NzaS50ZWFyc3luY19tb2RlLCBzb3NzaS50ZWFyc3luY19saW5lKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMod2lkdGggKiBoZWlnaHQgKiBzb3NzaS5idXNfcGlja193aWR0aCAvIDgpOworCisJc29zc2lfc3RhcnRfdHJhbnNmZXIoKTsKKwlpZiAoc29zc2kudGVhcnN5bmNfbW9kZSkgeworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgc3luYyBzaWduYWwgYW5kIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbmx5CisJCSAqIHRoZW4uIFdlIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byB1c2UgSFcgc3luYyBETUEgZm9yCisJCSAqIHRoaXMgc2luY2UgTENEIERNQSBzaG93cyBodWdlIGxhdGVuY2llcywgYXMgaWYgaXQKKwkJICogd291bGQgaWdub3JlIHNvbWUgb2YgdGhlIERNQSByZXF1ZXN0cyBmcm9tIFNvU1NJLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc29zc2kubG9jaywgZmxhZ3MpOworCQlzb3NzaS52c3luY19kbWFfcGVuZGluZysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCS8qIEp1c3Qgc3RhcnQgdGhlIHRyYW5zZmVyIHJpZ2h0IGF3YXkuICovCisJCW9tYXBfZW5hYmxlX2xjZF9kbWEoKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwlzb3NzaV9zdG9wX3RyYW5zZmVyKCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwlzb3NzaS5sY2RjX2NhbGxiYWNrKHNvc3NpLmxjZGNfY2FsbGJhY2tfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3JlYWRfZGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFJEX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCS8qIENNRCMvREFUQSAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAxOCk7CisJc2V0X2N5Y2xlcyhsZW4pOworCXNvc3NpX3N0YXJ0X3RyYW5zZmVyKCk7CisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCSoodTMyICopIGRhdGEgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9GSUZPX1JFRyk7CisJCWxlbiAtPSA0OworCQlkYXRhICs9IDQ7CisJfQorCXdoaWxlIChsZW4gPj0gMikgeworCQkqKHUxNiAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWcxNihTT1NTSV9GSUZPX1JFRyk7CisJCWxlbiAtPSAyOworCQlkYXRhICs9IDI7CisJfQorCXdoaWxlIChsZW4pIHsKKwkJKih1OCAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWc4KFNPU1NJX0ZJRk9fUkVHKTsKKwkJbGVuLS07CisJCWRhdGErKzsKKwl9CisJc29zc2lfc3RvcF90cmFuc2ZlcigpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzb3NzaV9tYXRjaF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvc3NpLmxvY2ssIGZsYWdzKTsKKwlpZiAoc29zc2kudnN5bmNfZG1hX3BlbmRpbmcpIHsKKwkJc29zc2kudnN5bmNfZG1hX3BlbmRpbmctLTsKKwkJb21hcF9lbmFibGVfbGNkX2RtYSgpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHNvc3NpX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXUzMiBsLCBrOworCXN0cnVjdCBjbGsgKmZjazsKKwlzdHJ1Y3QgY2xrICpkcGxsMW91dF9jazsKKwlpbnQgcjsKKworCXNvc3NpLmJhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhPTUFQX1NPU1NJX0JBU0UpOworCXNvc3NpLmZiZGV2ID0gZmJkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNvc3NpLmxvY2spOworCisJZHBsbDFvdXRfY2sgPSBjbGtfZ2V0KGZiZGV2LT5kZXYsICJja19kcGxsMW91dCIpOworCWlmIChJU19FUlIoZHBsbDFvdXRfY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGdldCBEUExMMU9VVCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRwbGwxb3V0X2NrKTsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRoZSBwYXJlbnQgY2xvY2sgcmF0ZSwgd2hpY2ggd2UgbWlnaHQgZGl2aWRlIGZ1cnRoZXIKKwkgKiBkZXBlbmRpbmcgb24gdGhlIHRpbWluZyByZXF1aXJlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIuIFNlZQorCSAqIF9zZXRfdGltaW5ncy4KKwkgKi8KKwlzb3NzaS5mY2tfaHogPSBjbGtfZ2V0X3JhdGUoZHBsbDFvdXRfY2spOworCWNsa19wdXQoZHBsbDFvdXRfY2spOworCisJZmNrID0gY2xrX2dldChmYmRldi0+ZGV2LCAiY2tfc29zc2kiKTsKKwlpZiAoSVNfRVJSKGZjaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IFNvU1NJIGZ1bmN0aW9uYWwgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihmY2spOworCX0KKwlzb3NzaS5mY2sgPSBmY2s7CisKKwkvKiBSZXNldCBhbmQgZW5hYmxlIHRoZSBTb1NTSSBtb2R1bGUgKi8KKwlsID0gb21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpOworCWwgfD0gQ09ORl9TT1NTSV9SRVNFVF9SOworCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisJbCAmPSB+Q09ORl9TT1NTSV9SRVNFVF9SOworCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJbCA9IG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpOworCWwgJj0gfigxIDw8IDgpOwkJCS8qIERNQUNLX1JFUSAqLworCW9tYXBfd3JpdGVsKGwsIEFSTV9JRExFQ1QyKTsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMl9SRUcpOworCS8qIEVuYWJsZSBhbmQgcmVzZXQgdGhlIFNvU1NJIGJsb2NrICovCisJbCB8PSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMl9SRUcsIGwpOworCS8qIFRha2UgU29TU0kgb3V0IG9mIHJlc2V0ICovCisJbCAmPSB+KDEgPDwgMSk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQyX1JFRywgbCk7CisKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSURfUkVHLCAwKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKwlrID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKworCWlmIChsICE9IDB4NTU1NTU1NTUgfHwgayAhPSAweGFhYWFhYWFhKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCSJpbnZhbGlkIFNvU1NJIHN5bmMgcGF0dGVybjogJTA4eCwgJTA4eFxuIiwgbCwgayk7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoKHIgPSBvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayhzb3NzaV9kbWFfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IExDREMgSVJRXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOyAvKiBDb21wb25lbnQgY29kZSAqLworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOworCWRldl9pbmZvKGZiZGV2LT5kZXYsICJTb1NTSSB2ZXJzaW9uICVkLiVkIGluaXRpYWxpemVkXG4iLAorCQlsID4+IDE2LCBsICYgMHhmZmZmKTsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMV9SRUcpOworCWwgfD0gKDEgPDwgMTkpOyAvKiBETUFfTU9ERSAqLworCWwgJj0gfigxIDw8IDMxKTsgLyogUkVPUkRFUklORyAqLworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMV9SRUcsIGwpOworCisJaWYgKChyID0gcmVxdWVzdF9pcnEoSU5UXzE2MTBfU29TU0lfTUFUQ0gsIHNvc3NpX21hdGNoX2lycSwKKwkJCSAgICAgSVJRVF9GQUxMSU5HLAorCSAgICAgInNvc3NpX21hdGNoIiwgc29zc2kuZmJkZXYtPmRldikpIDwgMCkgeworCQlkZXZfZXJyKHNvc3NpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgU29TU0kgbWF0Y2ggSVJRXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7CisJY2xrX3B1dChzb3NzaS5mY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9jbGVhbnVwKHZvaWQpCit7CisJb21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKCk7CisJY2xrX3B1dChzb3NzaS5mY2spOworfQorCitzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDFfZXh0X2lmID0geworCS5pbml0CQkJPSBzb3NzaV9pbml0LAorCS5jbGVhbnVwCQk9IHNvc3NpX2NsZWFudXAsCisJLmdldF9jbGtfaW5mbwkJPSBzb3NzaV9nZXRfY2xrX2luZm8sCisJLmNvbnZlcnRfdGltaW5ncwk9IHNvc3NpX2NvbnZlcnRfdGltaW5ncywKKwkuc2V0X3RpbWluZ3MJCT0gc29zc2lfc2V0X3RpbWluZ3MsCisJLnNldF9iaXRzX3Blcl9jeWNsZQk9IHNvc3NpX3NldF9iaXRzX3Blcl9jeWNsZSwKKwkuc2V0dXBfdGVhcnN5bmMJCT0gc29zc2lfc2V0dXBfdGVhcnN5bmMsCisJLmVuYWJsZV90ZWFyc3luYwk9IHNvc3NpX2VuYWJsZV90ZWFyc3luYywKKwkud3JpdGVfY29tbWFuZAkJPSBzb3NzaV93cml0ZV9jb21tYW5kLAorCS5yZWFkX2RhdGEJCT0gc29zc2lfcmVhZF9kYXRhLAorCS53cml0ZV9kYXRhCQk9IHNvc3NpX3dyaXRlX2RhdGEsCisJLnRyYW5zZmVyX2FyZWEJCT0gc29zc2lfdHJhbnNmZXJfYXJlYSwKKworCS5tYXhfdHJhbnNtaXRfc2l6ZQk9IFNPU1NJX01BWF9YTUlUX0JZVEVTLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCBlNjRmOGI1Li44NTAzZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNTIsNyArNTIsNyBAQAogCXN0cnVjdCB7CiAJCV9fdTggcmVkLCBncmVlbiwgYmx1ZTsKIAl9CQkJCXBhbGV0dGVbMjU2XTsKLQl1MzIJCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJCiAJdm9sYXRpbGUgc3RydWN0IGNtYXBfcmVncwlfX2lvbWVtICpjbWFwX3JlZ3M7CiAJdW5zaWduZWQgbG9uZwkJCWNtYXBfcmVnc19waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTJmYi5jIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCmluZGV4IDBhMDQ0ODNhLi4xMGMwY2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKLSAqIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC01OCw3ICs1OCw3IEBACiAjZW5kaWYKIAogLyoKLSAqIERyaXZlciBkYXRhIAorICogRHJpdmVyIGRhdGEKICAqLwogc3RhdGljIGNoYXIgKm1vZGUgX19kZXZpbml0ZGF0YSA9IE5VTEw7CiAKQEAgLTgyLDEyICs4MiwxMiBAQAogewogCXBtMnR5cGVfdAl0eXBlOwkJLyogQm9hcmQgdHlwZSAqLwogCXVuc2lnbmVkIGNoYXIJX19pb21lbSAqdl9yZWdzOy8qIHZpcnR1YWwgYWRkcmVzcyBvZiBwX3JlZ3MgKi8KLQl1MzIgCSAgIAltZW1jbG9jazsJLyogbWVtY2xvY2sgKi8KKwl1MzIJCW1lbWNsb2NrOwkvKiBtZW1jbG9jayAqLwogCXUzMgkJdmlkZW87CQkvKiB2aWRlbyBmbGFncyBiZWZvcmUgYmxhbmtpbmcgKi8KIAl1MzIJCW1lbV9jb25maWc7CS8qIE1lbUNvbmZpZyByZWcgYXQgcHJvYmUgKi8KIAl1MzIJCW1lbV9jb250cm9sOwkvKiBNZW1Db250cm9sIHJlZyBhdCBwcm9iZSAqLwogCXUzMgkJYm9vdF9hZGRyZXNzOwkvKiBCb290QWRkcmVzcyByZWcgYXQgcHJvYmUgKi8KLQl1MzIgICAgICAgICAgICAgcGFsZXR0ZVsxNl07CisJdTMyCQlwYWxldHRlWzE2XTsKIH07CiAKIC8qCkBAIC05NSwxMiArOTUsMTIgQEAKICAqIGlmIHdlIGRvbid0IHVzZSBtb2RlZGIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcG0yZmJfZml4IF9fZGV2aW5pdGRhdGEgPSB7Ci0JLmlkID0JCSIiLCAKKwkuaWQgPQkJIiIsCiAJLnR5cGUgPQkJRkJfVFlQRV9QQUNLRURfUElYRUxTLAogCS52aXN1YWwgPQlGQl9WSVNVQUxfUFNFVURPQ09MT1IsCiAJLnhwYW5zdGVwID0JMSwKIAkueXBhbnN0ZXAgPQkxLAotCS55d3JhcHN0ZXAgPQkwLCAKKwkueXdyYXBzdGVwID0JMCwKIAkuYWNjZWwgPQlGQl9BQ0NFTF8zRExBQlNfUEVSTUVESUEyLAogfTsKIApAQCAtMTA5LDI2ICsxMDksMjYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBwbTJmYl92YXIgX19kZXZpbml0ZGF0YSA9IHsKIAkvKiAiNjQweDQ4MCwgOCBicHAgQCA2MCBIeiAqLwotCS54cmVzID0JCTY0MCwKLQkueXJlcyA9CQk0ODAsCi0JLnhyZXNfdmlydHVhbCA9CTY0MCwKLQkueXJlc192aXJ0dWFsID0JNDgwLAotCS5iaXRzX3Blcl9waXhlbCA9OCwKLQkucmVkID0JCXswLCA4LCAwfSwKLQkuYmx1ZSA9CQl7MCwgOCwgMH0sCi0JLmdyZWVuID0JezAsIDgsIDB9LAotCS5hY3RpdmF0ZSA9CUZCX0FDVElWQVRFX05PVywKLQkuaGVpZ2h0ID0JLTEsCi0JLndpZHRoID0JLTEsCi0JLmFjY2VsX2ZsYWdzID0JMCwKLQkucGl4Y2xvY2sgPQkzOTcyMSwKLQkubGVmdF9tYXJnaW4gPQk0MCwKLQkucmlnaHRfbWFyZ2luID0JMjQsCi0JLnVwcGVyX21hcmdpbiA9CTMyLAotCS5sb3dlcl9tYXJnaW4gPQkxMSwKLQkuaHN5bmNfbGVuID0JOTYsCi0JLnZzeW5jX2xlbiA9CTIsCi0JLnZtb2RlID0JRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCS54cmVzID0JCQk2NDAsCisJLnlyZXMgPQkJCTQ4MCwKKwkueHJlc192aXJ0dWFsID0JCTY0MCwKKwkueXJlc192aXJ0dWFsID0JCTQ4MCwKKwkuYml0c19wZXJfcGl4ZWwgPQk4LAorCS5yZWQgPQkJCXswLCA4LCAwfSwKKwkuYmx1ZSA9CQkJezAsIDgsIDB9LAorCS5ncmVlbiA9CQl7MCwgOCwgMH0sCisJLmFjdGl2YXRlID0JCUZCX0FDVElWQVRFX05PVywKKwkuaGVpZ2h0ID0JCS0xLAorCS53aWR0aCA9CQktMSwKKwkuYWNjZWxfZmxhZ3MgPQkJMCwKKwkucGl4Y2xvY2sgPQkJMzk3MjEsCisJLmxlZnRfbWFyZ2luID0JCTQwLAorCS5yaWdodF9tYXJnaW4gPQkJMjQsCisJLnVwcGVyX21hcmdpbiA9CQkzMiwKKwkubG93ZXJfbWFyZ2luID0JCTExLAorCS5oc3luY19sZW4gPQkJOTYsCisJLnZzeW5jX2xlbiA9CQkyLAorCS52bW9kZSA9CQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiB9OwogCiAvKgpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCXBtMl9XUihwLCBQTTJWUl9SRF9JTkRFWF9MT1csIGlkeCAmIDB4ZmYpOwogCQlpbmRleCA9IFBNMlZSX1JEX0lOREVYRURfREFUQTsKIAkJYnJlYWs7Ci0JfQkKKwl9CiAJbWIoKTsKIAlyZXR1cm4gcG0yX1JEKHAsIGluZGV4KTsKIH0KQEAgLTE4Miw3ICsxODIsNyBAQAogCQlwbTJfV1IocCwgUE0yVlJfUkRfSU5ERVhfTE9XLCBpZHggJiAweGZmKTsKIAkJaW5kZXggPSBQTTJWUl9SRF9JTkRFWEVEX0RBVEE7CiAJCWJyZWFrOwotCX0JCisJfQogCXdtYigpOwogCXBtMl9XUihwLCBpbmRleCwgdik7CiAJd21iKCk7CkBAIC0xOTcsNyArMTk3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19GQl9QTTJfRklGT19ESVNDT05ORUNUCi0jZGVmaW5lIFdBSVRfRklGTyhwLGEpCisjZGVmaW5lIFdBSVRfRklGTyhwLCBhKQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBXQUlUX0ZJRk8oc3RydWN0IHBtMmZiX3BhciogcCwgdTMyIGEpCiB7CkBAIC0yMDksNyArMjA5LDcgQEAKIC8qCiAgKiBwYXJ0aWFsIHByb2R1Y3RzIGZvciB0aGUgc3VwcG9ydGVkIGhvcml6b250YWwgcmVzb2x1dGlvbnMuCiAgKi8KLSNkZWZpbmUgUEFDS1BQKHAwLHAxLHAyKQkoKChwMikgPDwgNikgfCAoKHAxKSA8PCAzKSB8IChwMCkpCisjZGVmaW5lIFBBQ0tQUChwMCwgcDEsIHAyKQkoKChwMikgPDwgNikgfCAoKHAxKSA8PCAzKSB8IChwMCkpCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAl1MTYgd2lkdGg7CiAJdTE2IHBwOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiBzdGF0aWMgdm9pZCByZXNldF9jb25maWcoc3RydWN0IHBtMmZiX3BhciogcCkKIHsKIAlXQUlUX0ZJRk8ocCwgNTIpOwotCXBtMl9XUihwLCBQTTJSX0NISVBfQ09ORklHLCBwbTJfUkQocCwgUE0yUl9DSElQX0NPTkZJRykmCisJcG0yX1dSKHAsIFBNMlJfQ0hJUF9DT05GSUcsIHBtMl9SRChwLCBQTTJSX0NISVBfQ09ORklHKSAmCiAJICAgICAgIH4oUE0yRl9WR0FfRU5BQkxFfFBNMkZfVkdBX0ZJWEVEKSk7CiAJcG0yX1dSKHAsIFBNMlJfQllQQVNTX1dSSVRFX01BU0ssIH4oMEwpKTsKIAlwbTJfV1IocCwgUE0yUl9GUkFNRUJVRkZFUl9XUklURV9NQVNLLCB+KDBMKSk7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAlwbTJfV1IocCwgUE0yUl9SQVNURVJJWkVSX01PREUsIDApOwogCXBtMl9XUihwLCBQTTJSX0RFTFRBX01PREUsIFBNMkZfREVMVEFfT1JERVJfUkdCKTsKIAlwbTJfV1IocCwgUE0yUl9MQl9SRUFEX0ZPUk1BVCwgMCk7Ci0JcG0yX1dSKHAsIFBNMlJfTEJfV1JJVEVfRk9STUFULCAwKTsgCisJcG0yX1dSKHAsIFBNMlJfTEJfV1JJVEVfRk9STUFULCAwKTsKIAlwbTJfV1IocCwgUE0yUl9MQl9SRUFEX01PREUsIDApOwogCXBtMl9XUihwLCBQTTJSX0xCX1NPVVJDRV9PRkZTRVQsIDApOwogCXBtMl9XUihwLCBQTTJSX0ZCX1NPVVJDRV9PRkZTRVQsIDApOwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJdnN5bmMgPSB2aWRlbzsKIAogCURQUklOVEsoInZpZGVvID0gMHgleFxuIiwgdmlkZW8pOwotCQorCiAJLyoKIAkgKiBUaGUgaGFyZHdhcmUgY3Vyc29yIG5lZWRzICt2c3luYyB0byByZWNvZ25pc2UgdmVydCByZXRyYWNlLgogCSAqIFdlIG1heSBub3QgYmUgdXNpbmcgdGhlIGhhcmR3YXJlIGN1cnNvciwgYnV0IHRoZSBYIEdsaW50CkBAIC01NzQsOSArNTc0LDkgQEAKICAqLwogCiAvKioKLSAqICAgICAgcG0yZmJfY2hlY2tfdmFyIC0gT3B0aW9uYWwgZnVuY3Rpb24uIFZhbGlkYXRlcyBhIHZhciBwYXNzZWQgaW4uIAotICogICAgICBAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyIAorICoJcG0yZmJfY2hlY2tfdmFyIC0gT3B0aW9uYWwgZnVuY3Rpb24uIFZhbGlkYXRlcyBhIHZhciBwYXNzZWQgaW4uCisgKglAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKICAqCUNoZWNrcyB0byBzZWUgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRoZSBzdGF0ZSByZXF1ZXN0ZWQgYnkKICAqCXZhciBwYXNzZWQgaW4uCkBAIC02MTUsMjMgKzYxNSwyMyBAQAogCiAJdmFyLT54cmVzID0gKHZhci0+eHJlcyArIDE1KSAmIH4xNTsgLyogY291bGQgc29tZXRpbWVzIGJlIDggKi8KIAlscGl0Y2ggPSB2YXItPnhyZXMgKiAoKHZhci0+Yml0c19wZXJfcGl4ZWwgKyA3KT4+Myk7Ci0gIAorCiAJaWYgKHZhci0+eHJlcyA8IDMyMCB8fCB2YXItPnhyZXMgPiAxNjAwKSB7CiAJCURQUklOVEsoIndpZHRoIG5vdCBzdXBwb3J0ZWQ6ICV1XG4iLCB2YXItPnhyZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0gIAorCiAJaWYgKHZhci0+eXJlcyA8IDIwMCB8fCB2YXItPnlyZXMgPiAxMjAwKSB7CiAJCURQUklOVEsoImhlaWdodCBub3Qgc3VwcG9ydGVkOiAldVxuIiwgdmFyLT55cmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotICAKKwogCWlmIChscGl0Y2ggKiB2YXItPnlyZXNfdmlydHVhbCA+IGluZm8tPmZpeC5zbWVtX2xlbikgewogCQlEUFJJTlRLKCJubyBtZW1vcnkgZm9yIHNjcmVlbiAoJXV4JXV4JXUpXG4iLAogCQkJdmFyLT54cmVzLCB2YXItPnlyZXNfdmlydHVhbCwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgCisKIAlpZiAoUElDT1MyS0haKHZhci0+cGl4Y2xvY2spID4gUE0yX01BWF9QSVhDTE9DSykgewogCQlEUFJJTlRLKCJwaXhjbG9jayB0b28gaGlnaCAoJWxkS0h6KVxuIiwgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NzIsMTcgKzY3MiwxNyBAQAogCQlicmVhazsKIAl9CiAJdmFyLT5oZWlnaHQgPSB2YXItPndpZHRoID0gLTE7Ci0gIAorCiAJdmFyLT5hY2NlbF9mbGFncyA9IDA7CS8qIENhbid0IG1tYXAgaWYgdGhpcyBpcyBvbiAqLwotCQorCiAJRFBSSU5USygiQ2hlY2tpbmcgZ3JhcGhpY3MgbW9kZSBhdCAlZHglZCBkZXB0aCAlZFxuIiwKIAkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqICAgICAgcG0yZmJfc2V0X3BhciAtIEFsdGVycyB0aGUgaGFyZHdhcmUgc3RhdGUuCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCXBtMmZiX3NldF9wYXIgLSBBbHRlcnMgdGhlIGhhcmR3YXJlIHN0YXRlLgorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKICAqCVVzaW5nIHRoZSBmYl92YXJfc2NyZWVuaW5mbyBpbiBmYl9pbmZvIHdlIHNldCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUKICAqCXRoaXMgcGFydGljdWxhciBmcmFtZWJ1ZmZlci4KQEAgLTcwOSw3ICs3MDksNyBAQAogCWNsZWFyX3BhbGV0dGUocGFyKTsKIAlpZiAoIHBhci0+bWVtY2xvY2sgKQogCQlzZXRfbWVtY2xvY2socGFyLCBwYXItPm1lbWNsb2NrKTsKLSAgICAKKwogCXdpZHRoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKyA3KSAmIH43OwogCWhlaWdodCA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CiAJZGVwdGggPSAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsICsgNykgJiB+NzsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCQlEUFJJTlRLKCJwaXhjbG9jayB0b28gaGlnaCAoJXVLSHopXG4iLCBwaXhjbG9jayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgICAKKwogCWhzc3RhcnQgPSB0bzMyNjQoaW5mby0+dmFyLnJpZ2h0X21hcmdpbiwgZGVwdGgsIGRhdGE2NCk7CiAJaHNlbmQgPSBoc3N0YXJ0ICsgdG8zMjY0KGluZm8tPnZhci5oc3luY19sZW4sIGRlcHRoLCBkYXRhNjQpOwogCWhiZW5kID0gaHNlbmQgKyB0bzMyNjQoaW5mby0+dmFyLmxlZnRfbWFyZ2luLCBkZXB0aCwgZGF0YTY0KTsKQEAgLTczNyw3ICs3MzcsNyBAQAogCWJhc2UgPSB0bzMyNjQoaW5mby0+dmFyLnlvZmZzZXQgKiB4cmVzICsgaW5mby0+dmFyLnhvZmZzZXQsIGRlcHRoLCAxKTsKIAlpZiAoZGF0YTY0KQogCQl2aWRlbyB8PSBQTTJGX0RBVEFfNjRfRU5BQkxFOwotICAgIAorCiAJaWYgKGluZm8tPnZhci5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpIHsKIAkJaWYgKGxvd2hzeW5jKSB7CiAJCQlEUFJJTlRLKCJpZ25vcmluZyAraHN5bmMsIHVzaW5nIC1oc3luYy5cbiIpOwpAQCAtNzc4LDkgKzc3OCw5IEBACiAJCVdBSVRfRklGTyhwYXIsIDEpOwogCQlwbTJfV1IocGFyLCBQTTJWUl9SRF9JTkRFWF9ISUdILCAwKTsKIAl9Ci0gICAgCisKIAlzZXRfYXBlcnR1cmUocGFyLCBkZXB0aCk7Ci0gICAgCisKIAltYigpOwogCVdBSVRfRklGTyhwYXIsIDE5KTsKIAlwbTJfUkRBQ19XUihwYXIsIFBNMklfUkRfQ09MT1JfS0VZX0NPTlRST0wsCkBAIC04NDcsMjIgKzg0NywyMiBAQAogCXNldF9waXhjbG9jayhwYXIsIHBpeGNsb2NrKTsKIAlEUFJJTlRLKCJTZXR0aW5nIGdyYXBoaWNzIG1vZGUgYXQgJWR4JWQgZGVwdGggJWRcbiIsCiAJCWluZm8tPnZhci54cmVzLCBpbmZvLT52YXIueXJlcywgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKLQlyZXR1cm4gMDsJCisJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIAlwbTJmYl9zZXRjb2xyZWcgLSBTZXRzIGEgY29sb3IgcmVnaXN0ZXIuCi0gKiAgICAgIEByZWdubzogYm9vbGVhbiwgMCBjb3B5IGxvY2FsLCAxIGdldF91c2VyKCkgZnVuY3Rpb24KLSAqICAgICAgQHJlZDogZnJhbWUgYnVmZmVyIGNvbG9ybWFwIHN0cnVjdHVyZQotICoJQGdyZWVuOiBUaGUgZ3JlZW4gdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZSAKKyAqCXBtMmZiX3NldGNvbHJlZyAtIFNldHMgYSBjb2xvciByZWdpc3Rlci4KKyAqCUByZWdubzogYm9vbGVhbiwgMCBjb3B5IGxvY2FsLCAxIGdldF91c2VyKCkgZnVuY3Rpb24KKyAqCUByZWQ6IGZyYW1lIGJ1ZmZlciBjb2xvcm1hcCBzdHJ1Y3R1cmUKKyAqCUBncmVlbjogVGhlIGdyZWVuIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUKICAqCUBibHVlOiAgVGhlIGJsdWUgdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZS4KLSAqCUB0cmFuc3A6IElmIHN1cHBvcnRlZCB0aGUgYWxwaGEgdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZS4JCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKLSAqIAotICogIAlTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgaGF2ZSBhIDE2IGJpdAotICogIAltYWduaXR1ZGUgd2hpY2ggbmVlZHMgdG8gYmUgc2NhbGVkIGluIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBoYXJkd2FyZS4KKyAqCUB0cmFuc3A6IElmIHN1cHBvcnRlZCB0aGUgYWxwaGEgdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZS4KKyAqCUBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKglTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgaGF2ZSBhIDE2IGJpdAorICoJbWFnbml0dWRlIHdoaWNoIG5lZWRzIHRvIGJlIHNjYWxlZCBpbiB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgaGFyZHdhcmUuCiAgKglQcmV0dHkgbXVjaCBhIGRpcmVjdCBsaWZ0IGZyb20gdGRmeGZiLmMuCi0gKiAKKyAqCiAgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQgcG0yZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLApAQCAtOTA2LDcgKzkwNiw3IEBACiAJICogICAgKGJsdWUgPDwgYmx1ZS5vZmZzZXQpIHwgKHRyYW5zcCA8PCB0cmFuc3Aub2Zmc2V0KQogCSAqICAgIFJBTURBQyBkb2VzIG5vdCBleGlzdAogCSAqLwotI2RlZmluZSBDTlZUX1RPSFcodmFsLHdpZHRoKSAoKCgodmFsKTw8KHdpZHRoKSkrMHg3RkZGLSh2YWwpKT4+MTYpCisjZGVmaW5lIENOVlRfVE9IVyh2YWwsIHdpZHRoKSAoKCgodmFsKSA8PCAod2lkdGgpKSArIDB4N0ZGRiAtKHZhbCkpID4+IDE2KQogCXN3aXRjaCAoaW5mby0+Zml4LnZpc3VhbCkgewogCWNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKIAljYXNlIEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjoKQEAgLTkxNiw5ICs5MTYsOSBAQAogCQl0cmFuc3AgPSBDTlZUX1RPSFcodHJhbnNwLCBpbmZvLT52YXIudHJhbnNwLmxlbmd0aCk7CiAJCWJyZWFrOwogCWNhc2UgRkJfVklTVUFMX0RJUkVDVENPTE9SOgotCQkvKiBleGFtcGxlIGhlcmUgYXNzdW1lcyA4IGJpdCBEQUMuIE1pZ2h0IGJlIGRpZmZlcmVudCAKLQkJICogZm9yIHlvdXIgaGFyZHdhcmUgKi8JCi0JCXJlZCA9IENOVlRfVE9IVyhyZWQsIDgpOyAgICAgICAKKwkJLyogZXhhbXBsZSBoZXJlIGFzc3VtZXMgOCBiaXQgREFDLiBNaWdodCBiZSBkaWZmZXJlbnQKKwkJICogZm9yIHlvdXIgaGFyZHdhcmUgKi8KKwkJcmVkID0gQ05WVF9UT0hXKHJlZCwgOCk7CiAJCWdyZWVuID0gQ05WVF9UT0hXKGdyZWVuLCA4KTsKIAkJYmx1ZSA9IENOVlRfVE9IVyhibHVlLCA4KTsKIAkJLyogaGV5LCB0aGVyZSBpcyBidWcgaW4gdHJhbnNwIGhhbmRsaW5nLi4uICovCkBAIC05NDAsMTEgKzk0MCwxMSBAQAogCiAJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJCWNhc2UgODoKLQkJCWJyZWFrOwkKLSAgIAkJY2FzZSAxNjoKKwkJCWJyZWFrOworCQljYXNlIDE2OgogCQljYXNlIDI0OgotCQljYXNlIDMyOgkKLSAgICAgICAgICAgCQlwYXItPnBhbGV0dGVbcmVnbm9dID0gdjsKKwkJY2FzZSAzMjoKKwkJCXBhci0+cGFsZXR0ZVtyZWdub10gPSB2OwogCQkJYnJlYWs7CiAJCX0KIAkJcmV0dXJuIDA7CkBAIC05NTYsMTUgKzk1NiwxNSBAQAogfQogCiAvKioKLSAqICAgICAgcG0yZmJfcGFuX2Rpc3BsYXkgLSBQYW5zIHRoZSBkaXNwbGF5LgotICogICAgICBAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKglwbTJmYl9wYW5fZGlzcGxheSAtIFBhbnMgdGhlIGRpc3BsYXkuCisgKglAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKICAqCVBhbiAob3Igd3JhcCwgZGVwZW5kaW5nIG9uIHRoZSBgdm1vZGUnIGZpZWxkKSB0aGUgZGlzcGxheSB1c2luZyB0aGUKLSAqICAJYHhvZmZzZXQnIGFuZCBgeW9mZnNldCcgZmllbGRzIG9mIHRoZSBgdmFyJyBzdHJ1Y3R1cmUuCi0gKiAgCUlmIHRoZSB2YWx1ZXMgZG9uJ3QgZml0LCByZXR1cm4gLUVJTlZBTC4KKyAqCWB4b2Zmc2V0JyBhbmQgYHlvZmZzZXQnIGZpZWxkcyBvZiB0aGUgYHZhcicgc3RydWN0dXJlLgorICoJSWYgdGhlIHZhbHVlcyBkb24ndCBmaXQsIHJldHVybiAtRUlOVkFMLgogICoKLSAqICAgICAgUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgorICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogICoKICAqLwogc3RhdGljIGludCBwbTJmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKQEAgLTk4MCwyNCArOTgwLDI0IEBACiAJZGVwdGggPSAoZGVwdGggPiAzMikgPyAzMiA6IGRlcHRoOwogCWJhc2UgPSB0bzMyNjQodmFyLT55b2Zmc2V0ICogeHJlcyArIHZhci0+eG9mZnNldCwgZGVwdGgsIDEpOwogCVdBSVRfRklGTyhwLCAxKTsKLQlwbTJfV1IocCwgUE0yUl9TQ1JFRU5fQkFTRSwgYmFzZSk7ICAgIAorCXBtMl9XUihwLCBQTTJSX1NDUkVFTl9CQVNFLCBiYXNlKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiAgICAgIHBtMmZiX2JsYW5rIC0gQmxhbmtzIHRoZSBkaXNwbGF5LgotICogICAgICBAYmxhbmtfbW9kZTogdGhlIGJsYW5rIG1vZGUgd2Ugd2FudC4gCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCXBtMmZiX2JsYW5rIC0gQmxhbmtzIHRoZSBkaXNwbGF5LgorICoJQGJsYW5rX21vZGU6IHRoZSBibGFuayBtb2RlIHdlIHdhbnQuCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAgKgotICogICAgICBCbGFuayB0aGUgc2NyZWVuIGlmIGJsYW5rX21vZGUgIT0gMCwgZWxzZSB1bmJsYW5rLiBSZXR1cm4gMCBpZgotICogICAgICBibGFua2luZyBzdWNjZWVkZWQsICE9IDAgaWYgdW4tL2JsYW5raW5nIGZhaWxlZCBkdWUgdG8gZS5nLiBhIAotICogICAgICB2aWRlbyBtb2RlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gSW1wbGVtZW50cyBWRVNBIHN1c3BlbmQKLSAqICAgICAgYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKLSAqICAgICAgYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZzeW5jCi0gKiAgICAgIGJsYW5rX21vZGUgPT0gMzogc3VzcGVuZCBoc3luYwotICogICAgICBibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgorICoJQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYKKyAqCWJsYW5raW5nIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkIGR1ZSB0byBlLmcuIGEKKyAqCXZpZGVvIG1vZGUgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGl0LiBJbXBsZW1lbnRzIFZFU0Egc3VzcGVuZAorICoJYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKKyAqCWJsYW5rX21vZGUgPT0gMjogc3VzcGVuZCB2c3luYworICoJYmxhbmtfbW9kZSA9PSAzOiBzdXNwZW5kIGhzeW5jCisgKglibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgogICoKLSAqICAgICAgUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgorICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogICoKICAqLwogc3RhdGljIGludCBwbTJmYl9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCkBAIC0xMDcxLDcgKzEwNzEsNyBAQAogCXBtMl9XUihwYXIsIFBNMlJfUkVDVEFOR0xFX09SSUdJTiwgKHkgPDwgMTYpIHwgeCk7CiAJcG0yX1dSKHBhciwgUE0yUl9SRUNUQU5HTEVfU0laRSwgKGggPDwgMTYpIHwgdyk7CiAJd21iKCk7Ci0JcG0yX1dSKHBhciwgUE0yUl9SRU5ERVIsUE0yRl9SRU5ERVJfUkVDVEFOR0xFIHwKKwlwbTJfV1IocGFyLCBQTTJSX1JFTkRFUiwgUE0yRl9SRU5ERVJfUkVDVEFOR0xFIHwKIAkJCQkoeDx4c3JjID8gUE0yRl9JTkNSRUFTRV9YIDogMCkgfAogCQkJCSh5PHlzcmMgPyBQTTJGX0lOQ1JFQVNFX1kgOiAwKSB8CiAJCQkJKGNvcHkgPyAwIDogUE0yRl9SRU5ERVJfRkFTVEZJTEwpKTsKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAJRFBSSU5USygiQWRqdXN0aW5nIHJlZ2lzdGVyIGJhc2UgZm9yIGJpZy1lbmRpYW4uXG4iKTsKICNlbmRpZgogCURQUklOVEsoIlJlZ2lzdGVyIGJhc2UgYXQgMHglbHhcbiIsIHBtMmZiX2ZpeC5tbWlvX3N0YXJ0KTsKLSAgICAKKwogCS8qIFJlZ2lzdGVycyAtIHJlcXVlc3QgcmVnaW9uIGFuZCBtYXAgaXQuICovCiAJaWYgKCAhcmVxdWVzdF9tZW1fcmVnaW9uKHBtMmZiX2ZpeC5tbWlvX3N0YXJ0LCBwbTJmYl9maXgubW1pb19sZW4sCiAJCQkJICJwbTJmYiByZWdiYXNlIikgKSB7CkBAIC0xMzE3LDE3ICsxMzE3LDE3IEBACiAJfQogCiAJaW5mby0+ZmJvcHMJCT0gJnBtMmZiX29wczsKLQlpbmZvLT5maXgJCT0gcG0yZmJfZml4OyAJCisJaW5mby0+Zml4CQk9IHBtMmZiX2ZpeDsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZQk9IGRlZmF1bHRfcGFyLT5wYWxldHRlOwogCWluZm8tPmZsYWdzCQk9IEZCSU5GT19ERUZBVUxUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9ZUEFOIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUOworCQkJCSAgRkJJTkZPX0hXQUNDRUxfWVBBTiB8CisJCQkJICBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8CisJCQkJICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVDsKIAogCWlmICghbW9kZSkKIAkJbW9kZSA9ICI2NDB4NDgwQDYwIjsKLQkgCi0JZXJyID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGUsIE5VTEwsIDAsIE5VTEwsIDgpOyAKKworCWVyciA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlLCBOVUxMLCAwLCBOVUxMLCA4KTsKIAlpZiAoIWVyciB8fCBlcnIgPT0gNCkKIAkJaW5mby0+dmFyID0gcG0yZmJfdmFyOwogCkBAIC0xMzQ4LDggKzEzNDgsOCBAQAogCXJldHVybiAwOwogCiAgZXJyX2V4aXRfYWxsOgotCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CQotIGVycl9leGl0X2JvdGg6ICAgIAorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisgZXJyX2V4aXRfYm90aDoKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24ocG0yZmJfZml4LnNtZW1fc3RhcnQsIHBtMmZiX2ZpeC5zbWVtX2xlbik7CiAgZXJyX2V4aXRfbW1pbzoKQEAgLTEzNzQsNyArMTM3NCw3IEBACiAJc3RydWN0IHBtMmZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKLSAgICAKKwogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihmaXgtPnNtZW1fc3RhcnQsIGZpeC0+c21lbV9sZW4pOwogCWlvdW5tYXAocGFyLT52X3JlZ3MpOwpAQCAtMTQwMiw5ICsxNDAyLDkgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBtMmZiX2RyaXZlciA9IHsKIAkubmFtZQkJPSAicG0yZmIiLAotCS5pZF90YWJsZSAJPSBwbTJmYl9pZF90YWJsZSwKLQkucHJvYmUgCQk9IHBtMmZiX3Byb2JlLAotCS5yZW1vdmUgCT0gX19kZXZleGl0X3AocG0yZmJfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBwbTJmYl9pZF90YWJsZSwKKwkucHJvYmUJCT0gcG0yZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwbTJmYl9yZW1vdmUpLAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBtMmZiX2lkX3RhYmxlKTsKQEAgLTE0MjMsNyArMTQyMyw3IEBACiAJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKIAkJcmV0dXJuIDA7CiAKLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CQorCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKIAkJaWYgKCEqdGhpc19vcHQpCiAJCQljb250aW51ZTsKIAkJaWYoIXN0cmNtcCh0aGlzX29wdCwgImxvd2hzeW5jIikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwppbmRleCBiNTJlODgzLi41YjNmNTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJLnhwYW5zdGVwID0JMSwKIAkueXBhbnN0ZXAgPQkxLAogCS55d3JhcHN0ZXAgPQkwLAotCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCisJLmFjY2VsID0JRkJfQUNDRUxfM0RMQUJTX1BFUk1FRElBMywKIH07CiAKIC8qCkBAIC0xODUsNiArMTg1LDIzOCBAQAogCXJldHVybiAwOwogfQogCisvKiBhY2NlbGVyYXRpb24gKi8KK3N0YXRpYyBpbnQgcG0zZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcG0zX3BhciAqcGFyID0gaW5mby0+cGFyOworCisJUE0zX1dBSVQocGFyLCAyKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRmlsdGVyTW9kZSwgUE0zRmlsdGVyTW9kZVN5bmMpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTeW5jLCAwKTsKKwltYigpOworCWRvIHsKKwkJd2hpbGUgKChQTTNfUkVBRF9SRUcocGFyLCBQTTNPdXRGSUZPV29yZHMpKSA9PSAwKTsKKwkJcm1iKCk7CisJfSB3aGlsZSAoKFBNM19SRUFEX1JFRyhwYXIsIFBNM091dHB1dEZpZm8pKSAhPSBQTTNTeW5jX1RhZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG0zZmJfaW5pdF9lbmdpbmUoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKKwljb25zdCB1MzIgd2lkdGggPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIDcpICYgfjc7CisKKwlQTTNfV0FJVChwYXIsIDUwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRmlsdGVyTW9kZSwgUE0zRmlsdGVyTW9kZVN5bmMpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGF0aXN0aWNNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNEZWx0YU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1Jhc3Rlcml6ZXJNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTY2lzc29yTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTGluZVN0aXBwbGVNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNBcmVhU3RpcHBsZU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0dJRE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RlcHRoTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RlbmNpbE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0ZW5jaWxEYXRhLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb2xvckREQU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb29yZE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVJbmRleE1vZGUwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlSW5kZXhNb2RlMSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZVJlYWRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMVVRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlRmlsdGVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVBcHBsaWNhdGlvbk1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVDb2xvck1vZGUxLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29tcG9zaXRlQWxwaGFNb2RlMSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZUNvbG9yTW9kZTAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVBbHBoYU1vZGUwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGb2dNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNDaHJvbWFUZXN0TW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQWxwaGFUZXN0TW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQW50aWFsaWFzTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zWVVWTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQWxwaGFCbGVuZENvbG9yTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQWxwaGFCbGVuZEFscGhhTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGl0aGVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTG9naWNhbE9wTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUm91dGVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zV2luZG93LCAweDApOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0NvbmZpZzJELCAweDApOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1NwYW5Db2xvck1hc2ssIDB4ZmZmZmZmZmYpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1hCaWFzLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNZQmlhcywgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGVsdGFDb250cm9sLCAweDApOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0JpdE1hc2tQYXR0ZXJuLCAweGZmZmZmZmZmKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkRW5hYmxlcywKKwkJCSAgIFBNM0ZCRGVzdFJlYWRFbmFibGVzX0UoMHhmZikgfAorCQkJICAgUE0zRkJEZXN0UmVhZEVuYWJsZXNfUigweGZmKSB8CisJCQkgICBQTTNGQkRlc3RSZWFkRW5hYmxlc19SZWZlcmVuY2VBbHBoYSgweGZmKSk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRCdWZmZXJBZGRyMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJEZXN0UmVhZEJ1ZmZlck9mZnNldDAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRCdWZmZXJXaWR0aDAsCisJCQkgICBQTTNGQkRlc3RSZWFkQnVmZmVyV2lkdGhfV2lkdGgod2lkdGgpKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkTW9kZSwKKwkJCSAgIFBNM0ZCRGVzdFJlYWRNb2RlX1JlYWRFbmFibGUgfAorCQkJICAgUE0zRkJEZXN0UmVhZE1vZGVfRW5hYmxlMCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU291cmNlUmVhZEJ1ZmZlckFkZHIsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU291cmNlUmVhZEJ1ZmZlck9mZnNldCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb3VyY2VSZWFkQnVmZmVyV2lkdGgsCisJCQkgICBQTTNGQlNvdXJjZVJlYWRCdWZmZXJXaWR0aF9XaWR0aCh3aWR0aCkpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQlNvdXJjZVJlYWRNb2RlLAorCQkJICAgUE0zRkJTb3VyY2VSZWFkTW9kZV9CbG9ja2luZyB8CisJCQkgICBQTTNGQlNvdXJjZVJlYWRNb2RlX1JlYWRFbmFibGUpOworCisJUE0zX1dBSVQocGFyLCAyKTsKKwl7CisJCXVuc2lnbmVkIGxvbmcgcm0gPSAxOworCQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDg6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUGl4ZWxTaXplLAorCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzhCSVQpOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUGl4ZWxTaXplLAorCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzE2QklUKTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1BpeGVsU2l6ZSwKKwkJCQkJICAgUE0zUGl4ZWxTaXplX0dMT0JBTF8zMkJJVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAorCQkJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CisJCQlicmVhazsKKwkJfQorCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUmFzdGVyaXplck1vZGUsIHJtKTsKKwl9CisKKwlQTTNfV0FJVChwYXIsIDIwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb2Z0d2FyZVdyaXRlTWFzaywgMHhmZmZmZmZmZik7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCSGFyZHdhcmVXcml0ZU1hc2ssIDB4ZmZmZmZmZmYpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQldyaXRlTW9kZSwKKwkJCSAgIFBNM0ZCV3JpdGVNb2RlX1dyaXRlRW5hYmxlIHwKKwkJCSAgIFBNM0ZCV3JpdGVNb2RlX09wYXF1ZVNwYW4gfAorCQkJICAgUE0zRkJXcml0ZU1vZGVfRW5hYmxlMCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCV3JpdGVCdWZmZXJBZGRyMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJXcml0ZUJ1ZmZlck9mZnNldDAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCV3JpdGVCdWZmZXJXaWR0aDAsCisJCQkgICBQTTNGQldyaXRlQnVmZmVyV2lkdGhfV2lkdGgod2lkdGgpKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNTaXplT2ZGcmFtZWJ1ZmZlciwgMHgwKTsKKwl7CisJCS8qIHNpemUgaW4gbGluZXMgb2YgRkIgKi8KKwkJdW5zaWduZWQgbG9uZyBzb2ZiID0gaW5mby0+c2NyZWVuX3NpemUgLworCQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoOworCQlpZiAoc29mYiA+IDQwOTUpCisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU2l6ZU9mRnJhbWVidWZmZXIsIDQwOTUpOworCQllbHNlCisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU2l6ZU9mRnJhbWVidWZmZXIsIHNvZmIpOworCisJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgODoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLAorCQkJCQkgICAoMSA8PCAxMCkgfCAoMiA8PCAzKSk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLAorCQkJCQkgICAoMSA8PCAxMCkgfCAoMSA8PCAzKSk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLAorCQkJCQkgICAoMSA8PCAxMCkgfCAoMCA8PCAzKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAorCQkJCWluZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCVBNM19XUklURV9SRUcocGFyLCBQTTNkWERvbSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zZFhTdWIsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM2RZLCAoMSA8PCAxNikpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGFydFhEb20sIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0YXJ0WFN1YiwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RhcnRZLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb3VudCwgMHgwKTsKKworLyogRGlzYWJsZSBMb2NhbEJ1ZmZlci4gYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAqLworCVBNM19XUklURV9SRUcocGFyLCBQTTNMQkRlc3RSZWFkTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTEJEZXN0UmVhZEVuYWJsZXMsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xCU291cmNlUmVhZE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xCV3JpdGVNb2RlLCAweDApOworCisJcG0zZmJfc3luYyhpbmZvKTsKK30KKworc3RhdGljIHZvaWQgcG0zZmJfZmlsbHJlY3QgKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVnaW9uKQoreworCXN0cnVjdCBwbTNfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGZiX2ZpbGxyZWN0IG1vZGRlZDsKKwlpbnQgdnhyZXMsIHZ5cmVzOworCXUzMiBjb2xvciA9IChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IpID8KKwkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdpb24tPmNvbG9yXSA6IHJlZ2lvbi0+Y29sb3I7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKwlpZiAoKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHx8CisJCXJlZ2lvbi0+cm9wICE9IFJPUF9DT1BZICkgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KKworCXZ4cmVzID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbDsKKwl2eXJlcyA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisKKwltZW1jcHkoJm1vZGRlZCwgcmVnaW9uLCBzaXplb2Yoc3RydWN0IGZiX2ZpbGxyZWN0KSk7CisKKwlpZighbW9kZGVkLndpZHRoIHx8ICFtb2RkZWQuaGVpZ2h0IHx8CisJICAgbW9kZGVkLmR4ID49IHZ4cmVzIHx8IG1vZGRlZC5keSA+PSB2eXJlcykKKwkJcmV0dXJuOworCisJaWYobW9kZGVkLmR4ICsgbW9kZGVkLndpZHRoICA+IHZ4cmVzKQorCQltb2RkZWQud2lkdGggID0gdnhyZXMgLSBtb2RkZWQuZHg7CisJaWYobW9kZGVkLmR5ICsgbW9kZGVkLmhlaWdodCA+IHZ5cmVzKQorCQltb2RkZWQuaGVpZ2h0ID0gdnlyZXMgLSBtb2RkZWQuZHk7CisKKwlpZihpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkKKwkJY29sb3IgfD0gY29sb3IgPDwgODsKKwlpZihpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gMTYpCisJCWNvbG9yIHw9IGNvbG9yIDw8IDE2OworCisJUE0zX1dBSVQocGFyLCA0KTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb25maWcyRCwKKwkJCQkgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKKwkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAorCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHgzKSkgfAkvKiBPeDMgaXMgR1hjb3B5ICovCisJCQkJICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNGb3JlZ3JvdW5kQ29sb3IsIGNvbG9yKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNSZWN0YW5nbGVQb3NpdGlvbiwKKwkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1hPZmZzZXQobW9kZGVkLmR4KSkgfAorCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChtb2RkZWQuZHkpKSk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUmVuZGVyMkQsCisJCSAgICAgIFBNM1JlbmRlcjJEX1hQb3NpdGl2ZSB8CisJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8CisJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAorCQkgICAgICBQTTNSZW5kZXIyRF9TcGFuT3BlcmF0aW9uIHwKKwkJICAgICAgKFBNM1JlbmRlcjJEX1dpZHRoKG1vZGRlZC53aWR0aCkpIHwKKwkJICAgICAgKFBNM1JlbmRlcjJEX0hlaWdodChtb2RkZWQuaGVpZ2h0KSkpOworfQorLyogZW5kIG9mIGFjY2VsZXJhdGlvbiBmdW5jdGlvbnMgKi8KKwogLyogd3JpdGUgdGhlIG1vZGUgdG8gcmVnaXN0ZXJzICovCiBzdGF0aWMgdm9pZCBwbTNmYl93cml0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpAQCAtMzgwLDggKzYxMiw2IEBACiAvKgogICogaGFyZHdhcmUgaW5kZXBlbmRlbnQgZnVuY3Rpb25zCiAgKi8KLWludCBwbTNmYl9pbml0KHZvaWQpOwotCiBzdGF0aWMgaW50IHBtM2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJdTMyIGxwaXRjaDsKQEAgLTUyOCw2ICs3NTgsNyBAQAogCXBtM2ZiX2NsZWFyX2NvbG9ybWFwKHBhciwgMCwgMCwgMCk7CiAJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9DdXJzb3JNb2RlLAogCQkJICBQTTNSRF9DdXJzb3JNb2RlX0NVUlNPUl9ESVNBQkxFKTsKKwlwbTNmYl9pbml0X2VuZ2luZShpbmZvKTsKIAlwbTNmYl93cml0ZV9tb2RlKGluZm8pOwogCXJldHVybiAwOwogfQpAQCAtNjc1LDEwICs5MDYsMTEgQEAKIAkuZmJfc2V0X3Bhcgk9IHBtM2ZiX3NldF9wYXIsCiAJLmZiX3NldGNvbHJlZwk9IHBtM2ZiX3NldGNvbHJlZywKIAkuZmJfcGFuX2Rpc3BsYXkJPSBwbTNmYl9wYW5fZGlzcGxheSwKLQkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2ZpbGxyZWN0CT0gcG0zZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogCS5mYl9ibGFuawk9IHBtM2ZiX2JsYW5rLAorCS5mYl9zeW5jCT0gcG0zZmJfc3luYywKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg0Nyw3ICsxMDc5LDggQEAKIAogCWluZm8tPmZpeCA9IHBtM2ZiX2ZpeDsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cGFsZXR0ZTsKLQlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOy8qIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsqLworCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfAorCQkJRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7LyogfCBGQklORk9fSFdBQ0NFTF9ZUEFOOyovCiAKIAkvKgogCSAqIFRoaXMgc2hvdWxkIGdpdmUgYSByZWFzb25hYmxlIGRlZmF1bHQgdmlkZW8gbW9kZS4gVGhlIGZvbGxvd2luZyBpcwpAQCAtOTM1LDM1ICsxMTY4LDEyIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbTNmYl9pZF90YWJsZSk7CiAKLSNpZm5kZWYgTU9EVUxFCi0JLyoKLQkgKiAgU2V0dXAKLQkgKi8KLQotLyoKLSAqIE9ubHkgbmVjZXNzYXJ5IGlmIHlvdXIgZHJpdmVyIHRha2VzIHNwZWNpYWwgb3B0aW9ucywKLSAqIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgZmJfc2V0dXAoKS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgcG0zZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgX19pbml0IHBtM2ZiX2luaXQodm9pZCkKIHsKLQkvKiBQYXJzZSB1c2VyIHNwZWZpY2llZCBvcHRpb25zIChgdmlkZW89cG0zZmI6JykgKi8KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBNT0RVTEUgKi8KLQotaW50IF9faW5pdCBwbTNmYl9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiAgRm9yIGtlcm5lbCBib290IG9wdGlvbnMgKGluICd2aWRlbz1wbTNmYjo8b3B0aW9ucz4nIGZvcm1hdCkKLQkgKi8KICNpZm5kZWYgTU9EVUxFCi0JY2hhciAqb3B0aW9uID0gTlVMTDsKLQotCWlmIChmYl9nZXRfb3B0aW9ucygicG0zZmIiLCAmb3B0aW9uKSkKKwlpZiAoZmJfZ2V0X29wdGlvbnMoInBtM2ZiIiwgTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwotCXBtM2ZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKLQogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwbTNmYl9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKaW5kZXggOWNmOTJiYS4uMzk3MmFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wczNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHMzZmIuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CkBAIC00Niw2ICs0NSw5IEBACiAjaW5jbHVkZSA8YXNtL3BzM2ZiLmg+CiAjaW5jbHVkZSA8YXNtL3BzMy5oPgogCisKKyNkZWZpbmUgREVWSUNFX05BTUUJCSJwczNmYiIKKwogI2lmZGVmIFBTM0ZCX0RFQlVHCiAjZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoIiVzOiAiIGZtdCwgX19mdW5jX18gLCAjI2FyZ3MpCiAjZWxzZQpAQCAtMTI2LDcgKzEyOCw2IEBACiAKIHN0cnVjdCBwczNmYl9wcml2IHsKIAl1bnNpZ25lZCBpbnQgaXJxX25vOwotCXZvaWQgKmRldjsKIAogCXU2NCBjb250ZXh0X2hhbmRsZSwgbWVtb3J5X2hhbmRsZTsKIAl2b2lkICp4ZHJfZWE7CkBAIC0xNzEsNyArMTcyLDcgQEAKIAl7ICAgIDAsICAgIDAsICAgMCwgICAwICwgMH0gfTsKIAogLyogZGVmYXVsdCByZXNvbHV0aW9uICovCi0jZGVmaW5lIEdQVV9SRVNfSU5ERVggMAkJLyogNzIwIHggNDgwICovCisjZGVmaW5lIEdQVV9SRVNfSU5ERVgJMAkJLyogNzIwIHggNDgwICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIHBzM2ZiX21vZGVkYltdID0gewogICAgIC8qIDYwIEh6IGJyb2FkY2FzdCBtb2RlcyAobW9kZXMgIjEiIHRvICI1IikgKi8KQEAgLTI5OCwxMCArMjk5LDkgQEAKICNkZWZpbmUgRkJfT0ZGKGkpCShHUFVfT0ZGU0VUIC0gVlBfT0ZGKGkpICUgR1BVX09GRlNFVCkKIAogc3RhdGljIGludCBwczNmYl9tb2RlOwotbW9kdWxlX3BhcmFtKHBzM2ZiX21vZGUsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKHBzM2ZiX21vZGUsIGludCwgMCk7CiAKLXN0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhOwotCitzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19kZXZpbml0ZGF0YTsKIAogc3RhdGljIGludCBwczNmYl9nZXRfcmVzX3RhYmxlKHUzMiB4cmVzLCB1MzIgeXJlcykKIHsKQEAgLTY4MSwxNSArNjgxLDE1IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX3dhaXRfZm9yX3ZzeW5jKTsKIAotdm9pZCBwczNmYl9mbGlwX2N0bChpbnQgb24pCit2b2lkIHBzM2ZiX2ZsaXBfY3RsKGludCBvbiwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3QgcHMzZmJfcHJpdiAqcHJpdiA9IGRhdGE7CiAJaWYgKG9uKQotCQlhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZwczNmYi5leHRfZmxpcCk7CisJCWF0b21pY19kZWNfaWZfcG9zaXRpdmUoJnByaXYtPmV4dF9mbGlwKTsKIAllbHNlCi0JCWF0b21pY19pbmMoJnBzM2ZiLmV4dF9mbGlwKTsKKwkJYXRvbWljX2luYygmcHJpdi0+ZXh0X2ZsaXApOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNmYl9mbGlwX2N0bCk7CiAKICAgICAvKgogICAgICAqIGlvY3RsCkBAIC04MTIsNiArODEyLDcgQEAKIAogc3RhdGljIGludCBwczNmYmQodm9pZCAqYXJnKQogeworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQl0cnlfdG9fZnJlZXplKCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CkBAIC04NTEsMzcgKzg1Miw5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0jaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgcHMzZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKLXsKLQljaGFyICp0aGlzX29wdDsKLQlpbnQgbW9kZSA9IDA7CiAKLQlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQotCQlyZXR1cm4gMDsJLyogbm8gb3B0aW9ucyAqLwotCi0Jd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewotCQlpZiAoISp0aGlzX29wdCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb2RlOiIsIDUpKQotCQkJbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7Ci0JCWVsc2UKLQkJCW1vZGVfb3B0aW9uID0gdGhpc19vcHQ7Ci0JfQotCXJldHVybiBtb2RlOwotfQotI2VuZGlmCS8qIE1PRFVMRSAqLwotCi0gICAgLyoKLSAgICAgKiAgSW5pdGlhbGlzYXRpb24KLSAgICAgKi8KLQotc3RhdGljIHZvaWQgcHMzZmJfcGxhdGZvcm1fcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0JLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8gemVyby4gKi8KLX0KLQotc3RhdGljIGludCBwczNmYl92c3luY19zZXR0aW5ncyhzdHJ1Y3QgZ3B1X2RyaXZlcl9pbmZvICpkaW5mbywgdm9pZCAqZGV2KQorc3RhdGljIGludCBwczNmYl92c3luY19zZXR0aW5ncyhzdHJ1Y3QgZ3B1X2RyaXZlcl9pbmZvICpkaW5mbywKKwkJCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGVycm9yOwogCkBAIC04OTcsNyArODcwLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHMzZmIuZGV2ID0gZGV2OwogCWVycm9yID0gcHMzX2lycV9wbHVnX3NldHVwKFBTM19CSU5ESU5HX0NQVV9BTlksIGRpbmZvLT5pcnEuaXJxX291dGxldCwKIAkJCQkgICAmcHMzZmIuaXJxX25vKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTkwNyw3ICs4NzksNyBAQAogCX0KIAogCWVycm9yID0gcmVxdWVzdF9pcnEocHMzZmIuaXJxX25vLCBwczNmYl92c3luY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCi0JCQkgICAgInBzM2ZiIHZzeW5jIiwgcHMzZmIuZGV2KTsKKwkJCSAgICBERVZJQ0VfTkFNRSwgZGV2KTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9pcnEgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIGVycm9yKTsKQEAgLTk2NiwxNiArOTM4LDQ1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHBzM2ZiX2ZpeCBfX2luaXRkYXRhID0gewotCS5pZCA9CQkiUFMzIEZCIiwKKwkuaWQgPQkJREVWSUNFX05BTUUsCiAJLnR5cGUgPQkJRkJfVFlQRV9QQUNLRURfUElYRUxTLAogCS52aXN1YWwgPQlGQl9WSVNVQUxfVFJVRUNPTE9SLAogCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwczNmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM2ZiX3NldF9zeW5jKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworI2lmZGVmIEhFQURfQQorCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUoMHgwLAorCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9ESVNQTEFZX1NZTkMsCisJCQkJCSAgIDAsIEwxR1BVX0RJU1BMQVlfU1lOQ19WU1lOQywgMCwgMCk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfU1lOQyAiCisJCSAgICAgICAiZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKyNpZmRlZiBIRUFEX0IKKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKDB4MCwKKwkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRElTUExBWV9TWU5DLAorCQkJCQkgICAxLCBMMUdQVV9ESVNQTEFZX1NZTkNfVlNZTkMsIDAsIDApOworCisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfTU9ERSAiCisJCSAgICAgICAiZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHMzZmJfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCByZXR2YWwgPSAtRU5PTUVNOworCXUzMiB4cmVzLCB5cmVzOwogCXU2NCBkZHJfbHBhciA9IDA7CiAJdTY0IGxwYXJfZG1hX2NvbnRyb2wgPSAwOwogCXU2NCBscGFyX2RyaXZlcl9pbmZvID0gMDsKQEAgLTk4Niw2ICs5ODcsMzAgQEAKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAKKwlzdGF0dXMgPSBwczNfb3Blbl9odl9kZXZpY2UoZGV2KTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM19vcGVuX2h2X2RldmljZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFwczNmYl9tb2RlKQorCQlwczNmYl9tb2RlID0gcHMzYXZfZ2V0X21vZGUoKTsKKwlEUFJJTlRLKCJwczNhdl9tb2RlOiVkXG4iLCBwczNmYl9tb2RlKTsKKworCWlmIChwczNmYl9tb2RlID4gMCAmJgorCSAgICAhcHMzYXZfdmlkZW9fbW9kZTJyZXMocHMzZmJfbW9kZSwgJnhyZXMsICZ5cmVzKSkgeworCQlwczNmYi5yZXNfaW5kZXggPSBwczNmYl9nZXRfcmVzX3RhYmxlKHhyZXMsIHlyZXMpOworCQlEUFJJTlRLKCJyZXNfaW5kZXg6JWRcbiIsIHBzM2ZiLnJlc19pbmRleCk7CisJfSBlbHNlCisJCXBzM2ZiLnJlc19pbmRleCA9IEdQVV9SRVNfSU5ERVg7CisKKwlhdG9taWNfc2V0KCZwczNmYi5mX2NvdW50LCAtMSk7CS8qIGZiY29uIG9wZW5zIHBzM2ZiICovCisJYXRvbWljX3NldCgmcHMzZmIuZXh0X2ZsaXAsIDApOwkvKiBmb3IgZmxpcCB3aXRoIHZzeW5jICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHMzZmIud2FpdF92c3luYyk7CisJcHMzZmIubnVtX2ZyYW1lcyA9IDE7CisKKwlwczNmYl9zZXRfc3luYygpOworCiAJLyogZ2V0IGdwdSBjb250ZXh0IGhhbmRsZSAqLwogCXN0YXR1cyA9IGx2MV9ncHVfbWVtb3J5X2FsbG9jYXRlKEREUl9TSVpFLCAwLCAwLCAwLCAwLAogCQkJCQkgJnBzM2ZiLm1lbW9yeV9oYW5kbGUsICZkZHJfbHBhcik7CkBAIC0xMDI5LDcgKzEwNTQsNyBAQAogCSAqIGxlYWthZ2UgaW50byB1c2Vyc3BhY2UKIAkgKi8KIAltZW1zZXQocHMzZmIueGRyX2VhLCAwLCBwczNmYl92aWRlb21lbW9yeS5zaXplKTsKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+Y29yZSk7CiAJaWYgKCFpbmZvKQogCQlnb3RvIGVycl9mcmVlX2lycTsKIApAQCAtMTA2MSwxOSArMTA4NiwyMCBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGVycl9mYl9kZWFsbG9jOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKKwlkZXYtPmNvcmUuZHJpdmVyX2RhdGEgPSBpbmZvOwogCiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiZmIlZDogUFMzIGZyYW1lIGJ1ZmZlciBkZXZpY2UsIHVzaW5nICVsZCBLaUIgb2YgdmlkZW8gbWVtb3J5XG4iLAogCSAgICAgICBpbmZvLT5ub2RlLCBwczNmYl92aWRlb21lbW9yeS5zaXplID4+IDEwKTsKIAotCXRhc2sgPSBrdGhyZWFkX3J1bihwczNmYmQsIGluZm8sICJwczNmYmQiKTsKKwl0YXNrID0ga3RocmVhZF9ydW4ocHMzZmJkLCBpbmZvLCBERVZJQ0VfTkFNRSk7CiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHRhc2spOwogCQlnb3RvIGVycl91bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyOwogCX0KIAogCXBzM2ZiLnRhc2sgPSB0YXNrOworCXBzM2F2X3JlZ2lzdGVyX2ZsaXBfY3RsKHBzM2ZiX2ZsaXBfY3RsLCAmcHMzZmIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTEwODQsNyArMTExMCw3IEBACiBlcnJfZnJhbWVidWZmZXJfcmVsZWFzZToKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX2ZyZWVfaXJxOgotCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgcHMzZmIuZGV2KTsKKwlmcmVlX2lycShwczNmYi5pcnFfbm8sIGRldik7CiAJcHMzX2lycV9wbHVnX2Rlc3Ryb3kocHMzZmIuaXJxX25vKTsKIGVycl9pb3VubWFwX2RpbmZvOgogCWlvdW5tYXAoKHU4IF9faW9tZW0gKilwczNmYi5kaW5mbyk7CkBAIC0xMDk2LDI2ICsxMTIyLDMwIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgcHMzZmJfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXBzM2ZiX2ZsaXBfY3RsKDApOwkvKiBmbGlwIG9mZiAqLwotCXBzM2ZiLmRpbmZvLT5pcnEubWFzayA9IDA7Ci0JZnJlZV9pcnEocHMzZmIuaXJxX25vLCBwczNmYi5kZXYpOwotCXBzM19pcnFfcGx1Z19kZXN0cm95KHBzM2ZiLmlycV9ubyk7Ci0JaW91bm1hcCgodTggX19pb21lbSAqKXBzM2ZiLmRpbmZvKTsKLX0KLQotdm9pZCBwczNmYl9jbGVhbnVwKHZvaWQpCitzdGF0aWMgaW50IHBzM2ZiX3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgc3RhdHVzOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2LT5jb3JlLmRyaXZlcl9kYXRhOwogCisJRFBSSU5USygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHMzZmJfZmxpcF9jdGwoMCwgJnBzM2ZiKTsJLyogZmxpcCBvZmYgKi8KKwlwczNmYi5kaW5mby0+aXJxLm1hc2sgPSAwOworCisJaWYgKGluZm8pIHsKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlwczNhdl9yZWdpc3Rlcl9mbGlwX2N0bChOVUxMLCBOVUxMKTsKIAlpZiAocHMzZmIudGFzaykgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwczNmYi50YXNrOwogCQlwczNmYi50YXNrID0gTlVMTDsKIAkJa3RocmVhZF9zdG9wKHRhc2spOwogCX0KIAlpZiAocHMzZmIuaXJxX25vKSB7Ci0JCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgcHMzZmIuZGV2KTsKKwkJZnJlZV9pcnEocHMzZmIuaXJxX25vLCBkZXYpOwogCQlwczNfaXJxX3BsdWdfZGVzdHJveShwczNmYi5pcnFfbm8pOwogCX0KIAlpb3VubWFwKCh1OCBfX2lvbWVtICopcHMzZmIuZGluZm8pOwpAQCAtMTEyOCwxMzQgKzExNTgsNjkgQEAKIAlpZiAoc3RhdHVzKQogCQlEUFJJTlRLKCJsdjFfZ3B1X21lbW9yeV9mcmVlIGZhaWxlZDogJWRcbiIsIHN0YXR1cyk7CiAKLQlwczNhdl9kZXZfY2xvc2UoKTsKLX0KKwlwczNfY2xvc2VfaHZfZGV2aWNlKGRldik7CisJRFBSSU5USygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNmYl9jbGVhbnVwKTsKLQotc3RhdGljIGludCBwczNmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChpbmZvKSB7Ci0JCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7Ci0JCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7Ci0JCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JfQotCXBzM2ZiX2NsZWFudXAoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHMzZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IHBzM2ZiX3Byb2JlLAotCS5yZW1vdmUgPSBwczNmYl9yZW1vdmUsCi0JLnNodXRkb3duID0gcHMzZmJfc2h1dGRvd24sCi0JLmRyaXZlciA9IHsgLm5hbWUgPSAicHMzZmIiIH0KK3N0YXRpYyBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyIHBzM2ZiX2RyaXZlciA9IHsKKwkubWF0Y2hfaWQJPSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1MsCisJLmNvcmUubmFtZQk9IERFVklDRV9OQU1FLAorCS5jb3JlLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQk9IHBzM2ZiX3Byb2JlLAorCS5yZW1vdmUJCT0gcHMzZmJfc2h1dGRvd24sCisJLnNodXRkb3duCT0gcHMzZmJfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwczNmYl9kZXZpY2UgPSB7Ci0JLm5hbWUJPSAicHMzZmIiLAotCS5pZAk9IDAsCi0JLmRldgk9IHsgLnJlbGVhc2UgPSBwczNmYl9wbGF0Zm9ybV9yZWxlYXNlIH0KLX07Ci0KLWludCBwczNmYl9zZXRfc3luYyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHMzZmJfc2V0dXAodm9pZCkKIHsKLQlpbnQgc3RhdHVzOworCWNoYXIgKm9wdGlvbnM7CiAKLSNpZmRlZiBIRUFEX0EKLQlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKDB4MCwKLQkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRElTUExBWV9TWU5DLAotCQkJCQkgICAwLCBMMUdQVV9ESVNQTEFZX1NZTkNfVlNZTkMsIDAsIDApOwotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgRElTUExBWV9TWU5DIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcmV0dXJuIC0xOwotCX0KKyNpZmRlZiBNT0RVTEUKKwlyZXR1cm4gMDsKICNlbmRpZgotI2lmZGVmIEhFQURfQgotCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUoMHgwLAotCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9ESVNQTEFZX1NZTkMsCi0JCQkJCSAgIDEsIEwxR1BVX0RJU1BMQVlfU1lOQ19WU1lOQywgMCwgMCk7CiAKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfTU9ERSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0JCXJldHVybiAtMTsKKwlpZiAoZmJfZ2V0X29wdGlvbnMoREVWSUNFX05BTUUsICZvcHRpb25zKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqdGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIik7CisKKwkJaWYgKCF0aGlzX29wdCkKKwkJCWJyZWFrOworCQlpZiAoISp0aGlzX29wdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb2RlOiIsIDUpKQorCQkJcHMzZmJfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CisJCWVsc2UKKwkJCW1vZGVfb3B0aW9uID0gdGhpc19vcHQ7CiAJfQotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX3NldF9zeW5jKTsKLQogc3RhdGljIGludCBfX2luaXQgcHMzZmJfaW5pdCh2b2lkKQogewotCWludCBlcnJvcjsKLSNpZm5kZWYgTU9EVUxFCi0JaW50IG1vZGU7Ci0JY2hhciAqb3B0aW9uID0gTlVMTDsKKwlpZiAoIXBzM2ZiX3ZpZGVvbWVtb3J5LmFkZHJlc3MgfHwgIHBzM2ZiX3NldHVwKCkpCisJCXJldHVybiAtRU5YSU87CiAKLQlpZiAoZmJfZ2V0X29wdGlvbnMoInBzM2ZiIiwgJm9wdGlvbikpCi0JCWdvdG8gZXJyOwotI2VuZGlmCisJcmV0dXJuIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKK30KIAotCWlmICghcHMzZmJfdmlkZW9tZW1vcnkuYWRkcmVzcykKLQkJZ290byBlcnI7Ci0KLQllcnJvciA9IHBzM2F2X2Rldl9vcGVuKCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM2F2X2Rldl9vcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlwczNmYl9tb2RlID0gcHMzYXZfZ2V0X21vZGUoKTsKLQlEUFJJTlRLKCJwczNhdl9tb2RlOiVkXG4iLCBwczNmYl9tb2RlKTsKLSNpZm5kZWYgTU9EVUxFCi0JbW9kZSA9IHBzM2ZiX3NldHVwKG9wdGlvbik7CS8qIGNoZWNrIGJvb3Qgb3B0aW9uICovCi0JaWYgKG1vZGUpCi0JCXBzM2ZiX21vZGUgPSBtb2RlOwotI2VuZGlmCi0JaWYgKHBzM2ZiX21vZGUgPiAwKSB7Ci0JCXUzMiB4cmVzLCB5cmVzOwotCQlwczNhdl92aWRlb19tb2RlMnJlcyhwczNmYl9tb2RlLCAmeHJlcywgJnlyZXMpOwotCQlwczNmYi5yZXNfaW5kZXggPSBwczNmYl9nZXRfcmVzX3RhYmxlKHhyZXMsIHlyZXMpOwotCQlEUFJJTlRLKCJyZXNfaW5kZXg6JWRcbiIsIHBzM2ZiLnJlc19pbmRleCk7Ci0JfSBlbHNlCi0JCXBzM2ZiLnJlc19pbmRleCA9IEdQVV9SRVNfSU5ERVg7Ci0KLQlhdG9taWNfc2V0KCZwczNmYi5mX2NvdW50LCAtMSk7CS8qIGZiY29uIG9wZW5zIHBzM2ZiICovCi0JYXRvbWljX3NldCgmcHMzZmIuZXh0X2ZsaXAsIDApOwkvKiBmb3IgZmxpcCB3aXRoIHZzeW5jICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHMzZmIud2FpdF92c3luYyk7Ci0JcHMzZmIubnVtX2ZyYW1lcyA9IDE7Ci0KLQllcnJvciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWVycm9yID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwczNmYl9kZXZpY2UpOwotCQlpZiAoZXJyb3IpCi0JCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKLQl9Ci0KLQlwczNmYl9zZXRfc3luYygpOwotCi0JcmV0dXJuIGVycm9yOwotCi1lcnI6Ci0JcmV0dXJuIC1FTlhJTzsKK3N0YXRpYyB2b2lkIF9fZXhpdCBwczNmYl9leGl0KHZvaWQpCit7CisJRFBSSU5USygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZwczNmYl9kcml2ZXIpOworCURQUklOVEsoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogbW9kdWxlX2luaXQocHMzZmJfaW5pdCk7Ci0KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIF9fZXhpdCBwczNmYl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJnBzM2ZiX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBzM2ZiX2RyaXZlcik7Ci19Ci0KIG1vZHVsZV9leGl0KHBzM2ZiX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0jZW5kaWYJCQkJLyogTU9EVUxFICovCitNT0RVTEVfREVTQ1JJUFRJT04oIlBTMyBHUFUgRnJhbWUgQnVmZmVyIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4iKTsKK01PRFVMRV9BTElBUyhQUzNfTU9EVUxFX0FMSUFTX0dSQVBISUNTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jCmluZGV4IGRmMjkwOWEuLjBmODhjMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wdnIyZmIuYwpAQCAtMTE1LDExICsxMTUsMTEgQEAKIGVudW0geyBQQUxfQVJHQjE1NTUsIFBBTF9SR0I1NjUsIFBBTF9BUkdCNDQ0NCwgUEFMX0FSR0I4ODg4IH07CiAKIHN0cnVjdCBwdnIyX3BhcmFtcyB7IHVuc2lnbmVkIGludCB2YWw7IGNoYXIgKm5hbWU7IH07Ci1zdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIGNhYmxlc1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIGNhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBDVF9WR0EsICJWR0EiIH0sIHsgQ1RfUkdCLCAiUkdCIiB9LCB7IENUX0NPTVBPU0lURSwgIkNPTVBPU0lURSIgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcHZyMl9wYXJhbXMgb3V0cHV0c1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIG91dHB1dHNbXSBfX2RldmluaXRkYXRhID0gewogCXsgVk9fUEFMLCAiUEFMIiB9LCB7IFZPX05UU0MsICJOVFNDIiB9LCB7IFZPX1ZHQSwgIlZHQSIgfSwKIH07CiAKQEAgLTE0NywxNiArMTQ3LDE2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbzsKIAotc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwdnIyX2ZpeCBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwdnIyX2ZpeCBfX2RldmluaXRkYXRhID0gewogCS5pZCA9CQkiTkVDIFBvd2VyVlIyIiwKLQkudHlwZSA9IAlGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCi0JLnZpc3VhbCA9IAlGQl9WSVNVQUxfVFJVRUNPTE9SLAorCS50eXBlID0JCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKKwkudmlzdWFsID0JRkJfVklTVUFMX1RSVUVDT0xPUiwKIAkueXBhbnN0ZXAgPQkxLAogCS55d3JhcHN0ZXAgPQkxLAotCS5hY2NlbCA9IAlGQl9BQ0NFTF9OT05FLAorCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHB2cjJfdmFyIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHB2cjJfdmFyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnhyZXMgPQkJNjQwLAogCS55cmVzID0JCTQ4MCwKIAkueHJlc192aXJ0dWFsID0JNjQwLApAQCAtMTk1LDEwICsxOTUsNiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBwdnIyZG1hID0gT05DSElQX05SX0RNQV9DSEFOTkVMUzsKICNlbmRpZgogCi0vKiBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQgKi8KLQotaW50IHB2cjJmYl9zZXR1cChjaGFyKik7Ci0KIHN0YXRpYyBpbnQgcHZyMmZiX3NldGNvbHJlZyh1bnNpZ25lZCBpbnQgcmVnbm8sIHVuc2lnbmVkIGludCByZWQsIHVuc2lnbmVkIGludCBncmVlbiwgdW5zaWduZWQgaW50IGJsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIGludCBwdnIyZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CkBAIC0yMjcsMTIgKzIyMywxMiBAQAogI2lmZGVmIENPTkZJR19TSF9ETUEKIAkuZmJfd3JpdGUJPSBwdnIyZmJfd3JpdGUsCiAjZW5kaWYKLQkuZmJfZmlsbHJlY3QgCT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBwdnIyX21vZGVkYltdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBwdnIyX21vZGVkYltdIF9fZGV2aW5pdGRhdGEgPSB7CiAgICAgLyoKICAgICAgKiBCcm9hZGNhc3QgdmlkZW8gbW9kZXMgKFBBTCBhbmQgTlRTQykuICBJJ20gdW5mYW1pbGlhciB3aXRoCiAgICAgICogUEFMLU0gYW5kIFBBTC1OLCBidXQgZnJvbSB3aGF0IEkndmUgcmVhZCBib3RoIG1vZGVzIHBhcmFsbGVsIFBBTCBhbmQKQEAgLTI1Miw3ICsyNDgsNyBAQAogCS8qIDY0MHg0ODAgQCA2MGh6IChWR0EpICovCiAJInZnYV82NDB4NDgwIiwgNjAsIDY0MCwgNDgwLCBWR0FfQ0xLLCAzOCwgMzMsIDAsIDE4LCAxNDYsIDI2LAogCTAsIEZCX1ZNT0RFX1lXUkFQCi0gICAgfSwgCisgICAgfSwKIH07CiAKICNkZWZpbmUgTlVNX1RPVEFMX01PREVTICBBUlJBWV9TSVpFKHB2cjJfbW9kZWRiKQpAQCAtMjYyLDcgKzI1OCw3IEBACiAjZGVmaW5lIERFRk1PREVfVkdBCTIKIAogc3RhdGljIGludCBkZWZtb2RlID0gREVGTU9ERV9OVFNDOwotc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9faW5pdGRhdGEgPSBOVUxMOworc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9fZGV2aW5pdGRhdGEgPSBOVUxMOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHZyMmZiX3NldF9wYWxfdHlwZSh1bnNpZ25lZCBpbnQgdHlwZSkKIHsKQEAgLTI5Myw3ICsyODksNyBAQAogewogCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewogCSAgICBjYXNlIDE2OiAgICAgICAgLyogUkdCIDU2NSAqLwotCSAgICAJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfUkdCNTY1KTsKKwkJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfUkdCNTY1KTsKIAkJdmFyLT5yZWQub2Zmc2V0ID0gMTE7ICAgIHZhci0+cmVkLmxlbmd0aCA9IDU7CiAJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsgICB2YXItPmdyZWVuLmxlbmd0aCA9IDY7CiAJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOyAgICB2YXItPmJsdWUubGVuZ3RoID0gNTsKQEAgLTMwNiw3ICszMDIsNyBAQAogCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOyAgdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKIAkJYnJlYWs7CiAJICAgIGNhc2UgMzI6ICAgICAgICAvKiBBUkdCIDg4ODggKi8KLQkgICAgCXB2cjJmYl9zZXRfcGFsX3R5cGUoUEFMX0FSR0I4ODg4KTsKKwkJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfQVJHQjg4ODgpOwogCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsgICAgdmFyLT5yZWQubGVuZ3RoID0gODsKIAkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OyAgIHZhci0+Z3JlZW4ubGVuZ3RoID0gODsKIAkJdmFyLT5ibHVlLm9mZnNldCA9IDA7ICAgIHZhci0+Ymx1ZS5sZW5ndGggPSA4OwpAQCAtMzM3LDI0ICszMzMsMjUgQEAKIAkJICAgICAgKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpOwogCiAJCXB2cjJmYl9zZXRfcGFsX2VudHJ5KHBhciwgcmVnbm8sIHRtcCk7Ci0JCSgodTE2KikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB0bXA7CiAJCWJyZWFrOwogCSAgICBjYXNlIDI0OiAvKiBSR0IgODg4ICovCiAJCXJlZCA+Pj0gODsgZ3JlZW4gPj49IDg7IGJsdWUgPj49IDg7Ci0JCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7CisJCXRtcCA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKIAkJYnJlYWs7CiAJICAgIGNhc2UgMzI6IC8qIEFSR0IgODg4OCAqLwogCQlyZWQgPj49IDg7IGdyZWVuID4+PSA4OyBibHVlID4+PSA4OwogCQl0bXAgPSAodHJhbnNwIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKIAogCQlwdnIyZmJfc2V0X3BhbF9lbnRyeShwYXIsIHJlZ25vLCB0bXApOwotCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdG1wOwogCQlicmVhazsKIAkgICAgZGVmYXVsdDoKIAkJcHJfZGVidWcoIkludmFsaWQgYml0IGRlcHRoICVkPyE/XG4iLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwogCQlyZXR1cm4gMTsKIAl9CiAKKwlpZiAocmVnbm8gPCAxNikKKwkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHRtcDsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNzksMTMgKzM3NiwxMyBAQAogCXZhci0+dm1vZGUgJj0gRkJfVk1PREVfTUFTSzsKIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQgJiYgdmlkZW9fb3V0cHV0ICE9IFZPX1ZHQSkKIAkJcGFyLT5pc19pbnRlcmxhY2VkID0gMTsKLQkvKiAKKwkvKgogCSAqIFhYWDogTmVlZCB0byBiZSBtb3JlIGNyZWF0aXZlIHdpdGggdGhpcyAoaS5lLiBhbGxvdyBkb3VibGVjYW4gZm9yCiAJICogUEFML05UU0Mgb3V0cHV0KS4KIAkgKi8KIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSAmJiB2aWRlb19vdXRwdXQgPT0gVk9fVkdBKQogCQlwYXItPmlzX2RvdWJsZXNjYW4gPSAxOwotCQorCiAJcGFyLT5oc3luY190b3RhbCA9IHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArCiAJICAgICAgICAgICAgICAgICAgIHZhci0+aHN5bmNfbGVuOwogCXBhci0+dnN5bmNfdG90YWwgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsKQEAgLTQwOCw3ICs0MDUsNyBAQAogCX0gZWxzZSB7CiAJCS8qIFZHQSBtb2RlICovCiAJCS8qIFhYWDogV2hhdCBlbHNlIG5lZWRzIHRvIGJlIGNoZWNrZWQ/ICovCi0JCS8qIAorCQkvKgogCQkgKiBYWFg6IFdlIGhhdmUgYSBsaXR0bGUgZnJlZWRvbSBpbiBWR0EgbW9kZXMsIHdoYXQgcmFuZ2VzCiAJCSAqIHNob3VsZCBiZSBoZXJlIChpLmUuIGhzeW5jL3ZzeW5jIHRvdGFscywgZXRjLik/CiAJCSAqLwpAQCAtNDE5LDggKzQxNiw4IEBACiAJLyogQ2FsY3VsYXRlIHRoZSByZW1haW5kaW5nIG9mZnNldHMgKi8KIAlwYXItPmRpd3N0YXJ0X2ggPSBwYXItPmJvcmRlcnN0YXJ0X2ggKyB2YXItPmxlZnRfbWFyZ2luOwogCXBhci0+ZGl3c3RhcnRfdiA9IHBhci0+Ym9yZGVyc3RhcnRfdiArIHZhci0+dXBwZXJfbWFyZ2luOwotCXBhci0+Ym9yZGVyc3RvcF9oID0gcGFyLT5kaXdzdGFydF9oICsgdmFyLT54cmVzICsgCi0JCQkgICAgdmFyLT5yaWdodF9tYXJnaW47ICAgIAorCXBhci0+Ym9yZGVyc3RvcF9oID0gcGFyLT5kaXdzdGFydF9oICsgdmFyLT54cmVzICsKKwkJCSAgICB2YXItPnJpZ2h0X21hcmdpbjsKIAlwYXItPmJvcmRlcnN0b3BfdiA9IHBhci0+ZGl3c3RhcnRfdiArIHZhci0+eXJlcyArCiAJCQkgICAgdmFyLT5sb3dlcl9tYXJnaW47CiAKQEAgLTQ2NSwxMiArNDYyLDEyIEBACiAJc2V0X2NvbG9yX2JpdGZpZWxkcyh2YXIpOwogCiAJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgewotCQlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCA8IDAgfHwgCisJCWlmICh2YXItPnhvZmZzZXQgfHwgdmFyLT55b2Zmc2V0IDwgMCB8fAogCQkgICAgdmFyLT55b2Zmc2V0ID49IHZhci0+eXJlc192aXJ0dWFsKSB7CiAJCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwogCQl9IGVsc2UgewogCQkJaWYgKHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzIHx8Ci0JCSAgICAJICAgIHZhci0+eW9mZnNldCA+IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzIHx8IAorCQkJICAgIHZhci0+eW9mZnNldCA+IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzIHx8CiAJCQkgICAgdmFyLT54b2Zmc2V0IDwgMCB8fCB2YXItPnlvZmZzZXQgPCAwKQogCQkJCXZhci0+eG9mZnNldCA9IHZhci0+eW9mZnNldCA9IDA7CiAJCX0KQEAgLTQ3OCw3ICs0NzUsNyBAQAogCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwogCX0KIAotCS8qIAorCS8qCiAJICogWFhYOiBOZWVkIHRvIGJlIG1vcmUgY3JlYXRpdmUgd2l0aCB0aGlzIChpLmUuIGFsbG93IGRvdWJsZWNhbiBmb3IKIAkgKiBQQUwvTlRTQyBvdXRwdXQpLgogCSAqLwpAQCAtNTA3LDcgKzUwNCw3IEBACiAJCXZhci0+dnN5bmNfbGVuICAgID0gcGFyLT5ib3JkZXJzdG9wX3YgKwogCQkJCSAgIChwYXItPnZzeW5jX3RvdGFsIC0gcGFyLT5ib3JkZXJzdG9wX3YpOwogCX0KLQkJCisKIAloc3luY190b3RhbCA9IHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArCiAJCSAgICAgIHZhci0+aHN5bmNfbGVuOwogCXZ0b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKwpAQCAtNTMxLDcgKzUyOCw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAkvKiBDaGVjayBtZW1vcnkgc2l6ZXMgKi8KIAlsaW5lX2xlbmd0aCA9IGdldF9saW5lX2xlbmd0aCh2YXItPnhyZXNfdmlydHVhbCwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJaWYgKGxpbmVfbGVuZ3RoICogdmFyLT55cmVzX3ZpcnR1YWwgPiBpbmZvLT5maXguc21lbV9sZW4pCkBAIC01NTIsNyArNTQ5LDcgQEAKIAkgICAgICAgICAgRElTUF9ESVdBRERSUyk7CiB9CiAKLS8qIAorLyoKICAqIEluaXRpYWxpemUgdGhlIHZpZGVvIG1vZGUuICBDdXJyZW50bHksIHRoZSAxNmJwcCBhbmQgMjRicHAgbW9kZXMgYXJlbid0CiAgKiB2ZXJ5IHN0YWJsZS4gIEl0J3MgcHJvYmFibHkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYSBsb3Qgb2YgdGhlIDJEIHZpZGVvCiAgKiByZWdpc3RlcnMgYXJlIHN0aWxsIHVuZG9jdW1lbnRlZC4KQEAgLTU5MiwxOCArNTg5LDE4IEBACiAJLyogZGlzcGxheSB3aW5kb3cgc3RhcnQgcG9zaXRpb24gKi8KIAlmYl93cml0ZWwocGFyLT5kaXdzdGFydF9oLCBESVNQX0RJV0hTVFJUKTsKIAlmYl93cml0ZWwoKHBhci0+ZGl3c3RhcnRfdiA8PCAxNikgfCBwYXItPmRpd3N0YXJ0X3YsIERJU1BfRElXVlNUUlQpOwotCQorCiAJLyogbWlzYy4gc2V0dGluZ3MgKi8KIAlmYl93cml0ZWwoKDB4MTYgPDwgMTYpIHwgcGFyLT5pc19sb3dyZXMsIERJU1BfRElXQ09ORik7CiAKIAkvKiBjbG9jayBkb3VibGVyIChmb3IgVkdBKSwgc2NhbiBkb3VibGVyLCBkaXNwbGF5IGVuYWJsZSAqLwotCWZiX3dyaXRlbCgoKHZpZGVvX291dHB1dCA9PSBWT19WR0EpIDw8IDIzKSB8IAorCWZiX3dyaXRlbCgoKHZpZGVvX291dHB1dCA9PSBWT19WR0EpIDw8IDIzKSB8CiAJICAgICAgICAgIChwYXItPmlzX2RvdWJsZXNjYW4gPDwgMSkgfCAxLCBESVNQX0RJV01PREUpOwogCiAJLyogYml0cyBwZXIgcGl4ZWwgKi8KIAlmYl93cml0ZWwoZmJfcmVhZGwoRElTUF9ESVdNT0RFKSB8ICgtLWJ5dGVzcGVycGl4ZWwgPDwgMiksIERJU1BfRElXTU9ERSk7CiAKLQkvKiB2aWRlbyBlbmFibGUsIGNvbG9yIHN5bmMsIGludGVybGFjZSwgCisJLyogdmlkZW8gZW5hYmxlLCBjb2xvciBzeW5jLCBpbnRlcmxhY2UsCiAJICogaHN5bmMgYW5kIHZzeW5jIHBvbGFyaXR5IChjdXJyZW50bHkgdW51c2VkKSAqLwogCWZiX3dyaXRlbCgweDEwMCB8ICgocGFyLT5pc19pbnRlcmxhY2VkIC8qfDQqLykgPDwgNCksIERJU1BfU1lOQ0NPTkYpOwogfQpAQCAtNjU3LDcgKzY1NCw3IEBACiBzdGF0aWMgaW50IHB2cjJfaW5pdF9jYWJsZSh2b2lkKQogewogCWlmIChjYWJsZV90eXBlIDwgMCkgewotCQlmYl93cml0ZWwoKGZiX3JlYWRsKFBDVFJBKSAmIDB4ZmZmMGZmZmYpIHwgMHgwMDBhMDAwMCwgCisJCWZiX3dyaXRlbCgoZmJfcmVhZGwoUENUUkEpICYgMHhmZmYwZmZmZikgfCAweDAwMGEwMDAwLAogCSAgICAgICAgICAgICAgICAgIFBDVFJBKTsKIAkJY2FibGVfdHlwZSA9IChmYl9yZWFkdyhQRFRSQSkgPj4gOCkgJiAzOwogCX0KQEAgLTY4Nyw3ICs2ODQsNyBAQAogCXBhZ2VzID0ga21hbGxvYyhucl9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWdlcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JCisKIAlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sICh1bnNpZ25lZCBsb25nKWJ1ZiwKIAkJCSAgICAgbnJfcGFnZXMsIFdSSVRFLCAwLCBwYWdlcywgTlVMTCk7CkBAIC03MDAsNyArNjk3LDcgQEAKIAl9CiAKIAlkbWFfY29uZmlndXJlX2NoYW5uZWwoc2hkbWEsIDB4MTJjMSk7Ci0JCisKIAlkc3QgICA9ICh1bnNpZ25lZCBsb25nKWZiX2luZm8tPnNjcmVlbl9iYXNlICsgKnBwb3M7CiAJc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZXNbMF0pOwogCWVuZCAgID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2VzW25yX3BhZ2VzXSk7CkBAIC03NDQsNyArNzQxLDcgQEAKIAlrZnJlZShwYWdlcyk7CiAKIAlyZXR1cm4gcmV0OwotfSAKK30KICNlbmRpZiAvKiBDT05GSUdfU0hfRE1BICovCiAKIC8qKgpAQCAtNzY1LDIxICs3NjIsMjEgQEAKICAqIGluIGZvciBmbGV4aWJpbGl0eSBhbnl3YXlzLiBXaG8ga25vd3MsIG1heWJlIHNvbWVvbmUgaGFzIHR2LW91dCBvbiBhCiAgKiBQQ0ktYmFzZWQgdmVyc2lvbiBvZiB0aGVzZSB0aGluZ3MgOy0pCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHB2cjJmYl9jb21tb25faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgcHZyMmZiX2NvbW1vbl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHB2cjJmYl9wYXIgKnBhciA9IGN1cnJlbnRwYXI7CiAJdW5zaWduZWQgbG9uZyBtb2RlbWVtdXNlZCwgcmV2OwogCiAJZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocHZyMl9maXguc21lbV9zdGFydCwKIAkJCQkJICAgICAgIHB2cjJfZml4LnNtZW1fbGVuKTsKLQkKKwogCWlmICghZmJfaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwdnIyZmI6IEZhaWxlZCB0byByZW1hcCBzbWVtIHNwYWNlXG4iKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAogCXBhci0+bW1pb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcF9ub2NhY2hlKHB2cjJfZml4Lm1taW9fc3RhcnQsCi0JCQkJCSAJCXB2cjJfZml4Lm1taW9fbGVuKTsKKwkJCQkJCQlwdnIyX2ZpeC5tbWlvX2xlbik7CiAJaWYgKCFwYXItPm1taW9fYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgInB2cjJmYjogRmFpbGVkIHRvIHJlbWFwIG1taW8gc3BhY2VcbiIpOwogCQlnb3RvIG91dF9lcnI7CkBAIC04MjAsNyArODE3LDcgQEAKIAlwcmludGsoImZiJWQ6ICVzIChyZXYgJWxkLiVsZCkgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWxkay8lbGRrIG9mIHZpZGVvIG1lbW9yeVxuIiwKIAkgICAgICAgZmJfaW5mby0+bm9kZSwgZmJfaW5mby0+Zml4LmlkLCAocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZiwKIAkgICAgICAgbW9kZW1lbXVzZWQgPj4gMTAsICh1bnNpZ25lZCBsb25nKShmYl9pbmZvLT5maXguc21lbV9sZW4gPj4gMTApKTsKLQlwcmludGsoImZiJWQ6IE1vZGUgJWR4JWQtJWQgcGl0Y2ggPSAlbGQgY2FibGU6ICVzIHZpZGVvIG91dHB1dDogJXNcbiIsIAorCXByaW50aygiZmIlZDogTW9kZSAlZHglZC0lZCBwaXRjaCA9ICVsZCBjYWJsZTogJXMgdmlkZW8gb3V0cHV0OiAlc1xuIiwKIAkgICAgICAgZmJfaW5mby0+bm9kZSwgZmJfaW5mby0+dmFyLnhyZXMsIGZiX2luZm8tPnZhci55cmVzLAogCSAgICAgICBmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCiAJICAgICAgIGdldF9saW5lX2xlbmd0aChmYl9pbmZvLT52YXIueHJlcywgZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSwKQEAgLTg3OCw4ICs4NzUsOCBAQAogCQkJdmlkZW9fb3V0cHV0ID0gVk9fTlRTQzsKIAkJfQogCX0KLQkKLQkvKiAKKworCS8qCiAJICogTm90aGluZyBleGNpdGluZyBhYm91dCB0aGUgREMgUFZSMiAuLiBvbmx5IGEgbWVhc2x5IDhNaUIuCiAJICovCiAJcHZyMl9maXguc21lbV9zdGFydAk9IDB4YTUwMDAwMDA7CS8qIFJBTSBzdGFydHMgaGVyZSAqLwpAQCAtOTAzLDcgKzkwMCw3IEBACiAJcmV0dXJuIHB2cjJmYl9jb21tb25faW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBwdnIyZmJfZGNfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHB2cjJmYl9kY19leGl0KHZvaWQpCiB7CiAJaWYgKGZiX2luZm8tPnNjcmVlbl9iYXNlKSB7CiAJCWlvdW5tYXAoZmJfaW5mby0+c2NyZWVuX2Jhc2UpOwpAQCAtOTg3LDEzICs5ODQsMTMgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcHZyMmZiX3BjaV9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBwdnIyZmJfcGNpX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwdnIyZmJfcGNpX2V4aXQodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnB2cjJmYl9wY2lfZHJpdmVyKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKLXN0YXRpYyBpbnQgX19pbml0IHB2cjJfZ2V0X3BhcmFtKGNvbnN0IHN0cnVjdCBwdnIyX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqcywKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB2cjJfZ2V0X3BhcmFtKGNvbnN0IHN0cnVjdCBwdnIyX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCwgaW50IHNpemUpCiB7CiAJaW50IGk7CkBAIC0xMDIxLDcgKzEwMTgsNyBAQAogICovCiAKICNpZm5kZWYgTU9EVUxFCi1pbnQgX19pbml0IHB2cjJmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcHZyMmZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7CiAJY2hhciAqdGhpc19vcHQ7CiAJY2hhciBjYWJsZV9hcmdbODBdOwpAQCAtMTA2MSw3ICsxMDU4LDcgQEAKIAlpbnQgKCppbml0KSh2b2lkKTsKIAl2b2lkICgqZXhpdCkodm9pZCk7CiAJY2hhciBuYW1lWzE2XTsKLX0gYm9hcmRfbGlzdFtdID0geworfSBib2FyZF9kcml2ZXJbXSA9IHsKICNpZmRlZiBDT05GSUdfU0hfRFJFQU1DQVNUCiAJeyBwdnIyZmJfZGNfaW5pdCwgcHZyMmZiX2RjX2V4aXQsICJTZWdhIERDIFBWUjIiIH0sCiAjZW5kaWYKQEAgLTEwNzEsNyArMTA2OCw3IEBACiAJeyAwLCB9LAogfTsKIAotaW50IF9faW5pdCBwdnIyZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHZyMmZiX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgcmV0ID0gLUVOT0RFVjsKIAlpbnQgc2l6ZTsKQEAgLTEwOTUsOCArMTA5Miw4IEBACiAKIAljdXJyZW50cGFyID0gKHN0cnVjdCBwdnIyZmJfcGFyICopKGZiX2luZm8gKyAxKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkX2xpc3QpOyBpKyspIHsKLQkJc3RydWN0IHB2cjJfYm9hcmQgKnB2cl9ib2FyZCA9IGJvYXJkX2xpc3QgKyBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkX2RyaXZlcik7IGkrKykgeworCQlzdHJ1Y3QgcHZyMl9ib2FyZCAqcHZyX2JvYXJkID0gYm9hcmRfZHJpdmVyICsgaTsKIAogCQlpZiAoIXB2cl9ib2FyZC0+aW5pdCkKIAkJCWNvbnRpbnVlOwpAQCAtMTExOCwxMyArMTExNSwxMyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmRfbGlzdCk7IGkrKykgewotCQlzdHJ1Y3QgcHZyMl9ib2FyZCAqcHZyX2JvYXJkID0gYm9hcmRfbGlzdCArIGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmRfZHJpdmVyKTsgaSsrKSB7CisJCXN0cnVjdCBwdnIyX2JvYXJkICpwdnJfYm9hcmQgPSBib2FyZF9kcml2ZXIgKyBpOwogCiAJCWlmIChwdnJfYm9hcmQtPmV4aXQpCiAJCQlwdnJfYm9hcmQtPmV4aXQoKTsKIAl9Ci0JCQorCiAjaWZkZWYgQ09ORklHX1NIX1NUT1JFX1FVRVVFUwogCXNxX3VubWFwKHB2cjJmYl9tYXApOwogI2VuZGlmCkBAIC0xMTM5LDQgKzExMzYsMyBAQAogTU9EVUxFX0FVVEhPUigiUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4sIE0uIFIuIEJyb3duIDxtcmJyb3duQDB4ZDYub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIE5FQyBQb3dlclZSIDIgYmFzZWQgZ3JhcGhpY3MgYm9hcmRzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcTQwZmIuYyBiL2RyaXZlcnMvdmlkZW8vcTQwZmIuYwppbmRleCA0ODUzNmMzLi40YmVhYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9xNDBmYi5jCkBAIC05NSw3ICs5NSw3IEBACiAJLyogbWFwcGVkIGluIHE0MC9jb25maWcuYyAqLwogCXE0MGZiX2ZpeC5zbWVtX3N0YXJ0ID0gUTQwX1BIWVNfU0NSRUVOX0FERFI7CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAyNTYsICZkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMTYsICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYwppbmRleCBlYmI2NzU2Li40ZmIxNjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYwpAQCAtNzUyLDcgKzc1Miw3IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJY2hhciAqbW9uaXRvcjsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHNnaXZ3X3BhcikgKyBzaXplb2YodTMyKSAqIDI1NiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2l2d19wYXIpICsgc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCXBhciA9IGluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKaW5kZXggZDVlMmQ5Yy4uZDUzYmY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKQEAgLTQ3OSw3ICs0NzksNyBAQAogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWZhdWx0X3ZhcjsKIAogCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBzaXNmYl9maXg7Ci0JdTMyCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAKIAlzdHJ1Y3Qgc2lzZmJfbW9uaXRvciB7CiAJCXUxNiBobWluOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKaW5kZXggOTNkMDdlZi4uZThjY2FjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCkBAIC0xNDA1LDEyICsxNDA1LDE4IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAxNjoKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJYnJlYWs7CisKIAkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQogCQkJCShyZWQgJiAweGY4MDApICAgICAgICAgIHwKIAkJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8CiAJCQkJKChibHVlICYgMHhmODAwKSA+PiAxMSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6CisJCWlmIChyZWdubyA+PSAxNikKKwkJCWJyZWFrOworCiAJCXJlZCA+Pj0gODsKIAkJZ3JlZW4gPj49IDg7CiAJCWJsdWUgPj49IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKaW5kZXggNWMwZGFiNi4uODlmYWNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90Z2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdGdhZmIuYwpAQCAtMTYzNCw3ICsxNjM0LDcgQEAKIAkJICAgICAgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7CiAJaW5mby0+ZmJvcHMgPSAmdGdhZmJfb3BzOwogCWluZm8tPnNjcmVlbl9iYXNlID0gcGFyLT50Z2FfZmJfYmFzZTsKLQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICh2b2lkICopKHBhciArIDEpOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wYWxldHRlOwogCiAJLyogVGhpcyBzaG91bGQgZ2l2ZSBhIHJlYXNvbmFibGUgZGVmYXVsdCB2aWRlbyBtb2RlLiAgKi8KIAlpZiAodGdhX2J1c19wY2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCmluZGV4IDU1ZThhYTQuLmM2OTk4NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKKysrIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwpAQCAtOTc2LDcgKzk3Niw3IEBACiAJCXJldHVybiAxOwogCiAKLQlpZiAoYnBwPT04KSB7CisJaWYgKGJwcCA9PSA4KSB7CiAJCXRfb3V0YigweEZGLDB4M0M2KTsKIAkJdF9vdXRiKHJlZ25vLDB4M0M4KTsKIApAQCAtOTg0LDE5ICs5ODQsMjEgQEAKIAkJdF9vdXRiKGdyZWVuPj4xMCwweDNDOSk7CiAJCXRfb3V0YihibHVlPj4xMCwweDNDOSk7CiAKLQl9IGVsc2UgaWYgKGJwcCA9PSAxNikgewkvKiBSR0IgNTY1ICovCi0JCXUzMiBjb2w7CisJfSBlbHNlIGlmIChyZWdubyA8IDE2KSB7CisJCWlmIChicHAgPT0gMTYpIHsJLyogUkdCIDU2NSAqLworCQkJdTMyIGNvbDsKIAotCQljb2wgPSAocmVkICYgMHhGODAwKSB8ICgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwKLQkJCSgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOwotCQljb2wgfD0gY29sIDw8IDE2OwkKLQkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSBjb2w7Ci0JfSBlbHNlIGlmIChicHAgPT0gMzIpCQkvKiBBUkdCIDg4ODggKi8KLQkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQotCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8MTYpIAl8Ci0JCQkoKHJlZCAmIDB4RkYwMCkgPDwgOCkgCQl8Ci0JCQkoKGdyZWVuICYgMHhGRjAwKSkJCXwKLQkJCSgoYmx1ZSAmIDB4RkYwMCk+PjgpOworCQkJY29sID0gKHJlZCAmIDB4RjgwMCkgfCAoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8CisJCQkJKChibHVlICYgMHhGODAwKSA+PiAxMSk7CisJCQljb2wgfD0gY29sIDw8IDE2OworCQkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSBjb2w7CisJCX0gZWxzZSBpZiAoYnBwID09IDMyKQkJLyogQVJHQiA4ODg4ICovCisJCQkoKHUzMiopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8MTYpIAl8CisJCQkJKChyZWQgJiAweEZGMDApIDw8IDgpIAkJfAorCQkJCSgoZ3JlZW4gJiAweEZGMDApKQkJfAorCQkJCSgoYmx1ZSAmIDB4RkYwMCk+PjgpOworCX0KIAogLy8JZGVidWcoImV4aXRcbiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90eDM5MTJmYi5jIGIvZHJpdmVycy92aWRlby90eDM5MTJmYi5jCmluZGV4IDA3Mzg5YmEuLmU2ZjdjNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHgzOTEyZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3R4MzkxMmZiLmMKQEAgLTI5MSw3ICsyOTEsNyBAQAogCWZiX2luZm8uZmJvcHMgPSAmdHgzOTEyZmJfb3BzOwogCWZiX2luZm8udmFyID0gdHgzOTEyZmJfdmFyOwogCWZiX2luZm8uZml4ID0gdHgzOTEyZmJfZml4OwotCWZiX2luZm8ucHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsZXR0ZTsKKwlmYl9pbmZvLnBzZXVkb19wYWxldHRlID0gY2ZiODsKIAlmYl9pbmZvLmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CiAKIAkvKiBDbGVhciB0aGUgZnJhbWVidWZmZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYyBiL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYwppbmRleCAzMGMwYjk0Li40YzNhNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCkBAIC02OCwyNiArNjgsMjYgQEAKIAogLyogQ1JUIHRpbWluZyByZWdpc3RlciBzZXRzICovCiAKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwMCwgMCwgN30sIHsweDM2LCAzLCAzfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfZGlzcGxheV9yZWdzW10gICAgID0ge3sweDAxLCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfc3RhcnRfcmVnc1tdID0ge3sweDAyLCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfZW5kX3JlZ3NbXSAgID0ge3sweDAzLCAwLCA0fSwgezB4MDUsIDcsIDd9LCB7MHgzMywgNSwgNX0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3N5bmNfc3RhcnRfcmVnc1tdICA9IHt7MHgwNCwgMCwgN30sIHsweDMzLCA0LCA0fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfc3luY19lbmRfcmVnc1tdICAgID0ge3sweDA1LCAwLCA0fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwMCwgMCwgN30sIHsweDM2LCAzLCAzfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2Rpc3BsYXlfcmVnc1tdICAgICA9IHt7MHgwMSwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9ibGFua19zdGFydF9yZWdzW10gPSB7ezB4MDIsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfZW5kX3JlZ3NbXSAgID0ge3sweDAzLCAwLCA0fSwgezB4MDUsIDcsIDd9LCB7MHgzMywgNSwgNX0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9zeW5jX3N0YXJ0X3JlZ3NbXSAgPSB7ezB4MDQsIDAsIDd9LCB7MHgzMywgNCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9zeW5jX2VuZF9yZWdzW10gICAgPSB7ezB4MDUsIDAsIDR9LCBWR0FfUkVHU0VUX0VORH07CiAKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwNiwgMCwgN30sIHsweDA3LCAwLCAwfSwgezB4MDcsIDUsIDV9LCB7MHgzNSwgMCwgMH0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2Rpc3BsYXlfcmVnc1tdICAgICA9IHt7MHgxMiwgMCwgN30sIHsweDA3LCAxLCAxfSwgezB4MDcsIDYsIDZ9LCB7MHgzNSwgMiwgMn0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX3N0YXJ0X3JlZ3NbXSA9IHt7MHgxNSwgMCwgN30sIHsweDA3LCAzLCAzfSwgezB4MDksIDUsIDV9LCB7MHgzNSwgMywgM30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX2VuZF9yZWdzW10gICA9IHt7MHgxNiwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfc3RhcnRfcmVnc1tdICA9IHt7MHgxMCwgMCwgN30sIHsweDA3LCAyLCAyfSwgezB4MDcsIDcsIDd9LCB7MHgzNSwgMSwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfZW5kX3JlZ3NbXSAgICA9IHt7MHgxMSwgMCwgM30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl90b3RhbF9yZWdzW10gICAgICAgPSB7ezB4MDYsIDAsIDd9LCB7MHgwNywgMCwgMH0sIHsweDA3LCA1LCA1fSwgezB4MzUsIDAsIDB9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfZGlzcGxheV9yZWdzW10gICAgID0ge3sweDEyLCAwLCA3fSwgezB4MDcsIDEsIDF9LCB7MHgwNywgNiwgNn0sIHsweDM1LCAyLCAyfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX3N0YXJ0X3JlZ3NbXSA9IHt7MHgxNSwgMCwgN30sIHsweDA3LCAzLCAzfSwgezB4MDksIDUsIDV9LCB7MHgzNSwgMywgM30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9ibGFua19lbmRfcmVnc1tdICAgPSB7ezB4MTYsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3Zfc3luY19zdGFydF9yZWdzW10gID0ge3sweDEwLCAwLCA3fSwgezB4MDcsIDIsIDJ9LCB7MHgwNywgNywgN30sIHsweDM1LCAxLCAxfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfZW5kX3JlZ3NbXSAgICA9IHt7MHgxMSwgMCwgM30sIFZHQV9SRUdTRVRfRU5EfTsKIAotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX29mZnNldF9yZWdzW10gICAgICAgID0ge3sweDEzLCAwLCA3fSwgezB4MzUsIDUsIDd9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfbGluZV9jb21wYXJlX3JlZ3NbXSAgPSB7ezB4MTgsIDAsIDd9LCB7MHgwNywgNCwgNH0sIHsweDA5LCA2LCA2fSwgezB4MzMsIDAsIDJ9LCB7MHgzNSwgNCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19mZXRjaF9jb3VudF9yZWdzW10gICA9IHt7MHgxQywgMCwgN30sIHsweDFELCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3N0YXJ0X2FkZHJlc3NfcmVnc1tdID0ge3sweDBkLCAwLCA3fSwgezB4MGMsIDAsIDd9LCB7MHgzNCwgMCwgN30sIHsweDQ4LCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19vZmZzZXRfcmVnc1tdICAgICAgICA9IHt7MHgxMywgMCwgN30sIHsweDM1LCA1LCA3fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19saW5lX2NvbXBhcmVfcmVnc1tdICA9IHt7MHgxOCwgMCwgN30sIHsweDA3LCA0LCA0fSwgezB4MDksIDYsIDZ9LCB7MHgzMywgMCwgMn0sIHsweDM1LCA0LCA0fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19mZXRjaF9jb3VudF9yZWdzW10gICA9IHt7MHgxQywgMCwgN30sIHsweDFELCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19zdGFydF9hZGRyZXNzX3JlZ3NbXSA9IHt7MHgwZCwgMCwgN30sIHsweDBjLCAwLCA3fSwgezB4MzQsIDAsIDd9LCB7MHg0OCwgMCwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKIAotc3RydWN0IHN2Z2FfdGltaW5nX3JlZ3MgdnQ4NjIzX3RpbWluZ19yZWdzICAgICA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3ZnYV90aW1pbmdfcmVncyB2dDg2MjNfdGltaW5nX3JlZ3MgICAgID0gewogCXZ0ODYyM19oX3RvdGFsX3JlZ3MsIHZ0ODYyM19oX2Rpc3BsYXlfcmVncywgdnQ4NjIzX2hfYmxhbmtfc3RhcnRfcmVncywKIAl2dDg2MjNfaF9ibGFua19lbmRfcmVncywgdnQ4NjIzX2hfc3luY19zdGFydF9yZWdzLCB2dDg2MjNfaF9zeW5jX2VuZF9yZWdzLAogCXZ0ODYyM192X3RvdGFsX3JlZ3MsIHZ0ODYyM192X2Rpc3BsYXlfcmVncywgdnQ4NjIzX3ZfYmxhbmtfc3RhcnRfcmVncywKQEAgLTkwMyw3ICs5MDMsNyBAQAogCiAvKiBEcml2ZXIgSW5pdGlhbGlzYXRpb24gKi8KIAotaW50IF9faW5pdCB2dDg2MjNmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB2dDg2MjNmYl9pbml0KHZvaWQpCiB7CiAKICNpZm5kZWYgTU9EVUxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL0tjb25maWcgYi9kcml2ZXJzL3cxL0tjb25maWcKaW5kZXggY2E3NWIzYS4uNjg1NGZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvS2NvbmZpZwpAQCAtMSw4ICsxLDYgQEAKLW1lbnUgIkRhbGxhcydzIDEtd2lyZSBidXMiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFcxCittZW51Y29uZmlnIFcxCiAJdHJpc3RhdGUgIkRhbGxhcydzIDEtd2lyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJLS0taGVscC0tLQogCSAgRGFsbGFzJyAxLXdpcmUgYnVzIGlzIHVzZWZ1bCB0byBjb25uZWN0IHNsb3cgMS1waW4gZGV2aWNlcwogCSAgc3VjaCBhcyBpQnV0dG9ucyBhbmQgdGhlcm1hbCBzZW5zb3JzLgpAQCAtMTIsOCArMTAsMTAgQEAKIAkgIFRoaXMgVzEgc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3aXJlLmtvLgogCitpZiBXMQorCiBjb25maWcgVzFfQ09OCi0JZGVwZW5kcyBvbiBDT05ORUNUT1IgJiYgVzEKKwlkZXBlbmRzIG9uIENPTk5FQ1RPUgogCWJvb2wgIlVzZXJzcGFjZSBjb21tdW5pY2F0aW9uIG92ZXIgY29ubmVjdG9yIgogCWRlZmF1bHQgeQogCS0tLSBoZWxwIC0tLQpAQCAtMjcsNCArMjcsNCBAQAogc291cmNlIGRyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCiBzb3VyY2UgZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwogCi1lbmRtZW51CitlbmRpZiAjIFcxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCmluZGV4IDhmNzc5MzMuLjgyMzZkNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCkBAIC0zLDExICszLDEwIEBACiAjCiAKIG1lbnUgIjEtd2lyZSBCdXMgTWFzdGVycyIKLQlkZXBlbmRzIG9uIFcxCiAKIGNvbmZpZyBXMV9NQVNURVJfTUFUUk9YCiAJdHJpc3RhdGUgIk1hdHJveCBHNDAwIHRyYW5zcG9ydCBsYXllciBmb3IgMS13aXJlIgotCWRlcGVuZHMgb24gVzEgJiYgUENJCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbW11bmljYXRlIHdpdGggeW91ciAxLXdpcmUgZGV2aWNlcwogCSAgdXNpbmcgTWF0cm94J3MgRzQwMCBHUElPIHBpbnMuCkBAIC0xNyw3ICsxNiw3IEBACiAKIGNvbmZpZyBXMV9NQVNURVJfRFMyNDkwCiAJdHJpc3RhdGUgIkRTMjQ5MCBVU0IgPC0+IFcxIHRyYW5zcG9ydCBsYXllciBmb3IgMS13aXJlIgotICAJZGVwZW5kcyBvbiBXMSAmJiBVU0IKKyAgCWRlcGVuZHMgb24gVVNCCiAgIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkcml2ZXIgZm9yIERTMjQ5MCBiYXNlZCBVU0IgPC0+IFcxIGJyaWRnZXMsCiAJICBmb3IgZXhhbXBsZSBEUzk0OTAqLgpAQCAtMjcsNyArMjYsNyBAQAogCiBjb25maWcgVzFfTUFTVEVSX0RTMjQ4MgogCXRyaXN0YXRlICJNYXhpbSBEUzI0ODIgSTJDIHRvIDEtV2lyZSBicmlkZ2UiCi0JZGVwZW5kcyBvbiBJMkMgJiYgVzEgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBEUzI0ODIKIAkgIEkyQyB0byAxLVdpcmUgYnJpZGdlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKaW5kZXggZGY5NWQ2Yy4uM2RmMjlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCkBAIC0zLDI1ICszLDIxIEBACiAjCiAKIG1lbnUgIjEtd2lyZSBTbGF2ZXMiCi0JZGVwZW5kcyBvbiBXMQogCiBjb25maWcgVzFfU0xBVkVfVEhFUk0KIAl0cmlzdGF0ZSAiVGhlcm1hbCBmYW1pbHkgaW1wbGVtZW50YXRpb24iCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCAxLXdpcmUgdGhlcm1hbCBzZW5zb3JzIHRvIHlvdXIKIAkgIHdpcmUuCiAKIGNvbmZpZyBXMV9TTEFWRV9TTUVNCiAJdHJpc3RhdGUgIlNpbXBsZSA2NGJpdCBtZW1vcnkgZmFtaWx5IGltcGxlbWVudGF0aW9uIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgMS13aXJlCiAJICBzaW1wbGUgNjRiaXQgbWVtb3J5IHJvbShkczI0MDEvZHMyNDExL2RzMTk5MCopIHRvIHlvdXIgd2lyZS4KIAogY29uZmlnIFcxX1NMQVZFX0RTMjQzMwogCXRyaXN0YXRlICI0a2IgRUVQUk9NIGZhbWlseSBzdXBwb3J0IChEUzI0MzMpIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIDEtd2lyZQogCSAgNGtiIEVFUFJPTSBmYW1pbHkgZGV2aWNlIChEUzI0MzMpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IGY1YzViNzYuLmM2MzMyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTgwNSw2ICs4MDUsNyBAQAogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgKm47CiAJaW50IGhhdmVfdG9fd2FpdCA9IDA7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgaGF2ZV90b193YWl0KSB7CiAJCWhhdmVfdG9fd2FpdCA9IDA7CiAKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDk0YjlkODYuLjYxM2RmNTUgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtOTkxLDcgKzk5MSw3IEBACiAKIGNvbmZpZyBIVUdFVExCRlMKIAlib29sICJIdWdlVExCIGZpbGUgc3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBYODYgfHwgSUE2NCB8fCBQUEM2NCB8fCBTUEFSQzY0IHx8IFNVUEVSSCB8fCBCUk9LRU4KKwlkZXBlbmRzIG9uIFg4NiB8fCBJQTY0IHx8IFBQQzY0IHx8IFNQQVJDNjQgfHwgKFNVUEVSSCAmJiBNTVUpIHx8IEJST0tFTgogCWhlbHAKIAkgIGh1Z2V0bGJmcyBpcyBhIGZpbGVzeXN0ZW0gYmFja2luZyBmb3IgSHVnZVRMQiBwYWdlcywgYmFzZWQgb24KIAkgIHJhbWZzLiBGb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgaXQsIHNheSBZIGhlcmUgYW5kIHJlYWQKQEAgLTE2NzUsNiArMTY3NSw3IEBACiBjb25maWcgTkZTRF9WNAogCWJvb2wgIlByb3ZpZGUgTkZTdjQgc2VydmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBORlNEX1YzICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBSUENTRUNfR1NTX0tSQjUKIAloZWxwCiAJICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIHRoZSBORlN2NCBzZXJ2ZXIgYXMgd2VsbCBhcyB0aGUgTkZTdjIKIAkgIGFuZCBORlN2MyBzZXJ2ZXJzLCBzYXkgWSBoZXJlLiAgVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbCwgYW5kCmRpZmYgLS1naXQgYS9mcy9hZnMvTWFrZWZpbGUgYi9mcy9hZnMvTWFrZWZpbGUKaW5kZXggNzNjZTU2MS4uYTY2NjcxMCAxMDA2NDQKLS0tIGEvZnMvYWZzL01ha2VmaWxlCisrKyBiL2ZzL2Fmcy9NYWtlZmlsZQpAQCAtOCw2ICs4LDcgQEAKIAljbXNlcnZpY2UubyBcCiAJZGlyLm8gXAogCWZpbGUubyBcCisJZmxvY2subyBcCiAJZnNjbGllbnQubyBcCiAJaW5vZGUubyBcCiAJbWFpbi5vIFwKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnMuaCBiL2ZzL2Fmcy9hZnMuaAppbmRleCAyNDUyNTc5Li5jNTQ4YWEzIDEwMDY0NAotLS0gYS9mcy9hZnMvYWZzLmgKKysrIGIvZnMvYWZzL2Fmcy5oCkBAIC0zNyw2ICszNywxMyBAQAogCUFGU19GVFlQRV9TWU1MSU5LCT0gMywKIH0gYWZzX2ZpbGVfdHlwZV90OwogCit0eXBlZGVmIGVudW0geworCUFGU19MT0NLX1JFQUQJCT0gMCwJLyogcmVhZCBsb2NrIHJlcXVlc3QgKi8KKwlBRlNfTE9DS19XUklURQkJPSAxLAkvKiB3cml0ZSBsb2NrIHJlcXVlc3QgKi8KK30gYWZzX2xvY2tfdHlwZV90OworCisjZGVmaW5lIEFGU19MT0NLV0FJVAkJKDUgKiA2MCkgLyogdGltZSB1bnRpbCBhIGxvY2sgdGltZXMgb3V0IChzZWNvbmRzKSAqLworCiAvKgogICogQUZTIGZpbGUgaWRlbnRpZmllcgogICovCkBAIC0xMjAsNiArMTI3LDcgQEAKIAlzdHJ1Y3QgYWZzX2ZpZAkJcGFyZW50OwkJLyogcGFyZW50IGRpciBJRCBmb3Igbm9uLWRpcnMgb25seSAqLwogCXRpbWVfdAkJCW10aW1lX2NsaWVudDsJLyogbGFzdCB0aW1lIGNsaWVudCBjaGFuZ2VkIGRhdGEgKi8KIAl0aW1lX3QJCQltdGltZV9zZXJ2ZXI7CS8qIGxhc3QgdGltZSBzZXJ2ZXIgY2hhbmdlZCBkYXRhICovCisJczMyCQkJbG9ja19jb3VudDsJLyogZmlsZSBsb2NrIGNvdW50ICgwPVVOTEsgLTE9V1JMQ0sgK3ZlPSNSRExDSyAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnNfZnMuaCBiL2ZzL2Fmcy9hZnNfZnMuaAppbmRleCBhMThjMzc0Li5lYjY0NzMyIDEwMDY0NAotLS0gYS9mcy9hZnMvYWZzX2ZzLmgKKysrIGIvZnMvYWZzL2Fmc19mcy5oCkBAIC0zMSw2ICszMSw5IEBACiAJRlNHRVRWT0xVTUVJTkZPCQk9IDE0OCwJLyogQUZTIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHZvbHVtZSAqLwogCUZTR0VUVk9MVU1FU1RBVFVTCT0gMTQ5LAkvKiBBRlMgR2V0IHZvbHVtZSBzdGF0dXMgaW5mb3JtYXRpb24gKi8KIAlGU0dFVFJPT1RWT0xVTUUJCT0gMTUxLAkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIG5hbWUgKi8KKwlGU1NFVExPQ0sJCT0gMTU2LAkvKiBBRlMgUmVxdWVzdCBhIGZpbGUgbG9jayAqLworCUZTRVhURU5ETE9DSwkJPSAxNTcsCS8qIEFGUyBFeHRlbmQgYSBmaWxlIGxvY2sgKi8KKwlGU1JFTEVBU0VMT0NLCQk9IDE1OCwJLyogQUZTIFJlbGVhc2UgYSBmaWxlIGxvY2sgKi8KIAlGU0xPT0tVUAkJPSAxNjEsCS8qIEFGUyBsb29rdXAgZmlsZSBpbiBkaXJlY3RvcnkgKi8KIAlGU0ZFVENIREFUQTY0CQk9IDY1NTM3LCAvKiBBRlMgRmV0Y2ggZmlsZSBkYXRhICovCiAJRlNTVE9SRURBVEE2NAkJPSA2NTUzOCwgLyogQUZTIFN0b3JlIGZpbGUgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NhbGxiYWNrLmMgYi9mcy9hZnMvY2FsbGJhY2suYwppbmRleCBiYWNmNTE4Li5iODI0Mzk0IDEwMDY0NAotLS0gYS9mcy9hZnMvY2FsbGJhY2suYworKysgYi9mcy9hZnMvY2FsbGJhY2suYwpAQCAtMTI1LDYgKzEyNSw5IEBACiAJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOwogCiAJCXF1ZXVlX3dvcmsoYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIsICZ2bm9kZS0+Y2JfYnJva2VuX3dvcmspOworCQlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpICYmCisJCSAgICAhbGlzdF9lbXB0eSgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpKQorCQkJYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZSh2bm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Rpci5jIGIvZnMvYWZzL2Rpci5jCmluZGV4IDU0NmM1OTUuLjMzZmUzOWEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9kaXIuYworKysgYi9mcy9hZnMvZGlyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAkub3BlbgkJPSBhZnNfZGlyX29wZW4sCiAJLnJlbGVhc2UJPSBhZnNfcmVsZWFzZSwKIAkucmVhZGRpcgk9IGFmc19yZWFkZGlyLAorCS5sb2NrCQk9IGFmc19sb2NrLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZpbGUuYyBiL2ZzL2Fmcy9maWxlLmMKaW5kZXggYWVkZTdlYi4uNTI1ZjdjNSAxMDA2NDQKLS0tIGEvZnMvYWZzL2ZpbGUuYworKysgYi9mcy9hZnMvZmlsZS5jCkBAIC0zNCw2ICszNCw4IEBACiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogCS5mc3luYwkJPSBhZnNfZnN5bmMsCisJLmxvY2sJCT0gYWZzX2xvY2ssCisJLmZsb2NrCQk9IGFmc19mbG9jaywKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9hZnMvZmxvY2suYyBiL2ZzL2Fmcy9mbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDdmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvZmxvY2suYwpAQCAtMCwwICsxLDU1OCBAQAorLyogQUZTIGZpbGUgbG9ja2luZyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgQUZTX0xPQ0tfR1JBTlRFRAkwCisjZGVmaW5lIEFGU19MT0NLX1BFTkRJTkcJMQorCitzdGF0aWMgdm9pZCBhZnNfZmxfY29weV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKm5ldywgc3RydWN0IGZpbGVfbG9jayAqZmwpOworc3RhdGljIHZvaWQgYWZzX2ZsX3JlbGVhc2VfcHJpdmF0ZShzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX2xvY2tfbWFuYWdlcjsKKworc3RhdGljIHN0cnVjdCBmaWxlX2xvY2tfb3BlcmF0aW9ucyBhZnNfbG9ja19vcHMgPSB7CisJLmZsX2NvcHlfbG9jawkJPSBhZnNfZmxfY29weV9sb2NrLAorCS5mbF9yZWxlYXNlX3ByaXZhdGUJPSBhZnNfZmxfcmVsZWFzZV9wcml2YXRlLAorfTsKKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIGxvY2sgbWFuYWdlciB0aHJlYWQgaWYgaXQgaXNuJ3QgYWxyZWFkeSBydW5uaW5nCisgKi8KK3N0YXRpYyBpbnQgYWZzX2luaXRfbG9ja19tYW5hZ2VyKHZvaWQpCit7CisJaWYgKCFhZnNfbG9ja19tYW5hZ2VyKSB7CisJCWFmc19sb2NrX21hbmFnZXIgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2Fmc19sb2NrZCIpOworCQlpZiAoIWFmc19sb2NrX21hbmFnZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZXN0cm95IHRoZSBsb2NrIG1hbmFnZXIgdGhyZWFkIGlmIGl0J3MgcnVubmluZworICovCit2b2lkIF9fZXhpdCBhZnNfa2lsbF9sb2NrX21hbmFnZXIodm9pZCkKK3sKKwlpZiAoYWZzX2xvY2tfbWFuYWdlcikKKwkJZGVzdHJveV93b3JrcXVldWUoYWZzX2xvY2tfbWFuYWdlcik7Cit9CisKKy8qCisgKiBpZiB0aGUgY2FsbGJhY2sgaXMgYnJva2VuIG9uIHRoaXMgdm5vZGUsIHRoZW4gdGhlIGxvY2sgbWF5IG5vdyBiZSBhdmFpbGFibGUKKyAqLwordm9pZCBhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCV9lbnRlcigieyV4OiV1fSIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfbG9ja19tYW5hZ2VyLCAmdm5vZGUtPmxvY2tfd29yaywgMCk7Cit9CisKKy8qCisgKiB0aGUgbG9jayB3aWxsIHRpbWUgb3V0IGluIDUgbWludXRlcyB1bmxlc3Mgd2UgZXh0ZW5kIGl0LCBzbyBzY2hlZHVsZQorICogZXh0ZW5zaW9uIGluIGEgYml0IGxlc3MgdGhhbiB0aGF0IHRpbWUKKyAqLworc3RhdGljIHZvaWQgYWZzX3NjaGVkdWxlX2xvY2tfZXh0ZW5zaW9uKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfbG9ja19tYW5hZ2VyLCAmdm5vZGUtPmxvY2tfd29yaywKKwkJCSAgIEFGU19MT0NLV0FJVCAqIEhaIC8gMik7Cit9CisKKy8qCisgKiBkbyB3b3JrIGZvciBhIGxvY2ssIGluY2x1ZGluZzoKKyAqIC0gcHJvYmluZyBmb3IgYSBsb2NrIHdlJ3JlIHdhaXRpbmcgb24gYnV0IGRpZG4ndCBnZXQgaW1tZWRpYXRlbHkKKyAqIC0gZXh0ZW5kaW5nIGEgbG9jayB0aGF0J3MgY2xvc2UgdG8gdGltaW5nIG91dAorICovCit2b2lkIGFmc19sb2NrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfdm5vZGUsIGxvY2tfd29yay53b3JrKTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlhZnNfbG9ja190eXBlX3QgdHlwZTsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCV9lbnRlcigieyV4OiV1fSIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9VTkxPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKSB7CisJCV9kZWJ1ZygidW5sb2NrIik7CisJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJLyogYXR0ZW1wdCB0byByZWxlYXNlIHRoZSBzZXJ2ZXIgbG9jazsgaWYgaXQgZmFpbHMsIHdlIGp1c3QKKwkJICogd2FpdCA1IG1pbnV0ZXMgYW5kIGl0J2xsIHRpbWUgb3V0IGFueXdheSAqLworCQlyZXQgPSBhZnNfdm5vZGVfcmVsZWFzZV9sb2NrKHZub2RlLCB2bm9kZS0+dW5sb2NrX2tleSk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUZTOiIKKwkJCSAgICAgICAiIEZhaWxlZCB0byByZWxlYXNlIGxvY2sgb24geyV4OiV4fSBlcnJvciAlZFxuIiwKKwkJCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgcmV0KTsKKworCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJa2V5X3B1dCh2bm9kZS0+dW5sb2NrX2tleSk7CisJCXZub2RlLT51bmxvY2tfa2V5ID0gTlVMTDsKKwkJY2xlYXJfYml0KEFGU19WTk9ERV9VTkxPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpOworCX0KKworCS8qIGlmIHdlJ3ZlIGdvdCBhIGxvY2ssIHRoZW4gaXQgbXVzdCBiZSB0aW1lIHRvIGV4dGVuZCB0aGF0IGxvY2sgYXMgQUZTCisJICogbG9ja3MgdGltZSBvdXQgYWZ0ZXIgNSBtaW51dGVzICovCisJaWYgKCFsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpIHsKKwkJX2RlYnVnKCJleHRlbmQiKTsKKworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncykpCisJCQlCVUcoKTsKKwkJZmwgPSBsaXN0X2VudHJ5KHZub2RlLT5ncmFudGVkX2xvY2tzLm5leHQsCisJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfdS5hZnMubGluayk7CisJCWtleSA9IGtleV9nZXQoZmwtPmZsX2ZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJcmV0ID0gYWZzX3Zub2RlX2V4dGVuZF9sb2NrKHZub2RlLCBrZXkpOworCQljbGVhcl9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpOworCQlrZXlfcHV0KGtleSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWFmc19zY2hlZHVsZV9sb2NrX2V4dGVuc2lvbih2bm9kZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHVtbW0uLi4gd2UgZmFpbGVkIHRvIGV4dGVuZCB0aGUgbG9jayAtIHJldHJ5CisJCQkgKiBleHRlbnNpb24gc2hvcnRseSAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUZTOiIKKwkJCSAgICAgICAiIEZhaWxlZCB0byBleHRlbmQgbG9jayBvbiB7JXg6JXh9IGVycm9yICVkXG4iLAorCQkJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCByZXQpOworCQkJcXVldWVfZGVsYXllZF93b3JrKGFmc19sb2NrX21hbmFnZXIsICZ2bm9kZS0+bG9ja193b3JrLAorCQkJCQkgICBIWiAqIDEwKTsKKwkJCWJyZWFrOworCQl9CisJCV9sZWF2ZSgiIFtleHRlbmRdIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB3ZSBkb24ndCBoYXZlIGEgZ3JhbnRlZCBsb2NrLCB0aGVuIHdlIG11c3QndmUgYmVlbiBjYWxsZWQgYmFjayBieQorCSAqIHRoZSBzZXJ2ZXIsIGFuZCBzbyBpZiBtaWdodCBiZSBwb3NzaWJsZSB0byBnZXQgYSBsb2NrIHdlJ3JlCisJICogY3VycmVudGx5IHdhaXRpbmcgZm9yICovCisJaWYgKCFsaXN0X2VtcHR5KCZ2bm9kZS0+cGVuZGluZ19sb2NrcykpIHsKKwkJX2RlYnVnKCJnZXQiKTsKKworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncykpCisJCQlCVUcoKTsKKwkJZmwgPSBsaXN0X2VudHJ5KHZub2RlLT5wZW5kaW5nX2xvY2tzLm5leHQsCisJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfdS5hZnMubGluayk7CisJCWtleSA9IGtleV9nZXQoZmwtPmZsX2ZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXR5cGUgPSAoZmwtPmZsX3R5cGUgPT0gRl9SRExDSykgPworCQkJQUZTX0xPQ0tfUkVBRCA6IEFGU19MT0NLX1dSSVRFOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCXJldCA9IGFmc192bm9kZV9zZXRfbG9jayh2bm9kZSwga2V5LCB0eXBlKTsKKwkJY2xlYXJfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAtRVdPVUxEQkxPQ0s6CisJCQlfZGVidWcoImJsb2NrZWQiKTsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlfZGVidWcoImFjcXVpcmVkIik7CisJCQlpZiAodHlwZSA9PSBBRlNfTE9DS19SRUFEKQorCQkJCXNldF9iaXQoQUZTX1ZOT0RFX1JFQURMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpOworCQkJZWxzZQorCQkJCXNldF9iaXQoQUZTX1ZOT0RFX1dSSVRFTE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCXJldCA9IEFGU19MT0NLX0dSQU5URUQ7CisJCWRlZmF1bHQ6CisJCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJCS8qIHRoZSBwZW5kaW5nIGxvY2sgbWF5IGhhdmUgYmVlbiB3aXRoZHJhd24gZHVlIHRvIGEKKwkJCSAqIHNpZ25hbCAqLworCQkJaWYgKGxpc3RfZW50cnkodm5vZGUtPnBlbmRpbmdfbG9ja3MubmV4dCwKKwkJCQkgICAgICAgc3RydWN0IGZpbGVfbG9jaywgZmxfdS5hZnMubGluaykgPT0gZmwpIHsKKwkJCQlmbC0+ZmxfdS5hZnMuc3RhdGUgPSByZXQ7CisJCQkJaWYgKHJldCA9PSBBRlNfTE9DS19HUkFOVEVEKQorCQkJCQlsaXN0X21vdmVfdGFpbCgmZmwtPmZsX3UuYWZzLmxpbmssCisJCQkJCQkgICAgICAgJnZub2RlLT5ncmFudGVkX2xvY2tzKTsKKwkJCQllbHNlCisJCQkJCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwkJCQl3YWtlX3VwKCZmbC0+Zmxfd2FpdCk7CisJCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJCX0gZWxzZSB7CisJCQkJX2RlYnVnKCJ3aXRoZHJhd24iKTsKKwkJCQljbGVhcl9iaXQoQUZTX1ZOT0RFX1JFQURMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpOworCQkJCWNsZWFyX2JpdChBRlNfVk5PREVfV1JJVEVMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkJYWZzX3Zub2RlX3JlbGVhc2VfbG9jayh2bm9kZSwga2V5KTsKKwkJCQlpZiAoIWxpc3RfZW1wdHkoJnZub2RlLT5wZW5kaW5nX2xvY2tzKSkKKwkJCQkJYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZSh2bm9kZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlrZXlfcHV0KGtleSk7CisJCV9sZWF2ZSgiIFtwZW5kXSIpOworCQlyZXR1cm47CisJfQorCisJLyogbG9va3MgbGlrZSB0aGUgbG9jayByZXF1ZXN0IHdhcyB3aXRoZHJhd24gb24gYSBzaWduYWwgKi8KKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCV9sZWF2ZSgiIFtubyBsb2Nrc10iKTsKK30KKworLyoKKyAqIHBhc3MgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSB1bmxvY2tpbmcgb2YgYSB2bm9kZSBvbiB0aGUgc2VydmVyIHRvIHRoZQorICogbWFuYWdlciB0aHJlYWQsIGxlc3QgYSBwZW5kaW5nIHNpZ25hbCBpbiB0aGUgY2FsbGluZyB0aHJlYWQgaW50ZXJydXB0CisgKiBBRl9SWFJQQworICogLSB0aGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgdm5vZGUgbG9jaworICovCitzdGF0aWMgdm9pZCBhZnNfZGVmZXJfdW5sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCit7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmdm5vZGUtPmxvY2tfd29yayk7CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQUZTX1ZOT0RFX1JFQURMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2FuZF9jbGVhcl9iaXQoQUZTX1ZOT0RFX1dSSVRFTE9DS0VELCAmdm5vZGUtPmZsYWdzKSkKKwkJQlVHKCk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoQUZTX1ZOT0RFX1VOTE9DS0lORywgJnZub2RlLT5mbGFncykpCisJCUJVRygpOworCXZub2RlLT51bmxvY2tfa2V5ID0ga2V5X2dldChrZXkpOworCWFmc19sb2NrX21heV9iZV9hdmFpbGFibGUodm5vZGUpOworfQorCisvKgorICogcmVxdWVzdCBhIGxvY2sgb24gYSBmaWxlIG9uIHRoZSBzZXJ2ZXIKKyAqLworc3RhdGljIGludCBhZnNfZG9fc2V0bGsoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKKwlhZnNfbG9ja190eXBlX3QgdHlwZTsKKwlzdHJ1Y3Qga2V5ICprZXkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCV9lbnRlcigieyV4OiV1fSwldSIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBmbC0+ZmxfdHlwZSk7CisKKwkvKiBvbmx5IHdob2xlLWZpbGUgbG9ja3MgYXJlIHN1cHBvcnRlZCAqLworCWlmIChmbC0+Zmxfc3RhcnQgIT0gMCB8fCBmbC0+ZmxfZW5kICE9IE9GRlNFVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWZzX2luaXRfbG9ja19tYW5hZ2VyKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmbC0+Zmxfb3BzID0gJmFmc19sb2NrX29wczsKKwlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX3UuYWZzLmxpbmspOworCWZsLT5mbF91LmFmcy5zdGF0ZSA9IEFGU19MT0NLX1BFTkRJTkc7CisKKwl0eXBlID0gKGZsLT5mbF90eXBlID09IEZfUkRMQ0spID8gQUZTX0xPQ0tfUkVBRCA6IEFGU19MT0NLX1dSSVRFOworCisJbG9ja19rZXJuZWwoKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSd2ZSBnb3QgYSBjYWxsYmFjayBvbiB0aGlzIGZpbGUgYW5kIHRoYXQgb3VyIHZpZXcgb2YgdGhlCisJICogZGF0YSB2ZXJzaW9uIGlzIHVwIHRvIGRhdGUgKi8KKwlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKHZub2RlLT5zdGF0dXMubG9ja19jb3VudCAhPSAwICYmICEoZmwtPmZsX2ZsYWdzICYgRkxfU0xFRVApKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpKSB7CisJCS8qIGlmIHRoZXJlJ3Mgbm8tb25lIGVsc2Ugd2l0aCBhIGxvY2sgb24gdGhpcyB2bm9kZSwgdGhlbiB3ZQorCQkgKiBuZWVkIHRvIGFzayB0aGUgc2VydmVyIGZvciBhIGxvY2sgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSkgeworCQkJX2RlYnVnKCJub3QgbG9ja2VkIik7CisJCQlBU1NFUlRDTVAodm5vZGUtPmZsYWdzICYKKwkJCQkgICgoMSA8PCBBRlNfVk5PREVfTE9DS0lORykgfAorCQkJCSAgICgxIDw8IEFGU19WTk9ERV9SRUFETE9DS0VEKSB8CisJCQkJICAgKDEgPDwgQUZTX1ZOT0RFX1dSSVRFTE9DS0VEKSksID09LCAwKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmZsLT5mbF91LmFmcy5saW5rLCAmdm5vZGUtPnBlbmRpbmdfbG9ja3MpOworCQkJc2V0X2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncyk7CisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCQlyZXQgPSBhZnNfdm5vZGVfc2V0X2xvY2sodm5vZGUsIGtleSwgdHlwZSk7CisJCQljbGVhcl9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpOworCQkJc3dpdGNoIChyZXQpIHsKKwkJCWNhc2UgMDoKKwkJCQlnb3RvIGFjcXVpcmVkX3NlcnZlcl9sb2NrOworCQkJY2FzZSAtRVdPVUxEQkxPQ0s6CisJCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkJQVNTRVJUKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSk7CisJCQkJQVNTRVJUQ01QKHZub2RlLT5wZW5kaW5nX2xvY2tzLm5leHQsID09LAorCQkJCQkgICZmbC0+ZmxfdS5hZnMubGluayk7CisJCQkJZ290byB3YWl0OworCQkJZGVmYXVsdDoKKwkJCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7CisJCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisKKwkJLyogaWYgd2UndmUgYWxyZWFkeSBnb3QgYSByZWFkbG9jayBvbiB0aGUgc2VydmVyIGFuZCBubyB3YWl0aW5nCisJCSAqIHdyaXRlbG9ja3MsIHRoZW4gd2UgbWlnaHQgYmUgYWJsZSB0byBpbnN0YW50bHkgZ3JhbnQgYW5vdGhlcgorCQkgKiByZWFkbG9jayAqLworCQlpZiAodHlwZSA9PSBBRlNfTE9DS19SRUFEICYmCisJCSAgICB2bm9kZS0+ZmxhZ3MgJiAoMSA8PCBBRlNfVk5PREVfUkVBRExPQ0tFRCkpIHsKKwkJCV9kZWJ1ZygiaW5zdGFudCByZWFkbG9jayIpOworCQkJQVNTRVJUQ01QKHZub2RlLT5mbGFncyAmCisJCQkJICAoKDEgPDwgQUZTX1ZOT0RFX0xPQ0tJTkcpIHwKKwkJCQkgICAoMSA8PCBBRlNfVk5PREVfV1JJVEVMT0NLRUQpKSwgPT0sIDApOworCQkJQVNTRVJUKCFsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpOworCQkJZ290byBzaGFyaW5nX2V4aXN0aW5nX2xvY2s7CisJCX0KKwl9CisKKwkvKiBvdGhlcndpc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgYSBsb2NhbCBsb2NrIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwlfZGVidWcoIndhaXQgbG9jYWwiKTsKKwlsaXN0X2FkZF90YWlsKCZmbC0+ZmxfdS5hZnMubGluaywgJnZub2RlLT5wZW5kaW5nX2xvY2tzKTsKK3dhaXQ6CisJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfU0xFRVApKSB7CisJCV9kZWJ1Zygibm9ibG9jayIpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGFib3J0X2F0dGVtcHQ7CisJfQorCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkvKiBub3cgd2UgbmVlZCB0byBzbGVlcCBhbmQgd2FpdCBmb3IgdGhlIGxvY2sgbWFuYWdlciB0aHJlYWQgdG8gZ2V0IHRoZQorCSAqIGxvY2sgZnJvbSB0aGUgc2VydmVyICovCisJX2RlYnVnKCJzbGVlcCIpOworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmbC0+Zmxfd2FpdCwKKwkJCQkgICAgICAgZmwtPmZsX3UuYWZzLnN0YXRlIDw9IEFGU19MT0NLX0dSQU5URUQpOworCWlmIChmbC0+ZmxfdS5hZnMuc3RhdGUgPD0gQUZTX0xPQ0tfR1JBTlRFRCkgeworCQlyZXQgPSBmbC0+ZmxfdS5hZnMuc3RhdGU7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCWdvdG8gZ2l2ZW5fbG9jazsKKwl9CisKKwkvKiB3ZSB3ZXJlIGludGVycnVwdGVkLCBidXQgc29tZW9uZSBtYXkgc3RpbGwgYmUgaW4gdGhlIHRocm9lcyBvZgorCSAqIGdpdmluZyB1cyB0aGUgbG9jayAqLworCV9kZWJ1ZygiaW50ciIpOworCUFTU0VSVENNUChyZXQsID09LCAtRVJFU1RBUlRTWVMpOworCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJaWYgKGZsLT5mbF91LmFmcy5zdGF0ZSA8PSBBRlNfTE9DS19HUkFOVEVEKSB7CisJCXJldCA9IGZsLT5mbF91LmFmcy5zdGF0ZTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWdvdG8gZ2l2ZW5fbG9jazsKKwl9CisKK2Fib3J0X2F0dGVtcHQ6CisJLyogd2UgYXJlbid0IGdvaW5nIHRvIGdldCB0aGUgbG9jaywgZWl0aGVyIGJlY2F1c2Ugd2UncmUgdW53aWxsaW5nIHRvCisJICogd2FpdCwgb3IgYmVjYXVzZSBzb21lIHNpZ25hbCBoYXBwZW5lZCAqLworCV9kZWJ1ZygiYWJvcnQiKTsKKwlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpICYmCisJICAgIHZub2RlLT5wZW5kaW5nX2xvY2tzLm5leHQgPT0gJmZsLT5mbF91LmFmcy5saW5rKSB7CisJCWlmICh2bm9kZS0+cGVuZGluZ19sb2Nrcy5wcmV2ICE9ICZmbC0+ZmxfdS5hZnMubGluaykgeworCQkJLyoga2ljayB0aGUgbmV4dCBwZW5kaW5nIGxvY2sgaW50byBoYXZpbmcgYSBnbyAqLworCQkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCQkJYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZSh2bm9kZSk7CisJCX0KKwl9IGVsc2UgeworCQlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7CisJfQorCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJZ290byBlcnJvcjsKKworYWNxdWlyZWRfc2VydmVyX2xvY2s6CisJLyogd2UndmUgYWNxdWlyZWQgYSBzZXJ2ZXIgbG9jaywgYnV0IGl0IG5lZWRzIHRvIGJlIHJlbmV3ZWQgYWZ0ZXIgNQorCSAqIG1pbnMgKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwlhZnNfc2NoZWR1bGVfbG9ja19leHRlbnNpb24odm5vZGUpOworCWlmICh0eXBlID09IEFGU19MT0NLX1JFQUQpCisJCXNldF9iaXQoQUZTX1ZOT0RFX1JFQURMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpOworCWVsc2UKKwkJc2V0X2JpdChBRlNfVk5PREVfV1JJVEVMT0NLRUQsICZ2bm9kZS0+ZmxhZ3MpOworc2hhcmluZ19leGlzdGluZ19sb2NrOgorCS8qIHRoZSBsb2NrIGhhcyBiZWVuIGdyYW50ZWQgYXMgZmFyIGFzIHdlJ3JlIGNvbmNlcm5lZC4uLiAqLworCWZsLT5mbF91LmFmcy5zdGF0ZSA9IEFGU19MT0NLX0dSQU5URUQ7CisJbGlzdF9tb3ZlX3RhaWwoJmZsLT5mbF91LmFmcy5saW5rLCAmdm5vZGUtPmdyYW50ZWRfbG9ja3MpOworZ2l2ZW5fbG9jazoKKwkvKiAuLi4gYnV0IHdlIGRvIHN0aWxsIG5lZWQgdG8gZ2V0IHRoZSBWRlMncyBibGVzc2luZyAqLworCUFTU0VSVCghKHZub2RlLT5mbGFncyAmICgxIDw8IEFGU19WTk9ERV9MT0NLSU5HKSkpOworCUFTU0VSVCgodm5vZGUtPmZsYWdzICYgKCgxIDw8IEFGU19WTk9ERV9SRUFETE9DS0VEKSB8CisJCQkJKDEgPDwgQUZTX1ZOT0RFX1dSSVRFTE9DS0VEKSkpICE9IDApOworCXJldCA9IHBvc2l4X2xvY2tfZmlsZShmaWxlLCBmbCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdmZzX3JlamVjdGVkX2xvY2s7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCS8qIGFnYWluLCBtYWtlIHN1cmUgd2UndmUgZ290IGEgY2FsbGJhY2sgb24gdGhpcyBmaWxlIGFuZCwgYWdhaW4sIG1ha2UKKwkgKiBzdXJlIHRoYXQgb3VyIHZpZXcgb2YgdGhlIGRhdGEgdmVyc2lvbiBpcyB1cCB0byBkYXRlICh3ZSBpZ25vcmUKKwkgKiBlcnJvcnMgaW5jdXJyZWQgaGVyZSBhbmQgZGVhbCB3aXRoIHRoZSBjb25zZXF1ZW5jZXMgZWxzZXdoZXJlKSAqLworCWFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUsIE5VTEwsIGtleSk7CisKK2Vycm9yOgorCXVubG9ja19rZXJuZWwoKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit2ZnNfcmVqZWN0ZWRfbG9jazoKKwkvKiB0aGUgVkZTIHJlamVjdGVkIHRoZSBsb2NrIHdlIGp1c3Qgb2J0YWluZWQsIHNvIHdlIGhhdmUgdG8gZGlzY2FyZAorCSAqIHdoYXQgd2UganVzdCBnb3QgKi8KKwlfZGVidWcoInZmcyByZWZ1c2VkICVkIiwgcmV0KTsKKwlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7CisJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSkKKwkJYWZzX2RlZmVyX3VubG9jayh2bm9kZSwga2V5KTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCWdvdG8gYWJvcnRfYXR0ZW1wdDsKK30KKworLyoKKyAqIHVubG9jayBvbiBhIGZpbGUgb24gdGhlIHNlcnZlcgorICovCitzdGF0aWMgaW50IGFmc19kb191bmxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCk7CisJc3RydWN0IGtleSAqa2V5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlfZW50ZXIoInsleDoldX0sJXUiLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgZmwtPmZsX3R5cGUpOworCisJLyogb25seSB3aG9sZS1maWxlIHVubG9ja3MgYXJlIHN1cHBvcnRlZCAqLworCWlmIChmbC0+Zmxfc3RhcnQgIT0gMCB8fCBmbC0+ZmxfZW5kICE9IE9GRlNFVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZmwtPmZsX29wcyA9ICZhZnNfbG9ja19vcHM7CisJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwlmbC0+ZmxfdS5hZnMuc3RhdGUgPSBBRlNfTE9DS19QRU5ESU5HOworCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJcmV0ID0gcG9zaXhfbG9ja19maWxlKGZpbGUsIGZsLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQlfbGVhdmUoIiA9ICVkIFt2ZnNdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBkaXNjYXJkIHRoZSBzZXJ2ZXIgbG9jayBvbmx5IGlmIGFsbCBncmFudGVkIGxvY2tzIGFyZSBnb25lICovCisJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSkKKwkJYWZzX2RlZmVyX3VubG9jayh2bm9kZSwga2V5KTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jayB3ZSBjdXJyZW50bHkgaG9sZCwgaWYgaW5kZWVkIHdlIGhvbGQgb25lCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RvX2dldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCk7CisJc3RydWN0IGtleSAqa2V5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQsIGxvY2tfY291bnQ7CisKKwlfZW50ZXIoIiIpOworCisJZmwtPmZsX3R5cGUgPSBGX1VOTENLOworCisJbXV0ZXhfbG9jaygmdm5vZGUtPnZmc19pbm9kZS5pX211dGV4KTsKKworCS8qIGNoZWNrIGxvY2FsIGxvY2sgcmVjb3JkcyBmaXJzdCAqLworCXJldCA9IDA7CisJaWYgKHBvc2l4X3Rlc3RfbG9jayhmaWxlLCBmbCkgPT0gMCkgeworCQkvKiBubyBsb2NhbCBsb2NrczsgY29uc3VsdCB0aGUgc2VydmVyICovCisJCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUsIE5VTEwsIGtleSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJbG9ja19jb3VudCA9IHZub2RlLT5zdGF0dXMubG9ja19jb3VudDsKKwkJaWYgKGxvY2tfY291bnQpIHsKKwkJCWlmIChsb2NrX2NvdW50ID4gMCkKKwkJCQlmbC0+ZmxfdHlwZSA9IEZfUkRMQ0s7CisJCQllbHNlCisJCQkJZmwtPmZsX3R5cGUgPSBGX1dSTENLOworCQkJZmwtPmZsX3N0YXJ0ID0gMDsKKwkJCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCQl9CisJfQorCitlcnJvcjoKKwltdXRleF91bmxvY2soJnZub2RlLT52ZnNfaW5vZGUuaV9tdXRleCk7CisJX2xlYXZlKCIgPSAlZCBbJWhkXSIsIHJldCwgZmwtPmZsX3R5cGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBtYW5hZ2UgUE9TSVggbG9ja3Mgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlfZW50ZXIoInsleDoldX0sJWQse3Q9JXgsZmw9JXgscj0lTGQ6JUxkfSIsCisJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBjbWQsCisJICAgICAgIGZsLT5mbF90eXBlLCBmbC0+ZmxfZmxhZ3MsCisJICAgICAgIChsb25nIGxvbmcpIGZsLT5mbF9zdGFydCwgKGxvbmcgbG9uZykgZmwtPmZsX2VuZCk7CisKKwkvKiBBRlMgZG9lc24ndCBzdXBwb3J0IG1hbmRhdG9yeSBsb2NrcyAqLworCWlmICgodm5vZGUtPnZmc19pbm9kZS5pX21vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSBTX0lTR0lEICYmCisJICAgIGZsLT5mbF90eXBlICE9IEZfVU5MQ0spCisJCXJldHVybiAtRU5PTENLOworCisJaWYgKElTX0dFVExLKGNtZCkpCisJCXJldHVybiBhZnNfZG9fZ2V0bGsoZmlsZSwgZmwpOworCWlmIChmbC0+ZmxfdHlwZSA9PSBGX1VOTENLKQorCQlyZXR1cm4gYWZzX2RvX3VubGsoZmlsZSwgZmwpOworCXJldHVybiBhZnNfZG9fc2V0bGsoZmlsZSwgZmwpOworfQorCisvKgorICogbWFuYWdlIEZMT0NLIGxvY2tzIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2Zsb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKworCV9lbnRlcigieyV4OiV1fSwlZCx7dD0leCxmbD0leH0iLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgY21kLAorCSAgICAgICBmbC0+ZmxfdHlwZSwgZmwtPmZsX2ZsYWdzKTsKKworCS8qCisJICogTm8gQlNEIGZsb2NrcyBvdmVyIE5GUyBhbGxvd2VkLgorCSAqIE5vdGU6IHdlIGNvdWxkIHRyeSB0byBmYWtlIGEgUE9TSVggbG9jayByZXF1ZXN0IGhlcmUgYnkKKwkgKiB1c2luZyAoKHUzMikgZmlscCB8IDB4ODAwMDAwMDApIG9yIHNvbWUgc3VjaCBhcyB0aGUgcGlkLgorCSAqIE5vdCBzdXJlIHdoZXRoZXIgdGhhdCB3b3VsZCBiZSB1bmlxdWUsIHRob3VnaCwgb3Igd2hldGhlcgorCSAqIHRoYXQgd291bGQgYnJlYWsgaW4gb3RoZXIgcGxhY2VzLgorCSAqLworCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX0ZMT0NLKSkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwkvKiB3ZSdyZSBzaW11bGF0aW5nIGZsb2NrKCkgbG9ja3MgdXNpbmcgcG9zaXggbG9ja3Mgb24gdGhlIHNlcnZlciAqLworCWZsLT5mbF9vd25lciA9IChmbF9vd25lcl90KSBmaWxlOworCWZsLT5mbF9zdGFydCA9IDA7CisJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisKKwlpZiAoZmwtPmZsX3R5cGUgPT0gRl9VTkxDSykKKwkJcmV0dXJuIGFmc19kb191bmxrKGZpbGUsIGZsKTsKKwlyZXR1cm4gYWZzX2RvX3NldGxrKGZpbGUsIGZsKTsKK30KKworLyoKKyAqIHRoZSBQT1NJWCBsb2NrIG1hbmFnZW1lbnQgY29yZSBWRlMgY29kZSBjb3BpZXMgdGhlIGxvY2sgcmVjb3JkIGFuZCBhZGRzIHRoZQorICogY29weSBpbnRvIGl0cyBvd24gbGlzdCwgc28gd2UgbmVlZCB0byBhZGQgdGhhdCBjb3B5IHRvIHRoZSB2bm9kZSdzIGxvY2sKKyAqIHF1ZXVlIGluIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBvcmlnaW5hbCAod2hpY2ggd2lsbCBiZSBkZWxldGVkIHNob3J0bHkKKyAqIGFmdGVyKQorICovCitzdGF0aWMgdm9pZCBhZnNfZmxfY29weV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKm5ldywgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJX2VudGVyKCIiKTsKKworCWxpc3RfYWRkKCZuZXctPmZsX3UuYWZzLmxpbmssICZmbC0+ZmxfdS5hZnMubGluayk7Cit9CisKKy8qCisgKiBuZWVkIHRvIHJlbW92ZSB0aGlzIGxvY2sgZnJvbSB0aGUgdm5vZGUgcXVldWUgd2hlbiBpdCdzIHJlbW92ZWQgZnJvbSB0aGUKKyAqIFZGUydzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX2ZsX3JlbGVhc2VfcHJpdmF0ZShzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlfZW50ZXIoIiIpOworCisJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZzY2xpZW50LmMgYi9mcy9hZnMvZnNjbGllbnQuYwppbmRleCA1ZGZmMTMwLi4wMjNiOTViIDEwMDY0NAotLS0gYS9mcy9hZnMvZnNjbGllbnQuYworKysgYi9mcy9hZnMvZnNjbGllbnQuYwpAQCAtNjcsNyArNjcsNyBAQAogCUVYVFJBQ1Qoc3RhdHVzLT5ncm91cCk7CiAJYnArKzsgLyogc3luYyBjb3VudGVyICovCiAJZGF0YV92ZXJzaW9uIHw9ICh1NjQpIG50b2hsKCpicCsrKSA8PCAzMjsKLQlicCsrOyAvKiBsb2NrIGNvdW50ICovCisJRVhUUkFDVChzdGF0dXMtPmxvY2tfY291bnQpOwogCXNpemUgfD0gKHU2NCkgbnRvaGwoKmJwKyspIDw8IDMyOwogCWJwKys7IC8qIHNwYXJlIDQgKi8KIAkqX2JwID0gYnA7CkBAIC0xNzQ4LDMgKzE3NDgsMTU2IEBACiAKIAlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKIH0KKworLyoKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5TZXRMb2NrLCBGUy5FeHRlbmRMb2NrIG9yIEZTLlJlbGVhc2VMb2NrCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQoreworCWNvbnN0IF9fYmUzMiAqYnA7CisKKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKworCWFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IpOworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpCisJCXJldHVybiAtRUJBRE1TRzsKKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJYnAgPSBjYWxsLT5idWZmZXI7CisJLyogeGRyX2RlY29kZV9BRlNWb2xTeW5jKCZicCwgY2FsbC0+cmVwbHlYKTsgKi8KKworCV9sZWF2ZSgiID0gMCBbZG9uZV0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZTLlNldExvY2sgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTU2V0TG9jayA9IHsKKwkubmFtZQkJPSAiRlMuU2V0TG9jayIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2ssCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIEZTLkV4dGVuZExvY2sgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTRXh0ZW5kTG9jayA9IHsKKwkubmFtZQkJPSAiRlMuRXh0ZW5kTG9jayIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2ssCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIEZTLlJlbGVhc2VMb2NrIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU1JlbGVhc2VMb2NrID0geworCS5uYW1lCQk9ICJGUy5SZWxlYXNlTG9jayIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2ssCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIGdldCBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfZnNfc2V0X2xvY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJICAgIHN0cnVjdCBrZXkgKmtleSwKKwkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgICAgYWZzX2xvY2tfdHlwZV90IHR5cGUsCisJCSAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU1NldExvY2ssIDUgKiA0LCA2ICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTU0VUTE9DSyk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKKwkqYnArKyA9IGh0b25sKHR5cGUpOworCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CisKKy8qCisgKiBleHRlbmQgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2ZzX2V4dGVuZF9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgICAgICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTRXh0ZW5kTG9jaywgNCAqIDQsIDYgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoRlNFWFRFTkRMT0NLKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CisKKy8qCisgKiByZWxlYXNlIGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc19mc19yZWxlYXNlX2xvY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCXN0cnVjdCBrZXkgKmtleSwKKwkJCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJX19iZTMyICpicDsKKworCV9lbnRlcigiIik7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNSZWxlYXNlTG9jaywgNCAqIDQsIDYgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoRlNSRUxFQVNFTE9DSyk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ludGVybmFsLmggYi9mcy9hZnMvaW50ZXJuYWwuaAppbmRleCAyYzU1ZGQ5Li42MzA2NDM4IDEwMDY0NAotLS0gYS9mcy9hZnMvaW50ZXJuYWwuaAorKysgYi9mcy9hZnMvaW50ZXJuYWwuaApAQCAtMzUxLDEwICszNTEsMTggQEAKICNkZWZpbmUgQUZTX1ZOT0RFX1pBUF9EQVRBCTMJCS8qIHNldCBpZiB2bm9kZSdzIGRhdGEgc2hvdWxkIGJlIGludmFsaWRhdGVkICovCiAjZGVmaW5lIEFGU19WTk9ERV9ERUxFVEVECTQJCS8qIHNldCBpZiB2bm9kZSBkZWxldGVkIG9uIHNlcnZlciAqLwogI2RlZmluZSBBRlNfVk5PREVfTU9VTlRQT0lOVAk1CQkvKiBzZXQgaWYgdm5vZGUgaXMgYSBtb3VudHBvaW50IHN5bWxpbmsgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX0xPQ0tJTkcJNgkJLyogc2V0IGlmIHdhaXRpbmcgZm9yIGxvY2sgb24gdm5vZGUgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX1JFQURMT0NLRUQJNwkJLyogc2V0IGlmIHZub2RlIGlzIHJlYWQtbG9ja2VkIG9uIHRoZSBzZXJ2ZXIgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX1dSSVRFTE9DS0VECTgJCS8qIHNldCBpZiB2bm9kZSBpcyB3cml0ZS1sb2NrZWQgb24gdGhlIHNlcnZlciAqLworI2RlZmluZSBBRlNfVk5PREVfVU5MT0NLSU5HCTkJCS8qIHNldCBpZiB2bm9kZSBpcyBiZWluZyB1bmxvY2tlZCBvbiB0aGUgc2VydmVyICovCiAKIAlsb25nCQkJYWNsX29yZGVyOwkvKiBBQ0wgY2hlY2sgY291bnQgKGNhbGxiYWNrIGJyZWFrIGNvdW50KSAqLwogCiAJc3RydWN0IGxpc3RfaGVhZAl3cml0ZWJhY2tzOwkvKiBhbHRlcmF0aW9ucyBpbiBwYWdlY2FjaGUgdGhhdCBuZWVkIHdyaXRpbmcgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXBlbmRpbmdfbG9ja3M7CS8qIGxvY2tzIHdhaXRpbmcgdG8gYmUgZ3JhbnRlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQJZ3JhbnRlZF9sb2NrczsJLyogbG9ja3MgZ3JhbnRlZCBvbiB0aGlzIGZpbGUgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWxvY2tfd29yazsJLyogd29yayB0byBiZSBkb25lIGluIGxvY2tpbmcgKi8KKwlzdHJ1Y3Qga2V5CQkqdW5sb2NrX2tleTsJLyoga2V5IHRvIGJlIHVzZWQgaW4gdW5sb2NraW5nICovCiAKIAkvKiBvdXRzdGFuZGluZyBjYWxsYmFjayBub3RpZmljYXRpb24gb24gdGhpcyBmaWxlICovCiAJc3RydWN0IHJiX25vZGUJCXNlcnZlcl9yYjsJLyogbGluayBpbiBzZXJ2ZXItPmZzX3Zub2RlcyAqLwpAQCAtNDc0LDYgKzQ4MiwxNSBAQAogZXh0ZXJuIGludCBhZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAKIC8qCisgKiBmbG9jay5jCisgKi8KK2V4dGVybiB2b2lkIF9fZXhpdCBhZnNfa2lsbF9sb2NrX21hbmFnZXIodm9pZCk7CitleHRlcm4gdm9pZCBhZnNfbG9ja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIGFmc19sb2NrX21heV9iZV9hdmFpbGFibGUoc3RydWN0IGFmc192bm9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2xvY2soc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOworZXh0ZXJuIGludCBhZnNfZmxvY2soc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOworCisvKgogICogZnNjbGllbnQuYwogICovCiBleHRlcm4gaW50IGFmc19mc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCkBAIC01MTMsNiArNTMwLDE1IEBACiAJCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKiwKIAkJCQkgICAgc3RydWN0IGFmc192b2x1bWVfc3RhdHVzICosCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfc2V0X2xvY2soc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLAorCQkJICAgc3RydWN0IGFmc192bm9kZSAqLCBhZnNfbG9ja190eXBlX3QsCisJCQkgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX2V4dGVuZF9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfcmVsZWFzZV9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CiAKIC8qCiAgKiBpbm9kZS5jCkBAIC02ODEsNiArNzA3LDEwIEBACiBleHRlcm4gaW50IGFmc192bm9kZV9zZXRhdHRyKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBleHRlcm4gaW50IGFmc192bm9kZV9nZXRfdm9sdW1lX3N0YXR1cyhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwKIAkJCQkgICAgICAgc3RydWN0IGFmc192b2x1bWVfc3RhdHVzICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfc2V0X2xvY2soc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgICAgICBhZnNfbG9ja190eXBlX3QpOworZXh0ZXJuIGludCBhZnNfdm5vZGVfZXh0ZW5kX2xvY2soc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfcmVsZWFzZV9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqKTsKIAogLyoKICAqIHZvbHVtZS5jCmRpZmYgLS1naXQgYS9mcy9hZnMvbWFpbi5jIGIvZnMvYWZzL21haW4uYwppbmRleCBjZDIxMTk1Li4wZjYwZjZiIDEwMDY0NAotLS0gYS9mcy9hZnMvbWFpbi5jCisrKyBiL2ZzL2Fmcy9tYWluLmMKQEAgLTE2OCw2ICsxNjgsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImtBRlM6IFJlZCBIYXQgQUZTIGNsaWVudCB2MC4xIHVucmVnaXN0ZXJpbmcuXG4iKTsKIAogCWFmc19mc19leGl0KCk7CisJYWZzX2tpbGxfbG9ja19tYW5hZ2VyKCk7CiAJYWZzX2Nsb3NlX3NvY2tldCgpOwogCWFmc19wdXJnZV9zZXJ2ZXJzKCk7CiAJYWZzX2NhbGxiYWNrX3VwZGF0ZV9raWxsKCk7CmRpZmYgLS1naXQgYS9mcy9hZnMvbWlzYy5jIGIvZnMvYWZzL21pc2MuYwppbmRleCBkMWE4ODljLi4yZDMzYTVmIDEwMDY0NAotLS0gYS9mcy9hZnMvbWlzYy5jCisrKyBiL2ZzL2Fmcy9taXNjLmMKQEAgLTM1LDYgKzM1LDcgQEAKIAljYXNlIFZPVkVSUVVPVEE6CXJldHVybiAtRURRVU9UOwogCWNhc2UgVkJVU1k6CQlyZXR1cm4gLUVCVVNZOwogCWNhc2UgVk1PVkVEOgkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIDB4MmY2ZGYwYToJCXJldHVybiAtRVdPVUxEQkxPQ0s7CiAJY2FzZSAweDJmNmRmMGM6CQlyZXR1cm4gLUVBQ0NFUzsKIAljYXNlIDB4MmY2ZGYwZjoJCXJldHVybiAtRUJVU1k7CiAJY2FzZSAweDJmNmRmMTA6CQlyZXR1cm4gLUVFWElTVDsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9wcm9jLmMgYi9mcy9hZnMvcHJvYy5jCmluZGV4IDEzZGY1MTIuLjZlZGI1NjYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9wcm9jLmMKKysrIGIvZnMvYWZzL3Byb2MuYwpAQCAtMjAxLDIzICsyMDEsOSBAQAogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwotCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCWRvd25fcmVhZCgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuICh2b2lkICopIDE7Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmYWZzX3Byb2NfY2VsbHMpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmYWZzX3Byb2NfY2VsbHMgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJmFmc19wcm9jX2NlbGxzLCAqX3Bvcyk7CiB9CiAKIC8qCkBAIC0yMjUsMTQgKzIxMSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQkoKnBvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGFmc19wcm9jX2NlbGxzLm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmYWZzX3Byb2NfY2VsbHMgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJmFmc19wcm9jX2NlbGxzLCBwb3MpOwogfQogCiAvKgpAQCAtMjUwLDcgKzIyOSw3IEBACiB7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgYWZzX2NlbGwsIHByb2NfbGluayk7CiAKLQlpZiAodiA9PSAodm9pZCAqKSAxKSB7CisJaWYgKHYgPT0gJmFmc19wcm9jX2NlbGxzKSB7CiAJCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwogCQlzZXFfcHV0cyhtLCAiVVNFIE5BTUVcbiIpOwogCQlyZXR1cm4gMDsKQEAgLTUwMywyNiArNDgyLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gbS0+cHJpdmF0ZTsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7CiAKIAlfZW50ZXIoImNlbGw9JXAgcG9zPSVMZCIsIGNlbGwsICpfcG9zKTsKIAogCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KIAlkb3duX3JlYWQoJmNlbGwtPnZsX3NlbSk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiAodm9pZCAqKSAxOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnZsX2xpc3QpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmY2VsbC0+dmxfbGlzdCA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmY2VsbC0+dmxfbGlzdCwgKl9wb3MpOwogfQogCiAvKgpAQCAtNTMxLDE3ICs0OTcsMTAgQEAKIHN0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3ZvbHVtZXNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsCiAJCQkJCWxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBwLT5wcml2YXRlOwogCiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7Ci0KLQkoKl9wb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSAodiA9PSAodm9pZCAqKSAxKSA/IGNlbGwtPnZsX2xpc3QubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIChfcCAhPSAmY2VsbC0+dmxfbGlzdCkgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJmNlbGwtPnZsX2xpc3QsIF9wb3MpOwogfQogCiAvKgpAQCAtNTY5LDExICs1MjgsMTIgQEAKICAqLwogc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KIAkJbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgbGluayk7CiAKIAkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KLQlpZiAodiA9PSAodm9pZCAqKSAxKSB7CisJaWYgKHYgPT0gJmNlbGwtPnZsX2xpc3QpIHsKIAkJc2VxX3B1dHMobSwgIlVTRSBTVFQgVkxJRFswXSAgVkxJRFsxXSAgVkxJRFsyXSAgTkFNRVxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTczNCwyNiArNjk0LDEzIEBACiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogCV9fYWNxdWlyZXMobS0+cHJpdmF0ZS0+c2VydmVyc19sb2NrKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwogCiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CiAKIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJcmVhZF9sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gKHZvaWQgKikgMTsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZjZWxsLT5zZXJ2ZXJzKQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJmNlbGwtPnNlcnZlcnMgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJmNlbGwtPnNlcnZlcnMsICpfcG9zKTsKIH0KIAogLyoKQEAgLTc2MiwxNyArNzA5LDEwIEBACiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LAogCQkJCQlsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKIAogCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOwotCi0JKCpfcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gdiA9PSAodm9pZCAqKSAxID8gY2VsbC0+c2VydmVycy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJmNlbGwtPnNlcnZlcnMgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJmNlbGwtPnNlcnZlcnMsIF9wb3MpOwogfQogCiAvKgpAQCAtNzkxLDExICs3MzEsMTIgQEAKICAqLwogc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgYWZzX3NlcnZlciwgbGluayk7CiAJY2hhciBpcGFkZHJbMjBdOwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gKHZvaWQgKikgMSkgeworCWlmICh2ID09ICZjZWxsLT5zZXJ2ZXJzKSB7CiAJCXNlcV9wdXRzKG0sICJVU0UgQUREUiAgICAgICAgICAgIFNUQVRFXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmMgYi9mcy9hZnMvc3VwZXIuYwppbmRleCAyZTg0OTZiLi45OTNjZGYxIDEwMDY0NAotLS0gYS9mcy9hZnMvc3VwZXIuYworKysgYi9mcy9hZnMvc3VwZXIuYwpAQCAtNDYwLDYgKzQ2MCw5IEBACiAJc3Bpbl9sb2NrX2luaXQoJnZub2RlLT53cml0ZWJhY2tfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnZub2RlLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPndyaXRlYmFja3MpOworCUlOSVRfTElTVF9IRUFEKCZ2bm9kZS0+cGVuZGluZ19sb2Nrcyk7CisJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT5ncmFudGVkX2xvY2tzKTsKKwlJTklUX0RFTEFZRURfV09SSygmdm5vZGUtPmxvY2tfd29yaywgYWZzX2xvY2tfd29yayk7CiAJSU5JVF9XT1JLKCZ2bm9kZS0+Y2JfYnJva2VuX3dvcmssIGFmc19icm9rZW5fY2FsbGJhY2tfd29yayk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bm9kZS5jIGIvZnMvYWZzL3Zub2RlLmMKaW5kZXggMjMyYzU1ZC4uMmYwNWM0ZiAxMDA2NDQKLS0tIGEvZnMvYWZzL3Zub2RlLmMKKysrIGIvZnMvYWZzL3Zub2RlLmMKQEAgLTU2MSw3ICs1NjEsNyBAQAogLyoKICAqIGNyZWF0ZSBhIGhhcmQgbGluawogICovCi1leHRlcm4gaW50IGFmc192bm9kZV9saW5rKHN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCitpbnQgYWZzX3Zub2RlX2xpbmsoc3RydWN0IGFmc192bm9kZSAqZHZub2RlLCBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKIAkJCSAgc3RydWN0IGtleSAqa2V5LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CkBAIC04ODcsMTEgKzg4Nyw2IEBACiAJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAogCSAgICAgICBrZXlfc2VyaWFsKGtleSkpOwogCi0JLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgKi8KLQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKLQl2bm9kZS0+dXBkYXRlX2NudCsrOwotCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7Ci0KIAlkbyB7CiAJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KIAkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOwpAQCAtOTA1LDIwICs5MDAsMTI3IEBACiAJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOwogCiAJLyogYWRqdXN0IHRoZSBmbGFncyAqLwotCWlmIChyZXQgPT0gMCkgewotCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwlpZiAocmV0ID09IDApCiAJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0JfSBlbHNlIHsKLQkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHZub2RlLCByZXQpOwotCX0KIAogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiAKIG5vX3NlcnZlcjoKLQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKLQl2bm9kZS0+dXBkYXRlX2NudC0tOwotCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOwotCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKworLyoKKyAqIGdldCBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfdm5vZGVfc2V0X2xvY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwKKwkJICAgICAgIGFmc19sb2NrX3R5cGVfdCB0eXBlKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXN7JXg6JXUuJXV9LCV4LCV1IiwKKwkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZub2RlLT5maWQudmlkLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpLCB0eXBlKTsKKworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX3NldF9sb2NrKHNlcnZlciwga2V5LCB2bm9kZSwgdHlwZSwgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK25vX3NlcnZlcjoKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCisvKgorICogZXh0ZW5kIGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc192bm9kZV9leHRlbmRfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXN7JXg6JXUuJXV9LCV4IiwKKwkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZub2RlLT5maWQudmlkLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpKTsKKworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX2V4dGVuZF9sb2NrKHNlcnZlciwga2V5LCB2bm9kZSwgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK25vX3NlcnZlcjoKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCisvKgorICogcmVsZWFzZSBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfdm5vZGVfcmVsZWFzZV9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlc3sleDoldS4ldX0sJXgiLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSkpOworCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfcmVsZWFzZV9sb2NrKHNlcnZlciwga2V5LCB2bm9kZSwgJmFmc19zeW5jX2NhbGwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLCBzZXJ2ZXIsIHJldCkpOworCisJLyogYWRqdXN0IHRoZSBmbGFncyAqLworCWlmIChyZXQgPT0gMCkKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK25vX3NlcnZlcjoKIAlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZnMvYW5vbl9pbm9kZXMuYyBiL2ZzL2Fub25faW5vZGVzLmMKaW5kZXggZWRjNjc0OC4uYjRhNzU4OCAxMDA2NDQKLS0tIGEvZnMvYW5vbl9pbm9kZXMuYworKysgYi9mcy9hbm9uX2lub2Rlcy5jCkBAIC01Myw3ICs1Myw3IEBACiB9OwogCiAvKioKLSAqIGFub25faW5vZGVfZ2V0ZmQgLSBjcmVhdGVzIGEgbmV3IGZpbGUgaW5zdGFuY2UgYnkgaG9va2luZyBpdCB1cCB0byBhbmQKKyAqIGFub25faW5vZGVfZ2V0ZmQgLSBjcmVhdGVzIGEgbmV3IGZpbGUgaW5zdGFuY2UgYnkgaG9va2luZyBpdCB1cCB0byBhbgogICogICAgICAgICAgICAgICAgICAgIGFub255bW91cyBpbm9kZSwgYW5kIGEgZGVudHJ5IHRoYXQgZGVzY3JpYmUgdGhlICJjbGFzcyIKICAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZmlsZQogICoKQEAgLTY2LDcgKzY2LDcgQEAKICAqCiAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgYnkgaG9va2luZyBpdCBvbiBhIHNpbmdsZSBpbm9kZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGZpbGVzCiAgKiB0aGF0IGRvIG5vdCBuZWVkIHRvIGhhdmUgYSBmdWxsLWZsZWRnZWQgaW5vZGUgaW4gb3JkZXIgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuCi0gKiBBbGwgdGhlIGZpbGVzIGNyZWF0ZWQgd2l0aCBhbm9uX2lub2RlX2dldGZkKCkgd2lsbCBzaGFyZSBhIHNpbmdsZSBpbm9kZSwgYnkKKyAqIEFsbCB0aGUgZmlsZXMgY3JlYXRlZCB3aXRoIGFub25faW5vZGVfZ2V0ZmQoKSB3aWxsIHNoYXJlIGEgc2luZ2xlIGlub2RlLAogICogaGVuY2Ugc2F2aW5nIG1lbW9yeSBhbmQgYXZvaWRpbmcgY29kZSBkdXBsaWNhdGlvbiBmb3IgdGhlIGZpbGUvaW5vZGUvZGVudHJ5CiAgKiBzZXR1cC4KICAqLwpAQCAtMTQyLDkgKzE0Miw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTChhbm9uX2lub2RlX2dldGZkKTsKIAogLyoKLSAqIEEgc2luZ2xlIGlub2RlIGV4aXN0IGZvciBhbGwgYW5vbl9pbm9kZSBmaWxlcy4gQ29udHJhcnkgdG8gcGlwZXMsCi0gKiBhbm9uX2lub2RlIGlub2RlcyBoYXMgbm8gcGVyLWluc3RhbmNlIGRhdGEgYXNzb2NpYXRlZCwgc28gd2UgY2FuIGF2b2lkCi0gKiB0aGUgYWxsb2NhdGlvbiBvZiBtdWx0aXBsZSBvZiB0aGVtLgorICogQSBzaW5nbGUgaW5vZGUgZXhpc3RzIGZvciBhbGwgYW5vbl9pbm9kZSBmaWxlcy4gQ29udHJhcnkgdG8gcGlwZXMsCisgKiBhbm9uX2lub2RlIGlub2RlcyBoYXZlIG5vIGFzc29jaWF0ZWQgcGVyLWluc3RhbmNlIGRhdGEsIHNvIHdlIG5lZWQKKyAqIG9ubHkgYWxsb2NhdGUgb25lIG9mIHRoZW0uCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFub25faW5vZGVfbWtpbm9kZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IDA4ZTQ0MTQuLmEyN2U0MmIgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogc3RhdGljIGludCBsb2FkX2VsZl9iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogc3RhdGljIGludCBsb2FkX2VsZl9saWJyYXJ5KHN0cnVjdCBmaWxlICopOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmX21hcCAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGVsZl9waGRyICosIGludCwgaW50KTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBlbGZfcGhkciAqLCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyk7CiAKIC8qCiAgKiBJZiB3ZSBkb24ndCBzdXBwb3J0IGNvcmUgZHVtcGluZywgdGhlbiBzdXBwbHkgYSBOVUxMIHNvIHdlCkBAIC04MCw3ICs4MCw3IEBACiAJCS5oYXN2ZHNvCT0gMQogfTsKIAotI2RlZmluZSBCQURfQUREUih4KSAoKHVuc2lnbmVkIGxvbmcpKHgpID49IFRBU0tfU0laRSkKKyNkZWZpbmUgQkFEX0FERFIoeCkgSVNfRVJSX1ZBTFVFKHgpCiAKIHN0YXRpYyBpbnQgc2V0X2Jyayh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTI4NSwzMyArMjg1LDcwIEBACiAjaWZuZGVmIGVsZl9tYXAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmX21hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlKQorCQlzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50LCBpbnQgcHJvdCwgaW50IHR5cGUsCisJCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIG1hcF9hZGRyOwotCXVuc2lnbmVkIGxvbmcgcGFnZW9mZnNldCA9IEVMRl9QQUdFT0ZGU0VUKGVwcG50LT5wX3ZhZGRyKTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBlcHBudC0+cF9maWxlc3ogKyBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcik7CisJdW5zaWduZWQgbG9uZyBvZmYgPSBlcHBudC0+cF9vZmZzZXQgLSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcik7CisJYWRkciA9IEVMRl9QQUdFU1RBUlQoYWRkcik7CisJc2l6ZSA9IEVMRl9QQUdFQUxJR04oc2l6ZSk7CiAKLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCS8qIG1tYXAoKSB3aWxsIHJldHVybiAtRUlOVkFMIGlmIGdpdmVuIGEgemVybyBzaXplLCBidXQgYQogCSAqIHNlZ21lbnQgd2l0aCB6ZXJvIGZpbGVzaXplIGlzIHBlcmZlY3RseSB2YWxpZCAqLwotCWlmIChlcHBudC0+cF9maWxlc3ogKyBwYWdlb2Zmc2V0KQotCQltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIEVMRl9QQUdFU1RBUlQoYWRkciksCi0JCQkJICAgZXBwbnQtPnBfZmlsZXN6ICsgcGFnZW9mZnNldCwgcHJvdCwgdHlwZSwKLQkJCQkgICBlcHBudC0+cF9vZmZzZXQgLSBwYWdlb2Zmc2V0KTsKLQllbHNlCi0JCW1hcF9hZGRyID0gRUxGX1BBR0VTVEFSVChhZGRyKTsKKwlpZiAoIXNpemUpCisJCXJldHVybiBhZGRyOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkvKgorCSogdG90YWxfc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgRUxGIChpbnRlcnByZXRlcikgaW1hZ2UuCisJKiBUaGUgX2ZpcnN0XyBtbWFwIG5lZWRzIHRvIGtub3cgdGhlIGZ1bGwgc2l6ZSwgb3RoZXJ3aXNlCisJKiByYW5kb21pemF0aW9uIG1pZ2h0IHB1dCB0aGlzIGltYWdlIGludG8gYW4gb3ZlcmxhcHBpbmcKKwkqIHBvc2l0aW9uIHdpdGggdGhlIEVMRiBiaW5hcnkgaW1hZ2UuIChzaW5jZSBzaXplIDwgdG90YWxfc2l6ZSkKKwkqIFNvIHdlIGZpcnN0IG1hcCB0aGUgJ2JpZycgaW1hZ2UgLSBhbmQgdW5tYXAgdGhlIHJlbWFpbmRlciBhdAorCSogdGhlIGVuZC4gKHdoaWNoIHVubWFwIGlzIG5lZWRlZCBmb3IgRUxGIGltYWdlcyB3aXRoIGhvbGVzLikKKwkqLworCWlmICh0b3RhbF9zaXplKSB7CisJCXRvdGFsX3NpemUgPSBFTEZfUEFHRUFMSUdOKHRvdGFsX3NpemUpOworCQltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIGFkZHIsIHRvdGFsX3NpemUsIHByb3QsIHR5cGUsIG9mZik7CisJCWlmICghQkFEX0FERFIobWFwX2FkZHIpKQorCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCBtYXBfYWRkcitzaXplLCB0b3RhbF9zaXplLXNpemUpOworCX0gZWxzZQorCQltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIGFkZHIsIHNpemUsIHByb3QsIHR5cGUsIG9mZik7CisKIAl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4obWFwX2FkZHIpOwogfQogCiAjZW5kaWYgLyogIWVsZl9tYXAgKi8KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfbWFwcGluZ19zaXplKHN0cnVjdCBlbGZfcGhkciAqY21kcywgaW50IG5yKQoreworCWludCBpLCBmaXJzdF9pZHggPSAtMSwgbGFzdF9pZHggPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWlmIChjbWRzW2ldLnBfdHlwZSA9PSBQVF9MT0FEKSB7CisJCQlsYXN0X2lkeCA9IGk7CisJCQlpZiAoZmlyc3RfaWR4ID09IC0xKQorCQkJCWZpcnN0X2lkeCA9IGk7CisJCX0KKwl9CisJaWYgKGZpcnN0X2lkeCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY21kc1tsYXN0X2lkeF0ucF92YWRkciArIGNtZHNbbGFzdF9pZHhdLnBfbWVtc3ogLQorCQkJCUVMRl9QQUdFU1RBUlQoY21kc1tmaXJzdF9pZHhdLnBfdmFkZHIpOworfQorCisKIC8qIFRoaXMgaXMgbXVjaCBtb3JlIGdlbmVyYWxpemVkIHRoYW4gdGhlIGxpYnJhcnkgcm91dGluZSByZWFkIGZ1bmN0aW9uLAogICAgc28gd2Uga2VlcCB0aGlzIHNlcGFyYXRlLiAgVGVjaG5pY2FsbHkgdGhlIGxpYnJhcnkgcmVhZCBmdW5jdGlvbgogICAgaXMgb25seSBwcm92aWRlZCBzbyB0aGF0IHdlIGNhbiByZWFkIGEub3V0IGxpYnJhcmllcyB0aGF0IGhhdmUKICAgIGFuIEVMRiBoZWFkZXIgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9hZF9lbGZfaW50ZXJwKHN0cnVjdCBlbGZoZHIgKmludGVycF9lbGZfZXgsCi0JCXN0cnVjdCBmaWxlICppbnRlcnByZXRlciwgdW5zaWduZWQgbG9uZyAqaW50ZXJwX2xvYWRfYWRkcikKKwkJc3RydWN0IGZpbGUgKmludGVycHJldGVyLCB1bnNpZ25lZCBsb25nICppbnRlcnBfbWFwX2FkZHIsCisJCXVuc2lnbmVkIGxvbmcgbm9fYmFzZSkKIHsKIAlzdHJ1Y3QgZWxmX3BoZHIgKmVsZl9waGRhdGE7CiAJc3RydWN0IGVsZl9waGRyICplcHBudDsKQEAgLTMxOSw2ICszNTYsNyBAQAogCWludCBsb2FkX2FkZHJfc2V0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfYnNzID0gMCwgZWxmX2JzcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBlcnJvciA9IH4wVUw7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwogCWludCByZXR2YWwsIGksIHNpemU7CiAKIAkvKiBGaXJzdCBvZiBhbGwsIHNvbWUgc2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNrcyAqLwpAQCAtMzU3LDYgKzM5NSwxMiBAQAogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKKwl0b3RhbF9zaXplID0gdG90YWxfbWFwcGluZ19zaXplKGVsZl9waGRhdGEsIGludGVycF9lbGZfZXgtPmVfcGhudW0pOworCWlmICghdG90YWxfc2l6ZSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKwogCWVwcG50ID0gZWxmX3BoZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgaW50ZXJwX2VsZl9leC0+ZV9waG51bTsgaSsrLCBlcHBudCsrKSB7CiAJCWlmIChlcHBudC0+cF90eXBlID09IFBUX0xPQUQpIHsKQEAgLTM3NCw5ICs0MTgsMTQgQEAKIAkJCXZhZGRyID0gZXBwbnQtPnBfdmFkZHI7CiAJCQlpZiAoaW50ZXJwX2VsZl9leC0+ZV90eXBlID09IEVUX0VYRUMgfHwgbG9hZF9hZGRyX3NldCkKIAkJCQllbGZfdHlwZSB8PSBNQVBfRklYRUQ7CisJCQllbHNlIGlmIChub19iYXNlICYmIGludGVycF9lbGZfZXgtPmVfdHlwZSA9PSBFVF9EWU4pCisJCQkJbG9hZF9hZGRyID0gLXZhZGRyOwogCiAJCQltYXBfYWRkciA9IGVsZl9tYXAoaW50ZXJwcmV0ZXIsIGxvYWRfYWRkciArIHZhZGRyLAotCQkJCQkgICBlcHBudCwgZWxmX3Byb3QsIGVsZl90eXBlKTsKKwkJCQkJICAgZXBwbnQsIGVsZl9wcm90LCBlbGZfdHlwZSwgdG90YWxfc2l6ZSk7CisJCQl0b3RhbF9zaXplID0gMDsKKwkJCWlmICghKmludGVycF9tYXBfYWRkcikKKwkJCQkqaW50ZXJwX21hcF9hZGRyID0gbWFwX2FkZHI7CiAJCQllcnJvciA9IG1hcF9hZGRyOwogCQkJaWYgKEJBRF9BRERSKG1hcF9hZGRyKSkKIAkJCQlnb3RvIG91dF9jbG9zZTsKQEAgLTQ0Miw4ICs0OTEsNyBAQAogCQkJZ290byBvdXRfY2xvc2U7CiAJfQogCi0JKmludGVycF9sb2FkX2FkZHIgPSBsb2FkX2FkZHI7Ci0JZXJyb3IgPSAoKHVuc2lnbmVkIGxvbmcpaW50ZXJwX2VsZl9leC0+ZV9lbnRyeSkgKyBsb2FkX2FkZHI7CisJZXJyb3IgPSBsb2FkX2FkZHI7CiAKIG91dF9jbG9zZToKIAlrZnJlZShlbGZfcGhkYXRhKTsKQEAgLTU0MCw3ICs1ODgsOCBAQAogCWludCBlbGZfZXhlY19maWxlbm87CiAJaW50IHJldHZhbCwgaTsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGVsZl9lbnRyeSwgaW50ZXJwX2xvYWRfYWRkciA9IDA7CisJdW5zaWduZWQgbG9uZyBlbGZfZW50cnk7CisJdW5zaWduZWQgbG9uZyBpbnRlcnBfbG9hZF9hZGRyID0gMDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2NvZGUsIGVuZF9jb2RlLCBzdGFydF9kYXRhLCBlbmRfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHJlbG9jX2Z1bmNfZGVzYyA9IDA7CiAJY2hhciBwYXNzZWRfZmlsZW5vWzZdOwpAQCAtODA4LDkgKzg1Nyw3IEBACiAJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gYnBybS0+cDsKIAogCS8qIE5vdyB3ZSBkbyBhIGxpdHRsZSBncnVuZ3kgd29yayBieSBtbWFwaW5nIHRoZSBFTEYgaW1hZ2UgaW50bwotCSAgIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIG1lbW9yeS4gIEF0IHRoaXMgcG9pbnQsIHdlIGFzc3VtZSB0aGF0Ci0JICAgdGhlIGltYWdlIHNob3VsZCBiZSBsb2FkZWQgYXQgZml4ZWQgYWRkcmVzcywgbm90IGF0IGEgdmFyaWFibGUKLQkgICBhZGRyZXNzLiAqLworCSAgIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIG1lbW9yeS4gKi8KIAlmb3IoaSA9IDAsIGVsZl9wcG50ID0gZWxmX3BoZGF0YTsKIAkgICAgaSA8IGxvYy0+ZWxmX2V4LmVfcGhudW07IGkrKywgZWxmX3BwbnQrKykgewogCQlpbnQgZWxmX3Byb3QgPSAwLCBlbGZfZmxhZ3M7CkBAIC04NjQsMTEgKzkxMSwxNSBAQAogCQkJICogZGVmYXVsdCBtbWFwIGJhc2UsIGFzIHdlbGwgYXMgd2hhdGV2ZXIgcHJvZ3JhbSB0aGV5CiAJCQkgKiBtaWdodCB0cnkgdG8gZXhlYy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgYnJrIHdpbGwKIAkJCSAqIGZvbGxvdyB0aGUgbG9hZGVyLCBhbmQgaXMgbm90IG1vdmFibGUuICAqLworI2lmZGVmIENPTkZJR19YODYKKwkJCWxvYWRfYmlhcyA9IDA7CisjZWxzZQogCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7CisjZW5kaWYKIAkJfQogCiAJCWVycm9yID0gZWxmX21hcChicHJtLT5maWxlLCBsb2FkX2JpYXMgKyB2YWRkciwgZWxmX3BwbnQsCi0JCQkJZWxmX3Byb3QsIGVsZl9mbGFncyk7CisJCQkJZWxmX3Byb3QsIGVsZl9mbGFncywwKTsKIAkJaWYgKEJBRF9BRERSKGVycm9yKSkgewogCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CiAJCQlyZXR2YWwgPSBJU19FUlIoKHZvaWQgKillcnJvcikgPwpAQCAtOTQ0LDEzICs5OTUsMjUgQEAKIAl9CiAKIAlpZiAoZWxmX2ludGVycHJldGVyKSB7Ci0JCWlmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpCisJCWlmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpIHsKIAkJCWVsZl9lbnRyeSA9IGxvYWRfYW91dF9pbnRlcnAoJmxvYy0+aW50ZXJwX2V4LAogCQkJCQkJICAgICBpbnRlcnByZXRlcik7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoaW50ZXJwX21hcF9hZGRyKTsKKwogCQkJZWxmX2VudHJ5ID0gbG9hZF9lbGZfaW50ZXJwKCZsb2MtPmludGVycF9lbGZfZXgsCiAJCQkJCQkgICAgaW50ZXJwcmV0ZXIsCi0JCQkJCQkgICAgJmludGVycF9sb2FkX2FkZHIpOworCQkJCQkJICAgICZpbnRlcnBfbWFwX2FkZHIsCisJCQkJCQkgICAgbG9hZF9iaWFzKTsKKwkJCWlmICghQkFEX0FERFIoZWxmX2VudHJ5KSkgeworCQkJCS8qCisJCQkJICogbG9hZF9lbGZfaW50ZXJwKCkgcmV0dXJucyByZWxvY2F0aW9uCisJCQkJICogYWRqdXN0bWVudAorCQkJCSAqLworCQkJCWludGVycF9sb2FkX2FkZHIgPSBlbGZfZW50cnk7CisJCQkJZWxmX2VudHJ5ICs9IGxvYy0+aW50ZXJwX2VsZl9leC5lX2VudHJ5OworCQkJfQorCQl9CiAJCWlmIChCQURfQUREUihlbGZfZW50cnkpKSB7CiAJCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJCQlyZXR2YWwgPSBJU19FUlIoKHZvaWQgKillbGZfZW50cnkpID8KZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggYjNlOWJmYS4uMzYzNTMxNWUgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC01ODgsMTIgKzU4OCwxMCBAQAogCiBsb25nIG5yX2Jsb2NrZGV2X3BhZ2VzKHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCWxvbmcgcmV0ID0gMDsKIAlzcGluX2xvY2soJmJkZXZfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmYWxsX2JkZXZzKSB7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0JCWJkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibG9ja19kZXZpY2UsIGJkX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmRldiwgJmFsbF9iZGV2cywgYmRfbGlzdCkgewogCQlyZXQgKz0gYmRldi0+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/ICovCiAJaWYgKGxpc3RfZW1wdHkoJmhjLT5oY19pdGVtKSkKIAkJcmV0dXJuOwogCisJaWYgKHJlZ2lvbl91dWlkKQorCQlvMmhiX3JlZ2lvbl9wdXQocmVnaW9uX3V1aWQpOworCiAJZG93bl93cml0ZSgmbzJoYl9jYWxsYmFja19zZW0pOwogCiAJbGlzdF9kZWxfaW5pdCgmaGMtPmhjX2l0ZW0pOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmgKaW5kZXggY2M2ZDQwYi4uMzUzOTdkZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5oCkBAIC02OSw4ICs2OSwxMCBAQAogCQkJIG8yaGJfY2JfZnVuYyAqZnVuYywKIAkJCSB2b2lkICpkYXRhLAogCQkJIGludCBwcmlvcml0eSk7Ci1pbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7Ci12b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7CitpbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKKwkJCSAgIHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKTsKK3ZvaWQgbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOwogdm9pZCBvMmhiX2ZpbGxfbm9kZV9tYXAodW5zaWduZWQgbG9uZyAqbWFwLAogCQkJdW5zaWduZWQgYnl0ZXMpOwogdm9pZCBvMmhiX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKaW5kZXggOWY1YWQwZi4uYWYyMDcwZGEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKQEAgLTkwMCw2ICs5MDAsNDYgQEAKIAl9LAogfTsKIAoraW50IG8ybm1fZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCXJldHVybiBjb25maWdmc19kZXBlbmRfaXRlbSgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cywgaXRlbSk7Cit9CisKK3ZvaWQgbzJubV91bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwljb25maWdmc191bmRlcGVuZF9pdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLCBpdGVtKTsKK30KKworaW50IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSh2b2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvMm5tX25vZGUgKmxvY2FsX25vZGU7CisKKwlsb2NhbF9ub2RlID0gbzJubV9nZXRfbm9kZV9ieV9udW0obzJubV90aGlzX25vZGUoKSk7CisJaWYgKCFsb2NhbF9ub2RlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG8ybm1fZGVwZW5kX2l0ZW0oJmxvY2FsX25vZGUtPm5kX2l0ZW0pOworCW8ybm1fbm9kZV9wdXQobG9jYWxfbm9kZSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKHZvaWQpCit7CisJc3RydWN0IG8ybm1fbm9kZSAqbG9jYWxfbm9kZTsKKworCWxvY2FsX25vZGUgPSBvMm5tX2dldF9ub2RlX2J5X251bShvMm5tX3RoaXNfbm9kZSgpKTsKKwlCVUdfT04oIWxvY2FsX25vZGUpOworCisJbzJubV91bmRlcGVuZF9pdGVtKCZsb2NhbF9ub2RlLT5uZF9pdGVtKTsKKwlvMm5tX25vZGVfcHV0KGxvY2FsX25vZGUpOworfQorCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X28ybm0odm9pZCkKIHsKIAlpZiAob2NmczJfdGFibGVfaGVhZGVyKQpAQCAtOTM0LDcgKzk3NCw3IEBACiAJCWdvdG8gb3V0X3N5c2N0bDsKIAogCWNvbmZpZ19ncm91cF9pbml0KCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X2dyb3VwKTsKLQlpbml0X01VVEVYKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfaW5pdCgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cy5zdV9tdXRleCk7CiAJcmV0ID0gY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAibm9kZW1hbmFnZXI6IFJlZ2lzdHJhdGlvbiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaAppbmRleCAwNzA1MjIxLi43Yzg2MDM2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oCkBAIC03Nyw0ICs3Nyw5IEBACiB2b2lkIG8ybm1fbm9kZV9nZXQoc3RydWN0IG8ybm1fbm9kZSAqbm9kZSk7CiB2b2lkIG8ybm1fbm9kZV9wdXQoc3RydWN0IG8ybm1fbm9kZSAqbm9kZSk7CiAKK2ludCBvMm5tX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7Cit2b2lkIG8ybm1fdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOworaW50IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSh2b2lkKTsKK3ZvaWQgbzJubV91bmRlcGVuZF90aGlzX25vZGUodm9pZCk7CisKICNlbmRpZiAvKiBPMkNMVVNURVJfTk9ERU1BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKaW5kZXggMGIyMjlhOS4uZjBiZGZkOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCkBAIC0yNjEsMTQgKzI2MSwxMiBAQAogCiBzdGF0aWMgdm9pZCBvMm5ldF9jb21wbGV0ZV9ub2Rlc19uc3coc3RydWN0IG8ybmV0X25vZGUgKm5uKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICp0bXA7CisJc3RydWN0IG8ybmV0X3N0YXR1c193YWl0ICpuc3csICp0bXA7CiAJdW5zaWduZWQgaW50IG51bV9raWxscyA9IDA7Ci0Jc3RydWN0IG8ybmV0X3N0YXR1c193YWl0ICpuc3c7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJm5uLT5ubl9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCB0bXAsICZubi0+bm5fc3RhdHVzX2xpc3QpIHsKLQkJbnN3ID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgbzJuZXRfc3RhdHVzX3dhaXQsIG5zX25vZGVfaXRlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5zdywgdG1wLCAmbm4tPm5uX3N0YXR1c19saXN0LCBuc19ub2RlX2l0ZW0pIHsKIAkJbzJuZXRfY29tcGxldGVfbnN3X2xvY2tlZChubiwgbnN3LCBPMk5FVF9FUlJfRElFRCwgMCk7CiAJCW51bV9raWxscysrOwogCX0KQEAgLTc2NCwxMyArNzYyLDEwIEBACiAKIHZvaWQgbzJuZXRfdW5yZWdpc3Rlcl9oYW5kbGVyX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciAqbm1oOworCXN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciAqbm1oLCAqbjsKIAogCXdyaXRlX2xvY2soJm8ybmV0X2hhbmRsZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgbGlzdCkgewotCQlubWggPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG8ybmV0X21zZ19oYW5kbGVyLAotCQkJCSBuaF91bnJlZ2lzdGVyX2l0ZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShubWgsIG4sIGxpc3QsIG5oX3VucmVnaXN0ZXJfaXRlbSkgewogCQltbG9nKE1MX1RDUCwgInVucmVnaXN0ZXJpbmcgaGFuZGxlciBmdW5jICVwIHR5cGUgJXUga2V5ICUwOHhcbiIsCiAJCSAgICAgbm1oLT5uaF9mdW5jLCBubWgtPm5oX21zZ190eXBlLCBubWgtPm5oX2tleSk7CiAJCXJiX2VyYXNlKCZubWgtPm5oX25vZGUsICZvMm5ldF9oYW5kbGVyX3RyZWUpOwpAQCAtMTYzOCw4ICsxNjMzLDggQEAKIAogdm9pZCBvMm5ldF91bnJlZ2lzdGVyX2hiX2NhbGxiYWNrcyh2b2lkKQogewotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfdXApOwotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfZG93bik7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl91cCk7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl9kb3duKTsKIH0KIAogaW50IG8ybmV0X3JlZ2lzdGVyX2hiX2NhbGxiYWNrcyh2b2lkKQpAQCAtMTY1MSw5ICsxNjQ2LDkgQEAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZvMm5ldF9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIG8ybmV0X2hiX25vZGVfdXBfY2IsIE5VTEwsIE8yTkVUX0hCX1BSSSk7CiAKLQlyZXQgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvMm5ldF9oYl91cCk7CisJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmbzJuZXRfaGJfdXApOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfZG93bik7CisJCXJldCA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJm8ybmV0X2hiX2Rvd24pOwogCiAJaWYgKHJldCkKIAkJbzJuZXRfdW5yZWdpc3Rlcl9oYl9jYWxsYmFja3MoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggYzQ0MWVmMS4uMGQ1ZmRkZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCQl1MzIgb2Zmc2V0ID0gT0NGUzJfSShkaXIpLT5pcF9jbHVzdGVyczsKIAogCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihPQ0ZTMl9TQihzYiksIGRpciwgJm9mZnNldCwKLQkJCQkJCSAgICAxLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKKwkJCQkJCSAgICAxLCAwLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKIAkJCQkJCSAgICBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKIAkJQlVHX09OKHN0YXR1cyA9PSAtRUFHQUlOKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwppbmRleCBkODM2Yjk4Li42OTU0NTY1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCkBAIC0xMTI4LDggKzExMjgsOCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fdW5yZWdpc3Rlcl9kb21haW5faGFuZGxlcnMoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCk7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX2Rvd24pOwogCW8ybmV0X3VucmVnaXN0ZXJfaGFuZGxlcl9saXN0KCZkbG0tPmRsbV9kb21haW5faGFuZGxlcnMpOwogfQogCkBAIC0xMTQxLDEzICsxMTQxLDEzIEBACiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duLCBPMkhCX05PREVfRE9XTl9DQiwKIAkJCSAgICBkbG1faGJfbm9kZV9kb3duX2NiLCBkbG0sIERMTV9IQl9OT0RFX0RPV05fUFJJKTsKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl9kb3duKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIGRsbV9oYl9ub2RlX3VwX2NiLCBkbG0sIERMTV9IQl9OT0RFX1VQX1BSSSk7Ci0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmZGxtLT5kbG1faGJfdXApOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwppbmRleCA2ZWRmZmNhLi42NWIyYjliIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCkBAIC0xOTIsMjUgKzE5MiwyMCBAQAogc3RhdGljIHZvaWQgZGxtX2R1bXBfbWxlcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAkKIAltbG9nKE1MX05PVElDRSwgImR1bXBpbmcgYWxsIG1sZXMgZm9yIGRvbWFpbiAlczpcbiIsIGRsbS0+bmFtZSk7CiAJc3Bpbl9sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCW1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtbGUsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KQogCQlkbG1fcHJpbnRfb25lX21sZShtbGUpOwotCX0KIAlzcGluX3VubG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7CiB9CiAKIGludCBkbG1fZHVtcF9hbGxfbWxlcyhjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtOwogCiAJc3Bpbl9sb2NrKCZkbG1fZG9tYWluX2xvY2spOwotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbV9kb21haW5zKSB7Ci0JCWRsbSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fY3R4dCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkbG0sICZkbG1fZG9tYWlucywgbGlzdCkgewogCQltbG9nKE1MX05PVElDRSwgImZvdW5kIGRsbTogJXAsIG5hbWU9JXNcbiIsIGRsbSwgZGxtLT5uYW1lKTsKIAkJZGxtX2R1bXBfbWxlcyhkbG0pOwogCX0KQEAgLTQ1NCwxMiArNDQ5LDEwIEBACiAJCQljaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbmFtZWxlbikKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICp0bXBtbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5tYXN0ZXJfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCXRtcG1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBtbGUsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KSB7CiAJCWlmICghZGxtX21sZV9lcXVhbChkbG0sIHRtcG1sZSwgbmFtZSwgbmFtZWxlbikpCiAJCQljb250aW51ZTsKIAkJZGxtX2dldF9tbGUodG1wbWxlKTsKQEAgLTQ3MiwxMyArNDY1LDEwIEBACiB2b2lkIGRsbV9oYl9ldmVudF9ub3RpZnlfYXR0YWNoZWQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIGludCBpZHgsIGludCBub2RlX3VwKQogewogCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKm1sZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAkKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1sZV9oYl9ldmVudHMpIHsKLQkJbWxlID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5LCAKLQkJCQkgaGJfZXZlbnRzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1sZSwgJmRsbS0+bWxlX2hiX2V2ZW50cywgaGJfZXZlbnRzKSB7CiAJCWlmIChub2RlX3VwKQogCQkJZGxtX21sZV9ub2RlX3VwKGRsbSwgbWxlLCBOVUxMLCBpZHgpOwogCQllbHNlCkBAIC0yNDM0LDcgKzI0MjQsNyBAQAogCWludCByZXQ7CiAJaW50IGk7CiAJaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKQEAgLTI0NTMsOCArMjQ0Myw3IEBACiAJcmV0ID0gMDsKIAlxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkrK2NvdW50OwogCQkJaWYgKGxvY2stPm1sLm5vZGUgPT0gZGxtLT5ub2RlX251bSkgewogCQkJCW1sb2coMCwgImZvdW5kIGEgbG9jayBvd25lZCBieSB0aGlzIG5vZGUgc3RpbGwgIgpAQCAtMjkyMywxOCArMjkxMiwxNiBAQAogc3RhdGljIHZvaWQgZGxtX3JlbW92ZV9ub25sb2NhbF9sb2NrcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCQkgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcXVldWUgPSAmcmVzLT5ncmFudGVkOwogCWludCBpLCBiaXQ7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCiAJQlVHX09OKHJlcy0+b3duZXIgPT0gZGxtLT5ub2RlX251bSk7CiAKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCBxdWV1ZSwgbGlzdCkgewogCQkJaWYgKGxvY2stPm1sLm5vZGUgIT0gZGxtLT5ub2RlX251bSkgewogCQkJCW1sb2coMCwgInB1dHRpbmcgbG9jayBmb3Igbm9kZSAldVxuIiwKIAkJCQkgICAgIGxvY2stPm1sLm5vZGUpOwpAQCAtMjk3Niw3ICsyOTYzLDYgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAJaW50IG5vZGVudW07CiAKQEAgLTI5ODQsMTAgKzI5NzAsOSBAQAogCiAJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCBxdWV1ZSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkvKiB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGlzIG5vZGUKIAkJCSAqIGlzIGFsaXZlICovCi0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKIAkJCWlmIChsb2NrLT5tbC5ub2RlICE9IGRsbS0+bm9kZV9udW0pIHsKIAkJCQlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQkJcmV0dXJuIGxvY2stPm1sLm5vZGU7CkBAIC0zMjM0LDggKzMyMTksNyBAQAogCiB2b2lkIGRsbV9jbGVhbl9tYXN0ZXJfbGlzdChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKLQlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7CisJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlLCAqbmV4dDsKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIApAQCAtMzI0NSw5ICszMjI5LDcgQEAKIAogCS8qIGNsZWFuIHRoZSBtYXN0ZXIgbGlzdCAqLwogCXNwaW5fbG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmZGxtLT5tYXN0ZXJfbGlzdCkgewotCQltbGUgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnksIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1sZSwgbmV4dCwgJmRsbS0+bWFzdGVyX2xpc3QsIGxpc3QpIHsKIAkJQlVHX09OKG1sZS0+dHlwZSAhPSBETE1fTUxFX0JMT0NLICYmCiAJCSAgICAgICBtbGUtPnR5cGUgIT0gRExNX01MRV9NQVNURVIgJiYKIAkJICAgICAgIG1sZS0+dHlwZSAhPSBETE1fTUxFX01JR1JBVElPTik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCmluZGV4IDY3MWM0ZWQuLmEyYzMzMTYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCkBAIC0xNTgsOCArMTU4LDcgQEAKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGxtX2N0eHQsIGRpc3BhdGNoZWRfd29yayk7CiAJTElTVF9IRUFEKHRtcF9saXN0KTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW07CisJc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW0sICpuZXh0OwogCWRsbV93b3JrZnVuY190ICp3b3JrZnVuYzsKIAlpbnQgdG90PTA7CiAKQEAgLTE2NywxMyArMTY2LDEyIEBACiAJbGlzdF9zcGxpY2VfaW5pdCgmZGxtLT53b3JrX2xpc3QsICZ0bXBfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmRsbS0+d29ya19sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJnRtcF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVtLCAmdG1wX2xpc3QsIGxpc3QpIHsKIAkJdG90Kys7CiAJfQogCW1sb2coMCwgIiVzOiB3b3JrIHRocmVhZCBoYXMgJWQgd29yayBpdGVtc1xuIiwgZGxtLT5uYW1lLCB0b3QpOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmdG1wX2xpc3QpIHsKLQkJaXRlbSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV93b3JrX2l0ZW0sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuZXh0LCAmdG1wX2xpc3QsIGxpc3QpIHsKIAkJd29ya2Z1bmMgPSBpdGVtLT5mdW5jOwogCQlsaXN0X2RlbF9pbml0KCZpdGVtLT5saXN0KTsKIApAQCAtNTQ5LDcgKzU0Nyw2IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSAqbmRhdGE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlpbnQgYWxsX25vZGVzX2RvbmU7CiAJaW50IGRlc3Ryb3kgPSAwOwogCWludCBwYXNzID0gMDsKQEAgLTU2Nyw4ICs1NjQsNyBAQAogCiAJLyogc2FmZSB0byBhY2Nlc3MgdGhlIG5vZGUgZGF0YSBsaXN0IHdpdGhvdXQgYSBsb2NrLCBzaW5jZSB0aGlzCiAJICogcHJvY2VzcyBpcyB0aGUgb25seSBvbmUgdG8gY2hhbmdlIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQluZGF0YSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmRhdGEsICZkbG0tPnJlY28ubm9kZV9kYXRhLCBsaXN0KSB7CiAJCUJVR19PTihuZGF0YS0+c3RhdGUgIT0gRExNX1JFQ09fTk9ERV9EQVRBX0lOSVQpOwogCQluZGF0YS0+c3RhdGUgPSBETE1fUkVDT19OT0RFX0RBVEFfUkVRVUVTVElORzsKIApAQCAtNjU1LDkgKzY1MSw3IEBACiAJCSAqIGRvbmUsIG9yIGlmIGFueW9uZSBkaWVkICovCiAJCWFsbF9ub2Rlc19kb25lID0gMTsKIAkJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQkJbmRhdGEgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhLCBsaXN0KTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kYXRhLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSwgbGlzdCkgewogCQkJbWxvZygwLCAiY2hlY2tpbmcgcmVjb3Zlcnkgc3RhdGUgb2Ygbm9kZSAldVxuIiwKIAkJCSAgICAgbmRhdGEtPm5vZGVfbnVtKTsKIAkJCXN3aXRjaCAobmRhdGEtPnN0YXRlKSB7CkBAIC03NzQsMTYgKzc2OCwxNCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fZGVzdHJveV9yZWNvdmVyeV9hcmVhKHN0cnVjdCBkbG1fY3R4dCAqZGxtLCB1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwotCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhOworCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhLCAqbmV4dDsKIAlMSVNUX0hFQUQodG1wbGlzdCk7CiAKIAlzcGluX2xvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJmRsbS0+cmVjby5ub2RlX2RhdGEsICZ0bXBsaXN0KTsKIAlzcGluX3VubG9jaygmZGxtX3JlY29fc3RhdGVfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZ0bXBsaXN0KSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kYXRhLCBuZXh0LCAmdG1wbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZuZGF0YS0+bGlzdCk7CiAJCWtmcmVlKG5kYXRhKTsKIAl9CkBAIC04NzYsNyArODY4LDYgQEAKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbTsKIAlMSVNUX0hFQUQocmVzb3VyY2VzKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCWludCByZXQ7CiAJdTggZGVhZF9ub2RlLCByZWNvX21hc3RlcjsKIAlpbnQgc2tpcF9hbGxfZG9uZSA9IDA7CkBAIC05MjAsOCArOTExLDcgQEAKIAogCS8qIGFueSBlcnJvcnMgcmV0dXJuZWQgd2lsbCBiZSBkdWUgdG8gdGhlIG5ld19tYXN0ZXIgZHlpbmcsCiAJICogdGhlIGRsbV9yZWNvX3RocmVhZCBzaG91bGQgZGV0ZWN0IHRoaXMgKi8KLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZyZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQlyZXQgPSBkbG1fc2VuZF9vbmVfbG9ja3JlcyhkbG0sIHJlcywgbXJlcywgcmVjb19tYXN0ZXIsCiAJCQkJICAgCURMTV9NUkVTX1JFQ09WRVJZKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTk4Myw3ICs5NzMsNiBAQAogewogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gZGF0YTsKIAlzdHJ1Y3QgZGxtX3JlY29fZGF0YV9kb25lICpkb25lID0gKHN0cnVjdCBkbG1fcmVjb19kYXRhX2RvbmUgKiltc2ctPmJ1ZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIApAQCAtMTAwMCw4ICs5ODksNyBAQAogCQkJZGxtLT5yZWNvLmRlYWRfbm9kZSwgZG9uZS0+bm9kZV9pZHgsIGRsbS0+bm9kZV9udW0pOwogCiAJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPnJlY28ubm9kZV9kYXRhKSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZGF0YSwgJmRsbS0+cmVjby5ub2RlX2RhdGEsIGxpc3QpIHsKIAkJaWYgKG5kYXRhLT5ub2RlX251bSAhPSBkb25lLT5ub2RlX2lkeCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMDQ5LDEzICsxMDM3LDExIEBACiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkJICAgICAgIAl1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCAqbmV4dDsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAKIAlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+cmVjby5yZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmZGxtLT5yZWNvLnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQkvKiBhbHdheXMgcHJ1bmUgYW55ICRSRUNPVkVSWSBlbnRyaWVzIGZvciBkZWFkIG5vZGVzLAogCQkgKiBvdGhlcndpc2UgaGFuZ3MgY2FuIG9jY3VyIGR1cmluZyBsYXRlciByZWNvdmVyeSAqLwogCQlpZiAoZGxtX2lzX3JlY292ZXJ5X2xvY2socmVzLT5sb2NrbmFtZS5uYW1lLApAQCAtMTE2OSw3ICsxMTU1LDcgQEAKIAkJCQkJdTggZmxhZ3MsIHU4IG1hc3RlcikKIHsKIAkvKiBtcmVzIGhlcmUgaXMgb25lIGZ1bGwgcGFnZSAqLwotCW1lbXNldChtcmVzLCAwLCBQQUdFX1NJWkUpOworCWNsZWFyX3BhZ2UobXJlcyk7CiAJbXJlcy0+bG9ja25hbWVfbGVuID0gbmFtZWxlbjsKIAltZW1jcHkobXJlcy0+bG9ja25hbWUsIGxvY2tuYW1lLCBuYW1lbGVuKTsKIAltcmVzLT5udW1fbG9ja3MgPSAwOwpAQCAtMTI1Miw3ICsxMjM4LDcgQEAKIAkJCSBzdHJ1Y3QgZGxtX21pZ3JhdGFibGVfbG9ja3JlcyAqbXJlcywKIAkJCSB1OCBzZW5kX3RvLCB1OCBmbGFncykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJaW50IHRvdGFsX2xvY2tzLCBpOwogCXU2NCBtaWdfY29va2llID0gMDsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CkBAIC0xMjc4LDkgKzEyNjQsNyBAQAogCXRvdGFsX2xvY2tzID0gMDsKIAlmb3IgKGk9RExNX0dSQU5URURfTElTVDsgaTw9RExNX0JMT0NLRURfTElTVDsgaSsrKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkvKiBhZGQgYW5vdGhlciBsb2NrLiAqLwogCQkJdG90YWxfbG9ja3MrKzsKIAkJCWlmICghZGxtX2FkZF9sb2NrX3RvX2FycmF5KGxvY2ssIG1yZXMsIGkpKQpAQCAtMTcxNyw3ICsxNzAxLDYgQEAKIAlzdHJ1Y3QgZGxtX2xvY2tzdGF0dXMgKmxrc2IgPSBOVUxMOwogCWludCByZXQgPSAwOwogCWludCBpLCBqLCBiYWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2sgPSBOVUxMOwogCXU4IGZyb20gPSBPMk5NX01BWF9OT0RFUzsKIAl1bnNpZ25lZCBpbnQgYWRkZWQgPSAwOwpAQCAtMTc1NSw4ICsxNzM4LDcgQEAKIAkJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQlmb3IgKGogPSBETE1fR1JBTlRFRF9MSVNUOyBqIDw9IERMTV9CTE9DS0VEX0xJU1Q7IGorKykgewogCQkJCXRtcHEgPSBkbG1fbGlzdF9pZHhfdG9fcHRyKHJlcywgaik7Ci0JCQkJbGlzdF9mb3JfZWFjaChpdGVyLCB0bXBxKSB7Ci0JCQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgdG1wcSwgbGlzdCkgewogCQkJCQlpZiAobG9jay0+bWwuY29va2llICE9IG1sLT5jb29raWUpCiAJCQkJCQlsb2NrID0gTlVMTDsKIAkJCQkJZWxzZQpAQCAtMTkzMCw4ICsxOTEyLDggQEAKIAkJCQkgICAgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcXVldWUsICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAKIAlyZXMtPnN0YXRlIHw9IERMTV9MT0NLX1JFU19SRUNPVkVSSU5HOwogCWlmICghbGlzdF9lbXB0eSgmcmVzLT5yZWNvdmVyaW5nKSkgewpAQCAtMTk0Nyw4ICsxOTI5LDcgQEAKIAkvKiBmaW5kIGFueSBwZW5kaW5nIGxvY2tzIGFuZCBwdXQgdGhlbSBiYWNrIG9uIHByb3BlciBsaXN0ICovCiAJZm9yIChpPURMTV9CTE9DS0VEX0xJU1Q7IGk+PURMTV9HUkFOVEVEX0xJU1Q7IGktLSkgewogCQlxdWV1ZSA9IGRsbV9saXN0X2lkeF90b19wdHIocmVzLCBpKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCBxdWV1ZSwgbGlzdCkgewogCQkJZGxtX2xvY2tfZ2V0KGxvY2spOwogCQkJaWYgKGxvY2stPmNvbnZlcnRfcGVuZGluZykgewogCQkJCS8qIG1vdmUgY29udmVydGluZyBsb2NrIGJhY2sgdG8gZ3JhbnRlZCAqLwpAQCAtMjAxMywxOCArMTk5NCwxNSBAQAogCQkJCQkgICAgICB1OCBkZWFkX25vZGUsIHU4IG5ld19tYXN0ZXIpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwogCXN0cnVjdCBobGlzdF9ub2RlICpoYXNoX2l0ZXI7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKLQotCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCAqbmV4dDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+cmVjby5yZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmZGxtLT5yZWNvLnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQlpZiAocmVzLT5vd25lciA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnJlcy0+cmVjb3ZlcmluZyk7CiAJCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwpAQCAtMjA5OSw3ICsyMDc3LDcgQEAKIHN0YXRpYyB2b2lkIGRsbV9yZXZhbGlkYXRlX2x2YihzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCSAgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICpxdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAJaW50IGJsYW5rX2x2YiA9IDAsIGxvY2FsID0gMDsKIAlpbnQgaTsKQEAgLTIxMjEsOCArMjA5OSw3IEBACiAKIAlmb3IgKGk9RExNX0dSQU5URURfTElTVDsgaTw9RExNX0NPTlZFUlRJTkdfTElTVDsgaSsrKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCBxdWV1ZSwgbGlzdCkgewogCQkJaWYgKGxvY2stPm1sLm5vZGUgPT0gc2VhcmNoX25vZGUpIHsKIAkJCQlpZiAoZGxtX2x2Yl9uZWVkc19pbnZhbGlkYXRpb24obG9jaywgbG9jYWwpKSB7CiAJCQkJCS8qIHplcm8gdGhlIGxrc2IgbHZiIGFuZCBsb2NrcmVzIGx2YiAqLwpAQCAtMjE0Myw4ICsyMTIwLDcgQEAKIHN0YXRpYyB2b2lkIGRsbV9mcmVlX2RlYWRfbG9ja3Moc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsIHU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqdG1waXRlcjsKLQlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CisJc3RydWN0IGRsbV9sb2NrICpsb2NrLCAqbmV4dDsKIAl1bnNpZ25lZCBpbnQgZnJlZWQgPSAwOwogCiAJLyogdGhpcyBub2RlIGlzIHRoZSBsb2NrcmVzIG1hc3RlcjoKQEAgLTIxNTUsMjQgKzIxMzEsMjEgQEAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCiAJLyogVE9ETzogY2hlY2sgcGVuZGluZ19hc3RzLCBwZW5kaW5nX2Jhc3RzIGhlcmUgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+Z3JhbnRlZCkgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+Z3JhbnRlZCwgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQkJZnJlZWQrKzsKIAkJfQogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+Y29udmVydGluZykgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+Y29udmVydGluZywgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQkJZnJlZWQrKzsKIAkJfQogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+YmxvY2tlZCkgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+YmxvY2tlZCwgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IGQxYmQzMDUuLmY3MTI1MGUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTYwMCwxNSArNjAwLDEzIEBACiBzdGF0aWMgdm9pZCBsb2NrcmVzX3NldF9mbGFncyhzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIG5ld2ZsYWdzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcDsKLQlzdHJ1Y3Qgb2NmczJfbWFza193YWl0ZXIgKm13OworCXN0cnVjdCBvY2ZzMl9tYXNrX3dhaXRlciAqbXcsICp0bXA7CiAKICAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZsb2NrcmVzLT5sX2xvY2spOwogCiAJbG9ja3Jlcy0+bF9mbGFncyA9IG5ld2ZsYWdzOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmbG9ja3Jlcy0+bF9tYXNrX3dhaXRlcnMpIHsKLQkJbXcgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG9jZnMyX21hc2tfd2FpdGVyLCBtd19pdGVtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXcsIHRtcCwgJmxvY2tyZXMtPmxfbWFza193YWl0ZXJzLCBtd19pdGVtKSB7CiAJCWlmICgobG9ja3Jlcy0+bF9mbGFncyAmIG13LT5td19tYXNrKSAhPSBtdy0+bXdfZ29hbCkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9lbmRpYW4uaCBiL2ZzL29jZnMyL2VuZGlhbi5oCmluZGV4IGYyMjZiMjIuLmZmMjU3NjIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2VuZGlhbi5oCisrKyBiL2ZzL29jZnMyL2VuZGlhbi5oCkBAIC0zMiw2ICszMiwxMSBAQAogCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSArIHZhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZTY0X2FkZF9jcHUoX19sZTY0ICp2YXIsIHU2NCB2YWwpCit7CisJKnZhciA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCp2YXIpICsgdmFsKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGxlMzJfYW5kX2NwdShfX2xlMzIgKnZhciwgdTMyIHZhbCkKIHsKIAkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKnZhcikgJiB2YWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXhwb3J0LmggYi9mcy9vY2ZzMi9leHBvcnQuaAppbmRleCA1Yjc3ZWU3Li5lMDhiZWQ5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHBvcnQuaAorKysgYi9mcy9vY2ZzMi9leHBvcnQuaApAQCAtMjYsNiArMjYsOCBAQAogI2lmbmRlZiBPQ0ZTMl9FWFBPUlRfSAogI2RlZmluZSBPQ0ZTMl9FWFBPUlRfSAogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKwogZXh0ZXJuIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBvY2ZzMl9leHBvcnRfb3BzOwogCiAjZW5kaWYgLyogT0NGUzJfRVhQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwppbmRleCBiYTJiMmFiLi4wM2MxZDM2NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXh0ZW50X21hcC5jCisrKyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwpAQCAtMTA5LDE3ICsxMDksMTQgQEAKICAqLwogdm9pZCBvY2ZzMl9leHRlbnRfbWFwX3RydW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0gKmVtaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtICplbWksICpuOwogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSA9ICZvaS0+aXBfZXh0ZW50X21hcDsKIAlMSVNUX0hFQUQodG1wX2xpc3QpOwogCXVuc2lnbmVkIGludCByYW5nZTsKIAogCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZW0tPmVtX2xpc3QpIHsKLQkJZW1pID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtLCBlaV9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbWksIG4sICZlbS0+ZW1fbGlzdCwgZWlfbGlzdCkgewogCQlpZiAoZW1pLT5laV9jcG9zID49IGNwb3MpIHsKIAkJCS8qIEZ1bGwgdHJ1bmNhdGUgb2YgdGhpcyByZWNvcmQuICovCiAJCQlsaXN0X21vdmUoJmVtaS0+ZWlfbGlzdCwgJnRtcF9saXN0KTsKQEAgLTEzNiw4ICsxMzMsNyBAQAogCX0KIAlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0bXBfbGlzdCkgewotCQllbWkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0sIGVpX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbWksIG4sICZ0bXBfbGlzdCwgZWlfbGlzdCkgewogCQlsaXN0X2RlbCgmZW1pLT5laV9saXN0KTsKIAkJa2ZyZWUoZW1pKTsKIAl9CkBAIC0zNzcsMzcgKzM3Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGV4dGVudCByZWNvcmQgd2hpY2ggY29udGFpbnMgY2x1c3RlciAjdl9jbHVzdGVyLgotICogLTEgaXMgcmV0dXJuZWQgaWYgaXQgd2FzIG5vdCBmb3VuZC4KLSAqCi0gKiBTaG91bGQgd29yayBmaW5lIG9uIGludGVyaW9yIGFuZCBleHRlcmlvciBub2Rlcy4KLSAqLwotc3RhdGljIGludCBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3Qoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKLQkJCQkgICAgdTMyIHZfY2x1c3RlcikKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JaW50IGk7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKLQl1MzIgcmVjX2VuZCwgcmVjX3N0YXJ0LCBjbHVzdGVyczsKLQotCWZvcihpID0gMDsgaSA8IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspIHsKLQkJcmVjID0gJmVsLT5sX3JlY3NbaV07Ci0KLQkJcmVjX3N0YXJ0ID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwotCQljbHVzdGVycyA9IG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKLQotCQlyZWNfZW5kID0gcmVjX3N0YXJ0ICsgY2x1c3RlcnM7Ci0KLQkJaWYgKHZfY2x1c3RlciA+PSByZWNfc3RhcnQgJiYgdl9jbHVzdGVyIDwgcmVjX2VuZCkgewotCQkJcmV0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQogaW50IG9jZnMyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAogCQkgICAgICAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzLAogCQkgICAgICAgdW5zaWduZWQgaW50ICpleHRlbnRfZmxhZ3MpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggNDk3OWI2Ni4uZjA0YzdhYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMjYzLDYgKzI2Myw3IEBACiAJaW50IHN0YXR1czsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCXU2NCBjbHVzdGVyX2J5dGVzOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTI4Niw3ICsyODcsOSBAQAogCS8qCiAJICogRG8gdGhpcyBiZWZvcmUgc2V0dGluZyBpX3NpemUuCiAJICovCi0Jc3RhdHVzID0gb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBuZXdfaV9zaXplKTsKKwljbHVzdGVyX2J5dGVzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIG5ld19pX3NpemUpOworCXN0YXR1cyA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIG5ld19pX3NpemUsCisJCQkJCSAgICAgICBjbHVzdGVyX2J5dGVzKTsKIAlpZiAoc3RhdHVzKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtMzI2LDkgKzMyOSw2IEBACiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19pX3NpemUpOwogCi0JdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSk7Ci0KIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGRpX2JoLT5iX2RhdGE7CiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7CiAJCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGlub2RlLT5pX3NiLCBmZSk7CkBAIC0zNjMsMTYgKzM2MywyMyBAQAogCWlmIChuZXdfaV9zaXplID09IGxlNjRfdG9fY3B1KGZlLT5pX3NpemUpKQogCQlnb3RvIGJhaWw7CiAKKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwogCS8qIFRoaXMgZm9yY2VzIG90aGVyIG5vZGVzIHRvIHN5bmMgYW5kIGRyb3AgdGhlaXIgcGFnZXMuIERvCiAJICogdGhpcyBldmVuIGlmIHdlIGhhdmUgYSB0cnVuY2F0ZSB3aXRob3V0IGFsbG9jYXRpb24gY2hhbmdlIC0KIAkgKiBvY2ZzMiBjbHVzdGVyIHNpemVzIGNhbiBiZSBtdWNoIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUsIHNvCiAJICogd2UgaGF2ZSB0byB0cnVuY2F0ZSB0aGVtIGFueXdheS4gICovCiAJc3RhdHVzID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgeworCQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCisJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSk7CisKIAkvKiBhbHJpZ2h0LCB3ZSdyZSBnb2luZyB0byBuZWVkIHRvIGRvIGEgZnVsbCBibG93biBhbGxvYyBzaXplCiAJICogY2hhbmdlLiBPcnBoYW4gdGhlIGlub2RlIHNvIHRoYXQgcmVjb3ZlcnkgY2FuIGNvbXBsZXRlIHRoZQogCSAqIHRydW5jYXRlIGlmIG5lY2Vzc2FyeS4gVGhpcyBkb2VzIHRoZSB0YXNrIG9mIG1hcmtpbmcKQEAgLTM5OSw2ICs0MDYsOCBAQAogYmFpbF91bmxvY2tfZGF0YToKIAlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiAKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIGJhaWw6CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKQEAgLTQxOSw2ICs0MjgsNyBAQAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgdTMyICpsb2dpY2FsX29mZnNldCwKIAkJCSAgICAgICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICAgICAgIGludCBtYXJrX3Vud3JpdHRlbiwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCkBAIC00MzEsOSArNDQxLDEzIEBACiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgcmVhc29uID0gUkVTVEFSVF9OT05FOwogCXUzMiBiaXRfb2ZmLCBudW1fYml0czsKIAl1NjQgYmxvY2s7CisJdTggZmxhZ3MgPSAwOwogCiAJQlVHX09OKCFjbHVzdGVyc190b19hZGQpOwogCisJaWYgKG1hcmtfdW53cml0dGVuKQorCQlmbGFncyA9IE9DRlMyX0VYVF9VTldSSVRURU47CisKIAlmcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGZlKTsKIAlpZiAoZnJlZV9leHRlbnRzIDwgMCkgewogCQlzdGF0dXMgPSBmcmVlX2V4dGVudHM7CkBAIC00ODMsNyArNDk3LDcgQEAKIAkgICAgIG51bV9iaXRzLCBiaXRfb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CiAJc3RhdHVzID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAogCQkJCSAgICAgKmxvZ2ljYWxfb2Zmc2V0LCBibG9jaywgbnVtX2JpdHMsCi0JCQkJICAgICBtZXRhX2FjKTsKKwkJCQkgICAgIGZsYWdzLCBtZXRhX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC01MTYsMjUgKzUzMCwzMSBAQAogICogRm9yIGEgZ2l2ZW4gYWxsb2NhdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIGFsbG9jYXRvcnMgd2lsbCBuZWVkIHRvIGJlCiAgKiBhY2Nlc3NlZCwgYW5kIGxvY2sgdGhlbSwgcmVzZXJ2aW5nIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYml0cy4KICAqCi0gKiBDYWxsZWQgZnJvbSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpIGZvciBmaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3QKLSAqIHN1cHBvcnQgaG9sZXMsIGFuZCBmcm9tIG9jZnMyX3dyaXRlKCkgZm9yIGZpbGUgc3lzdGVtcyB3aGljaAotICogdW5kZXJzdGFuZCBzcGFyc2UgaW5vZGVzLgorICogU3BhcnNlIGZpbGUgc3lzdGVtcyBjYWxsIHRoaXMgZnJvbSBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soKQorICogYW5kIG9jZnMyX2FsbG9jYXRlX3Vud3JpdHRlbl9leHRlbnRzKCkuCisgKgorICogRmlsZSBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgaG9sZXMgY2FsbCB0aGlzIGZyb20KKyAqIG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKCkuCiAgKi8KIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYykKIHsKLQlpbnQgcmV0LCBudW1fZnJlZV9leHRlbnRzOworCWludCByZXQgPSAwLCBudW1fZnJlZV9leHRlbnRzOworCXVuc2lnbmVkIGludCBtYXhfcmVjc19uZWVkZWQgPSBjbHVzdGVyc190b19hZGQgKyAyICogZXh0ZW50c190b19zcGxpdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAogCSptZXRhX2FjID0gTlVMTDsKLQkqZGF0YV9hYyA9IE5VTEw7CisJaWYgKGRhdGFfYWMpCisJCSpkYXRhX2FjID0gTlVMTDsKKworCUJVR19PTihjbHVzdGVyc190b19hZGQgIT0gMCAmJiBkYXRhX2FjID09IE5VTEwpOwogCiAJbWxvZygwLCAiZXh0ZW5kIGlub2RlICVsbHUsIGlfc2l6ZSA9ICVsbGQsIGRpLT5pX2NsdXN0ZXJzID0gJXUsICIKLQkgICAgICJjbHVzdGVyc190b19hZGQgPSAldVxuIiwKKwkgICAgICJjbHVzdGVyc190b19hZGQgPSAldSwgZXh0ZW50c190b19zcGxpdCA9ICV1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlfc2l6ZV9yZWFkKGlub2RlKSwKLQkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkKTsKKwkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkLCBleHRlbnRzX3RvX3NwbGl0KTsKIAogCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGRpKTsKIAlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKQEAgLTU1Miw5ICs1NzIsMTIgQEAKIAkgKgogCSAqIE1vc3Qgb2YgdGhlIHRpbWUgd2UnbGwgb25seSBiZSBzZWVpbmcgdGhpcyAxIGNsdXN0ZXIgYXQgYSB0aW1lCiAJICogYW55d2F5LgorCSAqCisJICogQWx3YXlzIGxvY2sgZm9yIGFueSB1bndyaXR0ZW4gZXh0ZW50cyAtIHdlIG1pZ2h0IHdhbnQgdG8KKwkgKiBhZGQgYmxvY2tzIGR1cmluZyBhIHNwbGl0LgogCSAqLwogCWlmICghbnVtX2ZyZWVfZXh0ZW50cyB8fAotCSAgICAob2NmczJfc3BhcnNlX2FsbG9jKG9zYikgJiYgbnVtX2ZyZWVfZXh0ZW50cyA8IGNsdXN0ZXJzX3RvX2FkZCkpIHsKKwkgICAgKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmIG51bV9mcmVlX2V4dGVudHMgPCBtYXhfcmVjc19uZWVkZWQpKSB7CiAJCXJldCA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZGksIG1ldGFfYWMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtNTYzLDYgKzU4Niw5IEBACiAJCX0KIAl9CiAKKwlpZiAoY2x1c3RlcnNfdG9fYWRkID09IDApCisJCWdvdG8gb3V0OworCiAJcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGNsdXN0ZXJzX3RvX2FkZCwgZGF0YV9hYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtNTg1LDE0ICs2MTEsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCkKK3N0YXRpYyBpbnQgX19vY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbG9naWNhbF9zdGFydCwKKwkJCQkgICAgIHUzMiBjbHVzdGVyc190b19hZGQsIGludCBtYXJrX3Vud3JpdHRlbikKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgcmVzdGFydF9mdW5jID0gMDsKLQlpbnQgZHJvcF9hbGxvY19zZW0gPSAwOwogCWludCBjcmVkaXRzOwotCXUzMiBwcmV2X2NsdXN0ZXJzLCBsb2dpY2FsX3N0YXJ0OworCXUzMiBwcmV2X2NsdXN0ZXJzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKQEAgLTYwNyw3ICs2MzIsNyBAQAogCSAqIFRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgZm9yIGZpbGUgc3lzdGVtcyB3aGljaCBkb24ndAogCSAqIHN1cHBvcnQgaG9sZXMuCiAJICovCi0JQlVHX09OKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKKwlCVUdfT04obWFya191bndyaXR0ZW4gJiYgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKIAogCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKIAkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwpAQCAtNjIzLDE5ICs2NDgsMTAgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlsb2dpY2FsX3N0YXJ0ID0gT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzOwotCiByZXN0YXJ0X2FsbDoKIAlCVUdfT04obGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7CiAKLQkvKiBibG9ja3MgcGVvcGUgaW4gcmVhZC93cml0ZSBmcm9tIHJlYWRpbmcgb3VyIGFsbG9jYXRpb24KLQkgKiB1bnRpbCB3ZSdyZSBkb25lIGNoYW5naW5nIGl0LiBXZSBkZXBlbmQgb24gaV9tdXRleCB0byBibG9jawotCSAqIG90aGVyIGV4dGVuZC90cnVuY2F0ZSBjYWxscyB3aGlsZSB3ZSdyZSBoZXJlLiBPcmRlcmluZyB3cnQKLQkgKiBzdGFydF90cmFucyBpcyBpbXBvcnRhbnQgaGVyZSAtLSBhbHdheXMgZG8gaXQgYmVmb3JlISAqLwotCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCWRyb3BfYWxsb2Nfc2VtID0gMTsKLQotCXN0YXR1cyA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZmUsIGNsdXN0ZXJzX3RvX2FkZCwgJmRhdGFfYWMsCisJc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBmZSwgY2x1c3RlcnNfdG9fYWRkLCAwLCAmZGF0YV9hYywKIAkJCQkgICAgICAgJm1ldGFfYWMpOwogCWlmIChzdGF0dXMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjY4LDYgKzY4NCw3IEBACiAJCQkJCSAgICBpbm9kZSwKIAkJCQkJICAgICZsb2dpY2FsX3N0YXJ0LAogCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkLAorCQkJCQkgICAgbWFya191bndyaXR0ZW4sCiAJCQkJCSAgICBiaCwKIAkJCQkJICAgIGhhbmRsZSwKIAkJCQkJICAgIGRhdGFfYWMsCkBAIC03MjAsMTAgKzczNyw2IEBACiAJICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKIGxlYXZlOgotCWlmIChkcm9wX2FsbG9jX3NlbSkgewotCQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JCWRyb3BfYWxsb2Nfc2VtID0gMDsKLQl9CiAJaWYgKGhhbmRsZSkgewogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNzQ5LDYgKzc2MiwyNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGxvZ2ljYWxfc3RhcnQsCisJCQkJICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgaW50IG1hcmtfdW53cml0dGVuKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFRoZSBhbGxvYyBzZW0gYmxvY2tzIHBlb3BlIGluIHJlYWQvd3JpdGUgZnJvbSByZWFkaW5nIG91cgorCSAqIGFsbG9jYXRpb24gdW50aWwgd2UncmUgZG9uZSBjaGFuZ2luZyBpdC4gV2UgZGVwZW5kIG9uCisJICogaV9tdXRleCB0byBibG9jayBvdGhlciBleHRlbmQvdHJ1bmNhdGUgY2FsbHMgd2hpbGUgd2UncmUKKwkgKiBoZXJlLgorCSAqLworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCXJldCA9IF9fb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGxvZ2ljYWxfc3RhcnQsIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQkJbWFya191bndyaXR0ZW4pOworCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIFNvbWUgcGFydHMgb2YgdGhpcyB0YWtlbiBmcm9tIGdlbmVyaWNfY29udF9leHBhbmQsIHdoaWNoIHR1cm5lZCBvdXQKICAqIHRvIGJlIHRvbyBmcmFnaWxlIHRvIGRvIGV4YWN0bHkgd2hhdCB3ZSBuZWVkIHdpdGhvdXQgdXMgaGF2aW5nIHRvCiAgKiB3b3JyeSBhYm91dCByZWN1cnNpdmUgbG9ja2luZyBpbiAtPnByZXBhcmVfd3JpdGUoKSBhbmQKQEAgLTg5MCw3ICs5MjIsOSBAQAogCX0KIAogCWlmIChjbHVzdGVyc190b19hZGQpIHsKLQkJcmV0ID0gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGNsdXN0ZXJzX3RvX2FkZCk7CisJCXJldCA9IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLAorCQkJCQkgICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsCisJCQkJCSAgICAgIGNsdXN0ZXJzX3RvX2FkZCwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dF91bmxvY2s7CkBAIC05OTUsNiArMTAyOSwxMyBAQAogCQlnb3RvIGJhaWxfdW5sb2NrOwogCX0KIAorCS8qCisJICogVGhpcyB3aWxsIGludGVudGlvbmFsbHkgbm90IHdpbmQgdXAgY2FsbGluZyB2bXRydW5jYXRlKCksCisJICogc2luY2UgYWxsIHRoZSB3b3JrIGZvciBhIHNpemUgY2hhbmdlIGhhcyBiZWVuIGRvbmUgYWJvdmUuCisJICogT3RoZXJ3aXNlLCB3ZSBjb3VsZCBnZXQgaW50byBwcm9ibGVtcyB3aXRoIHRydW5jYXRlIGFzCisJICogaXBfYWxsb2Nfc2VtIGlzIHVzZWQgdGhlcmUgdG8gcHJvdGVjdCBhZ2FpbnN0IGlfc2l6ZQorCSAqIGNoYW5nZXMuCisJICovCiAJc3RhdHVzID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTA3MCwxNyArMTExMSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbnQgX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAKIAltbG9nX2VudHJ5KCIoSW5vZGUgJWxsdSwgbW9kZSAwJW8pXG4iLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW9pLT5pcF9ibGtubywgaW5vZGUtPmlfbW9kZSk7CisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBpbm9kZS0+aV9tb2RlKTsKIAogCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmIChoYW5kbGUgPT0gTlVMTCkgewpAQCAtMTA4OSwxNyArMTEyOSwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgb2ktPmlwX2Jsa25vLCAmYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfdHJhbnM7Ci0JfQotCiAJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCiAJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfYmg7CisJCWdvdG8gb3V0X3RyYW5zOwogCX0KIAogCWlub2RlLT5pX21vZGUgJj0gflNfSVNVSUQ7CkBAIC0xMTEyLDggKzExNDYsNyBAQAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKLW91dF9iaDoKLQlicmVsc2UoYmgpOworCiBvdXRfdHJhbnM6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKQEAgLTExNTksNiArMTE5Miw0NjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJICAgICAgIG9pLT5pcF9ibGtubywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9ICBfX29jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKGlub2RlLCBiaCk7CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWxsb2NhdGUgZW5vdWdoIGV4dGVudHMgdG8gY292ZXIgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBieXRlIG9mZnNldAorICogc3RhcnQgZm9yIGxlbiBieXRlcy4gRXhpc3RpbmcgZXh0ZW50cyBhcmUgc2tpcHBlZCwgYW55IGV4dGVudHMKKyAqIGFkZGVkIGFyZSBtYXJrZWQgYXMgInVud3JpdHRlbiIuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlpbnQgcmV0OworCXUzMiBjcG9zLCBwaHlzX2Nwb3MsIGNsdXN0ZXJzLCBhbGxvY19zaXplOworCisJLyoKKwkgKiBXZSBjb25zaWRlciBib3RoIHN0YXJ0IGFuZCBsZW4gdG8gYmUgaW5jbHVzaXZlLgorCSAqLworCWNwb3MgPSBzdGFydCA+PiBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemVfYml0czsKKwljbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgc3RhcnQgKyBsZW4pOworCWNsdXN0ZXJzIC09IGNwb3M7CisKKwl3aGlsZSAoY2x1c3RlcnMpIHsKKwkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgJmFsbG9jX3NpemUsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIEhvbGUgb3IgZXhpc3RpbmcgZXh0ZW50IGxlbiBjYW4gYmUgYXJiaXRyYXJ5LCBzbworCQkgKiBjYXAgaXQgdG8gb3VyIG93biBhbGxvY2F0aW9uIHJlcXVlc3QuCisJCSAqLworCQlpZiAoYWxsb2Nfc2l6ZSA+IGNsdXN0ZXJzKQorCQkJYWxsb2Nfc2l6ZSA9IGNsdXN0ZXJzOworCisJCWlmIChwaHlzX2Nwb3MpIHsKKwkJCS8qCisJCQkgKiBXZSBhbHJlYWR5IGhhdmUgYW4gYWxsb2NhdGlvbiBhdCB0aGlzCisJCQkgKiByZWdpb24gc28gd2UgY2FuIHNhZmVseSBza2lwIGl0LgorCQkJICovCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlyZXQgPSBfX29jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLCBjcG9zLCBhbGxvY19zaXplLCAxKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHJldCAhPSAtRU5PU1BDKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKK25leHQ6CisJCWNwb3MgKz0gYWxsb2Nfc2l6ZTsKKwkJY2x1c3RlcnMgLT0gYWxsb2Nfc2l6ZTsKKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgcGh5c19jcG9zLCB1MzIgbGVuLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQ7CisJdTY0IHBoeXNfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgeworCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCBkaV9iaCwgY3BvcywgbGVuLCBoYW5kbGUsIG1ldGFfYWMsCisJCQkJICBkZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyAtPSBsZW47CisJZGktPmlfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXJldCA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIHBoeXNfYmxrbm8sIGxlbik7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRydW5jYXRlIGEgYnl0ZSByYW5nZSwgYXZvaWRpbmcgcGFnZXMgd2l0aGluIHBhcnRpYWwgY2x1c3RlcnMuIFRoaXMKKyAqIHByZXNlcnZlcyB0aG9zZSBwYWdlcyBmb3IgdGhlIHplcm9pbmcgY29kZSB0byB3cml0ZSB0by4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfdHJ1bmNhdGVfY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYnl0ZV9zdGFydCwKKwkJCQkJIHU2NCBieXRlX2xlbikKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlsb2ZmX3Qgc3RhcnQsIGVuZDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwlzdGFydCA9IChsb2ZmX3Qpb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIGJ5dGVfc3RhcnQpOworCWVuZCA9IGJ5dGVfc3RhcnQgKyBieXRlX2xlbjsKKwllbmQgPSBlbmQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpOworCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCAtIHN0YXJ0LCAwKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCAtIDEpOworCX0KK30KKworc3RhdGljIGludCBvY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCWludCByZXQgPSAwOworCXU2NCB0bXBlbmQsIGVuZCA9IHN0YXJ0ICsgbGVuOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXVuc2lnbmVkIGludCBjc2l6ZSA9IG9zYi0+c19jbHVzdGVyc2l6ZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJLyoKKwkgKiBUaGUgInN0YXJ0IiBhbmQgImVuZCIgdmFsdWVzIGFyZSBOT1QgbmVjZXNzYXJpbHkgcGFydCBvZgorCSAqIHRoZSByYW5nZSB3aG9zZSBhbGxvY2F0aW9uIGlzIGJlaW5nIGRlbGV0ZWQuIFJhdGhlciwgdGhpcworCSAqIGlzIHdoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHdpdGggdGhlIHJlcXVlc3QuIFdlIG11c3QgemVybworCSAqIHBhcnRpYWwgY2x1c3RlcnMgaGVyZS4gVGhlcmUncyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0CisJICogcGh5c2ljYWwgYWxsb2NhdGlvbiAtIHRoZSB6ZXJvaW5nIGNvZGUga25vd3MgdG8gc2tpcCBob2xlcy4KKwkgKi8KKwltbG9nKDAsICJieXRlIHN0YXJ0OiAlbGx1LCBlbmQ6ICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWVuZCk7CisKKwkvKgorCSAqIElmIGJvdGggZWRnZXMgYXJlIG9uIGEgY2x1c3RlciBib3VuZGFyeSB0aGVuIHRoZXJlJ3Mgbm8KKwkgKiB6ZXJvaW5nIHJlcXVpcmVkIGFzIHRoZSByZWdpb24gaXMgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiB0bworCSAqIGJlIHRydW5jYXRlZC4KKwkgKi8KKwlpZiAoKHN0YXJ0ICYgKGNzaXplIC0gMSkpID09IDAgJiYgKGVuZCAmIChjc2l6ZSAtIDEpKSA9PSAwKQorCQlnb3RvIG91dDsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2Ugd2FudCB0byBnZXQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIDFzdCBjbHVzdGVyLgorCSAqLworCXRtcGVuZCA9ICh1NjQpb3NiLT5zX2NsdXN0ZXJzaXplICsgKHN0YXJ0ICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSk7CisJaWYgKHRtcGVuZCA+IGVuZCkKKwkJdG1wZW5kID0gZW5kOworCisJbWxvZygwLCAiMXN0IHJhbmdlOiBzdGFydDogJWxsdSwgdG1wZW5kOiAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBlbmQpOworCisJcmV0ID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgc3RhcnQsIHRtcGVuZCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJaWYgKHRtcGVuZCA8IGVuZCkgeworCQkvKgorCQkgKiBUaGlzIG1heSBtYWtlIHN0YXJ0IGFuZCBlbmQgZXF1YWwsIGJ1dCB0aGUgemVyb2luZworCQkgKiBjb2RlIHdpbGwgc2tpcCBhbnkgd29yayBpbiB0aGF0IGNhc2Ugc28gdGhlcmUncyBubworCQkgKiBuZWVkIHRvIGNhdGNoIGl0IHVwIGhlcmUuCisJCSAqLworCQlzdGFydCA9IGVuZCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSk7CisKKwkJbWxvZygwLCAiMm5kIHJhbmdlOiBzdGFydDogJWxsdSwgZW5kOiAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kKTsKKworCQlyZXQgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBzdGFydCwgZW5kKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHU2NCBieXRlX3N0YXJ0LAorCQkJCSAgICB1NjQgYnl0ZV9sZW4pCit7CisJaW50IHJldCA9IDA7CisJdTMyIHRydW5jX3N0YXJ0LCB0cnVuY19sZW4sIGNwb3MsIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmRlYWxsb2MpOworCisJaWYgKGJ5dGVfbGVuID09IDApCisJCXJldHVybiAwOworCisJdHJ1bmNfc3RhcnQgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwgYnl0ZV9zdGFydCk7CisJdHJ1bmNfbGVuID0gKGJ5dGVfc3RhcnQgKyBieXRlX2xlbikgPj4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHM7CisJaWYgKHRydW5jX2xlbiA+PSB0cnVuY19zdGFydCkKKwkJdHJ1bmNfbGVuIC09IHRydW5jX3N0YXJ0OworCWVsc2UKKwkJdHJ1bmNfbGVuID0gMDsKKworCW1sb2coMCwgIklub2RlOiAlbGx1LCBzdGFydDogJWxsdSwgbGVuOiAlbGx1LCBjc3RhcnQ6ICV1LCBjbGVuOiAldVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX3N0YXJ0LAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX2xlbiwgdHJ1bmNfc3RhcnQsIHRydW5jX2xlbik7CisKKwlyZXQgPSBvY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnMoaW5vZGUsIGJ5dGVfc3RhcnQsIGJ5dGVfbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJY3BvcyA9IHRydW5jX3N0YXJ0OworCXdoaWxlICh0cnVuY19sZW4pIHsKKwkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgJmFsbG9jX3NpemUsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChhbGxvY19zaXplID4gdHJ1bmNfbGVuKQorCQkJYWxsb2Nfc2l6ZSA9IHRydW5jX2xlbjsKKworCQkvKiBPbmx5IGRvIHdvcmsgZm9yIG5vbi1ob2xlcyAqLworCQlpZiAocGh5c19jcG9zICE9IDApIHsKKwkJCXJldCA9IF9fb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKGlub2RlLCBkaV9iaCwgY3BvcywKKwkJCQkJCQkgcGh5c19jcG9zLCBhbGxvY19zaXplLAorCQkJCQkJCSAmZGVhbGxvYyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJY3BvcyArPSBhbGxvY19zaXplOworCQl0cnVuY19sZW4gLT0gYWxsb2Nfc2l6ZTsKKwl9CisKKwlvY2ZzMl90cnVuY2F0ZV9jbHVzdGVyX3BhZ2VzKGlub2RlLCBieXRlX3N0YXJ0LCBieXRlX2xlbik7CisKK291dDoKKwlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmZGVhbGxvYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFydHMgb2YgdGhpcyBmdW5jdGlvbiB0YWtlbiBmcm9tIHhmc19jaGFuZ2VfZmlsZV9zcGFjZSgpCisgKi8KK2ludCBvY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiAqc3IpCit7CisJaW50IHJldDsKKwlzNjQgbGxlbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfb2ZmID0gb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmICgoY21kID09IE9DRlMyX0lPQ19SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19SRVNWU1A2NCkgJiYKKwkgICAgIW9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhvc2IpKQorCQlyZXR1cm4gLUVOT1RUWTsKKwllbHNlIGlmICgoY21kID09IE9DRlMyX0lPQ19VTlJFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1VOUkVTVlNQNjQpICYmCisJCSAhb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCWlmIChvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikgfHwgb2NmczJfaXNfc29mdF9yZWFkb25seShvc2IpKQorCQlyZXR1cm4gLUVST0ZTOworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBUaGlzIHByZXZlbnRzIGNvbmN1cnJlbnQgd3JpdGVzIG9uIG90aGVyIG5vZGVzCisJICovCisJcmV0ID0gb2NmczJfcndfbG9jayhpbm9kZSwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfcndfdW5sb2NrOworCX0KKworCWlmIChpbm9kZS0+aV9mbGFncyAmIChTX0lNTVVUQUJMRXxTX0FQUEVORCkpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlzd2l0Y2ggKHNyLT5sX3doZW5jZSkgeworCWNhc2UgMDogLypTRUVLX1NFVCovCisJCWJyZWFrOworCWNhc2UgMTogLypTRUVLX0NVUiovCisJCXNyLT5sX3N0YXJ0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6IC8qU0VFS19FTkQqLworCQlzci0+bF9zdGFydCArPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKwlzci0+bF93aGVuY2UgPSAwOworCisJbGxlbiA9IHNyLT5sX2xlbiA+IDAgPyBzci0+bF9sZW4gLSAxIDogc3ItPmxfbGVuOworCisJaWYgKHNyLT5sX3N0YXJ0IDwgMAorCSAgICB8fCBzci0+bF9zdGFydCA+IG1heF9vZmYKKwkgICAgfHwgKHNyLT5sX3N0YXJ0ICsgbGxlbikgPCAwCisJICAgIHx8IChzci0+bF9zdGFydCArIGxsZW4pID4gbWF4X29mZikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlpZiAoY21kID09IE9DRlMyX0lPQ19SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19SRVNWU1A2NCkgeworCQlpZiAoc3ItPmxfbGVuIDw9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwkJfQorCX0KKworCWlmIChzaG91bGRfcmVtb3ZlX3N1aWQoZmlsZS0+Zl9wYXRoLmRlbnRyeSkpIHsKKwkJcmV0ID0gX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChpbm9kZSwgZGlfYmgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwkJfQorCX0KKworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCQkvKgorCQkgKiBUaGlzIHRha2VzIHVuc2lnbmVkIG9mZnNldHMsIGJ1dCB0aGUgc2lnbmVkIG9uZXMgd2UKKwkJICogcGFzcyBoYXZlIGJlZW4gY2hlY2tlZCBhZ2FpbnN0IG92ZXJmbG93IGFib3ZlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoaW5vZGUsIHNyLT5sX3N0YXJ0LAorCQkJCQkJICAgICAgIHNyLT5sX2xlbik7CisJCWJyZWFrOworCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCXJldCA9IG9jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShpbm9kZSwgZGlfYmgsIHNyLT5sX3N0YXJ0LAorCQkJCQkgICAgICAgc3ItPmxfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwkvKgorCSAqIFdlIHVwZGF0ZSBjL210aW1lIGZvciB0aGVzZSBjaGFuZ2VzCisJICovCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCXJldCA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSwgZGlfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXRfbWV0YV91bmxvY2s6CisJYnJlbHNlKGRpX2JoKTsKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CitvdXRfcndfdW5sb2NrOgorCW9jZnMyX3J3X3VubG9jayhpbm9kZSwgMSk7CisKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJIGxvZmZfdCAqcHBvcywKIAkJCQkJIHNpemVfdCBjb3VudCwKQEAgLTEzMjksMTUgKzE4MTYsMTYgQEAKIAkqYmFzZXAgPSBiYXNlOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKiBvY2ZzMl9nZXRfd3JpdGVfc291cmNlKHN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCwKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqIG9jZnMyX2dldF93cml0ZV9zb3VyY2UoY2hhciAqKnJldF9zcmNfYnVmLAogCQkJCQkgICAgY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92LAogCQkJCQkgICAgc2l6ZV90IGlvdl9vZmZzZXQpCiB7CiAJaW50IHJldDsKLQljaGFyICpidWY7CisJY2hhciAqYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBpb3Zfb2Zmc2V0OwogCXN0cnVjdCBwYWdlICpzcmNfcGFnZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKLQlidWYgPSBjdXJfaW92LT5pb3ZfYmFzZSArIGlvdl9vZmZzZXQ7CisJb2ZmID0gKHVuc2lnbmVkIGxvbmcpKGJ1ZikgJiB+UEFHRV9DQUNIRV9NQVNLOwogCiAJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSB7CiAJCS8qCkBAIC0xMzQ5LDE4ICsxODM3LDE3IEBACiAJCQkJICAgICAodW5zaWduZWQgbG9uZylidWYgJiBQQUdFX0NBQ0hFX01BU0ssIDEsCiAJCQkJICAgICAwLCAwLCAmc3JjX3BhZ2UsIE5VTEwpOwogCQlpZiAocmV0ID09IDEpCi0JCQlicC0+Yl9zcmNfYnVmID0ga21hcChzcmNfcGFnZSk7CisJCQkqcmV0X3NyY19idWYgPSBrbWFwKHNyY19wYWdlKSArIG9mZjsKIAkJZWxzZQogCQkJc3JjX3BhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOwogCX0gZWxzZSB7Ci0JCWJwLT5iX3NyY19idWYgPSBidWY7CisJCSpyZXRfc3JjX2J1ZiA9IGJ1ZjsKIAl9CiAKIAlyZXR1cm4gc3JjX3BhZ2U7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX3B1dF93cml0ZV9zb3VyY2Uoc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgKmJwLAotCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgb2NmczJfcHV0X3dyaXRlX3NvdXJjZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAocGFnZSkgewogCQlrdW5tYXAocGFnZSk7CkBAIC0xMzc2LDEwICsxODYzLDEyIEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3NpemVfdCBjb3BpZWQsIHRvdGFsID0gMDsKLQlzaXplX3QgaW92X29mZnNldCA9IDA7CisJc2l6ZV90IGlvdl9vZmZzZXQgPSAwLCBieXRlczsKKwlsb2ZmX3QgcG9zOwogCWNvbnN0IHN0cnVjdCBpb3ZlYyAqY3VyX2lvdiA9IGlvdjsKLQlzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiBicDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqdXNlcl9wYWdlLCAqcGFnZTsKKwljaGFyICpidWYsICpkc3Q7CisJdm9pZCAqZnNkYXRhOwogCiAJLyoKIAkgKiBoYW5kbGUgcGFydGlhbCBESU8gd3JpdGUuICBBZGp1c3QgY3VyX2lvdiBpZiBuZWVkZWQuCkBAIC0xMzg3LDIxICsxODc2LDM4IEBACiAJb2NmczJfc2V0X25leHRfaW92ZWMoJmN1cl9pb3YsICZpb3Zfb2Zmc2V0LCBvX2RpcmVjdF93cml0dGVuKTsKIAogCWRvIHsKLQkJYnAuYl9jdXJfb2ZmID0gaW92X29mZnNldDsKLQkJYnAuYl9jdXJfaW92ID0gY3VyX2lvdjsKKwkJcG9zID0gKnBwb3M7CiAKLQkJcGFnZSA9IG9jZnMyX2dldF93cml0ZV9zb3VyY2UoJmJwLCBjdXJfaW92LCBpb3Zfb2Zmc2V0KTsKLQkJaWYgKElTX0VSUihwYWdlKSkgewotCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJdXNlcl9wYWdlID0gb2NmczJfZ2V0X3dyaXRlX3NvdXJjZSgmYnVmLCBjdXJfaW92LCBpb3Zfb2Zmc2V0KTsKKwkJaWYgKElTX0VSUih1c2VyX3BhZ2UpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHVzZXJfcGFnZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWNvcGllZCA9IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoZmlsZSwgKnBwb3MsIGNvdW50LAotCQkJCQkJICAgICAgb2NmczJfbWFwX2FuZF93cml0ZV91c2VyX2RhdGEsCi0JCQkJCQkgICAgICAmYnApOworCQkvKiBTdGF5IHdpdGhpbiBvdXIgcGFnZSBib3VuZGFyaWVzICovCisJCWJ5dGVzID0gbWluKChQQUdFX0NBQ0hFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpcG9zICYgflBBR0VfQ0FDSEVfTUFTSykpLAorCQkJICAgIChQQUdFX0NBQ0hFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpYnVmICYgflBBR0VfQ0FDSEVfTUFTSykpKTsKKwkJLyogU3RheSB3aXRoaW4gdGhlIHZlY3RvciBib3VuZGFyeSAqLworCQlieXRlcyA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIGN1cl9pb3YtPmlvdl9sZW4gLSBpb3Zfb2Zmc2V0KTsKKwkJLyogU3RheSB3aXRoaW4gY291bnQgKi8KKwkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGNvdW50KTsKIAotCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKCZicCwgcGFnZSk7CisJCXBhZ2UgPSBOVUxMOworCQlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbihmaWxlLCBmaWxlLT5mX21hcHBpbmcsIHBvcywgYnl0ZXMsIDAsCisJCQkJCSZwYWdlLCAmZnNkYXRhKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KIAorCQlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbWNweShkc3QgKyAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSwgYnVmLCBieXRlcyk7CisJCWt1bm1hcF9hdG9taWMoZHN0LCBLTV9VU0VSMCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKHVzZXJfcGFnZSk7CisKKwkJY29waWVkID0gb2NmczJfd3JpdGVfZW5kKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgcG9zLCBieXRlcywKKwkJCQkJIGJ5dGVzLCBwYWdlLCBmc2RhdGEpOwogCQlpZiAoY29waWVkIDwgMCkgewogCQkJbWxvZ19lcnJubyhjb3BpZWQpOwogCQkJcmV0ID0gY29waWVkOwpAQCAtMTQwOSw3ICsxOTE1LDcgQEAKIAkJfQogCiAJCXRvdGFsICs9IGNvcGllZDsKLQkJKnBwb3MgPSAqcHBvcyArIGNvcGllZDsKKwkJKnBwb3MgPSBwb3MgKyBjb3BpZWQ7CiAJCWNvdW50IC09IGNvcGllZDsKIAogCQlvY2ZzMl9zZXRfbmV4dF9pb3ZlYygmY3VyX2lvdiwgJmlvdl9vZmZzZXQsIGNvcGllZCk7CkBAIC0xNTc5LDUyICsyMDg1LDQ2IEBACiAJCQkJICAgIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmLAogCQkJCSAgICBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkKQogewotCWludCByZXQsIGNvdW50LCB0b3RhbCA9IDA7CisJaW50IHJldCwgY291bnQ7CiAJc3NpemVfdCBjb3BpZWQgPSAwOwotCXN0cnVjdCBvY2ZzMl9zcGxpY2Vfd3JpdGVfcHJpdiBzcDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNkLT51LmZpbGU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJdm9pZCAqZnNkYXRhOworCWNoYXIgKnNyYywgKmRzdDsKIAogCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlzcC5zX3NkID0gc2Q7Ci0Jc3Auc19idWYgPSBidWY7Ci0Jc3Auc19waXBlID0gcGlwZTsKLQlzcC5zX29mZnNldCA9IHNkLT5wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwotCXNwLnNfYnVmX29mZnNldCA9IGJ1Zi0+b2Zmc2V0OwotCisJb2Zmc2V0ID0gc2QtPnBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJY291bnQgPSBzZC0+bGVuOwotCWlmIChjb3VudCArIHNwLnNfb2Zmc2V0ID4gUEFHRV9DQUNIRV9TSVpFKQotCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRSAtIHNwLnNfb2Zmc2V0OworCWlmIChjb3VudCArIG9mZnNldCA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CiAKLQlkbyB7Ci0JCS8qCi0JCSAqIHNwbGljZSB3YW50cyB1cyB0byBjb3B5IHVwIHRvIG9uZSBwYWdlIGF0IGEKLQkJICogdGltZS4gRm9yIHBhZ2VzaXplID4gY2x1c3RlciBzaXplLCB0aGlzIG1lYW5zIHdlCi0JCSAqIG1pZ2h0IGVudGVyIG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoKSBtb3JlCi0JCSAqIHRoYW4gb25jZSwgc28ga2VlcCB0cmFjayBvZiBvdXIgcHJvZ3Jlc3MgaGVyZS4KLQkJICovCi0JCWNvcGllZCA9IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoc2QtPnUuZmlsZSwKLQkJCQkJCSAgICAgIChsb2ZmX3Qpc2QtPnBvcyArIHRvdGFsLAotCQkJCQkJICAgICAgY291bnQsCi0JCQkJCQkgICAgICBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhLAotCQkJCQkJICAgICAgJnNwKTsKLQkJaWYgKGNvcGllZCA8IDApIHsKLQkJCW1sb2dfZXJybm8oY29waWVkKTsKLQkJCXJldCA9IGNvcGllZDsKLQkJCWdvdG8gb3V0OwotCQl9CisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW4oZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBzZC0+cG9zLCBjb3VudCwgMCwKKwkJCQkmcGFnZSwgJmZzZGF0YSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KIAotCQljb3VudCAtPSBjb3BpZWQ7Ci0JCXNwLnNfb2Zmc2V0ICs9IGNvcGllZDsKLQkJc3Auc19idWZfb2Zmc2V0ICs9IGNvcGllZDsKLQkJdG90YWwgKz0gY29waWVkOwotCX0gd2hpbGUgKGNvdW50KTsKKwlzcmMgPSBidWYtPm9wcy0+bWFwKHBpcGUsIGJ1ZiwgMSk7CisJZHN0ID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCW1lbWNweShkc3QgKyBvZmZzZXQsIHNyYyArIGJ1Zi0+b2Zmc2V0LCBjb3VudCk7CisJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJYnVmLT5vcHMtPnVubWFwKHBpcGUsIGJ1Ziwgc3JjKTsKIAotCXJldCA9IDA7CisJY29waWVkID0gb2NmczJfd3JpdGVfZW5kKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgc2QtPnBvcywgY291bnQsIGNvdW50LAorCQkJCSBwYWdlLCBmc2RhdGEpOworCWlmIChjb3BpZWQgPCAwKSB7CisJCW1sb2dfZXJybm8oY29waWVkKTsKKwkJcmV0ID0gY29waWVkOworCQlnb3RvIG91dDsKKwl9CiBvdXQ6CiAKLQlyZXR1cm4gdG90YWwgPyB0b3RhbCA6IHJldDsKKwlyZXR1cm4gY29waWVkID8gY29waWVkIDogcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBfX29jZnMyX2ZpbGVfc3BsaWNlX3dyaXRlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmggYi9mcy9vY2ZzMi9maWxlLmgKaW5kZXggYTRkZDFmYS4uMzZmZTI3ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5oCisrKyBiL2ZzL29jZnMyL2ZpbGUuaApAQCAtMzksMTUgKzM5LDE2IEBACiB9OwogaW50IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICAgdTMyICpjbHVzdGVyX3N0YXJ0LAorCQkJICAgICAgIHUzMiAqbG9naWNhbF9vZmZzZXQsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgICAgICBpbnQgbWFya191bndyaXR0ZW4sCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb24pOworCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYyk7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CkBAIC02MSw0ICs2Miw3IEBACiBpbnQgb2NmczJfdXBkYXRlX2lub2RlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCitpbnQgb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgKnNyKTsKKwogI2VuZGlmIC8qIE9DRlMyX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9oZWFydGJlYXQuYwppbmRleCBiMjVlZjYzLi4zNTJlYjRhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9oZWFydGJlYXQuYworKysgYi9mcy9vY2ZzMi9oZWFydGJlYXQuYwpAQCAtMTU3LDE2ICsxNTcsMTYgQEAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKIAkJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl91cCk7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfdXApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKKwkJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKIAl9CiAKIGJhaWw6CkBAIC0xNzgsOCArMTc4LDggQEAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKIAkJcmV0dXJuOwogCi0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX2Rvd24pOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfdXApOwogfQogCiB2b2lkIG9jZnMyX3N0b3BfaGVhcnRiZWF0KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW9jdGwuYyBiL2ZzL29jZnMyL2lvY3RsLmMKaW5kZXggZjNhZDIxYS4uYmQ2OGMzZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW9jdGwuYworKysgYi9mcy9vY2ZzMi9pb2N0bC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIKICNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJqb3VybmFsLmgiCiAKQEAgLTExNSw2ICsxMTYsNyBAQAogewogCXVuc2lnbmVkIGludCBmbGFnczsKIAlpbnQgc3RhdHVzOworCXN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2IHNyOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9DRlMyX0lPQ19HRVRGTEFHUzoKQEAgLTEzMCw2ICsxMzIsMTQgQEAKIAogCQlyZXR1cm4gb2NmczJfc2V0X2lub2RlX2F0dHIoaW5vZGUsIGZsYWdzLAogCQkJT0NGUzJfRkxfTU9ESUZJQUJMRSk7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsIChpbnQgX191c2VyICopIGFyZywgc2l6ZW9mKHNyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2UoZmlscCwgY21kLCAmc3IpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PVFRZOwogCX0KQEAgLTE0OCw2ICsxNTgsMTEgQEAKIAljYXNlIE9DRlMyX0lPQzMyX1NFVEZMQUdTOgogCQljbWQgPSBPQ0ZTMl9JT0NfU0VURkxBR1M7CiAJCWJyZWFrOworCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A2NDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDY0OgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCBkYzExODgwLi5kYmZiMjBiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC03MjIsOCArNzIyLDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY2ZzMl9qb3VybmFsLCBqX3JlY292ZXJ5X3dvcmspOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gam91cm5hbC0+al9vc2I7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGFfZGlub2RlLCAqdGxfZGlub2RlOwotCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtLCAqbjsKIAlMSVNUX0hFQUQodG1wX2xhX2xpc3QpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CkBAIC03MzQsOCArNzMzLDcgQEAKIAlsaXN0X3NwbGljZV9pbml0KCZqb3VybmFsLT5qX2xhX2NsZWFudXBzLCAmdG1wX2xhX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0bXBfbGFfbGlzdCkgewotCQlpdGVtID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfbGFfcmVjb3ZlcnlfaXRlbSwgbHJpX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuLCAmdG1wX2xhX2xpc3QsIGxyaV9saXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJml0ZW0tPmxyaV9saXN0KTsKIAogCQltbG9nKDAsICJDb21wbGV0ZSByZWNvdmVyeSBmb3Igc2xvdCAlZFxuIiwgaXRlbS0+bHJpX3Nsb3QpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5oIGIvZnMvb2NmczIvam91cm5hbC5oCmluZGV4IDNkYjVkZTQuLmNlNjBhYWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuaAorKysgYi9mcy9vY2ZzMi9qb3VybmFsLmgKQEAgLTI4OSw2ICsyODksOCBAQAogI2RlZmluZSBPQ0ZTMl9UUlVOQ0FURV9MT0dfRkxVU0hfT05FX1JFQyAoT0NGUzJfU1VCQUxMT0NfRlJFRSAJCSAgICAgIFwKIAkJCQkJICsgT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSkKIAorI2RlZmluZSBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMgKE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUgKyBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUykKKwogLyogZGF0YSBibG9jayBmb3IgbmV3IGRpci9zeW1saW5rLCAyIGZvciBiaXRtYXAgdXBkYXRlcyAoYml0bWFwIGZlICsKICAqIGJpdG1hcCBibG9jayBmb3IgdGhlIG5ldyBiaXQpICovCiAjZGVmaW5lIE9DRlMyX0RJUl9MSU5LX0FERElUSU9OQUxfQ1JFRElUUyAoMSArIDIpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9tbWFwLmMgYi9mcy9vY2ZzMi9tbWFwLmMKaW5kZXggYWYwMTE1OC4uZDc5YWExMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbW1hcC5jCisrKyBiL2ZzL29jZnMyL21tYXAuYwpAQCAtMzcsMTEgKzM3LDI5IEBACiAKICNpbmNsdWRlICJvY2ZzMi5oIgogCisjaW5jbHVkZSAiYW9wcy5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJtbWFwLmgiCiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3Moc2lnc2V0X3QgKmJsb2NrZWQsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJLyogVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCBzaWduYWxzIGluIHRoZSB2bSBwYXRoIGlzCisJICogdG8gYmxvY2sgdGhlbSB1cGZyb250LCByYXRoZXIgdGhhbiBhbGxvd2luZyB0aGUKKwkgKiBsb2NraW5nIHBhdGhzIHRvIHJldHVybiAtRVJFU1RBUlRTWVMuICovCisJc2lnZmlsbHNldChibG9ja2VkKTsKKworCS8qIFdlIHNob3VsZCB0ZWNobmljYWxseSBuZXZlciBnZXQgYSBiYWQgcmV0dXJuIHZhbHVlCisJICogZnJvbSBzaWdwcm9jbWFzayAqLworCXJldHVybiBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssIGJsb2NrZWQsIG9sZHNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3ZtX29wX3VuYmxvY2tfc2lncyhzaWdzZXRfdCAqb2xkc2V0KQoreworCXJldHVybiBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb2xkc2V0LCBOVUxMKTsKK30KKwogc3RhdGljIHN0cnVjdCBwYWdlICpvY2ZzMl9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJCSBpbnQgKnR5cGUpCkBAIC01MywxNCArNzEsNyBAQAogCW1sb2dfZW50cnkoIihhcmVhPSVwLCBhZGRyZXNzPSVsdSwgdHlwZT0lcClcbiIsIGFyZWEsIGFkZHJlc3MsCiAJCSAgIHR5cGUpOwogCi0JLyogVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCBzaWduYWxzIGluIHRoaXMgcGF0aCBpcwotCSAqIHRvIGJsb2NrIHRoZW0gdXBmcm9udCwgcmF0aGVyIHRoYW4gYWxsb3dpbmcgdGhlCi0JICogbG9ja2luZyBwYXRocyB0byByZXR1cm4gLUVSRVNUQVJUU1lTLiAqLwotCXNpZ2ZpbGxzZXQoJmJsb2NrZWQpOwotCi0JLyogV2Ugc2hvdWxkIHRlY2huaWNhbGx5IG5ldmVyIGdldCBhIGJhZCByZXQgcmV0dXJuCi0JICogZnJvbSBzaWdwcm9jbWFzayAqLwotCXJldCA9IHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmJsb2NrZWQsICZvbGRzZXQpOworCXJldCA9IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3MoJmJsb2NrZWQsICZvbGRzZXQpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC02OCw3ICs3OSw3IEBACiAKIAlwYWdlID0gZmlsZW1hcF9ub3BhZ2UoYXJlYSwgYWRkcmVzcywgdHlwZSk7CiAKLQlyZXQgPSBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0ID0gb2NmczJfdm1fb3BfdW5ibG9ja19zaWdzKCZvbGRzZXQpOwogCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7CiBvdXQ6CkBAIC03NiwyNyArODcsMTM1IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKK3N0YXRpYyBpbnQgX19vY2ZzMl9wYWdlX21rd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlsb2ZmX3QgcG9zID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gUEFHRV9DQUNIRV9TSVpFOworCXBnb2ZmX3QgbGFzdF9pbmRleDsKKwlzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UgPSBOVUxMOworCXZvaWQgKmZzZGF0YTsKKwlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCS8qCisJICogQW5vdGhlciBub2RlIG1pZ2h0IGhhdmUgdHJ1bmNhdGVkIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBvbgorCSAqIGNsdXN0ZXIgbG9ja3MuCisJICovCisJbGFzdF9pbmRleCA9IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGFnZS0+aW5kZXggPiBsYXN0X2luZGV4KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGlfc2l6ZSBjaGVjayBhYm92ZSBkb2Vzbid0IGNhdGNoIHRoZSBjYXNlIHdoZXJlIG5vZGVzCisJICogdHJ1bmNhdGVkIGFuZCB0aGVuIHJlLWV4dGVuZGVkIHRoZSBmaWxlLiBXZSdsbCByZS1jaGVjayB0aGUKKwkgKiBwYWdlIG1hcHBpbmcgYWZ0ZXIgdGFraW5nIHRoZSBwYWdlIGxvY2sgaW5zaWRlIG9mCisJICogb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgcGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2FsbCBvY2ZzMl93cml0ZV9iZWdpbigpIGFuZCBvY2ZzMl93cml0ZV9lbmQoKSB0byB0YWtlCisJICogYWR2YW50YWdlIG9mIHRoZSBhbGxvY2F0aW9uIGNvZGUgdGhlcmUuIFdlIHBhc3MgYSB3cml0ZQorCSAqIGxlbmd0aCBvZiB0aGUgd2hvbGUgcGFnZSAoY2hvcHBlZCB0byBpX3NpemUpIHRvIG1ha2Ugc3VyZQorCSAqIHRoZSB3aG9sZSB0aGluZyBpcyBhbGxvY2F0ZWQuCisJICoKKwkgKiBTaW5jZSB3ZSBrbm93IHRoZSBwYWdlIGlzIHVwIHRvIGRhdGUsIHdlIGRvbid0IGhhdmUgdG8KKwkgKiB3b3JyeSBhYm91dCBvY2ZzMl93cml0ZV9iZWdpbigpIHNraXBwaW5nIHNvbWUgYnVmZmVyIHJlYWRzCisJICogYmVjYXVzZSB0aGUgIndyaXRlIiB3b3VsZCBpbnZhbGlkYXRlIHRoZWlyIGRhdGEuCisJICovCisJaWYgKHBhZ2UtPmluZGV4ID09IGxhc3RfaW5kZXgpCisJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCAwLCAmbG9ja2VkX3BhZ2UsCisJCQkJICAgICAgICZmc2RhdGEsIGRpX2JoLCBwYWdlKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfd3JpdGVfZW5kX25vbG9jayhtYXBwaW5nLCBwb3MsIGxlbiwgbGVuLCBsb2NrZWRfcGFnZSwKKwkJCQkgICAgIGZzZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJQlVHX09OKHJldCAhPSBsZW4pOworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc2lnc2V0X3QgYmxvY2tlZCwgb2xkc2V0OworCWludCByZXQsIHJldDI7CisKKwlyZXQgPSBvY2ZzMl92bV9vcF9ibG9ja19zaWdzKCZibG9ja2VkLCAmb2xkc2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBUaGUgY2x1c3RlciBsb2NrcyB0YWtlbiB3aWxsIGJsb2NrIGEgdHJ1bmNhdGUgZnJvbSBhbm90aGVyCisJICogbm9kZS4gVGFraW5nIHRoZSBkYXRhIGxvY2sgd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHdlIGRvbid0CisJICogYXR0ZW1wdCBwYWdlIHRydW5jYXRpb24gYXMgcGFydCBvZiBhIGRvd25jb252ZXJ0LgorCSAqLworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGFsbG9jIHNlbSBzaG91bGQgYmUgZW5vdWdoIHRvIHNlcmlhbGl6ZSB3aXRoCisJICogb2NmczJfdHJ1bmNhdGVfZmlsZSgpIGNoYW5naW5nIGlfc2l6ZSBhcyB3ZWxsIGFzIGFueSB0aHJlYWQKKwkgKiBtb2RpZnlpbmcgdGhlIGlub2RlIGJ0cmVlLgorCSAqLworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCisJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCXJldCA9IF9fb2NmczJfcGFnZV9ta3dyaXRlKGlub2RlLCBkaV9iaCwgcGFnZSk7CisKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisKK291dF9tZXRhX3VubG9jazoKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlicmVsc2UoZGlfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworb3V0OgorCXJldDIgPSBvY2ZzMl92bV9vcF91bmJsb2NrX3NpZ3MoJm9sZHNldCk7CisJaWYgKHJldDIgPCAwKQorCQltbG9nX2Vycm5vKHJldDIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBvY2ZzMl9maWxlX3ZtX29wcyA9IHsKLQkubm9wYWdlID0gb2NmczJfbm9wYWdlLAorCS5ub3BhZ2UJCT0gb2NmczJfbm9wYWdlLAorCS5wYWdlX21rd3JpdGUJPSBvY2ZzMl9wYWdlX21rd3JpdGUsCiB9OwogCiBpbnQgb2NmczJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJaW50IHJldCA9IDAsIGxvY2tfbGV2ZWwgPSAwOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IpOwotCi0JLyoKLQkgKiBPbmx5IHN1cHBvcnQgc2hhcmVkIHdyaXRlYWJsZSBtbWFwIGZvciBsb2NhbCBtb3VudHMgd2hpY2gKLQkgKiBkb24ndCBrbm93IGFib3V0IGhvbGVzLgotCSAqLwotCWlmICgoIW9jZnMyX21vdW50X2xvY2FsKG9zYikgfHwgb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpICYmCi0JICAgICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpICYmCi0JICAgICgodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVdSSVRFKSkpIHsKLQkJbWxvZygwLCAiZGlzYWxsb3cgc2hhcmVkIHdyaXRhYmxlIG1tYXBzICVseFxuIiwgdm1hLT52bV9mbGFncyk7Ci0JCS8qIFRoaXMgaXMgLUVJTlZBTCBiZWNhdXNlIGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwCi0JCSAqIHJldHVybnMgaXQgaW4gYSBzaW1pbGFyIHNpdHVhdGlvbi4gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJcmV0ID0gb2NmczJfbWV0YV9sb2NrX2F0aW1lKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAogCQkJCSAgICBmaWxlLT5mX3Zmc21udCwgJmxvY2tfbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggMzYyODllNi4uZDQzMGZkYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0xNjc0LDcgKzE2NzQsNyBAQAogCQl1MzIgb2Zmc2V0ID0gMDsKIAogCQlpbm9kZS0+aV9vcCA9ICZvY2ZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsCisJCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsIDAsCiAJCQkJCQkgICAgbmV3X2ZlX2JoLAogCQkJCQkJICAgIGhhbmRsZSwgZGF0YV9hYywgTlVMTCwKIAkJCQkJCSAgICBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IGE4NjA2MzMuLjVjYzkwYTQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtMjE5LDYgKzIxOSw3IEBACiAJdTE2IG1heF9zbG90czsKIAlzMTYgbm9kZV9udW07CiAJczE2IHNsb3RfbnVtOworCXMxNiBwcmVmZXJyZWRfc2xvdDsKIAlpbnQgc19zZWN0c2l6ZV9iaXRzOwogCWludCBzX2NsdXN0ZXJzaXplOwogCWludCBzX2NsdXN0ZXJzaXplX2JpdHM7CkBAIC0zMDUsNiArMzA2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwkvKgorCSAqIFN1cHBvcnQgZm9yIHNwYXJzZSBmaWxlcyBpcyBhIHByZS1yZXF1aXNpdGUKKwkgKi8KKwlpZiAoIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKQorCQlyZXR1cm4gMDsKKworCWlmIChvc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJiBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiAvKiBzZXQgLyBjbGVhciBmdW5jdGlvbnMgYmVjYXVzZSBjbHVzdGVyIGV2ZW50cyBjYW4gbWFrZSB0aGVzZSBoYXBwZW4KICAqIGluIHBhcmFsbGVsIHNvIHdlIHdhbnQgdGhlIHRyYW5zaXRpb25zIHRvIGJlIGF0b21pYy4gdGhpcyBhbHNvCiAgKiBtZWFucyB0aGF0IGFueSBmdXR1cmUgZmxhZ3Mgb3NiX2ZsYWdzIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oIGIvZnMvb2NmczIvb2NmczJfZnMuaAppbmRleCBmMGQ5ZWIwLi44MmY4YTc1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oCisrKyBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9DT01QQVRfU1VQUAlPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9CQUNLVVBfU0IKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0xPQ0FMX01PVU5UIFwKIAkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TUEFSU0VfQUxMT0MpCi0jZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJMAorI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTgogCiAvKgogICogSGVhcnRiZWF0LW9ubHkgZGV2aWNlcyBhcmUgbWlzc2luZyBqb3VybmFscyBhbmQgb3RoZXIgZmlsZXMuICBUaGUKQEAgLTExNiw2ICsxMTYsMTEgQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9CQUNLVVBfU0IJCTB4MDAwMQogCisvKgorICogVW53cml0dGVuIGV4dGVudHMgc3VwcG9ydC4KKyAqLworI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4JMHgwMDAxCisKIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZmlyc3QgYmFja3VwIGJsb2NrIHdpbGwgYmUgMUcuCiAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYmUgNEcsIDE2RywgNjRHLCAyNTZHIGFuZCAxVC4KICAqLwpAQCAtMTcwLDYgKzE3NSwzMiBAQAogI2RlZmluZSBPQ0ZTMl9JT0MzMl9TRVRGTEFHUwlfSU9XKCdmJywgMiwgaW50KQogCiAvKgorICogU3BhY2UgcmVzZXJ2YXRpb24gLyBhbGxvY2F0aW9uIC8gZnJlZSBpb2N0bHMgYW5kIGFyZ3VtZW50IHN0cnVjdHVyZQorICogYXJlIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBYRlMuCisgKgorICogQUxMT0NTUCogYW5kIEZSRUVTUCogYXJlIG5vdCBhbmQgd2lsbCBuZXZlciBiZSBzdXBwb3J0ZWQsIGJ1dCBhcmUKKyAqIGluY2x1ZGVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4KKyAqLworc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgeworCV9fczE2CQlsX3R5cGU7CisJX19zMTYJCWxfd2hlbmNlOworCV9fczY0CQlsX3N0YXJ0OworCV9fczY0CQlsX2xlbjsJCS8qIGxlbiA9PSAwIG1lYW5zIHVudGlsIGVuZCBvZiBmaWxlICovCisJX19zMzIJCWxfc3lzaWQ7CisJX191MzIJCWxfcGlkOworCV9fczMyCQlsX3BhZFs0XTsJLyogcmVzZXJ2ZSBhcmVhCQkJICAgICovCit9OworCisjZGVmaW5lIE9DRlMyX0lPQ19BTExPQ1NQCQlfSU9XICgnWCcsIDEwLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX0ZSRUVTUAkJX0lPVyAoJ1gnLCAxMSwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19SRVNWU1AJCV9JT1cgKCdYJywgNDAsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfVU5SRVNWU1AJX0lPVyAoJ1gnLCA0MSwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19BTExPQ1NQNjQJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19GUkVFU1A2NAlfSU9XICgnWCcsIDM3LCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX1JFU1ZTUDY0CV9JT1cgKCdYJywgNDIsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NAlfSU9XICgnWCcsIDQzLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKworLyoKICAqIEpvdXJuYWwgRmxhZ3MgKG9jZnMyX2Rpbm9kZS5pZDEuam91cm5hbDEuaV9mbGFncykKICAqLwogI2RlZmluZSBPQ0ZTMl9KT1VSTkFMX0RJUlRZX0ZMCSgweDAwMDAwMDAxKQkvKiBKb3VybmFsIG5lZWRzIHJlY292ZXJ5ICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zbG90X21hcC5jIGIvZnMvb2NmczIvc2xvdF9tYXAuYwppbmRleCBkOGI3OTA2Li5hZjQ4ODJiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zbG90X21hcC5jCisrKyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKQEAgLTEyMSwxNyArMTIxLDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHMxNiBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzdHJ1Y3Qgb2NmczJfc2xvdF9pbmZvICpzaSkKK3N0YXRpYyBzMTYgX19vY2ZzMl9maW5kX2VtcHR5X3Nsb3Qoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyAqc2ksIHMxNiBwcmVmZXJyZWQpCiB7CiAJaW50IGk7CiAJczE2IHJldCA9IE9DRlMyX0lOVkFMSURfU0xPVDsKIAorCWlmIChwcmVmZXJyZWQgPj0gMCAmJiBwcmVmZXJyZWQgPCBzaS0+c2lfbnVtX3Nsb3RzKSB7CisJCWlmIChPQ0ZTMl9JTlZBTElEX1NMT1QgPT0gc2ktPnNpX2dsb2JhbF9ub2RlX251bXNbcHJlZmVycmVkXSkgeworCQkJcmV0ID0gcHJlZmVycmVkOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKIAlmb3IoaSA9IDA7IGkgPCBzaS0+c2lfbnVtX3Nsb3RzOyBpKyspIHsKIAkJaWYgKE9DRlMyX0lOVkFMSURfU0xPVCA9PSBzaS0+c2lfZ2xvYmFsX25vZGVfbnVtc1tpXSkgewogCQkJcmV0ID0gKHMxNikgaTsKIAkJCWJyZWFrOwogCQl9CiAJfQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI0OCw3ICsyNTYsNyBAQAogCWlmIChzbG90ID09IE9DRlMyX0lOVkFMSURfU0xPVCkgewogCQkvKiBpZiBubyBzbG90IHlldCwgdGhlbiBqdXN0IHRha2UgMXN0IGF2YWlsYWJsZQogCQkgKiBvbmUuICovCi0JCXNsb3QgPSBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzaSk7CisJCXNsb3QgPSBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzaSwgb3NiLT5wcmVmZXJyZWRfc2xvdCk7CiAJCWlmIChzbG90ID09IE9DRlMyX0lOVkFMSURfU0xPVCkgewogCQkJc3Bpbl91bmxvY2soJnNpLT5zaV9sb2NrKTsKIAkJCW1sb2coTUxfRVJST1IsICJubyBmcmVlIHNsb3RzIGF2YWlsYWJsZSFcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggZTM0Mzc2Mi4uZDljNWM5ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC05OCwxNCArOTgsNiBAQAogCQkJCSAgICB1MTYgY2hhaW4pOwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfcmVhc29uYWJseV9lbXB0eShzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcsCiAJCQkJCQkgICAgIHUzMiB3YW50ZWQpOwotc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKLQkJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKLQkJCQkgICAgdTY0IGJnX2Jsa25vLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQpOwotc3RhdGljIGlubGluZSB1NjQgb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAodTY0IGJsb2NrLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBiaXQpOwogc3RhdGljIGlubGluZSB1MzIgb2NmczJfZGVzY19iaXRtYXBfdG9fY2x1c3Rlcl9vZmYoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCSAgIHU2NCBiZ19ibGtubywKIAkJCQkJCSAgIHUxNiBiZ19iaXRfb2ZmKTsKQEAgLTQ5NiwxMyArNDg4LDcgQEAKIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChmZSk7CiAJKCphYyktPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX01FVEE7Ci0KLSNpZm5kZWYgT0NGUzJfVVNFX0FMTF9NRVRBREFUQV9TVUJBTExPQ0FUT1JTCi0Jc2xvdCA9IDA7Ci0jZWxzZQogCXNsb3QgPSBvc2ItPnNsb3RfbnVtOwotI2VuZGlmCi0KIAkoKmFjKS0+YWNfZ3JvdXBfc2VhcmNoID0gb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoOwogCiAJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgKCphYyksCkBAIC0xNjI2LDEyICsxNjEyLDEyIEBACiAvKgogICogZXhwZWN0cyB0aGUgc3ViYWxsb2MgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCi0JCQkJICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCi0JCQkJICAgIHU2NCBiZ19ibGtubywKLQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50KQoraW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LAorCQkJICAgICB1NjQgYmdfYmxrbm8sCisJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAl1MzIgdG1wX3VzZWQ7CkBAIC0xNzAzLDEzICsxNjg5LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cCh1NjQgYmxvY2ssIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JdTY0IGdyb3VwID0gYmxvY2sgLSAodTY0KSBiaXQ7Ci0KLQlyZXR1cm4gZ3JvdXA7Ci19Ci0KIGludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLApAQCAtMTcyMywxOSArMTcwMiw2IEBACiAJCQkJCWlub2RlX2FsbG9jX2JoLCBiaXQsIGJnX2Jsa25vLCAxKTsKIH0KIAotaW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgc3RydWN0IGlub2RlICplYl9hbGxvY19pbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2FsbG9jX2JoLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKQotewotCXU2NCBibGsgPSBsZTY0X3RvX2NwdShlYi0+aF9ibGtubyk7Ci0JdTE2IGJpdCA9IGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX2JpdCk7Ci0JdTY0IGJnX2Jsa25vID0gb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAoYmxrLCBiaXQpOwotCi0JcmV0dXJuIG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGViX2FsbG9jX2lub2RlLCBlYl9hbGxvY19iaCwKLQkJCQkJYml0LCBiZ19ibGtubywgMSk7Ci19Ci0KIGludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmJpdG1hcF9pbm9kZSwKIAkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuaCBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKaW5kZXggMWEzYzk0Yy4uZjIxMmRjMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCkBAIC04NiwyMCArODYsMjkgQEAKIAkJCSB1MzIgKmNsdXN0ZXJfc3RhcnQsCiAJCQkgdTMyICpudW1fY2x1c3RlcnMpOwogCitpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCisJCQkgICAgIHU2NCBiZ19ibGtubywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKIGludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLAogCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSk7Ci1pbnQgb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmViX2FsbG9jX2lub2RlLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYWxsb2NfYmgsCi0JCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpOwogaW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqYml0bWFwX2lub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyk7CiAKK3N0YXRpYyBpbmxpbmUgdTY0IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKHU2NCBibG9jaywgdW5zaWduZWQgaW50IGJpdCkKK3sKKwl1NjQgZ3JvdXAgPSBibG9jayAtICh1NjQpIGJpdDsKKworCXJldHVybiBncm91cDsKK30KKwogc3RhdGljIGlubGluZSB1MzIgb2NmczJfY2x1c3Rlcl9mcm9tX2Rlc2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSAgdTY0IGJnX2Jsa25vKQogewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggODZiNTU5Yy4uM2E1YTFlZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC04Miw3ICs4Miw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgb2NmczJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwgaW50IGlzX3JlbW91bnQpOworCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwgczE2ICpzbG90LAorCQkJICAgICAgIGludCBpc19yZW1vdW50KTsKIHN0YXRpYyB2b2lkIG9jZnMyX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyBpbnQgb2NmczJfbW91bnRfdm9sdW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIGludCBvY2ZzMl9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOwpAQCAtMTE0LDggKzExNSw2IEBACiBzdGF0aWMgc3RydWN0IGlub2RlICpvY2ZzMl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyB2b2lkIG9jZnMyX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG9jZnMyX3NvcHMgPSB7CiAJLnN0YXRmcwkJPSBvY2ZzMl9zdGF0ZnMsCiAJLmFsbG9jX2lub2RlCT0gb2NmczJfYWxsb2NfaW5vZGUsCkBAIC0xNDAsNiArMTM5LDcgQEAKIAlPcHRfZGF0YV9vcmRlcmVkLAogCU9wdF9kYXRhX3dyaXRlYmFjaywKIAlPcHRfYXRpbWVfcXVhbnR1bSwKKwlPcHRfc2xvdCwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTU0LDYgKzE1NCw3IEBACiAJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKIAl7T3B0X2RhdGFfd3JpdGViYWNrLCAiZGF0YT13cml0ZWJhY2sifSwKIAl7T3B0X2F0aW1lX3F1YW50dW0sICJhdGltZV9xdWFudHVtPSV1In0sCisJe09wdF9zbG90LCAicHJlZmVycmVkX3Nsb3Q9JXUifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTMxOCw3ICszMTksNyBAQAogLyogRnJvbSB4ZnNfc3VwZXIuYzp4ZnNfbWF4X2ZpbGVfb2Zmc2V0CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KQordW5zaWduZWQgbG9uZyBsb25nIG9jZnMyX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQgYmxvY2tzaGlmdCkKIHsKIAl1bnNpZ25lZCBpbnQgcGFnZWZhY3RvciA9IDE7CiAJdW5zaWduZWQgaW50IGJpdHNoaWZ0ID0gQklUU19QRVJfTE9ORyAtIDE7CkBAIC0zNTUsOSArMzU2LDEwIEBACiAJaW50IGluY29tcGF0X2ZlYXR1cmVzOwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgcGFyc2VkX29wdGlvbnM7CisJczE2IHNsb3Q7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihzYik7CiAKLQlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0aW9ucywgMSkpIHsKKwlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0aW9ucywgJnNsb3QsIDEpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTUzNCw2ICs1MzYsNyBAQAogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CiAJaW50IHN0YXR1cywgc2VjdG9yX3NpemU7CiAJdW5zaWduZWQgbG9uZyBwYXJzZWRfb3B0OworCXMxNiBzbG90OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKQEAgLTU0MSw3ICs1NDQsNyBAQAogCiAJbWxvZ19lbnRyeSgiJXAsICVwLCAlaSIsIHNiLCBkYXRhLCBzaWxlbnQpOwogCi0JaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdCwgMCkpIHsKKwlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0LCAmc2xvdCwgMCkpIHsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJZ290byByZWFkX3N1cGVyX2Vycm9yOwogCX0KQEAgLTU3MSw2ICs1NzQsNyBAQAogCWJyZWxzZShiaCk7CiAJYmggPSBOVUxMOwogCW9zYi0+c19tb3VudF9vcHQgPSBwYXJzZWRfb3B0OworCW9zYi0+cHJlZmVycmVkX3Nsb3QgPSBzbG90OwogCiAJc2ItPnNfbWFnaWMgPSBPQ0ZTMl9TVVBFUl9NQUdJQzsKIApAQCAtNzEzLDYgKzcxNyw3IEBACiBzdGF0aWMgaW50IG9jZnMyX3BhcnNlX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICAgICBjaGFyICpvcHRpb25zLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwKKwkJCSAgICAgICBzMTYgKnNsb3QsCiAJCQkgICAgICAgaW50IGlzX3JlbW91bnQpCiB7CiAJaW50IHN0YXR1czsKQEAgLTcyMiw2ICs3MjcsNyBAQAogCQkgICBvcHRpb25zID8gb3B0aW9ucyA6ICIobm9uZSkiKTsKIAogCSptb3VudF9vcHQgPSAwOworCSpzbG90ID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCiAJaWYgKCFvcHRpb25zKSB7CiAJCXN0YXR1cyA9IDE7CkBAIC03ODIsNiArNzg4LDE1IEBACiAJCQllbHNlCiAJCQkJb3NiLT5zX2F0aW1lX3F1YW50dW0gPSBPQ0ZTMl9ERUZBVUxUX0FUSU1FX1FVQU5UVU07CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfc2xvdDoKKwkJCW9wdGlvbiA9IDA7CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkgeworCQkJCXN0YXR1cyA9IDA7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJaWYgKG9wdGlvbikKKwkJCQkqc2xvdCA9IChzMTYpb3B0aW9uOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQltbG9nKE1MX0VSUk9SLAogCQkJICAgICAiVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuaCBiL2ZzL29jZnMyL3N1cGVyLmgKaW5kZXggNzgzZjUyNy4uM2I5Y2IzZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuaAorKysgYi9mcy9vY2ZzMi9zdXBlci5oCkBAIC00NSw0ICs0NSw2IEBACiAKICNkZWZpbmUgb2NmczJfYWJvcnQoc2IsIGZtdCwgYXJncy4uLikgX19vY2ZzMl9hYm9ydChzYiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZm10LCAjI2FyZ3MpCiAKK3Vuc2lnbmVkIGxvbmcgbG9uZyBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50IGJsb2Nrc2hpZnQpOworCiAjZW5kaWYgLyogT0NGUzJfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDBkNTE1ZDEuLmJlNmE0NTcgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTg1NSw3ICs4NTUsNyBAQAogLyoKICAqIEZpbmQgYW4gZW1wdHkgZmlsZSBkZXNjcmlwdG9yIGVudHJ5LCBhbmQgbWFyayBpdCBidXN5LgogICovCi1pbnQgZ2V0X3VudXNlZF9mZCh2b2lkKQoraW50IGdldF91bnVzZWRfZmRfZmxhZ3MoaW50IGZsYWdzKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCWludCBmZCwgZXJyb3I7CkBAIC04OTEsNyArODkxLDEwIEBACiAJfQogCiAJRkRfU0VUKGZkLCBmZHQtPm9wZW5fZmRzKTsKLQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJaWYgKGZsYWdzICYgT19DTE9FWEVDKQorCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZWxzZQorCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7CiAjaWYgMQogCS8qIFNhbml0eSBjaGVjayAqLwpAQCAtOTA3LDYgKzkxMCwxMSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAoraW50IGdldF91bnVzZWRfZmQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X3VudXNlZF9mZF9mbGFncygwKTsKK30KKwogRVhQT1JUX1NZTUJPTChnZXRfdW51c2VkX2ZkKTsKIAogc3RhdGljIHZvaWQgX19wdXRfdW51c2VkX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCkBAIC05NTksNyArOTY3LDcgQEAKIAlpbnQgZmQgPSBQVFJfRVJSKHRtcCk7CiAKIAlpZiAoIUlTX0VSUih0bXApKSB7Ci0JCWZkID0gZ2V0X3VudXNlZF9mZCgpOworCQlmZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoZmxhZ3MpOwogCQlpZiAoZmQgPj0gMCkgewogCQkJc3RydWN0IGZpbGUgKmYgPSBkb19maWxwX29wZW4oZGZkLCB0bXAsIGZsYWdzLCBtb2RlKTsKIAkJCWlmIChJU19FUlIoZikpIHsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYyBiL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYwppbmRleCBlMzQ5MTMyLi4zZDNlMTY2IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKKysrIGIvZnMvcGFydGl0aW9ucy9hY29ybi5jCkBAIC0yNSw2ICsyNSw4IEBACiAjZGVmaW5lIFBBUlRJVElPTl9SSVNDSVhfU0NTSQkyCiAjZGVmaW5lIFBBUlRJVElPTl9MSU5VWAkJOQogCisjaWYgZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTKQogc3RhdGljIHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKgogYWRmc19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgY2hhciAqbmFtZSwgY2hhciAqZGF0YSwKIAkgICAgICAgdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IsIGludCBzbG90KQpAQCAtNDgsNiArNTAsNyBAQAogCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIGZpcnN0X3NlY3RvciwgbnJfc2VjdHMpOwogCXJldHVybiBkcjsKIH0KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9SSVNDSVgKIApAQCAtNjUsNiArNjgsOCBAQAogCXN0cnVjdCByaXNjaXhfcGFydCBwYXJ0WzhdOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBpbnQKIHJpc2NpeF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0LCBpbnQgc2xvdCwgdW5zaWduZWQgbG9uZyBucl9zZWN0cykKQEAgLTEwNSw2ICsxMTAsNyBAQAogCXJldHVybiBzbG90OwogfQogI2VuZGlmCisjZW5kaWYKIAogI2RlZmluZSBMSU5VWF9OQVRJVkVfTUFHSUMgMHhkZWFmYTFkZQogI2RlZmluZSBMSU5VWF9TV0FQX01BR0lDICAgMHhkZWFmYWIxZQpAQCAtMTE1LDYgKzEyMSw4IEBACiAJX19sZTMyIG5yX3NlY3RzOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBpbnQKIGxpbnV4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3QsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIG5yX3NlY3RzKQpAQCAtMTQ2LDYgKzE1NCw3IEBACiAJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CiAJcmV0dXJuIHNsb3Q7CiB9CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCmluZGV4IDk5ODczYTIuLmU3ZGQxZDQgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtNjc3LDE1ICs2NzcsMjQgQEAKICAqIFJldHVybjogIC0xIEVycm9yLCB0aGUgY2FsY3VsYXRlZCBvZmZzZXQgZXhjZWVkZWQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgogICogICAgICAgICAgIG4gT0ssIGEgcmFuZ2UtY2hlY2tlZCBvZmZzZXQgaW50byBidWZmZXIKICAqLwotc3RhdGljIGludCBsZG1fcmVsYXRpdmUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIGludCBiYXNlLCBpbnQgb2Zmc2V0KQorc3RhdGljIGludCBsZG1fcmVsYXRpdmUoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGJhc2UsIGludCBvZmZzZXQpCiB7CiAKIAliYXNlICs9IG9mZnNldDsKLQlpZiAoKCFidWZmZXIpIHx8IChvZmZzZXQgPCAwKSB8fCAoYmFzZSA+IGJ1ZmxlbikpCisJaWYgKCFidWZmZXIgfHwgb2Zmc2V0IDwgMCB8fCBiYXNlID4gYnVmbGVuKSB7CisJCWlmICghYnVmZmVyKQorCQkJbGRtX2Vycm9yKCIhYnVmZmVyIik7CisJCWlmIChvZmZzZXQgPCAwKQorCQkJbGRtX2Vycm9yKCJvZmZzZXQgKCVkKSA8IDAiLCBvZmZzZXQpOworCQlpZiAoYmFzZSA+IGJ1ZmxlbikKKwkJCWxkbV9lcnJvcigiYmFzZSAoJWQpID4gYnVmbGVuICglZCkiLCBiYXNlLCBidWZsZW4pOwogCQlyZXR1cm4gLTE7Ci0JaWYgKChiYXNlICsgYnVmZmVyW2Jhc2VdKSA+PSBidWZsZW4pCisJfQorCWlmIChiYXNlICsgYnVmZmVyW2Jhc2VdID49IGJ1ZmxlbikgeworCQlsZG1fZXJyb3IoImJhc2UgKCVkKSArIGJ1ZmZlcltiYXNlXSAoJWQpID49IGJ1ZmxlbiAoJWQpIiwgYmFzZSwKKwkJCQlidWZmZXJbYmFzZV0sIGJ1Zmxlbik7CiAJCXJldHVybiAtMTsKLQorCX0KIAlyZXR1cm4gYnVmZmVyW2Jhc2VdICsgb2Zmc2V0ICsgMTsKIH0KIApAQCAtMTA1NCw2MCArMTA2Myw5OCBAQAogICogUmV0dXJuOiAgJ3RydWUnICAgQHZiIGNvbnRhaW5zIGEgVm9sdW1lIFZCTEsKICAqICAgICAgICAgICdmYWxzZScgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKICAqLwotc3RhdGljIGJvb2wgbGRtX3BhcnNlX3ZvbDUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3N0YXRpYyBib29sIGxkbV9wYXJzZV92b2w1KGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKIHsKLQlpbnQgcl9vYmppZCwgcl9uYW1lLCByX3Z0eXBlLCByX2NoaWxkLCByX3NpemUsIHJfaWQxLCByX2lkMiwgcl9zaXplMjsKLQlpbnQgcl9kcml2ZSwgbGVuOworCWludCByX29iamlkLCByX25hbWUsIHJfdnR5cGUsIHJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIsIHJfY2hpbGQsIHJfc2l6ZTsKKwlpbnQgcl9pZDEsIHJfaWQyLCByX3NpemUyLCByX2RyaXZlLCBsZW47CiAJc3RydWN0IHZibGtfdm9sdSAqdm9sdTsKIAotCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOwotCi0Jcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKLQlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOwotCXJfdnR5cGUgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKLQlyX2NoaWxkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkUsIHJfdnR5cGUpOwotCXJfc2l6ZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzRSwgcl9jaGlsZCk7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKQotCQlyX2lkMSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfc2l6ZSk7Ci0JZWxzZQorCUJVR19PTighYnVmZmVyIHx8ICF2Yik7CisJcl9vYmppZCA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7CisJaWYgKHJfb2JqaWQgPCAwKSB7CisJCWxkbV9lcnJvcigicl9vYmppZCAlZCA8IDAiLCByX29iamlkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX25hbWUgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCWlmIChyX25hbWUgPCAwKSB7CisJCWxkbV9lcnJvcigicl9uYW1lICVkIDwgMCIsIHJfbmFtZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl92dHlwZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKwlpZiAocl92dHlwZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX3Z0eXBlICVkIDwgMCIsIHJfdnR5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfdnR5cGUpOworCWlmIChyX2Rpc2FibGVfZHJpdmVfbGV0dGVyIDwgMCkgeworCQlsZG1fZXJyb3IoInJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgJWQgPCAwIiwKKwkJCQlyX2Rpc2FibGVfZHJpdmVfbGV0dGVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX2NoaWxkID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDJELCByX2Rpc2FibGVfZHJpdmVfbGV0dGVyKTsKKwlpZiAocl9jaGlsZCA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX2NoaWxkICVkIDwgMCIsIHJfY2hpbGQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfc2l6ZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgzRCwgcl9jaGlsZCk7CisJaWYgKHJfc2l6ZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX3NpemUgJWQgPCAwIiwgcl9zaXplKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKSB7CisJCXJfaWQxID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX3NpemUpOworCQlpZiAocl9pZDEgPCAwKSB7CisJCQlsZG1fZXJyb3IoInJfaWQxICVkIDwgMCIsIHJfaWQxKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX2lkMSA9IHJfc2l6ZTsKLQotCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDIpCi0JCXJfaWQyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9pZDEpOwotCWVsc2UKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQyKSB7CisJCXJfaWQyID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX2lkMSk7CisJCWlmIChyX2lkMiA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9pZDIgJWQgPCAwIiwgcl9pZDIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCiAJCXJfaWQyID0gcl9pZDE7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfU0laRSkKLQkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfaWQyKTsKLQllbHNlCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX1NJWkUpIHsKKwkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9pZDIpOworCQlpZiAocl9zaXplMiA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9zaXplMiAlZCA8IDAiLCByX3NpemUyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX3NpemUyID0gcl9pZDI7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpCi0JCXJfZHJpdmUgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX3NpemUyKTsKLQllbHNlCi0JCXJfZHJpdmUgPSByX3NpemUyOwotCi0JbGVuID0gcl9kcml2ZTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbGVuICs9IFZCTEtfU0laRV9WT0w1OwotCWlmIChsZW4gIT0gQkUzMiAoYnVmZmVyICsgMHgxNCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXZvbHUgPSAmdmItPnZibGsudm9sdTsKLQotCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgIHZvbHUtPnZvbHVtZV90eXBlLAotCQlzaXplb2YgKHZvbHUtPnZvbHVtZV90eXBlKSk7Ci0JbWVtY3B5ICh2b2x1LT52b2x1bWVfc3RhdGUsIGJ1ZmZlciArIDB4MTkgKyByX3Z0eXBlLAotCQkJc2l6ZW9mICh2b2x1LT52b2x1bWVfc3RhdGUpKTsKLQl2b2x1LT5zaXplID0gbGRtX2dldF92bnVtIChidWZmZXIgKyAweDNFICsgcl9jaGlsZCk7Ci0Jdm9sdS0+cGFydGl0aW9uX3R5cGUgPSBidWZmZXJbMHg0MiArIHJfc2l6ZV07Ci0JbWVtY3B5ICh2b2x1LT5ndWlkLCBidWZmZXIgKyAweDQzICsgcl9zaXplLCAgc2l6ZW9mICh2b2x1LT5ndWlkKSk7CiAJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0RSSVZFKSB7Ci0JCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHg1MyArIHJfc2l6ZSwgIHZvbHUtPmRyaXZlX2hpbnQsCi0JCQlzaXplb2YgKHZvbHUtPmRyaXZlX2hpbnQpKTsKKwkJcl9kcml2ZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9zaXplMik7CisJCWlmIChyX2RyaXZlIDwgMCkgeworCQkJbGRtX2Vycm9yKCJyX2RyaXZlICVkIDwgMCIsIHJfZHJpdmUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCisJCXJfZHJpdmUgPSByX3NpemUyOworCWxlbiA9IHJfZHJpdmU7CisJaWYgKGxlbiA8IDApIHsKKwkJbGRtX2Vycm9yKCJsZW4gJWQgPCAwIiwgbGVuKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlsZW4gKz0gVkJMS19TSVpFX1ZPTDU7CisJaWYgKGxlbiA+IEJFMzIoYnVmZmVyICsgMHgxNCkpIHsKKwkJbGRtX2Vycm9yKCJsZW4gJWQgPiBCRTMyKGJ1ZmZlciArIDB4MTQpICVkIiwgbGVuLAorCQkJCUJFMzIoYnVmZmVyICsgMHgxNCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZvbHUgPSAmdmItPnZibGsudm9sdTsKKwlsZG1fZ2V0X3ZzdHIoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgdm9sdS0+dm9sdW1lX3R5cGUsCisJCQlzaXplb2Yodm9sdS0+dm9sdW1lX3R5cGUpKTsKKwltZW1jcHkodm9sdS0+dm9sdW1lX3N0YXRlLCBidWZmZXIgKyAweDE4ICsgcl9kaXNhYmxlX2RyaXZlX2xldHRlciwKKwkJCXNpemVvZih2b2x1LT52b2x1bWVfc3RhdGUpKTsKKwl2b2x1LT5zaXplID0gbGRtX2dldF92bnVtKGJ1ZmZlciArIDB4M0QgKyByX2NoaWxkKTsKKwl2b2x1LT5wYXJ0aXRpb25fdHlwZSA9IGJ1ZmZlclsweDQxICsgcl9zaXplXTsKKwltZW1jcHkodm9sdS0+Z3VpZCwgYnVmZmVyICsgMHg0MiArIHJfc2l6ZSwgc2l6ZW9mKHZvbHUtPmd1aWQpKTsKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpIHsKKwkJbGRtX2dldF92c3RyKGJ1ZmZlciArIDB4NTIgKyByX3NpemUsIHZvbHUtPmRyaXZlX2hpbnQsCisJCQkJc2l6ZW9mKHZvbHUtPmRyaXZlX2hpbnQpKTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2xkbS5oIGIvZnMvcGFydGl0aW9ucy9sZG0uaAppbmRleCBkMmU2YTMwLi44MGY2M2I1IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2xkbS5oCisrKyBiL2ZzL3BhcnRpdGlvbnMvbGRtLmgKQEAgLTY4LDcgKzY4LDcgQEAKICNkZWZpbmUgVkJMS19TSVpFX0RTSzMJCTEyCiAjZGVmaW5lIFZCTEtfU0laRV9EU0s0CQk0NQogI2RlZmluZSBWQkxLX1NJWkVfUFJUMwkJMjgKLSNkZWZpbmUgVkJMS19TSVpFX1ZPTDUJCTU5CisjZGVmaW5lIFZCTEtfU0laRV9WT0w1CQk1OAogCiAvKiBjb21wb25lbnQgdHlwZXMgKi8KICNkZWZpbmUgQ09NUF9TVFJJUEUJCTB4MDEJCS8qIFN0cmlwZS1zZXQgKi8KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYXJyYXkuYyBiL2ZzL3Byb2MvYXJyYXkuYwppbmRleCA5OGU3OGUyLi45NjU2MjVhIDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC02Miw2ICs2Miw4IEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC03Niw5ICs3OCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtODcsMTAgKzg3LDEwIEBACiBkbyB7IG1lbWNweShidWZmZXIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOyBcCiAgICAgIGJ1ZmZlciArPSBzdHJsZW4oc3RyaW5nKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBjaGFyICogdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqIGJ1ZikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmKQogewogCWludCBpOwotCWNoYXIgKiBuYW1lOworCWNoYXIgKm5hbWU7CiAJY2hhciB0Y29tbVtzaXplb2YocC0+Y29tbSldOwogCiAJZ2V0X3Rhc2tfY29tbSh0Y29tbSwgcCk7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkiWCAoZGVhZCkiCQkvKiAzMiAqLwogfTsKIAotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICogZ2V0X3Rhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldF90YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXVuc2lnbmVkIGludCBzdGF0ZSA9ICh0c2stPnN0YXRlICYgKFRBU0tfUlVOTklORyB8CiAJCQkJCSAgICBUQVNLX0lOVEVSUlVQVElCTEUgfApAQCAtMTU2LDcgKzE1Niw3IEBACiAJcmV0dXJuICpwOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSBjaGFyICp0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQogewogCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOwogCWludCBnOwpAQCAtMTcyLDggKzE3Miw4IEBACiAJCSJVaWQ6XHQlZFx0JWRcdCVkXHQlZFxuIgogCQkiR2lkOlx0JWRcdCVkXHQlZFx0JWRcbiIsCiAJCWdldF90YXNrX3N0YXRlKHApLAotCSAgICAgICAJcC0+dGdpZCwgcC0+cGlkLAotCSAgICAgICAJcGlkX2FsaXZlKHApID8gcmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KS0+dGdpZCA6IDAsCisJCXAtPnRnaWQsIHAtPnBpZCwKKwkJcGlkX2FsaXZlKHApID8gcmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KS0+dGdpZCA6IDAsCiAJCXBpZF9hbGl2ZShwKSAmJiBwLT5wdHJhY2UgPyByY3VfZGVyZWZlcmVuY2UocC0+cGFyZW50KS0+cGlkIDogMCwKIAkJcC0+dWlkLCBwLT5ldWlkLCBwLT5zdWlkLCBwLT5mc3VpZCwKIAkJcC0+Z2lkLCBwLT5lZ2lkLCBwLT5zZ2lkLCBwLT5mc2dpZCk7CkBAIC0xOTEsMTUgKzE5MSwxNSBAQAogCWdldF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCXRhc2tfdW5sb2NrKHApOwogCi0JZm9yIChnID0gMDsgZyA8IG1pbihncm91cF9pbmZvLT5uZ3JvdXBzLE5HUk9VUFNfU01BTEwpOyBnKyspCi0JCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sZykpOworCWZvciAoZyA9IDA7IGcgPCBtaW4oZ3JvdXBfaW5mby0+bmdyb3VwcywgTkdST1VQU19TTUFMTCk7IGcrKykKKwkJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiJWQgIiwgR1JPVVBfQVQoZ3JvdXBfaW5mbywgZykpOwogCXB1dF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCiAJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiXG4iKTsKIAlyZXR1cm4gYnVmZmVyOwogfQogCi1zdGF0aWMgY2hhciAqIHJlbmRlcl9zaWdzZXRfdChjb25zdCBjaGFyICpoZWFkZXIsIHNpZ3NldF90ICpzZXQsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBjaGFyICpyZW5kZXJfc2lnc2V0X3QoY29uc3QgY2hhciAqaGVhZGVyLCBzaWdzZXRfdCAqc2V0LCBjaGFyICpidWZmZXIpCiB7CiAJaW50IGksIGxlbjsKIApAQCAtMjM5LDcgKzIzOSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3NpZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19zaWcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzaWdzZXRfdCBwZW5kaW5nLCBzaHBlbmRpbmcsIGJsb2NrZWQsIGlnbm9yZWQsIGNhdWdodDsKQEAgLTI4OSwxNCArMjg5LDIzIEBACiAJCQkgICAgY2FwX3QocC0+Y2FwX2VmZmVjdGl2ZSkpOwogfQogCi1pbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCQkJY2hhciAqYnVmZmVyKQogewotCWNoYXIgKiBvcmlnID0gYnVmZmVyOworCXJldHVybiBidWZmZXIgKyBzcHJpbnRmKGJ1ZmZlciwgInZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iCisJCQkgICAgIm5vbnZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iLAorCQkJICAgIHAtPm52Y3N3LAorCQkJICAgIHAtPm5pdmNzdyk7Cit9CisKK2ludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJY2hhciAqb3JpZyA9IGJ1ZmZlcjsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCiAJYnVmZmVyID0gdGFza19uYW1lKHRhc2ssIGJ1ZmZlcik7CiAJYnVmZmVyID0gdGFza19zdGF0ZSh0YXNrLCBidWZmZXIpOwotIAorCiAJaWYgKG1tKSB7CiAJCWJ1ZmZlciA9IHRhc2tfbWVtKG1tLCBidWZmZXIpOwogCQltbXB1dChtbSk7CkBAIC0zMDcsNiArMzE2LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQogCWJ1ZmZlciA9IHRhc2tfc2hvd19yZWdzKHRhc2ssIGJ1ZmZlcik7CiAjZW5kaWYKKwlidWZmZXIgPSB0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyh0YXNrLCBidWZmZXIpOwogCXJldHVybiBidWZmZXIgLSBvcmlnOwogfQogCkBAIC0zMzIsNyArMzQyLDcgQEAKIAogc3RhdGljIGNsb2NrX3QgdGFza19zdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JY2xvY2tfdCBzdGltZSA9IGNwdXRpbWVfdG9fY2xvY2tfdChwLT5zdGltZSk7CisJY2xvY2tfdCBzdGltZTsKIAogCS8qCiAJICogVXNlIENGUydzIHByZWNpc2UgYWNjb3VudGluZy4gKHdlIHN1YnRyYWN0IHV0aW1lIGZyb20KQEAgLTM0NCw4ICszNTQsNyBAQAogCXJldHVybiBzdGltZTsKIH0KIAotCi1zdGF0aWMgaW50IGRvX3Rhc2tfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIsIGludCB3aG9sZSkKK3N0YXRpYyBpbnQgZG9fdGFza19zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyLCBpbnQgd2hvbGUpCiB7CiAJdW5zaWduZWQgbG9uZyB2c2l6ZSwgZWlwLCBlc3AsIHdjaGFuID0gfjBVTDsKIAlsb25nIHByaW9yaXR5LCBuaWNlOwpAQCAtMzUzLDcgKzM2Miw3IEBACiAJc2lnc2V0X3Qgc2lnaWduLCBzaWdjYXRjaDsKIAljaGFyIHN0YXRlOwogCWludCByZXM7Ci0gCXBpZF90IHBwaWQgPSAwLCBwZ2lkID0gLTEsIHNpZCA9IC0xOworCXBpZF90IHBwaWQgPSAwLCBwZ2lkID0gLTEsIHNpZCA9IC0xOwogCWludCBudW1fdGhyZWFkcyA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X3RpbWU7CkBAIC00MjQsNyArNDMzLDcgQEAKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAoIXdob2xlIHx8IG51bV90aHJlYWRzPDIpCisJaWYgKCF3aG9sZSB8fCBudW1fdGhyZWFkcyA8IDIpCiAJCXdjaGFuID0gZ2V0X3djaGFuKHRhc2spOwogCWlmICghd2hvbGUpIHsKIAkJbWluX2ZsdCA9IHRhc2stPm1pbl9mbHQ7CkBAIC00NDAsMTIgKzQ0OSwxMyBAQAogCiAJLyogVGVtcG9yYXJ5IHZhcmlhYmxlIG5lZWRlZCBmb3IgZ2NjLTIuOTYgKi8KIAkvKiBjb252ZXJ0IHRpbWVzcGVjIC0+IG5zZWMqLwotCXN0YXJ0X3RpbWUgPSAodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPnN0YXJ0X3RpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDCi0JCQkJKyB0YXNrLT5zdGFydF90aW1lLnR2X25zZWM7CisJc3RhcnRfdGltZSA9CisJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+cmVhbF9zdGFydF90aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQworCQkJCSsgdGFzay0+cmVhbF9zdGFydF90aW1lLnR2X25zZWM7CiAJLyogY29udmVydCBuc2VjIC0+IHRpY2tzICovCiAJc3RhcnRfdGltZSA9IG5zZWNfdG9fY2xvY2tfdChzdGFydF90aW1lKTsKIAotCXJlcyA9IHNwcmludGYoYnVmZmVyLCIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCisJcmVzID0gc3ByaW50ZihidWZmZXIsICIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsZCAlbGQgJWxkICVsZCAlZCAwICVsbHUgJWx1ICVsZCAlbHUgJWx1ICVsdSAlbHUgJWx1IFwKICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWQgJWQgJXUgJXUgJWxsdVxuIiwKIAkJdGFzay0+cGlkLApAQCAtNDcxLDcgKzQ4MSw3IEBACiAJCXN0YXJ0X3RpbWUsCiAJCXZzaXplLAogCQltbSA/IGdldF9tbV9yc3MobW0pIDogMCwKLQkgICAgICAgIHJzc2xpbSwKKwkJcnNzbGltLAogCQltbSA/IG1tLT5zdGFydF9jb2RlIDogMCwKIAkJbW0gPyBtbS0+ZW5kX2NvZGUgOiAwLAogCQltbSA/IG1tLT5zdGFydF9zdGFjayA6IDAsCkBAIC00OTMsMTcgKzUwMywxNyBAQAogCQl0YXNrLT5ydF9wcmlvcml0eSwKIAkJdGFzay0+cG9saWN5LAogCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbGF5YWNjdF9ibGtpb190aWNrcyh0YXNrKSk7Ci0JaWYobW0pCisJaWYgKG1tKQogCQltbXB1dChtbSk7CiAJcmV0dXJuIHJlczsKIH0KIAotaW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoraW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCiB7CiAJcmV0dXJuIGRvX3Rhc2tfc3RhdCh0YXNrLCBidWZmZXIsIDApOwogfQogCi1pbnQgcHJvY190Z2lkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoraW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXJldHVybiBkb190YXNrX3N0YXQodGFzaywgYnVmZmVyLCAxKTsKIH0KQEAgLTUxMiwxMiArNTIyLDEyIEBACiB7CiAJaW50IHNpemUgPSAwLCByZXNpZGVudCA9IDAsIHNoYXJlZCA9IDAsIHRleHQgPSAwLCBsaWIgPSAwLCBkYXRhID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwotCQorCiAJaWYgKG1tKSB7CiAJCXNpemUgPSB0YXNrX3N0YXRtKG1tLCAmc2hhcmVkLCAmdGV4dCwgJmRhdGEsICZyZXNpZGVudCk7CiAJCW1tcHV0KG1tKTsKIAl9CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmZXIsIiVkICVkICVkICVkICVkICVkICVkXG4iLAorCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVkICVkICVkICVkICVkICVkICVkXG4iLAogCQkgICAgICAgc2l6ZSwgcmVzaWRlbnQsIHNoYXJlZCwgdGV4dCwgbGliLCBkYXRhLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNDZlYTVkNS4uNDJjYjRmNSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTY3LDcgKzY3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgpAQCAtMjA0LDEyICsyMDMsMTcgQEAKIAlpbnQgcmVzID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCWlmIChtbSkgewotCQl1bnNpZ25lZCBpbnQgbGVuID0gbW0tPmVudl9lbmQgLSBtbS0+ZW52X3N0YXJ0OworCQl1bnNpZ25lZCBpbnQgbGVuOworCisJCXJlcyA9IC1FU1JDSDsKKwkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKKwkJCWdvdG8gb3V0OworCisJCWxlbiAgPSBtbS0+ZW52X2VuZCAtIG1tLT5lbnZfc3RhcnQ7CiAJCWlmIChsZW4gPiBQQUdFX1NJWkUpCiAJCQlsZW4gPSBQQUdFX1NJWkU7CiAJCXJlcyA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIG1tLT5lbnZfc3RhcnQsIGJ1ZmZlciwgbGVuLCAwKTsKLQkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKLQkJCXJlcyA9IC1FU1JDSDsKK291dDoKIAkJbW1wdXQobW0pOwogCX0KIAlyZXR1cm4gcmVzOwpAQCAtMjc5LDcgKzI4Myw3IEBACiBzdGF0aWMgaW50IHByb2NfcGlkX3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXVuc2lnbmVkIGxvbmcgd2NoYW47Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJd2NoYW4gPSBnZXRfd2NoYW4odGFzayk7CiAKQEAgLTgxMiw3MSArODE2LDYgQEAKIH07CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRUNDT01QCi1zdGF0aWMgc3NpemVfdCBzZWNjb21wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQljaGFyIF9fYnVmWzIwXTsKLQlzaXplX3QgbGVuOwotCi0JaWYgKCF0c2spCi0JCXJldHVybiAtRVNSQ0g7Ci0JLyogbm8gbmVlZCB0byBwcmludCB0aGUgdHJhaWxpbmcgemVybywgc28gdXNlIG9ubHkgbGVuICovCi0JbGVuID0gc3ByaW50ZihfX2J1ZiwgIiV1XG4iLCB0c2stPnNlY2NvbXAubW9kZSk7Ci0JcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgX19idWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNlY2NvbXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JY2hhciBfX2J1ZlsyMF0sICplbmQ7Ci0JdW5zaWduZWQgaW50IHNlY2NvbXBfbW9kZTsKLQlzc2l6ZV90IHJlc3VsdDsKLQotCXJlc3VsdCA9IC1FU1JDSDsKLQlpZiAoIXRzaykKLQkJZ290byBvdXRfbm9fdGFzazsKLQotCS8qIGNhbiBzZXQgaXQgb25seSBvbmNlIHRvIGJlIGV2ZW4gbW9yZSBzZWN1cmUgKi8KLQlyZXN1bHQgPSAtRVBFUk07Ci0JaWYgKHVubGlrZWx5KHRzay0+c2VjY29tcC5tb2RlKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXN1bHQgPSAtRUZBVUxUOwotCW1lbXNldChfX2J1ZiwgMCwgc2l6ZW9mKF9fYnVmKSk7Ci0JY291bnQgPSBtaW4oY291bnQsIHNpemVvZihfX2J1ZikgLSAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoX19idWYsIGJ1ZiwgY291bnQpKQotCQlnb3RvIG91dDsKLQotCXNlY2NvbXBfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKF9fYnVmLCAmZW5kLCAwKTsKLQlpZiAoKmVuZCA9PSAnXG4nKQotCQllbmQrKzsKLQlyZXN1bHQgPSAtRUlOVkFMOwotCWlmIChzZWNjb21wX21vZGUgJiYgc2VjY29tcF9tb2RlIDw9IE5SX1NFQ0NPTVBfTU9ERVMpIHsKLQkJdHNrLT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7Ci0JCXNldF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfU0VDQ09NUCk7Ci0JfSBlbHNlCi0JCWdvdG8gb3V0OwotCXJlc3VsdCA9IC1FSU87Ci0JaWYgKHVubGlrZWx5KCEoZW5kIC0gX19idWYpKSkKLQkJZ290byBvdXQ7Ci0JcmVzdWx0ID0gZW5kIC0gX19idWY7Ci1vdXQ6Ci0JcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci1vdXRfbm9fdGFzazoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NlY2NvbXBfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkJPSBzZWNjb21wX3JlYWQsCi0JLndyaXRlCQk9IHNlY2NvbXBfd3JpdGUsCi19OwotI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCi0KICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCiBzdGF0aWMgc3NpemVfdCBwcm9jX2ZhdWx0X2luamVjdF9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0yMDM3LDkgKzE5NzYsNiBAQAogCVJFRygibnVtYV9tYXBzIiwgIFNfSVJVR08sIG51bWFfbWFwcyksCiAjZW5kaWYKIAlSRUcoIm1lbSIsICAgICAgICBTX0lSVVNSfFNfSVdVU1IsIG1lbSksCi0jaWZkZWYgQ09ORklHX1NFQ0NPTVAKLQlSRUcoInNlY2NvbXAiLCAgICBTX0lSVVNSfFNfSVdVU1IsIHNlY2NvbXApLAotI2VuZGlmCiAJTE5LKCJjd2QiLCAgICAgICAgY3dkKSwKIAlMTksoInJvb3QiLCAgICAgICByb290KSwKIAlMTksoImV4ZSIsICAgICAgICBleGUpLApAQCAtMjMyNCw5ICsyMjYwLDYgQEAKIAlSRUcoIm51bWFfbWFwcyIsIFNfSVJVR08sIG51bWFfbWFwcyksCiAjZW5kaWYKIAlSRUcoIm1lbSIsICAgICAgIFNfSVJVU1J8U19JV1VTUiwgbWVtKSwKLSNpZmRlZiBDT05GSUdfU0VDQ09NUAotCVJFRygic2VjY29tcCIsICAgU19JUlVTUnxTX0lXVVNSLCBzZWNjb21wKSwKLSNlbmRpZgogCUxOSygiY3dkIiwgICAgICAgY3dkKSwKIAlMTksoInJvb3QiLCAgICAgIHJvb3QpLAogCUxOSygiZXhlIiwgICAgICAgZXhlKSwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggOGE0MGUxNS4uYjVlNzE1NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtNTI5LDEyICs1MzAsNiBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAlkcC0+bG93X2lubyA9IGk7CiAKLQlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOwotCWRwLT5uZXh0ID0gZGlyLT5zdWJkaXI7Ci0JZHAtPnBhcmVudCA9IGRpcjsKLQlkaXItPnN1YmRpciA9IGRwOwotCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKLQogCWlmIChTX0lTRElSKGRwLT5tb2RlKSkgewogCQlpZiAoZHAtPnByb2NfaW9wcyA9PSBOVUxMKSB7CiAJCQlkcC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7CkBAIC01NTAsNiArNTQ1LDEzIEBACiAJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpCiAJCQlkcC0+cHJvY19pb3BzID0gJnByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogCX0KKworCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisJZHAtPm5leHQgPSBkaXItPnN1YmRpcjsKKwlkcC0+cGFyZW50ID0gZGlyOworCWRpci0+c3ViZGlyID0gZHA7CisJc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMyw2ICs2MTUsOSBAQAogCWVudC0+bmFtZWxlbiA9IGxlbjsKIAllbnQtPm1vZGUgPSBtb2RlOwogCWVudC0+bmxpbmsgPSBubGluazsKKwllbnQtPnBkZV91c2VycyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmVudC0+cGRlX3VubG9hZF9sb2NrKTsKKwllbnQtPnBkZV91bmxvYWRfY29tcGxldGlvbiA9IE5VTEw7CiAgb3V0OgogCXJldHVybiBlbnQ7CiB9CkBAIC02NDksOSArNjU0LDYgQEAKIAogCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsIG5hbWUsIFNfSUZESVIgfCBtb2RlLCAyKTsKIAlpZiAoZW50KSB7Ci0JCWVudC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7Ci0JCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0KIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKIAkJCWVudCA9IE5VTEw7CkBAIC02ODYsMTAgKzY4OCw2IEBACiAKIAllbnQgPSBwcm9jX2NyZWF0ZSgmcGFyZW50LG5hbWUsbW9kZSxubGluayk7CiAJaWYgKGVudCkgewotCQlpZiAoU19JU0RJUihtb2RlKSkgewotCQkJZW50LT5wcm9jX2ZvcHMgPSAmcHJvY19kaXJfb3BlcmF0aW9uczsKLQkJCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCX0KIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKIAkJCWVudCA9IE5VTEw7CkBAIC03MzQsOSArNzMyLDM1IEBACiAJCWRlID0gKnA7CiAJCSpwID0gZGUtPm5leHQ7CiAJCWRlLT5uZXh0ID0gTlVMTDsKKworCQlzcGluX2xvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOworCQkvKgorCQkgKiBTdG9wIGFjY2VwdGluZyBuZXcgY2FsbGVycyBpbnRvIG1vZHVsZS4gSWYgeW91J3JlCisJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgLT5wcm9jX2ZvcHMsIHNhdmUgYSBwb2ludGVyIHNvbWV3aGVyZS4KKwkJICovCisJCWRlLT5wcm9jX2ZvcHMgPSBOVUxMOworCQkvKiBXYWl0IHVudGlsIGFsbCBleGlzdGluZyBjYWxsZXJzIGludG8gbW9kdWxlIGFyZSBkb25lLiAqLworCQlpZiAoZGUtPnBkZV91c2VycyA+IDApIHsKKwkJCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGMpOworCisJCQlpZiAoIWRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24pCisJCQkJZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbiA9ICZjOworCisJCQlzcGluX3VubG9jaygmZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCQlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CisKKwkJCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisJCQlnb3RvIGNvbnRpbnVlX3JlbW92aW5nOworCQl9CisJCXNwaW5fdW5sb2NrKCZkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworY29udGludWVfcmVtb3Zpbmc6CiAJCWlmIChTX0lTRElSKGRlLT5tb2RlKSkKIAkJCXBhcmVudC0+bmxpbmstLTsKLQkJcHJvY19raWxsX2lub2RlcyhkZSk7CisJCWlmICghU19JU1JFRyhkZS0+bW9kZSkpCisJCQlwcm9jX2tpbGxfaW5vZGVzKGRlKTsKIAkJZGUtPm5saW5rID0gMDsKIAkJV0FSTl9PTihkZS0+c3ViZGlyKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmZGUtPmNvdW50KSkKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCBkNWNlNjVjLi5kZDI4ZTg2IDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xNDAsNiArMTQxLDI1MSBAQAogCS5yZW1vdW50X2ZzCT0gcHJvY19yZW1vdW50LAogfTsKIAorc3RhdGljIHZvaWQgcGRlX3VzZXJzX2RlYyhzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSkKK3sKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlwZGUtPnBkZV91c2Vycy0tOworCWlmIChwZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbiAmJiBwZGUtPnBkZV91c2VycyA9PSAwKQorCQljb21wbGV0ZShwZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKK30KKworc3RhdGljIGxvZmZfdCBwcm9jX3JlZ19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9mZl90IHJ2ID0gLUVJTlZBTDsKKwlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCS8qCisJICogcmVtb3ZlX3Byb2NfZW50cnkoKSBpcyBnb2luZyB0byBkZWxldGUgUERFIChhcyBwYXJ0IG9mIG1vZHVsZQorCSAqIGNsZWFudXAgc2VxdWVuY2UpLiBObyBuZXcgY2FsbGVycyBpbnRvIG1vZHVsZSBhbGxvd2VkLgorCSAqLworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwkvKgorCSAqIEJ1bXAgcmVmY291bnQgc28gdGhhdCByZW1vdmVfcHJvY19lbnRyeSB3aWxsIHdhaWwgZm9yIC0+bGxzZWVrIHRvCisJICogY29tcGxldGUuCisJICovCisJcGRlLT5wZGVfdXNlcnMrKzsKKwkvKgorCSAqIFNhdmUgZnVuY3Rpb24gcG9pbnRlciB1bmRlciBsb2NrLCB0byBwcm90ZWN0IGFnYWluc3QgLT5wcm9jX2ZvcHMKKwkgKiBOVUxMJ2lmeWluZyByaWdodCBhZnRlciAtPnBkZV91bmxvYWRfbG9jayBpcyBkcm9wcGVkLgorCSAqLworCWxsc2VlayA9IHBkZS0+cHJvY19mb3BzLT5sbHNlZWs7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmICghbGxzZWVrKQorCQlsbHNlZWsgPSBkZWZhdWx0X2xsc2VlazsKKwlydiA9IGxsc2VlayhmaWxlLCBvZmZzZXQsIHdoZW5jZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlzc2l6ZV90IHJ2ID0gLUVJTzsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlyZWFkID0gcGRlLT5wcm9jX2ZvcHMtPnJlYWQ7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChyZWFkKQorCQlydiA9IHJlYWQoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJc3NpemVfdCBydiA9IC1FSU87CisJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXdyaXRlID0gcGRlLT5wcm9jX2ZvcHMtPndyaXRlOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAod3JpdGUpCisJCXJ2ID0gd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHByb2NfcmVnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHRzKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBydiA9IDA7CisJdW5zaWduZWQgaW50ICgqcG9sbCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJcG9sbCA9IHBkZS0+cHJvY19mb3BzLT5wb2xsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAocG9sbCkKKwkJcnYgPSBwb2xsKGZpbGUsIHB0cyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgbG9uZyBwcm9jX3JlZ191bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9uZyBydiA9IC1FTk9UVFk7CisJbG9uZyAoKnVubG9ja2VkX2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmlvY3RsKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXVubG9ja2VkX2lvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPnVubG9ja2VkX2lvY3RsOworCWlvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPmlvY3RsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAodW5sb2NrZWRfaW9jdGwpIHsKKwkJcnYgPSB1bmxvY2tlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChydiA9PSAtRU5PSU9DVExDTUQpCisJCQlydiA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChpb2N0bCkgeworCQlsb2NrX2tlcm5lbCgpOworCQlydiA9IGlvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBwcm9jX3JlZ19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWxvbmcgcnYgPSAtRU5PVFRZOworCWxvbmcgKCpjb21wYXRfaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwljb21wYXRfaW9jdGwgPSBwZGUtPnByb2NfZm9wcy0+Y29tcGF0X2lvY3RsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAoY29tcGF0X2lvY3RsKQorCQlydiA9IGNvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJvY19yZWdfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJ2ID0gLUVJTzsKKwlpbnQgKCptbWFwKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwltbWFwID0gcGRlLT5wcm9jX2ZvcHMtPm1tYXA7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChtbWFwKQorCQlydiA9IG1tYXAoZmlsZSwgdm1hKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yZWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJaW50IHJ2ID0gMDsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlvcGVuID0gcGRlLT5wcm9jX2ZvcHMtPm9wZW47CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChvcGVuKQorCQlydiA9IG9wZW4oaW5vZGUsIGZpbGUpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBwcm9jX3JlZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGlub2RlKTsKKwlpbnQgcnYgPSAwOworCWludCAoKnJlbGVhc2UpKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXJlbGVhc2UgPSBwZGUtPnByb2NfZm9wcy0+cmVsZWFzZTsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHJlbGVhc2UpCisJCXJ2ID0gcmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3JlZ19maWxlX29wcyA9IHsKKwkubGxzZWVrCQk9IHByb2NfcmVnX2xsc2VlaywKKwkucmVhZAkJPSBwcm9jX3JlZ19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3JlZ193cml0ZSwKKwkucG9sbAkJPSBwcm9jX3JlZ19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IHByb2NfcmVnX3VubG9ja2VkX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gcHJvY19yZWdfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLm1tYXAJCT0gcHJvY19yZWdfbW1hcCwKKwkub3BlbgkJPSBwcm9jX3JlZ19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19yZWdfcmVsZWFzZSwKK307CisKIHN0cnVjdCBpbm9kZSAqcHJvY19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubywKIAkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewpAQCAtMTY2LDggKzQxMiwxMiBAQAogCQkJaW5vZGUtPmlfbmxpbmsgPSBkZS0+bmxpbms7CiAJCWlmIChkZS0+cHJvY19pb3BzKQogCQkJaW5vZGUtPmlfb3AgPSBkZS0+cHJvY19pb3BzOwotCQlpZiAoZGUtPnByb2NfZm9wcykKLQkJCWlub2RlLT5pX2ZvcCA9IGRlLT5wcm9jX2ZvcHM7CisJCWlmIChkZS0+cHJvY19mb3BzKSB7CisJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19yZWdfZmlsZV9vcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfZm9wID0gZGUtPnByb2NfZm9wczsKKwkJfQogCX0KIAogCXJldHVybiBpbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19taXNjLmMgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCmluZGV4IDVmZDQ5ZTQuLmQyNGI4ZDQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19taXNjLmMKKysrIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAJY3B1dGltZV90IGlkbGV0aW1lID0gY3B1dGltZV9hZGQoaW5pdF90YXNrLnV0aW1lLCBpbml0X3Rhc2suc3RpbWUpOwogCiAJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7CisJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdXB0aW1lKTsKIAljcHV0aW1lX3RvX3RpbWVzcGVjKGlkbGV0aW1lLCAmaWRsZSk7CiAJbGVuID0gc3ByaW50ZihwYWdlLCIlbHUuJTAybHUgJWx1LiUwMmx1XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcpIHVwdGltZS50dl9zZWMsCkBAIC00NDMsMTIgKzQ0NCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgamlmOwogCWNwdXRpbWU2NF90IHVzZXIsIG5pY2UsIHN5c3RlbSwgaWRsZSwgaW93YWl0LCBpcnEsIHNvZnRpcnEsIHN0ZWFsOwogCXU2NCBzdW0gPSAwOworCXN0cnVjdCB0aW1lc3BlYyBib290dGltZTsKIAogCXVzZXIgPSBuaWNlID0gc3lzdGVtID0gaWRsZSA9IGlvd2FpdCA9CiAJCWlycSA9IHNvZnRpcnEgPSBzdGVhbCA9IGNwdXRpbWU2NF96ZXJvOwotCWppZiA9IC0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCWlmICh3YWxsX3RvX21vbm90b25pYy50dl9uc2VjKQotCQktLWppZjsKKwlnZXRib290dGltZSgmYm9vdHRpbWUpOworCWppZiA9IGJvb3R0aW1lLnR2X3NlYzsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCWludCBqOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3R0eS5jIGIvZnMvcHJvYy9wcm9jX3R0eS5jCmluZGV4IGIzYTQ3M2IuLjIyODQ2MjIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY190dHkuYworKysgYi9mcy9wcm9jL3Byb2NfdHR5LmMKQEAgLTY5LDcgKzY5LDcgQEAKIAogc3RhdGljIGludCBzaG93X3R0eV9kcml2ZXIoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCB0dHlfZHJpdmVyICpwID0gdjsKKwlzdHJ1Y3QgdHR5X2RyaXZlciAqcCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKIAlkZXZfdCBmcm9tID0gTUtERVYocC0+bWFqb3IsIHAtPm1pbm9yX3N0YXJ0KTsKIAlkZXZfdCB0byA9IGZyb20gKyBwLT5udW07CiAKQEAgLTEwNiwyMiArMTA2LDEzIEBACiAvKiBpdGVyYXRvciAqLwogc3RhdGljIHZvaWQgKnRfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCWxvZmZfdCBsID0gKnBvczsKLQogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmdHR5X2RyaXZlcnMpCi0JCWlmICghbC0tKQotCQkJcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJnR0eV9kcml2ZXJzLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKnRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAgPSAoKHN0cnVjdCB0dHlfZHJpdmVyICopdiktPnR0eV9kcml2ZXJzLm5leHQ7Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIHA9PSZ0dHlfZHJpdmVycyA/IE5VTEwgOgotCQkJbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdHR5X2RyaXZlciwgdHR5X2RyaXZlcnMpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZ0dHlfZHJpdmVycywgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhLmMgYi9mcy9xdW90YS5jCmluZGV4IDlmMjM3ZDYuLmU2NTc3YWMgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhLmMKKysrIGIvZnMvcXVvdGEuYwpAQCAtMTAsMTIgKzEwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBDaGVjayB2YWxpZGl0eSBvZiBnZW5lcmljIHF1b3RhY3RsIGNvbW1hbmRzICovCiBzdGF0aWMgaW50IGdlbmVyaWNfcXVvdGFjdGxfdmFsaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBjbWQsIHFpZF90IGlkKQpAQCAtMzg0LDMgKzM4NiwxMTkgQEAKIAogCXJldHVybiByZXQ7CiB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCisvKgorICogVGhpcyBjb2RlIHdvcmtzIG9ubHkgZm9yIDMyIGJpdCBxdW90YSB0b29scyBvdmVyIDY0IGJpdCBPUyAoeDg2XzY0LCBpYTY0KQorICogYW5kIGlzIG5lY2Vzc2FyeSBkdWUgdG8gYWxpZ25tZW50IHByb2JsZW1zLgorICovCitzdHJ1Y3QgY29tcGF0X2lmX2RxYmxrIHsKKwljb21wYXRfdTY0IGRxYl9iaGFyZGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2Jzb2Z0bGltaXQ7CisJY29tcGF0X3U2NCBkcWJfY3Vyc3BhY2U7CisJY29tcGF0X3U2NCBkcWJfaWhhcmRsaW1pdDsKKwljb21wYXRfdTY0IGRxYl9pc29mdGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2N1cmlub2RlczsKKwljb21wYXRfdTY0IGRxYl9idGltZTsKKwljb21wYXRfdTY0IGRxYl9pdGltZTsKKwljb21wYXRfdWludF90IGRxYl92YWxpZDsKK307CisKKy8qIFhGUyBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdCB7CisJY29tcGF0X3U2NCBkcWJfYmhhcmRsaW1pdDsKKwljb21wYXRfdTY0IHFmc19uYmxrczsKKwljb21wYXRfdWludF90IHFmc19uZXh0ZW50czsKK307CisKK3N0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCB7CisJX19zOAkJcXNfdmVyc2lvbjsKKwlfX3UxNgkJcXNfZmxhZ3M7CisJX19zOAkJcXNfcGFkOworCXN0cnVjdCBjb21wYXRfZnNfcWZpbGVzdGF0CXFzX3VxdW90YTsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdAlxc19ncXVvdGE7CisJY29tcGF0X3VpbnRfdAlxc19pbmNvcmVkcXM7CisJY29tcGF0X2ludF90CXFzX2J0aW1lbGltaXQ7CisJY29tcGF0X2ludF90CXFzX2l0aW1lbGltaXQ7CisJY29tcGF0X2ludF90CXFzX3J0YnRpbWVsaW1pdDsKKwlfX3UxNgkJcXNfYndhcm5saW1pdDsKKwlfX3UxNgkJcXNfaXdhcm5saW1pdDsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9xdW90YWN0bCh1bnNpZ25lZCBpbnQgY21kLCBjb25zdCBjaGFyIF9fdXNlciAqc3BlY2lhbCwKKwkJCQkJCXFpZF90IGlkLCB2b2lkIF9fdXNlciAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgY21kczsKKwlzdHJ1Y3QgaWZfZHFibGsgX191c2VyICpkcWJsazsKKwlzdHJ1Y3QgY29tcGF0X2lmX2RxYmxrIF9fdXNlciAqY29tcGF0X2RxYmxrOworCXN0cnVjdCBmc19xdW90YV9zdGF0IF9fdXNlciAqZnNxc3RhdDsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQgX191c2VyICpjb21wYXRfZnNxc3RhdDsKKwljb21wYXRfdWludF90IGRhdGE7CisJdTE2IHhkYXRhOworCWxvbmcgcmV0OworCisJY21kcyA9IGNtZCA+PiBTVUJDTURTSElGVDsKKworCXN3aXRjaCAoY21kcykgeworCWNhc2UgUV9HRVRRVU9UQToKKwkJZHFibGsgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmX2RxYmxrKSk7CisJCWNvbXBhdF9kcWJsayA9IGFkZHI7CisJCXJldCA9IHN5c19xdW90YWN0bChjbWQsIHNwZWNpYWwsIGlkLCBkcWJsayk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJaWYgKGNvcHlfaW5fdXNlcihjb21wYXRfZHFibGssIGRxYmxrLCBzaXplb2YoKmNvbXBhdF9kcWJsaykpIHx8CisJCQlnZXRfdXNlcihkYXRhLCAmZHFibGstPmRxYl92YWxpZCkgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZjb21wYXRfZHFibGstPmRxYl92YWxpZCkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFFfU0VUUVVPVEE6CisJCWRxYmxrID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBpZl9kcWJsaykpOworCQljb21wYXRfZHFibGsgPSBhZGRyOworCQlyZXQgPSAtRUZBVUxUOworCQlpZiAoY29weV9pbl91c2VyKGRxYmxrLCBjb21wYXRfZHFibGssIHNpemVvZigqY29tcGF0X2RxYmxrKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZjb21wYXRfZHFibGstPmRxYl92YWxpZCkgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZkcWJsay0+ZHFiX3ZhbGlkKSkKKwkJCWJyZWFrOworCQlyZXQgPSBzeXNfcXVvdGFjdGwoY21kLCBzcGVjaWFsLCBpZCwgZHFibGspOworCQlicmVhazsKKwljYXNlIFFfWEdFVFFTVEFUOgorCQlmc3FzdGF0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBmc19xdW90YV9zdGF0KSk7CisJCWNvbXBhdF9mc3FzdGF0ID0gYWRkcjsKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGZzcXN0YXQpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCS8qIENvcHlpbmcgcXNfdmVyc2lvbiwgcXNfZmxhZ3MsIHFzX3BhZCAqLworCQlpZiAoY29weV9pbl91c2VyKGNvbXBhdF9mc3FzdGF0LCBmc3FzdGF0LAorCQkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0LCBxc191cXVvdGEpKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHFzX3VxdW90YSAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhLAorCQkJJmZzcXN0YXQtPnFzX3VxdW90YSwKKwkJCXNpemVvZihjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZmc3FzdGF0LT5xc191cXVvdGEucWZzX25leHRlbnRzKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc191cXVvdGEucWZzX25leHRlbnRzKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHFzX2dxdW90YSAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhLAorCQkJJmZzcXN0YXQtPnFzX2dxdW90YSwKKwkJCXNpemVvZihjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZmc3FzdGF0LT5xc19ncXVvdGEucWZzX25leHRlbnRzKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc19ncXVvdGEucWZzX25leHRlbnRzKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHRoZSByZXN0ICovCisJCWlmIChjb3B5X2luX3VzZXIoJmNvbXBhdF9mc3FzdGF0LT5xc19pbmNvcmVkcXMsCisJCQkmZnNxc3RhdC0+cXNfaW5jb3JlZHFzLAorCQkJc2l6ZW9mKHN0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCkgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0LCBxc19pbmNvcmVkcXMpKSB8fAorCQkJZ2V0X3VzZXIoeGRhdGEsICZmc3FzdGF0LT5xc19pd2FybmxpbWl0KSB8fAorCQkJcHV0X3VzZXIoeGRhdGEsICZjb21wYXRfZnNxc3RhdC0+cXNfaXdhcm5saW1pdCkpCisJCQlicmVhazsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGFkZHIpOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yYW1mcy9pbm9kZS5jIGIvZnMvcmFtZnMvaW5vZGUuYwppbmRleCBkNDBkMjJiLi5lZjJiNDZkIDEwMDY0NAotLS0gYS9mcy9yYW1mcy9pbm9kZS5jCisrKyBiL2ZzL3JhbWZzL2lub2RlLmMKQEAgLTYwLDYgKzYwLDcgQEAKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmFtZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZyYW1mc19iYWNraW5nX2Rldl9pbmZvOworCQltYXBwaW5nX3NldF9nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nLCBHRlBfSElHSFVTRVIpOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZmlsZS5jIGIvZnMvcmVpc2VyZnMvZmlsZS5jCmluZGV4IDMwZWViZmIuLjIwNzBhZWUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2ZpbGUuYworKysgYi9mcy9yZWlzZXJmcy9maWxlLmMKQEAgLTEzMDUsNyArMTMwNSw2IEBACiAJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKIAkgICAgKnBwb3MgKyBjb3VudCA+IE1BWF9OT05fTEZTKSB7CiAJCWlmICgqcHBvcyA+PSBNQVhfTk9OX0xGUykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJCWlmIChjb3VudCA+IE1BWF9OT05fTEZTIC0gKHVuc2lnbmVkIGxvbmcpKnBwb3MpCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCAxMjcyZDExLi5kZGRlNDg5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggYjRhYzkxMS4uNWE5M2NmZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbnRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KZGlmZiAtLWdpdCBhL2ZzL3NlcV9maWxlLmMgYi9mcy9zZXFfZmlsZS5jCmluZGV4IDQ5MTk0YTQuLmJiYjE5YmUgMTAwNjQ0Ci0tLSBhL2ZzL3NlcV9maWxlLmMKKysrIGIvZnMvc2VxX2ZpbGUuYwpAQCAtMTc3LDIxICsxNzcsMjMgQEAKIAogc3RhdGljIGludCB0cmF2ZXJzZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCBvZmZzZXQpCiB7Ci0JbG9mZl90IHBvcyA9IDA7CisJbG9mZl90IHBvcyA9IDAsIGluZGV4OwogCWludCBlcnJvciA9IDA7CiAJdm9pZCAqcDsKIAogCW0tPnZlcnNpb24gPSAwOwotCW0tPmluZGV4ID0gMDsKKwlpbmRleCA9IDA7CiAJbS0+Y291bnQgPSBtLT5mcm9tID0gMDsKLQlpZiAoIW9mZnNldCkKKwlpZiAoIW9mZnNldCkgeworCQltLT5pbmRleCA9IGluZGV4OwogCQlyZXR1cm4gMDsKKwl9CiAJaWYgKCFtLT5idWYpIHsKIAkJbS0+YnVmID0ga21hbGxvYyhtLT5zaXplID0gUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtLT5idWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcCA9IG0tPm9wLT5zdGFydChtLCAmbS0+aW5kZXgpOworCXAgPSBtLT5vcC0+c3RhcnQobSwgJmluZGV4KTsKIAl3aGlsZSAocCkgewogCQllcnJvciA9IFBUUl9FUlIocCk7CiAJCWlmIChJU19FUlIocCkpCkBAIC0yMDQsMTUgKzIwNiwxNyBAQAogCQlpZiAocG9zICsgbS0+Y291bnQgPiBvZmZzZXQpIHsKIAkJCW0tPmZyb20gPSBvZmZzZXQgLSBwb3M7CiAJCQltLT5jb3VudCAtPSBtLT5mcm9tOworCQkJbS0+aW5kZXggPSBpbmRleDsKIAkJCWJyZWFrOwogCQl9CiAJCXBvcyArPSBtLT5jb3VudDsKIAkJbS0+Y291bnQgPSAwOwogCQlpZiAocG9zID09IG9mZnNldCkgewotCQkJbS0+aW5kZXgrKzsKKwkJCWluZGV4Kys7CisJCQltLT5pbmRleCA9IGluZGV4OwogCQkJYnJlYWs7CiAJCX0KLQkJcCA9IG0tPm9wLT5uZXh0KG0sIHAsICZtLT5pbmRleCk7CisJCXAgPSBtLT5vcC0+bmV4dChtLCBwLCAmaW5kZXgpOwogCX0KIAltLT5vcC0+c3RvcChtLCBwKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0yNjAsOCArMjY0LDggQEAKIAkJCQl9CiAJCQl9CiAJfQotCW11dGV4X3VubG9jaygmbS0+bG9jayk7CiAJZmlsZS0+Zl92ZXJzaW9uID0gbS0+dmVyc2lvbjsKKwltdXRleF91bmxvY2soJm0tPmxvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MKHNlcV9sc2Vlayk7CmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IDZjOTgyODYuLjUzZmMyMDggMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC0xMDYxLDggKzEwNjEsOSBAQAogCiAJd2hpbGUgKGxlbikgewogCQlzaXplX3QgcmVhZF9sZW47CisJCWxvZmZfdCBwb3MgPSBzZC0+cG9zOwogCi0JCXJldCA9IGRvX3NwbGljZV90byhpbiwgJnNkLT5wb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOworCQlyZXQgPSBkb19zcGxpY2VfdG8oaW4sICZwb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOwogCQlpZiAodW5saWtlbHkocmV0IDw9IDApKQogCQkJZ290byBvdXRfcmVsZWFzZTsKIApAQCAtMTA4MCw2ICsxMDgxLDcgQEAKIAogCQlieXRlcyArPSByZXQ7CiAJCWxlbiAtPSByZXQ7CisJCXNkLT5wb3MgPSBwb3M7CiAKIAkJaWYgKHJldCA8IHJlYWRfbGVuKQogCQkJZ290byBvdXRfcmVsZWFzZTsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDUyNjBkNjIuLmZjOGViZWQgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtODg0LDYgKzg4NCw3IEBACiAJZXJyb3IgPSB0eXBlLT5nZXRfc2IodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEsIG1udCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXRfZnJlZV9zZWNkYXRhOworCUJVR19PTighbW50LT5tbnRfc2IpOwogCiAgCWVycm9yID0gc2VjdXJpdHlfc2Jfa2Vybl9tb3VudChtbnQtPm1udF9zYiwgc2VjZGF0YSk7CiAgCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL3VkZi9jcmMuYyBiL2ZzL3VkZi9jcmMuYwppbmRleCAxYjgyYTRhLi5lZjJiZmFhIDEwMDY0NAotLS0gYS9mcy91ZGYvY3JjLmMKKysrIGIvZnMvdWRmL2NyYy5jCkBAIC0xMDYsOCArMTA2LDggQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB4OwogCi0JeCA9IHVkZl9jcmMxNihieXRlcywgc2l6ZW9mIGJ5dGVzKTsKLQlwcmludGYoInVkZl9jcmMxNjogY2FsY3VsYXRlZCA9ICU0LjR4LCBjb3JyZWN0ID0gJTQuNHhcbiIsIHgsIDB4MzI5OVUpOworCXggPSB1ZGZfY3JjKGJ5dGVzLCBzaXplb2YgYnl0ZXMpOworCXByaW50ZigidWRmX2NyYzogY2FsY3VsYXRlZCA9ICU0LjR4LCBjb3JyZWN0ID0gJTQuNHhcbiIsIHgsIDB4MzI5OVUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy91ZGYvaWFsbG9jLmMgYi9mcy91ZGYvaWFsbG9jLmMKaW5kZXggODIwNjk4My4uMTBmMzE4OCAxMDA2NDQKLS0tIGEvZnMvdWRmL2lhbGxvYy5jCisrKyBiL2ZzL3VkZi9pYWxsb2MuYwpAQCAtNTAsNyArNTAsNyBAQAogCQllbHNlCiAJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMgPQogCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgLSAxKTsKLQkJCisKIAkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRiaCk7CiAJfQogCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKQEAgLTEzNiw2ICsxMzYsMTMgQEAKIAkJVURGX0lfRUZFKGlub2RlKSA9IDA7CiAJCVVERl9JX0RBVEEoaW5vZGUpID0ga3phbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIEdGUF9LRVJORUwpOwogCX0KKwlpZiAoIVVERl9JX0RBVEEoaW5vZGUpKQorCXsKKwkJaXB1dChpbm9kZSk7CisJCSplcnIgPSAtRU5PTUVNOworCQltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KIAlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpKQogCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOwogCWVsc2UgaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwppbmRleCBiZjdkZTBiLi41YjgyZTQ4IDEwMDY0NAotLS0gYS9mcy91ZGYvaW5vZGUuYworKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtNDksNiArNDksNyBAQAogc3RhdGljIG1vZGVfdCB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICopOwogc3RhdGljIGludCB1ZGZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogc3RhdGljIHZvaWQgdWRmX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyBpbnQgdWRmX2FsbG9jX2lfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9nZXRibGsoc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBpbnQgKiwKIAlsb25nICosIGludCAqKTsKIHN0YXRpYyBpbnQ4X3QgdWRmX2luc2VydF9hZXh0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uLApAQCAtNzM0LDcgKzczNSw3IEBACiAJCQkoKmMpICsrOwogCQkJKCplbmRudW0pICsrOwogCQl9Ci0JCQorCiAJCWxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IG5ld2Jsb2NrbnVtOwogCQlpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCiAJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPQpAQCAtODM2LDcgKzgzNyw3IEBACiAJCQkJewogCQkJCQludW1hbGxvYyAtPSBlbGVuOwogCQkJCQlpZiAoKmVuZG51bSA+IChpKzEpKQotCQkJCQkJbWVtbW92ZSgmbGFhcnJbaV0sICZsYWFycltpKzFdLCAKKwkJCQkJCW1lbW1vdmUoJmxhYXJyW2ldLCAmbGFhcnJbaSsxXSwKIAkJCQkJCQlzaXplb2YobG9uZ19hZCkgKiAoKmVuZG51bSAtIChpKzEpKSk7CiAJCQkJCWkgLS07CiAJCQkJCSgqZW5kbnVtKSAtLTsKQEAgLTEwMjQsNyArMTAyNSw3IEBACiAJewogCQlibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUsIHVkZl9nZXRfYmxvY2spOwogCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7Ci0JfQkKKwl9CiAKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCkBAIC0xMDg3LDEwICsxMDg4LDEwIEBACiAJCQl7CiAJCQkJa2VybmVsX2xiX2FkZHIgbG9jOwogCQkJCWllID0gKHN0cnVjdCBpbmRpcmVjdEVudHJ5ICopaWJoLT5iX2RhdGE7Ci0JCisKIAkJCQlsb2MgPSBsZWxiX3RvX2NwdShpZS0+aW5kaXJlY3RJQ0IuZXh0TG9jYXRpb24pOwotCQotCQkJCWlmIChpZS0+aW5kaXJlY3RJQ0IuZXh0TGVuZ3RoICYmIAorCisJCQkJaWYgKGllLT5pbmRpcmVjdElDQi5leHRMZW5ndGggJiYKIAkJCQkJKG5iaCA9IHVkZl9yZWFkX3B0YWdnZWQoaW5vZGUtPmlfc2IsIGxvYywgMCwgJmlkZW50KSkpCiAJCQkJewogCQkJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0ZFIHx8CkBAIC0xMTU2LDE0ICsxMTU3LDIyIEBACiAJewogCQlVREZfSV9FRkUoaW5vZGUpID0gMTsKIAkJVURGX0lfVVNFKGlub2RlKSA9IDA7Ci0JCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOwogCX0KIAllbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgPT0gVEFHX0lERU5UX0ZFKQogCXsKIAkJVURGX0lfRUZFKGlub2RlKSA9IDA7CiAJCVVERl9JX1VTRShpbm9kZSkgPSAwOwotCQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSk7CiAJfQogCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfVVNFKQpAQCAtMTE3Myw3ICsxMTgyLDExIEBACiAJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9CiAJCQlsZTMyX3RvX2NwdSgKIAkJCQkoKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGEpLT5sZW5ndGhBbGxvY0Rlc2NzKTsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKSkKKwkJeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CiAJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTkxLDcgKzEyMDQsNyBAQAogCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmZpbGVMaW5rQ291bnQpOwogCWlmICghaW5vZGUtPmlfbmxpbmspCiAJCWlub2RlLT5pX25saW5rID0gMTsKLQkKKwogCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShmZS0+aW5mb3JtYXRpb25MZW5ndGgpOwogCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKIApAQCAtMTI0Myw3ICsxMjU2LDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJaW5vZGUtPmlfYmxvY2tzID0gbGU2NF90b19jcHUoZWZlLT5sb2dpY2FsQmxvY2tzUmVjb3JkZWQpIDw8IAorCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShlZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwKIAkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwogCiAJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKQEAgLTEzNzQsNiArMTM4NywyMCBAQAogCX0KIH0KIAorc3RhdGljIGludCB1ZGZfYWxsb2NfaV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBzaXplKQoreworCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghVURGX0lfREFUQShpbm9kZSkpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjp1ZGZfYWxsb2NfaV9kYXRhIChpbm8gJWxkKSBubyBmcmVlIG1lbW9yeVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgbW9kZV90CiB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICpmZSkKIHsKQEAgLTIwNzIsNyArMjA5OSw3IEBACiAJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShvZXBvcy5iaCwgaW5vZGUpOwogCQl9CiAJfQotCQorCiAJYnJlbHNlKGVwb3MuYmgpOwogCWJyZWxzZShvZXBvcy5iaCk7CiAJcmV0dXJuIChlbGVuID4+IDMwKTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zdXBlci5jIGIvZnMvdWZzL3N1cGVyLmMKaW5kZXggMjJmZjZlZC4uMmIzMDExNiAxMDA2NDQKLS0tIGEvZnMvdWZzL3N1cGVyLmMKKysrIGIvZnMvdWZzL3N1cGVyLmMKQEAgLTg3LDYgKzg3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKQEAgLTg1NCw3ICs4NTUsNyBAQAogCXVzcGktPnNfZm1hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZm1hc2spOwogCXVzcGktPnNfZnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCk7CiAKLQlpZiAodXNwaS0+c19mc2l6ZSAmICh1c3BpLT5zX2ZzaXplIC0gMSkpIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwaS0+c19mc2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogZnJhZ21lbnQgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAogCQkJdXNwaS0+c19mc2l6ZSk7CiAJCQlnb3RvIGZhaWxlZDsKQEAgLTg2OSw3ICs4NzAsNyBAQAogCQkJdXNwaS0+c19mc2l6ZSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KLQlpZiAodXNwaS0+c19ic2l6ZSAmICh1c3BpLT5zX2JzaXplIC0gMSkpIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwaS0+c19ic2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogYmxvY2sgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAogCQkJdXNwaS0+c19ic2l6ZSk7CiAJCWdvdG8gZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZnMvdXRpbWVzLmMgYi9mcy91dGltZXMuYwppbmRleCBiM2M4ODk1Li44M2E3ZTY5IDEwMDY0NAotLS0gYS9mcy91dGltZXMuYworKysgYi9mcy91dGltZXMuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRwdXRfYW5kX291dDsKIAotCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSB7CisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkgewogCQkJaWYgKGYpIHsKIAkJCQlpZiAoIShmLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCQkJCWdvdG8gZHB1dF9hbmRfb3V0OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCAyZGY2MzYyLi5iMGYwZTU4IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMzUsMTAgKzM1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiBzdGF0aWMga21lbV96b25lX3QgKnhmc19idWZfem9uZTsKLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnhmc19idWZfc2hha2U7CiBTVEFUSUMgaW50IHhmc2J1ZmQodm9pZCAqKTsKIFNUQVRJQyBpbnQgeGZzYnVmZF93YWtldXAoaW50LCBnZnBfdCk7CiBTVEFUSUMgdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZSh4ZnNfYnVmX3QgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgeGZzX2J1Zl9zaGFrZSA9IHsKKwkuc2hyaW5rID0geGZzYnVmZF93YWtldXAsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzbG9nZF93b3JrcXVldWU7CiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwpAQCAtMTgzMiwxNCArMTgzNSw5IEBACiAJaWYgKCF4ZnNkYXRhZF93b3JrcXVldWUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU7CiAKLQl4ZnNfYnVmX3NoYWtlID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHhmc2J1ZmRfd2FrZXVwKTsKLQlpZiAoIXhmc19idWZfc2hha2UpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOwotCisJcmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCXJldHVybiAwOwogCi0gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAgb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU6CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogIG91dF9mcmVlX2J1Zl96b25lOgpAQCAtMTg1NCw3ICsxODUyLDcgQEAKIHZvaWQKIHhmc19idWZfdGVybWluYXRlKHZvaWQpCiB7Ci0JcmVtb3ZlX3Nocmlua2VyKHhmc19idWZfc2hha2UpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogCWttZW1fem9uZV9kZXN0cm95KHhmc19idWZfem9uZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAwNjg5NGNmLi40NTI4ZjlhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTU2Miw2ICs1NjIsNyBAQAogCWJodl92ZnNfc3luY193b3JrX3QJKndvcmssICpuOwogCUxJU1RfSEVBRAkJKHRtcCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJdGltZWxlZnQgPSB4ZnNfc3luY2RfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7CiAJZm9yICg7OykgewogCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lbGVmdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaAppbmRleCAzM2RkMWNhLi4yMDFjYzMyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKQEAgLTE4LDYgKzE4LDggQEAKICNpZm5kZWYgX19YRlNfU1VQRVJfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUEVSX0hfXwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKwogI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKICMgZGVmaW5lIHZmc19pbnNlcnRkbWFwaSh2ZnMpCXZmc19pbnNlcnRvcHModmZzcCwgJnhmc19kbW9wcykKICMgZGVmaW5lIHZmc19pbml0ZG1hcGkoKQlkbWFwaV9pbml0KCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwppbmRleCA3ZGVmNGM2Li4yZDI3NGIyIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC02Miw3ICs2Miw2IEBACiAKIGttZW1fem9uZV90CSpxbV9kcXpvbmU7CiBrbWVtX3pvbmVfdAkqcW1fZHF0cnh6b25lOwotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqeGZzX3FtX3NoYWtlcjsKIAogc3RhdGljIGNyZWRfdAl4ZnNfemVyb2NyOwogCkBAIC03OCw2ICs3NywxMSBAQAogU1RBVElDIGludAl4ZnNfcW1faW5pdF9xdW90YWluZm8oeGZzX21vdW50X3QgKik7CiBTVEFUSUMgaW50CXhmc19xbV9zaGFrZShpbnQsIGdmcF90KTsKIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciB4ZnNfcW1fc2hha2VyID0geworCS5zaHJpbmsgPSB4ZnNfcW1fc2hha2UsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKICNpZmRlZiBERUJVRwogZXh0ZXJuIG11dGV4X3QJcWNoZWNrX2xvY2s7CiAjZW5kaWYKQEAgLTE0OSw3ICsxNTMsNyBAQAogCX0gZWxzZQogCQl4cW0tPnFtX2Rxem9uZSA9IHFtX2Rxem9uZTsKIAotCXhmc19xbV9zaGFrZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgeGZzX3FtX3NoYWtlKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmeGZzX3FtX3NoYWtlcik7CiAKIAkvKgogCSAqIFRoZSB0X2RxaW5mbyBwb3J0aW9uIG9mIHRyYW5zYWN0aW9ucy4KQEAgLTE4MSw3ICsxODUsNyBAQAogCiAJQVNTRVJUKHhxbSAhPSBOVUxMKTsKIAlBU1NFUlQoeHFtLT5xbV9ucmVmcyA9PSAwKTsKLQlyZW1vdmVfc2hyaW5rZXIoeGZzX3FtX3NoYWtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmeGZzX3FtX3NoYWtlcik7CiAJaHNpemUgPSB4cW0tPnFtX2RxaGFzaG1hc2sgKyAxOwogCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CiAJCXhmc19xbV9saXN0X2Rlc3Ryb3koJih4cW0tPnFtX3Vzcl9kcWh0YWJsZVtpXSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZmIuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5YmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyogQ2FjaGluZyBpcyBvZmYgaW4gdGhlIEkvTyBzcGFjZSBxdWFkcmFudCBieSBkZXNpZ24uICAqLworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaAppbmRleCAyMWE4NmYxLi5hYjViNjBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKQEAgLTQsNiArNCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTkwLDYgKzkxLDExIEBACiAKICNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpCXBhZ2VfdG9fcGEocGFnZSkKIAorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IF9fZGVwcmVjYXRlZCBpc2FfcGFnZV90b19idXMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKTsKK30KKwogLyogVGhpcyBkZXBlbmRzIG9uIHdvcmtpbmcgaW9tbXUuICAqLwogI2RlZmluZSBCSU9fVk1FUkdFX0JPVU5EQVJZCShhbHBoYV9tdi5tdl9wY2lfdGJpID8gUEFHRV9TSVpFIDogMCkKIApAQCAtMTAyLDEyICsxMDgsMTIgQEAKICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIGZvciBhIGxpbWl0ZWQgcmFuZ2Ugb2Yga2VybmVsIGFkZHJlc3NlcywKICAqIGFuZCB2ZXJ5IHdlbGwgbWF5IG5vdCBzcGFuIGFsbCBtZW1vcnkuICBDb25zaWRlciB0aGlzIGludGVyZmFjZSAKLSAqIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyBpbiA8YXNtL3BjaS5oPi4KKyAqIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBETUEtbWFwcGluZyBBUEkuCiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fZGlyZWN0X21hcF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19kaXJlY3RfbWFwX3NpemU7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2J1cyh2b2lkICphZGRyZXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZGVwcmVjYXRlZCB2aXJ0X3RvX2J1cyh2b2lkICphZGRyZXNzKQogewogCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHZpcnRfdG9fcGh5cyhhZGRyZXNzKTsKIAl1bnNpZ25lZCBsb25nIGJ1cyA9IHBoeXMgKyBfX2RpcmVjdF9tYXBfYmFzZTsKQEAgLTExNSw3ICsxMjEsNyBAQAogfQogI2RlZmluZSBpc2FfdmlydF90b19idXMgdmlydF90b19idXMKIAotc3RhdGljIGlubGluZSB2b2lkICpidXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKiBfX2RlcHJlY2F0ZWQgYnVzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXZvaWQgKnZpcnQ7CiAKQEAgLTEyNiw2ICsxMzIsNyBAQAogCXZpcnQgPSBwaHlzX3RvX3ZpcnQoYWRkcmVzcyk7CiAJcmV0dXJuIChsb25nKWFkZHJlc3MgPD0gMCA/IE5VTEwgOiB2aXJ0OwogfQorI2RlZmluZSBpc2FfYnVzX3RvX3ZpcnQgYnVzX3RvX3ZpcnQKIAogLyoKICAqIFRoZXJlIGFyZSBkaWZmZXJlbnQgY2hpcHNldHMgdG8gaW50ZXJmYWNlIHRoZSBBbHBoYSBDUFVzIHRvIHRoZSB3b3JsZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaAppbmRleCBkMmJlZDNjLi5iYWU3ZjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCkBAIC0xNyw3ICsxNyw4IEBACiBleHRlcm4gdm9pZCBjbGVhcl9wYWdlKHZvaWQgKnBhZ2UpOwogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2bWFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2bWFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIGV4dGVybiB2b2lkIGNvcHlfcGFnZSh2b2lkICogX3RvLCB2b2lkICogX2Zyb20pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCmluZGV4IDYxNmQyMDYuLjk5MDM3YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKQEAgLTI2NCwyMSArMjY0LDE1IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9SKTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9XKTsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GT0UpOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogCiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9GT1c7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0ZPUjsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRk9FOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfihfX0RJUlRZX0JJVFMpOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX19BQ0NFU1NfQklUUyk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9XOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9SOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9FOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX19ESVJUWV9CSVRTOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX19BQ0NFU1NfQklUUzsgcmV0dXJuIHB0ZTsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmgKaW5kZXggMzllNDkyYy4uZmExMzcxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1pb3MuaApAQCAtODEsNyArODEsNyBAQAogCiAjZGVmaW5lIHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKGFfdGVybWlvcywgdV90ZXJtaW8pCQkJXAogKHsJCQkJCQkJCQkJXAotCXN0cnVjdCB0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQkJXAorCXN0cnVjdCBrdGVybWlvcyAqa190ZXJtaW9zID0gKGFfdGVybWlvcyk7CQkJCVwKIAlzdHJ1Y3QgdGVybWlvIGtfdGVybWlvOwkJCQkJCQlcCiAJaW50IGNhbm9uLCByZXQ7CQkJCQkJCQlcCiAJCQkJCQkJCQkJXApAQCAtMTEzLDcgKzExMyw3IEBACiAgKi8KICNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odV90ZXJtaW8sIGFfdGVybWlvcykJCVwKICh7CQkJCQkJCQkJXAotCXN0cnVjdCB0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQlcCisJc3RydWN0IGt0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQlcCiAJc3RydWN0IHRlcm1pbyBrX3Rlcm1pbzsJCQkJCQlcCiAJaW50IGNhbm9uOwkJCQkJCQlcCiAJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmgKaW5kZXggMGNlNmVlOS4uZDk2YjEwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MS9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTEvYm9hcmQuaApAQCAtNjQsNiArNjQsNyBAQAogCiAgLyogRXRoZXJuZXQgKEVNQUMgJiBNQUNCKSAqLwogc3RydWN0IGF0OTFfZXRoX2RhdGEgeworCXUzMgkJcGh5X21hc2s7CiAJdTgJCXBoeV9pcnFfcGluOwkvKiBQSFkgSVJRICovCiAJdTgJCWlzX3JtaWk7CS8qIHVzaW5nIFJNSUkgaW50ZXJmYWNlPyAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9mYi5oIGIvaW5jbHVkZS9hc20tYXJtL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaAppbmRleCAyMWRlYzlmLi5kMmU4MTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmgKQEAgLTgzLDE0ICs4MywxNCBAQAogICogbWVhbnMgdGhhdCBhIHdyaXRlIHRvIGEgY2xlYW4gcGFnZSB3aWxsIGNhdXNlIGEgcGVybWlzc2lvbiBmYXVsdCwgYW5kCiAgKiB0aGUgTGludXggTU0gbGF5ZXIgd2lsbCBtYXJrIHRoZSBwYWdlIGRpcnR5IHZpYSBoYW5kbGVfcHRlX2ZhdWx0KCkuCiAgKiBGb3IgdGhlIGhhcmR3YXJlIHRvIG5vdGljZSB0aGUgcGVybWlzc2lvbiBjaGFuZ2UsIHRoZSBUTEIgZW50cnkgbXVzdAotICogYmUgZmx1c2hlZCwgYW5kIHB0ZXBfZXN0YWJsaXNoKCkgZG9lcyB0aGF0IGZvciB1cy4KKyAqIGJlIGZsdXNoZWQsIGFuZCBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoKSBkb2VzIHRoYXQgZm9yIHVzLgogICoKICAqIFRoZSAiYWNjZXNzZWQiIG9yICJ5b3VuZyIgYml0IGlzIGVtdWxhdGVkIGJ5IGEgc2ltaWxhciBtZXRob2Q7IHdlIG9ubHkKICAqIGFsbG93IGFjY2Vzc2VzIHRvIHRoZSBwYWdlIGlmIHRoZSAieW91bmciIGJpdCBpcyBzZXQuICBBY2Nlc3NlcyB0byB0aGUKICAqIHBhZ2Ugd2lsbCBjYXVzZSBhIGZhdWx0LCBhbmQgaGFuZGxlX3B0ZV9mYXVsdCgpIHdpbGwgc2V0IHRoZSB5b3VuZyBiaXQKICAqIGZvciB1cyBhcyBsb25nIGFzIHRoZSBwYWdlIGlzIG1hcmtlZCBwcmVzZW50IGluIHRoZSBjb3JyZXNwb25kaW5nIExpbnV4Ci0gKiBQVEUgZW50cnkuICBBZ2FpbiwgcHRlcF9lc3RhYmxpc2goKSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBUTEIgaXMgdXAgdG8KLSAqIGRhdGUuCisgKiBQVEUgZW50cnkuICBBZ2FpbiwgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKCkgd2lsbCBlbnN1cmUgdGhhdCB0aGUgVExCIGlzCisgKiB1cCB0byBkYXRlLgogICoKICAqIEhvd2V2ZXIsIHdoZW4gdGhlICJ5b3VuZyIgYml0IGlzIGNsZWFyZWQsIHdlIGRlbnkgYWNjZXNzIHRvIHRoZSBwYWdlCiAgKiBieSBjbGVhcmluZyB0aGUgaGFyZHdhcmUgUFRFLiAgQ3VycmVudGx5IExpbnV4IGRvZXMgbm90IGZsdXNoIHRoZSBUTEIKQEAgLTI1Nyw5ICsyNTcsNyBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCiAjZGVmaW5lIHB0ZV9wcmVzZW50KHB0ZSkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1BSRVNFTlQpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9VU0VSKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1dSSVRFKQotI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfRVhFQykKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9ESVJUWSkKICNkZWZpbmUgcHRlX3lvdW5nKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9ZT1VORykKIApAQCAtMjc1LDEyICsyNzMsOCBAQAogI2RlZmluZSBQVEVfQklUX0ZVTkMoZm4sb3ApIFwKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlXyMjZm4ocHRlX3QgcHRlKSB7IHB0ZV92YWwocHRlKSBvcDsgcmV0dXJuIHB0ZTsgfQogCi0vKlBURV9CSVRfRlVOQyhyZHByb3RlY3QsICY9IH5MX1BURV9VU0VSKTsqLwotLypQVEVfQklUX0ZVTkMobWtyZWFkLCAgICB8PSBMX1BURV9VU0VSKTsqLwogUFRFX0JJVF9GVU5DKHdycHJvdGVjdCwgJj0gfkxfUFRFX1dSSVRFKTsKIFBURV9CSVRfRlVOQyhta3dyaXRlLCAgIHw9IExfUFRFX1dSSVRFKTsKLVBURV9CSVRfRlVOQyhleHByb3RlY3QsICY9IH5MX1BURV9FWEVDKTsKLVBURV9CSVRfRlVOQyhta2V4ZWMsICAgIHw9IExfUFRFX0VYRUMpOwogUFRFX0JJVF9GVU5DKG1rY2xlYW4sICAgJj0gfkxfUFRFX0RJUlRZKTsKIFBURV9CSVRfRlVOQyhta2RpcnR5LCAgIHw9IExfUFRFX0RJUlRZKTsKIFBURV9CSVRfRlVOQyhta29sZCwgICAgICY9IH5MX1BURV9ZT1VORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZG1hLW1hcHBpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZWFlMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2ZiLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCmluZGV4IGJhOWM3ZDguLjhhMzI5NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oCmluZGV4IDJiMjBlOWYuLjU1YTFhNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9wZ3RhYmxlLmgKQEAgLTIxOCw5ICsyMTgsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkgICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfTk9UX1VTRVIpKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQURPTkxZKSkKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKSAgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OT1RfVVNFUikpCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfQ0xFQU4pKQogI2RlZmluZSBwdGVfeW91bmcocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX09MRCkpCiAvL09OTFkgd2hlbiAhcHRlX3ByZXNlbnQoKSBJIHRoaW5rLiBuaWNrZWQgZnJvbSBhcm0zMiAoRklYTUUhKQpAQCAtMjMxLDggKzIyOSw2IEBACiAKIFBURV9CSVRfRlVOQyh3cnByb3RlY3QsIHw9ICBfUEFHRV9SRUFET05MWSk7CiBQVEVfQklUX0ZVTkMobWt3cml0ZSwgICAmPSB+X1BBR0VfUkVBRE9OTFkpOwotUFRFX0JJVF9GVU5DKGV4cHJvdGVjdCwgfD0gIF9QQUdFX05PVF9VU0VSKTsKLVBURV9CSVRfRlVOQyhta2V4ZWMsICAgICY9IH5fUEFHRV9OT1RfVVNFUik7CiBQVEVfQklUX0ZVTkMobWtjbGVhbiwgICB8PSAgX1BBR0VfQ0xFQU4pOwogUFRFX0JJVF9GVU5DKG1rZGlydHksICAgJj0gfl9QQUdFX0NMRUFOKTsKIFBURV9CSVRfRlVOQyhta29sZCwgICAgIHw9ICBfUEFHRV9PTEQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmgKaW5kZXggZjY2YjUxOC4uNDhkMmY1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oCkBAIC0xMzgsNiArMTM4LDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICBCT1RIRVIgIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1MywxMCArMTU0LDEyIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIgICAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJICAxNgkJLyogU2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KKwogLyogY19sZmxhZyBiaXRzICovCiAjZGVmaW5lIElTSUcJMDAwMDAwMQogI2RlZmluZSBJQ0FOT04JMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oCmluZGV4IDMyOWMzMjQuLjI5M2UzZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtaW9zLmgKQEAgLTgyLDggKzgyLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKaW5kZXggOWZkMmUzMi4uOTc0NDgwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCkBAIC0yMSw2ICsyMSw3IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2VfdXNhcnQodW5zaWduZWQgaW50IGlkKTsKIAogc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIHsKKwl1MzIJcGh5X21hc2s7CiAJdTgJaXNfcm1paTsKIH07CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2ZiLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdCgocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKKwkJCQkgICAgICAmIH5fUEFHRV9DQUNIQUJMRSkKKwkJCQkgICAgIHwgKF9QQUdFX0JVRkZFUiB8IF9QQUdFX0RJUlRZKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oCmluZGV4IGY2Y2MyYjAuLmMwN2JkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9wZ3RhYmxlLmgKQEAgLTIwMSwxOCArMjAxLDEwIEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOwogfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDVVRFOwotfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7CkBAIC0yMzEsMjEgKzIyMywxMSBAQAogfQogCiAvKiBNdXRhdG9yIGZ1bmN0aW9ucyBmb3IgUFRFIGJpdHMgKi8KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JXKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRVhFQ1VURSkpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOwpAQCAtMjU2LDIxICsyMzgsMTEgQEAKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOwogCXJldHVybiBwdGU7CiB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JXKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9FWEVDVVRFKSk7Ci0JcmV0dXJuIHB0ZTsKLX0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL2ZiLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2ZiLmggYi9pbmNsdWRlL2FzbS1jcmlzL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGxzLmgKaW5kZXggOTc3ODdjMy4uNGY0ZTUyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2lvY3Rscy5oCkBAIC00OCw2ICs0OCwxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmggYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAppbmRleCA5ZjEzYzMyLi4wNjQ4ZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaApAQCAtMjAsNyArMjAsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKSAgICBjbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpIGNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCmluZGV4IGM5NGE3MTAuLjQxN2Y3MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCkBAIC0xMTEsOSArMTExLDcgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKSAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSAgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CkBAIC0xMjQsMTggKzEyMiw2IEBACiAgICAgICAgIHJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0gICAgICAgIHB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9NT0RJRklFRCB8IF9QQUdFX1NJTEVOVF9XUklURSk7IApAQCAtMTU2LDIyICsxNDIsNiBAQAogICAgICAgICByZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLSAgICAgICAgaWYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQotICAgICAgICAgICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLSAgICAgICAgcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0gICAgICAgIGlmIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRCkKLSAgICAgICAgICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0gICAgICAgIHJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTU9ESUZJRUQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmgKaW5kZXggNmNjMmUyNy4uNzFjMWIzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaApAQCAtMTY2LDYgKzE2Niw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICBCT1RIRVIgIDAwMTAwMDAKICNkZWZpbmUgIEI1NzYwMCAgMDAxMDAwMQogI2RlZmluZSAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICBCMjMwNDAwIDAwMTAwMDMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtaW9zLmgKaW5kZXggYzlkYmQ0ZC4uYjAxMjRlNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCkBAIC04MSw4ICs4MSwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9mYi5oIGIvaW5jbHVkZS9hc20tZnJ2L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaAppbmRleCAxMTRhZWZhLi4xNDdlOTk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmgKQEAgLTM3NywzMCArMzc3LDE3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEoKHB0ZSkucHRlICYgX1BBR0VfU1VQRVIpOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1NVUEVSKTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1dQKTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9TVVBFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9XUDsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1NVUEVSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1dQOyByZXR1cm4gcHRlOyB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JaW50IGkgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCBwdGVwKTsKLQlhc20gdm9sYXRpbGUoImRjZiAlTTAiIDo6ICJVIigqcHRlcCkpOwotCXJldHVybiBpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCWludCBpID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9BQ0NFU1NFRCwgcHRlcCk7CkBAIC01MTAsNyArNDk3LDYgQEAKIAkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCmluZGV4IGQwZWE2NzguLjczMDZjNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKQEAgLTMyNiwxMCArMzI2LDE0IEBACiAjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKICNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMyMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMjEKKyNkZWZpbmUgX19OUl90aW1lcmZkCQkzMjIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMjMKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzMjAKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzI0CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIC8qICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCmluZGV4IDdmMzBjY2UuLjM0NGUzMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaApAQCAtMjgsNyArMjgsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgSEFWRV9BUkNIX0JVR19PTgotI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseSgoY29uZGl0aW9uKSE9MCkpIEJVRygpOyB9IHdoaWxlKDApCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KGNvbmRpdGlvbikpIEJVRygpOyB9IHdoaWxlKDApCiAjZW5kaWYKIAogI2lmbmRlZiBIQVZFX0FSQ0hfV0FSTl9PTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmgKaW5kZXggMjk0MTNkMy4uZTI0NjhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oCkBAIC0xLDI0ICsxLDgyIEBACiAjaWZuZGVmIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19ICiAKLS8qIFRoaXMgaXMgdXNlZCBmb3IgYXJjaHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBETUEgKi8KKy8qIGRlZmluZSB0aGUgZG1hIGFwaSB0byBhbGxvdyBjb21waWxhdGlvbiBidXQgbm90IGxpbmtpbmcgb2YKKyAqIGRtYSBkZXBlbmRlbnQgY29kZS4gIENvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBkbWEtbWFwcGluZworICogQVBJIG5lZWRzIHRvIHNldCAnZGVwZW5kcyBvbiBIQVNfRE1BJyBpbiBpdHMgS2NvbmZpZworICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqCitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKK2V4dGVybiB2b2lkICoKIGRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLAotCQkgICBnZnBfdCBmbGFnKQotewotCUJVRygpOwotCXJldHVybiBOVUxMOwotfQorCQkgICBnZnBfdCBmbGFnKTsKIAotc3RhdGljIGlubGluZSB2b2lkCitleHRlcm4gdm9pZAogZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqY3B1X2FkZHIsCi0JCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JQlVHKCk7Ci19CisJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogCiAjZGVmaW5lIGRtYV9hbGxvY19ub25jb2hlcmVudChkLCBzLCBoLCBmKSBkbWFfYWxsb2NfY29oZXJlbnQoZCwgcywgaCwgZikKICNkZWZpbmUgZG1hX2ZyZWVfbm9uY29oZXJlbnQoZCwgcywgdiwgaCkgZG1hX2ZyZWVfY29oZXJlbnQoZCwgcywgdiwgaCkKIAorZXh0ZXJuIGRtYV9hZGRyX3QKK2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiBpbnQKK2RtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuaHdlbnRyaWVzLAorCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIGRtYV9hZGRyX3QKK2RtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKKyNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUKKyNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUKKyNkZWZpbmUgZG1hX3N5bmNfc2dfZm9yX2RldmljZSBkbWFfc3luY19zZ19mb3JfY3B1CisKK2V4dGVybiBpbnQKK2RtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIpOworCitleHRlcm4gaW50CitkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworCitleHRlcm4gaW50CitkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CisKK2V4dGVybiBpbnQKK2RtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpOworCitleHRlcm4gaW50CitkbWFfaXNfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisKK2V4dGVybiB2b2lkCitkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwogI2VuZGlmIC8qIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKaW5kZXggYzE1NGI5ZC4uYjg0Nzc0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaApAQCAtNDgsNiArNDgsOSBAQAogI2lmbmRlZiBPX05PQVRJTUUKICNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAjZW5kaWYKKyNpZm5kZWYgT19DTE9FWEVDCisjZGVmaW5lIE9fQ0xPRVhFQwkwMjAwMDAwMAkvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLworI2VuZGlmCiAjaWZuZGVmIE9fTkRFTEFZCiAjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCA3ZDdiY2Y5Li5mNjA1ZThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtMywyNSArMyw2IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKLS8qCi0gKiBFc3RhYmxpc2ggYSBuZXcgbWFwcGluZzoKLSAqICAtIGZsdXNoIHRoZSBvbGQgb25lCi0gKiAgLSB1cGRhdGUgdGhlIHBhZ2UgdGFibGVzCi0gKiAgLSBpbmZvcm0gdGhlIFRMQiBhYm91dCB0aGUgbmV3IG9uZQotICoKLSAqIFdlIGhvbGQgdGhlIG1tIHNlbWFwaG9yZSBmb3IgcmVhZGluZywgYW5kIHRoZSBwdGUgbG9jay4KLSAqCi0gKiBOb3RlOiB0aGUgb2xkIHB0ZSBpcyBrbm93biB0byBub3QgYmUgd3JpdGFibGUsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAqIHdvcnJ5IGFib3V0IGRpcnR5IGJpdHMgZXRjIGdldHRpbmcgbG9zdC4KLSAqLwotI2RlZmluZSBwdGVwX2VzdGFibGlzaChfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXAsIF9fZW50cnkpCQlcCi1kbyB7CQkJCSAgCQkJCQlcCi0Jc2V0X3B0ZV9hdCgoX192bWEpLT52bV9tbSwgKF9fYWRkcmVzcyksIF9fcHRlcCwgX19lbnRyeSk7CVwKLQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyZXNzKTsJCQkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwogLyoKICAqIExhcmdlbHkgc2FtZSBhcyBhYm92ZSwgYnV0IG9ubHkgc2V0cyB0aGUgYWNjZXNzIGZsYWdzIChkaXJ0eSwKQEAgLTY4LDMxICs0OSw2IEBACiB9KQogI2VuZGlmCiAKLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCXB0ZV90IF9fcHRlID0gKl9fcHRlcDsJCQkJCQlcCi0JaW50IHIgPSAxOwkJCQkJCQlcCi0JaWYgKCFwdGVfZGlydHkoX19wdGUpKQkJCQkJCVwKLQkJciA9IDA7CQkJCQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHJlc3MpLCAoX19wdGVwKSwJXAotCQkJICAgcHRlX21rY2xlYW4oX19wdGUpKTsJCQkJXAotCXI7CQkJCQkJCQlcCi19KQotI2VuZGlmCi0KLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ESVJUWV9GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX2RpcnR5OwkJCQkJCQlcCi0JX19kaXJ0eSA9IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKTsJXAotCWlmIChfX2RpcnR5KQkJCQkJCQlcCi0JCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHJlc3MpOwkJCVwKLQlfX2RpcnR5OwkJCQkJCQlcCi19KQotI2VuZGlmCi0KICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIHB0ZXBfZ2V0X2FuZF9jbGVhcihfX21tLCBfX2FkZHJlc3MsIF9fcHRlcCkJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCmluZGV4IDA5ZWM0NDcuLjE2YTQ2NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaApAQCAtMTgsNyArMTgsOCBAQAogI2RlZmluZSBnZXRfdW5hbGlnbmVkKHB0cikgXAogCV9fZ2V0X3VuYWxpZ25lZCgocHRyKSwgc2l6ZW9mKCoocHRyKSkpCiAjZGVmaW5lIHB1dF91bmFsaWduZWQoeCxwdHIpIFwKLQlfX3B1dF91bmFsaWduZWQoKF9fdTY0KSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorCSgodm9pZClzaXplb2YoKihwdHIpPSh4KSksXAorCV9fcHV0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3U2NCkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkpCiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QuICBUaGUgaWRlYSBpcyB0aGF0IHdoZW4KQEAgLTk1LDIxICs5NiwyMSBAQAogCWRlZmF1bHQ6CQkJCVwKIAkJYmFkX3VuYWxpZ25lZF9hY2Nlc3NfbGVuZ3RoKCk7CVwKIAl9OwkJCQkJXAotCShfX3R5cGVvZl9fKCoocHRyKSkpdmFsOwkJXAorCShfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSl2YWw7CVwKIH0pCiAKICNkZWZpbmUgX19wdXRfdW5hbGlnbmVkKHZhbCwgcHRyLCBzaXplKQkJXAotZG8gewkJCQkJCVwKKyh7CQkJCQkJXAogCXZvaWQgKl9fZ3VfcCA9IHB0cjsJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCVwKIAljYXNlIDE6CQkJCQlcCi0JCSooX191OCAqKV9fZ3VfcCA9IHZhbDsJCVwKKwkJKihfX3U4ICopX19ndV9wID0gKF9fZm9yY2UgX191OCl2YWw7CQlcCiAJICAgICAgICBicmVhazsJCQkJXAogCWNhc2UgMjoJCQkJCVwKLQkJX191c3R3KHZhbCwgX19ndV9wKTsJCVwKKwkJX191c3R3KChfX2ZvcmNlIF9fdTE2KXZhbCwgX19ndV9wKTsJCVwKIAkJYnJlYWs7CQkJCVwKIAljYXNlIDQ6CQkJCQlcCi0JCV9fdXN0bCh2YWwsIF9fZ3VfcCk7CQlcCisJCV9fdXN0bCgoX19mb3JjZSBfX3UzMil2YWwsIF9fZ3VfcCk7CQlcCiAJCWJyZWFrOwkJCQlcCiAJY2FzZSA4OgkJCQkJXAogCQlfX3VzdHEodmFsLCBfX2d1X3ApOwkJXApAQCAtMTE3LDYgKzExOCw3IEBACiAJZGVmYXVsdDoJCQkJXAogCSAgICAJYmFkX3VuYWxpZ25lZF9hY2Nlc3NfbGVuZ3RoKCk7CVwKIAl9OwkJCQkJXAotfSB3aGlsZSgwKQorCSh2b2lkKTA7CQkJCVwKK30pCiAKICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1oODMwMC9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBlNDAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9mYi5oIGIvaW5jbHVkZS9hc20taDgzMDAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaAppbmRleCBhYzIwNDU3Li45OGE1M2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaApAQCAtNDcsNiArNDcsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaAppbmRleCAzYjRmMjkwLi5jOGNjODFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCkBAIC0yMiw3ICsyMiw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oCmluZGV4IGU4NzdiNDAuLjMxZWNhODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTYsMTAgKzE1NywxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJICAxNgkJCS8qIHNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaAppbmRleCBmYjI5MjVkLi43MGVlYTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWlvcy5oCkBAIC04Miw4ICs4MiwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCmluZGV4IDQ1ZjA5ZGMuLmFlZTQwMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaApAQCAtOTIsNiArOTIsNyBAQAogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJNAkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcKIAkJCQkJICAgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQk1CisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJNgkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCiAKIC8qIGFzIGFib3ZlLCBidXQgYXMgYml0IHZhbHVlcyAqLwogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtOTksNiArMTAwLDcgQEAKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogCiAjZGVmaW5lIF9USUZfV09SS19NQVNLCQkweDAwMDBGRkZFCS8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mYi5oIGIvaW5jbHVkZS9hc20taTM4Ni9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZiLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitleHRlcm4gaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKaW5kZXggODBlYTA1Mi4uMjQ5ZTc1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCkBAIC01NCw2ICs1NCw4IEBACiBlbnVtIGZpeGVkX2FkZHJlc3NlcyB7CiAJRklYX0hPTEUsCiAJRklYX1ZEU08sCisJRklYX0RCR1BfQkFTRSwKKwlGSVhfRUFSTFlDT05fTUVNX0JBU0UsCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJRklYX0FQSUNfQkFTRSwJLyogbG9jYWwgKENQVSkgQVBJQykgLS0gcmVxdWlyZWQgZm9yIFNNUCBvciBub3QgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaCBiL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKaW5kZXggMGZjMjQwYy4uZTc4MTdhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCkBAIC00MCwxNCArNDAsMTMgQEAKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBpZGVfZGVmYXVsdF9pb19iYXNlKGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAkvKgogCSAqCUlmIFBDSSBpcyBwcmVzZW50IHRoZW4gaXQgaXMgbm90IHNhZmUgdG8gcG9rZSBhcm91bmQKIAkgKgl0aGUgb3RoZXIgbGVnYWN5IElERSBwb3J0cy4gT25seSAweDFmMCBhbmQgMHgxNzAgYXJlCiAJICoJZGVmaW5lZCBjb21wYXRpYmlsaXR5IG1vZGUgcG9ydHMgZm9yIFBDSS4gQSB1c2VyIGNhbiAKIAkgKglvdmVycmlkZSB0aGlzIHVzaW5nIGlkZT0gYnV0IHdlIG11c3QgZGVmYXVsdCBzYWZlLgogCSAqLwotCWlmICgocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpKSA9PSBOVUxMKSB7CisJaWYgKG5vX3BjaV9kZXZpY2VzKCkpIHsKIAkJc3dpdGNoKGluZGV4KSB7CiAJCQljYXNlIDI6IHJldHVybiAweDFlODsKIAkJCWNhc2UgMzogcmV0dXJuIDB4MTY4OwpAQCAtNTUsNyArNTQsNiBAQAogCQkJY2FzZSA1OiByZXR1cm4gMHgxNjA7CiAJCX0KIAl9Ci0JcGNpX2Rldl9wdXQocGRldik7CiAJc3dpdGNoIChpbmRleCkgewogCQljYXNlIDA6CXJldHVybiAweDFmMDsKIAkJY2FzZSAxOglyZXR1cm4gMHgxNzA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKaW5kZXggZTc5NzU4Ni4uN2I2NWI1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaApAQCAtMTI5LDYgKzEyOSw3IEBACiAgKi8KIGV4dGVybiB2b2lkICpidF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgYnRfaW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgX19pb21lbSAqZml4X2lvcmVtYXAodW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsb25nIHBoeXMpOwogCiAvKiBVc2UgZWFybHkgSU8gbWFwcGluZ3MgZm9yIERNSSBiZWNhdXNlIGl0J3MgaW5pdGlhbGl6ZWQgZWFybHkgKi8KICNkZWZpbmUgZG1pX2lvcmVtYXAgYnRfaW9yZW1hcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAppbmRleCA4MThhYzhiLi45OWNmNWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaApAQCAtMzQsNyArMzQsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmgKaW5kZXggYTUwZmQxNy4uODRiMDNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaApAQCAtNTcsMTQgKzU3LDYgQEAKICNkZWZpbmUgcGZuX3BtZChwZm4sIHByb3QpCV9fcG1kKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCiAKIC8qCi0gKiBBbGwgcHJlc2VudCB1c2VyIHBhZ2VzIGFyZSB1c2VyLWV4ZWN1dGFibGU6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3VzZXIocHRlKTsKLX0KLQotLyoKICAqIEFsbCBwcmVzZW50IHBhZ2VzIGFyZSBrZXJuZWwtZXhlY3V0YWJsZToKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWNfa2VybmVsKHB0ZV90IHB0ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaAppbmRleCBlYjBmMWQ3Li45NDhhMzM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCkBAIC0yMCwyNiArMjAsMTEgQEAKICNkZWZpbmUgcHVkX3ByZXNlbnQocHVkKQkJCTEKIAogLyoKLSAqIElzIHRoZSBwdGUgZXhlY3V0YWJsZT8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3gocHRlX3QgcHRlKQotewotCXJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKTsKLX0KLQotLyoKLSAqIEFsbCBwcmVzZW50IHVzZXItcGFnZXMgd2l0aCAhTlggYml0IGFyZSB1c2VyLWV4ZWN1dGFibGU6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3VzZXIocHRlKSAmJiBwdGVfeChwdGUpOwotfQotLyoKICAqIEFsbCBwcmVzZW50IHBhZ2VzIHdpdGggIU5YIGJpdCBhcmUga2VybmVsLWV4ZWN1dGFibGU6CiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjX2tlcm5lbChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIHB0ZV94KHB0ZSk7CisJcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfTlgpOwogfQogCiAvKiBSdWxlcyBmb3IgdXNpbmcgc2V0X3B0ZTogdGhlIHB0ZSBiZWluZyBhc3NpZ25lZCAqbXVzdCogYmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKaW5kZXggNjI4ZmE3Ny4uYzdmZWZhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKQEAgLTc5LDcgKzc5LDcgQEAKICAqIGFyZWEgZm9yIHRoZSBzYW1lIHJlYXNvbi4gOykKICAqLwogI2RlZmluZSBWTUFMTE9DX09GRlNFVAkoOCoxMDI0KjEwMjQpCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQJKCgodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgKyB2bWFsbG9jX2Vhcmx5cmVzZXJ2ZSArIFwKKyNkZWZpbmUgVk1BTExPQ19TVEFSVAkoKCh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSArIFwKIAkJCTIqVk1BTExPQ19PRkZTRVQtMSkgJiB+KFZNQUxMT0NfT0ZGU0VULTEpKQogI2lmZGVmIENPTkZJR19ISUdITUVNCiAjIGRlZmluZSBWTUFMTE9DX0VORAkoUEtNQVBfQkFTRS0yKlBBR0VfU0laRSkKQEAgLTIxOCw4ICsyMTgsNiBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfVVNFUjsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfUlc7IH0KQEAgLTIzMCwxMyArMjI4LDkgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX0ZJTEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfUlc7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQpAQCAtMjk1LDE3ICsyODksNiBAQAogCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkodm1hLCBhZGRyLCBwdGVwKSAoewkJCVwKLQlpbnQgX19yZXQgPSAwOwkJCQkJCQlcCi0JaWYgKHB0ZV9kaXJ0eSgqKHB0ZXApKSkJCQkJCQlcCi0JCV9fcmV0ID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwJCVwKLQkJCQkJCSYocHRlcCktPnB0ZV9sb3cpOwlcCi0JaWYgKF9fcmV0KQkJCQkJCQlcCi0JCXB0ZV91cGRhdGUoKHZtYSktPnZtX21tLCBhZGRyLCBwdGVwKTsJCQlcCi0JX19yZXQ7CQkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2bWEsIGFkZHIsIHB0ZXApICh7CQkJXAogCWludCBfX3JldCA9IDA7CQkJCQkJCVwKQEAgLTMxNywyNyArMzAwLDYgQEAKIAlfX3JldDsJCQkJCQkJCVwKIH0pCiAKLS8qCi0gKiBSdWxlcyBmb3IgdXNpbmcgcHRlcF9lc3RhYmxpc2g6IHRoZSBwdGUgTVVTVCBiZSBhIHVzZXIgcHRlLCBhbmQKLSAqIG11c3QgYmUgYSBwcmVzZW50LT5wcmVzZW50IHRyYW5zaXRpb24uCi0gKi8KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKLSNkZWZpbmUgcHRlcF9lc3RhYmxpc2godm1hLCBhZGRyZXNzLCBwdGVwLCBwdGV2YWwpCQkJXAotZG8gewkJCQkJCQkJCVwKLQlzZXRfcHRlX3ByZXNlbnQoKHZtYSktPnZtX21tLCBhZGRyZXNzLCBwdGVwLCBwdGV2YWwpOwkJXAotCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRElSVFlfRkxVU0gKLSNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF9kaXJ0eSh2bWEsIGFkZHJlc3MsIHB0ZXApCQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fZGlydHk7CQkJCQkJCVwKLQlfX2RpcnR5ID0gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSgodm1hKSwgKGFkZHJlc3MpLCAocHRlcCkpOwlcCi0JaWYgKF9fZGlydHkpCQkJCQkJCVwKLQkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsJCQkJXAotCV9fZGlydHk7CQkJCQkJCVwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ZT1VOR19GTFVTSAogI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCkJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IDk0ZTBjMTQuLjQyMmNmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtMjI4LDYgKzIyOCwxMCBAQAogCiAjZGVmaW5lIEhBVkVfQVJDSF9QSUNLX01NQVBfTEFZT1VUCiAKK2V4dGVybiB2b2lkIGhhcmRfZGlzYWJsZV9UU0Modm9pZCk7CitleHRlcm4gdm9pZCBkaXNhYmxlX1RTQyh2b2lkKTsKK2V4dGVybiB2b2lkIGhhcmRfZW5hYmxlX1RTQyh2b2lkKTsKKwogLyoKICAqIFNpemUgb2YgaW9fYml0bWFwLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKaW5kZXggNGNiMGY5MS4uNTQ0MjRlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaApAQCAtMTM3LDYgKzEzNyw3IEBACiAjZGVmaW5lIFRJRl9ERUJVRwkJMTcJLyogdXNlcyBkZWJ1ZyByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGX0lPX0JJVE1BUAkJMTgJLyogdXNlcyBJL08gYml0bWFwICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE5CS8qIGlzIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9OT1RTQwkJMjAJLyogVFNDIGlzIG5vdCBhY2Nlc3NpYmxlIGluIHVzZXJsYW5kICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKQEAgLTE1MSw2ICsxNTIsNyBAQAogI2RlZmluZSBfVElGX0RFQlVHCQkoMTw8VElGX0RFQlVHKQogI2RlZmluZSBfVElGX0lPX0JJVE1BUAkJKDE8PFRJRl9JT19CSVRNQVApCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKKyNkZWZpbmUgX1RJRl9OT1RTQwkJKDE8PFRJRl9OT1RTQykKIAogLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwogI2RlZmluZSBfVElGX1dPUktfTUFTSyBcCkBAIC0xNjAsNyArMTYyLDggQEAKICNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sJKDB4MDAwMEZGRkYgJiB+X1RJRl9TRUNDT01QKQogCiAvKiBmbGFncyB0byBjaGVjayBpbiBfX3N3aXRjaF90bygpICovCi0jZGVmaW5lIF9USUZfV09SS19DVFhTVyAoX1RJRl9ERUJVR3xfVElGX0lPX0JJVE1BUCkKKyNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXX05FWFQgKF9USUZfSU9fQklUTUFQIHwgX1RJRl9OT1RTQyB8IF9USUZfREVCVUcpCisjZGVmaW5lIF9USUZfV09SS19DVFhTV19QUkVWIChfVElGX0lPX0JJVE1BUCB8IF9USUZfTk9UU0MpCiAKIC8qCiAgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKaW5kZXggNDBkMDFkOC4uMGY2ZTUyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIGNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9mYi5oIGIvaW5jbHVkZS9hc20taWE2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTM5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2ZiLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoZWZpX3JhbmdlX2lzX3djKHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCisJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJZWxzZQorCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvY3Rscy5oCmluZGV4IDMxZWU1MjEuLmY0MWI2MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb2N0bHMuaApAQCAtNTMsNiArNTMsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKaW5kZXggNDg1NzU5Yi4uZDYzNDU0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKQEAgLTg3LDEyICs4NywxMyBAQAogfSB3aGlsZSAoMCkKIAogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIFwKLSh7CQkJCQkJXAotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcik7IFwKLQlpZiAocGFnZSkJCQkJXAotIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CVwKLQlwYWdlOwkJCQkJXAorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikJCVwKKyh7CQkJCQkJCQkJXAorCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoCQkJCVwKKwkJR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcik7CVwKKwlpZiAocGFnZSkJCQkJCQkJXAorIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CQkJCVwKKwlwYWdlOwkJCQkJCQkJXAogfSkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAppbmRleCA2NTgwZjMxLi5kZTZkMDFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaApAQCAtMjk3LDggKzI5Nyw2IEBACiAvKgogICogVGhlIGZvbGxvd2luZyBoYXZlIGRlZmluZWQgYmVoYXZpb3Igb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqLwotI2RlZmluZSBwdGVfdXNlcihwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX1BMX01BU0spID09IF9QQUdFX1BMXzMpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCSgoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX01BU0spID4+IF9QQUdFX0FSX1NISUZUKSA8IDYpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCSgodW5zaWduZWQpICgoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX01BU0spID4+IF9QQUdFX0FSX1NISUZUKSAtIDIpIDw9IDQpCiAjZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgX1BBR0VfQVJfUlgpICE9IDApCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0QpICE9IDApCkBAIC0zMTAsNyArMzA4LDYgQEAKICAqLwogI2RlZmluZSBwdGVfd3Jwcm90ZWN0KHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BUl9SVykpCiAjZGVmaW5lIHB0ZV9ta3dyaXRlKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FSX1JXKSkKLSNkZWZpbmUgcHRlX21rZXhlYyhwdGUpCQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQVJfUlgpKQogI2RlZmluZSBwdGVfbWtvbGQocHRlKQkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BKSkKICNkZWZpbmUgcHRlX21reW91bmcocHRlKQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQSkpCiAjZGVmaW5lIHB0ZV9ta2NsZWFuKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9EKSkKQEAgLTM5OCwyMiArMzk1LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGludAotcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmICghcHRlX2RpcnR5KCpwdGVwKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9EX0JJVCwgcHRlcCk7Ci0jZWxzZQotCXB0ZV90IHB0ZSA9ICpwdGVwOwotCWlmICghcHRlX2RpcnR5KHB0ZSkpCi0JCXJldHVybiAwOwotCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkciwgcHRlcCwgcHRlX21rY2xlYW4ocHRlKSk7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdAogcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewpAQCAtNTQ2LDggKzUyNywxMCBAQAogIyBkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCwgX19lbnRyeSwgX19zYWZlbHlfd3JpdGFibGUpIFwKICh7CQkJCQkJCQkJXAogCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQlcCi0JaWYgKF9fY2hhbmdlZCkJCQkJCQkJXAotCQlwdGVwX2VzdGFibGlzaChfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnkpOwkJXAorCWlmIChfX2NoYW5nZWQpIHsJCQkJCQlcCisJCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHIpLCBfX3B0ZXAsIF9fZW50cnkpOwlcCisJCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHIpOwkJCQlcCisJfQkJCQkJCQkJXAogCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKICNlbmRpZgpAQCAtNTkxLDcgKzU3NCw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oCmluZGV4IDdmYWUzMTAuLjlmMTYyZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmgKQEAgLTE0OSw2ICsxNDksNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTY0LDEwICsxNjUsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZSBJQlNISUZUCTE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCmluZGV4IDA4NzUwYzIuLjY4OWQyMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCkBAIC04Nyw4ICs4NywxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOwlcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICMgZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjU4ZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9BU01fTTMyUl9ETUFfTUFQUElOR19ICi0jZGVmaW5lIF9BU01fTTMyUl9ETUFfTUFQUElOR19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KLQotI2VuZGlmIC8qIF9BU01fTTMyUl9ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2ZiLmggYi9pbmNsdWRlL2FzbS1tMzJyL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGxzLmgKaW5kZXggZDIzY2ZjNC4uYjlmNTRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wYWdlLmggYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAppbmRleCA2ZjZlY2Y3Li4wNGZkMTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaApAQCAtMTUsNyArMTUsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCmluZGV4IDY2MDQzMDMuLjkyZDcyNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCkBAIC0xOTEsMTYgKzE5MSw2IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQogewogCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsKQEAgLTIyNCwxOCArMjE0LDYgQEAKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsKQEAgLTI1NCwxOCArMjMyLDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOwotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0VYRUM7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOwpAQCAtMjg0LDExICsyNTAsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCBwdGVwKTsKLX0KLQogc3RhdGljIGlubGluZSAgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CiAJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsIHB0ZXApOwpAQCAtMzgyLDcgKzM0Myw2IEBACiAJCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaAppbmRleCA2YmUzYjhhLi5iYzEwNDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oCkBAIC0xNDAsNiArMTQwLDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICAgQk9USEVSIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1NSwxMSArMTU2LDEzIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ1RWQgkgIDAwNDAwMDAwMDAwMAkJLyogVmlzaW9CcmFpbGxlIFRlcm1pbmFsIGZsb3cgY29udHJvbCAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUJSUJTSElGVAkxNgkJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKaW5kZXggNDk0M2RkOC4uOTNjZTc5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKQEAgLTgxLDggKzgxLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjRmY2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQotI2lmbmRlZiBfQVRBUklfU0xNX0gKLSNkZWZpbmUgX0FUQVJJX1NMTV9ICi0KLS8qIEF0YXJpIFNMTSBsYXNlciBwcmludGVyIHNwZWNpZmljIGlvY3RscyAqLwotCi0jZGVmaW5lCVNMTUlPR1NUQVQJMHhhMTAwCi0jZGVmaW5lCVNMTUlPR1BTSVpFCTB4YTEwMQotI2RlZmluZQlTTE1JT0dNRkVFRAkweGExMDIKLQotI2RlZmluZQlTTE1JT1JFU0VUCTB4YTE0MAotCi0jZGVmaW5lCVNMTUlPU1BTSVpFCTB4YTE4MQotI2RlZmluZQlTTE1JT1NNRkVFRAkweGExODIKLQotLyogU3RhdHVzIHJldHVybmluZyBzdHJ1Y3R1cmUgKFNMTUlPR1NUQVQpICovCi1zdHJ1Y3QgU0xNX3N0YXR1cyB7Ci0JaW50CQlzdGF0OwkJLyogbnVtZXJpYyBzdGF0dXMgY29kZSAqLwotCWNoYXIJc3RyWzQwXTsJLyogc3RhdHVzIHN0cmluZyAqLwotfTsKLQotLyogUGFwZXIgc2l6ZSBzdHJ1Y3R1cmUgKFNMTUlPW0dTXVBTSVpFKSAqLwotc3RydWN0IFNMTV9wYXBlcl9zaXplIHsKLQlpbnQJCXdpZHRoOwotCWludAkJaGVpZ2h0OwotfTsKLQotI2VuZGlmIC8qIF9BVEFSSV9TTE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZWE2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9BVEFSSV9BQ1NJX0gKLSNkZWZpbmUgX0FTTV9BVEFSSV9BQ1NJX0gKLQotLyogRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IGRyaXZlcnMvYmxvY2svYWNzaS5jICovCi0KLXZvaWQgYWNzaV9kZWxheV9zdGFydCggdm9pZCApOwotdm9pZCBhY3NpX2RlbGF5X2VuZCggbG9uZyB1c2VjICk7Ci1pbnQgYWNzaV93YWl0X2Zvcl9JUlEoIHVuc2lnbmVkIHRpbWVvdXQgKTsKLWludCBhY3NpX3dhaXRfZm9yX25vSVJRKCB1bnNpZ25lZCB0aW1lb3V0ICk7Ci1pbnQgYWNzaWNtZF9ub2RtYSggY29uc3QgY2hhciAqY21kLCBpbnQgZW5hYmxlKTsKLWludCBhY3NpX2dldHN0YXR1cyggdm9pZCApOwotaW50IGFjc2lfZXh0c3RhdHVzKCBjaGFyICpidWZmZXIsIGludCBjbnQgKTsKLXZvaWQgYWNzaV9lbmRfZXh0c3RhdHVzKCB2b2lkICk7Ci1pbnQgYWNzaV9leHRjbWQoIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGNudCApOwotCi0vKiBUaGUgQUNTSSBidWZmZXIgaXMgZ3VhcmFudHVlZWQgdG8gcmVzaWRlIGluIFNULVJBTSBhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXIKLSAqIGRyaXZlcnMgdGhhdCB3b3JrIG9uIHRoZSBBQ1NJIGJ1cywgdG9vLiBJdCdzIGRhdGEgYXJlIHZhbGlkIG9ubHkgYXMgbG9uZyBhcwotICogdGhlIFNULURNQSBpcyBsb2NrZWQuICovCi1leHRlcm4gY2hhciAqYWNzaV9idWZmZXI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzX2Fjc2lfYnVmZmVyOwotCi0vKiBVdGlsaXR5IG1hY3JvcyAqLwotCi0vKiBTZW5kIG9uZSBkYXRhIGJ5dGUgb3ZlciB0aGUgYnVzIGFuZCBzZXQgbW9kZSBmb3IgbmV4dCBvcGVyYXRpb24KLSAqIHdpdGggb25lIG1vdmUubCAtLSBBdGFyaSByZWNvbW1lbmRzIHRoaXMuLi4KLSAqLwotCi0jZGVmaW5lIERNQV9MT05HX1dSSVRFKGRhdGEsbW9kZSkJCQkJCQkJXAotICAgIGRvIHsJCQkJCQkJCQkJCQkJXAotCQkqKCh1bnNpZ25lZCBsb25nICopJmRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQpID0JXAotCQkJKChkYXRhKTw8MTYpIHwgKG1vZGUpOwkJCQkJCQlcCi0JfSB3aGlsZSgwKQotCi0jZGVmaW5lIEVOQUJMRV9JUlEoKQlhdGFyaV90dXJub25faXJxKCBJUlFfTUZQX0FDU0kgKQotI2RlZmluZSBESVNBQkxFX0lSUSgpCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfTUZQX0FDU0kgKQotCi0jZW5kaWYgLyogX0FTTV9BVEFSSV9BQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZmIuaCBiL2luY2x1ZGUvYXNtLW02OGsvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBiOTdhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9mYi5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2lmZGVmIENPTkZJR19TVU4zCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBTVU4zX1BBR0VfTk9DQUNIRTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoQ1BVX0lTXzAyMF9PUl8wMzApCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PQ0FDSEUwMzA7CisJaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICY9IF9DQUNIRU1BU0swNDA7CisJCS8qIFVzZSBuby1jYWNoZSBtb2RlLCBzZXJpYWxpemVkICovCisJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PQ0FDSEVfUzsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NVTjMgKi8KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oCmluZGV4IGI1Yjc4YzAuLmQwMjliNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oCkBAIC0xNjQsMjEgKzE2NCwxNSBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ST05MWSk7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JPTkxZOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfUk9OTFk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtub2NhY2hlKHB0ZV90IHB0ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCmluZGV4IGI5ZTYyYzEuLmI3NjZmYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaApAQCAtMTY1LDIxICsxNjUsMTUgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4uCiAgKiBbd2UgaGF2ZSB0aGUgZnVsbCBzZXQgaGVyZSBldmVuIGlmIHRoZXkgZG9uJ3QgY2hhbmdlIGZyb20gbTY4a10KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIFNVTjNfUEFHRV9XUklURUFCTEU7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIFNVTjNfUEFHRV9BQ0NFU1NFRDsgfQogCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+U1VOM19QQUdFX1dSSVRFQUJMRTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+U1VOM19QQUdFX01PRElGSUVEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5TVU4zX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfV1JJVEVBQkxFOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9NT0RJRklFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtub2NhY2hlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gU1VOM19QQUdFX05PQ0FDSEU7IHJldHVybiBwdGU7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9mYi5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaAppbmRleCAyYTFiOGJkLi45ZWZhMGE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKQEAgLTIyLDcgKzIyLDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKQljb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKaW5kZXggNjdjM2Y4ZS4uNTY4Yzc2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCkBAIC0zNyw4ICszNywxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9mYi5oIGIvaW5jbHVkZS9hc20tbWlwcy9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2Y2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKaW5kZXggMjdkNzdkOS4uMmUyZDcwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKQEAgLTE3OCw5ICsxNzgsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCXsgQlVHKCk7IHJldHVybiAwOyB9CiAjaWYgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyX1IxKQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX1JFQUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfV1JJVEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQ7IH0KQEAgLTE5MywxMyArMTkxLDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQotewotCXB0ZS5wdGVfbG93ICAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcHRlLnB0ZV9oaWdoICY9IH5fUEFHRV9TSUxFTlRfUkVBRDsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGUucHRlX2xvdyAgJj0gfihfUEFHRV9NT0RJRklFRCB8IF9QQUdFX1NJTEVOVF9XUklURSk7CkBAIC0yMjQsMTYgKzIxNSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLQlwdGUucHRlX2xvdyB8PSBfUEFHRV9SRUFEOwotCWlmIChwdGUucHRlX2xvdyAmIF9QQUdFX0FDQ0VTU0VEKSB7Ci0JCXB0ZS5wdGVfbG93ICB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLQkJcHRlLnB0ZV9oaWdoIHw9IF9QQUdFX1NJTEVOVF9SRUFEOwotCX0KLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlwdGUucHRlX2xvdyB8PSBfUEFHRV9NT0RJRklFRDsKQEAgLTI1Myw3ICsyMzQsNiBAQAogCXJldHVybiBwdGU7CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CkBAIC0yNjUsMTIgKzI0NSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SRUFEIHwgX1BBR0VfU0lMRU5UX1JFQUQpOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX01PRElGSUVEfF9QQUdFX1NJTEVOVF9XUklURSk7CkBAIC0yOTEsMTQgKzI2NSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLQlpZiAocHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQpCi0JCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTU9ESUZJRUQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCmluZGV4IGJkYTM5MWQuLjI3MzhjMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oCkBAIC0yMjAsMTcgKzIyMCwyNSBAQAogI2RlZmluZSBBX0JDTTE0ODBfRFVBUlQoY2hhbikgICAgICAgICAgICAgICAoKCgoY2hhbikmMikgPT0gMCk/IEFfQkNNMTQ4MF9EVUFSVDAgOiBBX0JDTTE0ODBfRFVBUlQxKQogCiAjZGVmaW5lIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HICAgICAgIDB4MTAwCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcqKChjaGFuKSYxKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocmVnKSkKLSNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0NIQU5SRUcoY2hhbixyZWcpICAgKEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HKigoY2hhbikmMSkgKyAocmVnKSkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0NIQU5SRUcoY2hhbiwgcmVnKQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArCQkJCQlcCisJIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogKCgoY2hhbikgJiAxKSArIDEpICsgKHJlZykpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKGNoYW4sIHJlZykJCQkJXAorCShBX0JDTTE0ODBfRFVBUlQoY2hhbikgKwkJCQkJXAorCSBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyAqIDMgKyAocmVnKSkKIAotI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JTVJfQSArICgoY2hhbikmMSkqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCi0jZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikJICAgIChSX0RVQVJUX0lTUl9BICsgKChjaGFuKSYxKSpEVUFSVF9JTVJJU1JfU1BBQ0lORykKKyNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkJCQkJXAorCShSX0RVQVJUX0lNUl9BICsgKChjaGFuKSAmIDEpICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikJCQkJCVwKKwkoUl9EVUFSVF9JU1JfQSArICgoY2hhbikgJiAxKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQogCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pKQotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKSkKLSNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lOX1BPUlQoY2hhbikgICAgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfRFVBUlRfSU5QX09SVCkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkJCQkJXAorCShBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygoY2hhbiksIFJfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikpKQorI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKChjaGFuKSwgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKSkpCisKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lOX1BPUlQoY2hhbikJCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoKGNoYW4pLCBSX0RVQVJUX0lOX1BPUlQpKQogCiAvKgogICogVGhlc2UgY29uc3RhbnRzIGFyZSB0aGUgYWJzb2x1dGUgYWRkcmVzc2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKaW5kZXggZGE3YzE4OC4uMjIwYjdlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCkBAIC0yNzIsNTkgKzI3Miw2OSBAQAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCiAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4CQkvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4ICAgIC8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLwogI2RlZmluZSBSX0RVQVJUX05VTV9QT1JUUyAgICAgICAgICAgMgogCiAjZGVmaW5lIEFfRFVBUlQgICAgICAgICAgICAgICAgICAgICAweDAwMTAwNjAwMDAKIAogI2RlZmluZSBEVUFSVF9DSEFOUkVHX1NQQUNJTkcgICAgICAgMHgxMDAKLSNkZWZpbmUgQV9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChBX0RVQVJUICsgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKihjaGFuKSArIChyZWcpKQotI2RlZmluZSBSX0RVQVJUX0NIQU5SRUcoY2hhbixyZWcpICAgKERVQVJUX0NIQU5SRUdfU1BBQ0lORyooY2hhbikgKyAocmVnKSkKKworI2RlZmluZSBBX0RVQVJUX0NIQU5SRUcoY2hhbiwgcmVnKQkJCQkJXAorCShBX0RVQVJUICsgRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogKChjaGFuKSArIDEpICsgKHJlZykpCiAjZW5kaWYJLyogMTI1MCAmIDExMnggKi8KIAotI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzEJICAgIDB4MTAwCi0jZGVmaW5lIFJfRFVBUlRfTU9ERV9SRUdfMgkgICAgMHgxMTAKLSNkZWZpbmUgUl9EVUFSVF9TVEFUVVMgICAgICAgICAgICAgIDB4MTIwCi0jZGVmaW5lIFJfRFVBUlRfQ0xLX1NFTCAgICAgICAgICAgICAweDEzMAotI2RlZmluZSBSX0RVQVJUX0NNRCAgICAgICAgICAgICAgICAgMHgxNTAKLSNkZWZpbmUgUl9EVUFSVF9SWF9IT0xEICAgICAgICAgICAgIDB4MTYwCi0jZGVmaW5lIFJfRFVBUlRfVFhfSE9MRCAgICAgICAgICAgICAweDE3MAorI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzEJICAgIDB4MDAwCisjZGVmaW5lIFJfRFVBUlRfTU9ERV9SRUdfMgkgICAgMHgwMTAKKyNkZWZpbmUgUl9EVUFSVF9TVEFUVVMJCSAgICAweDAyMAorI2RlZmluZSBSX0RVQVJUX0NMS19TRUwJCSAgICAweDAzMAorI2RlZmluZSBSX0RVQVJUX0NNRAkJICAgIDB4MDUwCisjZGVmaW5lIFJfRFVBUlRfUlhfSE9MRAkJICAgIDB4MDYwCisjZGVmaW5lIFJfRFVBUlRfVFhfSE9MRAkJICAgIDB4MDcwCiAKICNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzIpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkgfHwgU0lCWVRFX0hEUl9GRUFUVVJFX0NISVAoMTQ4MCkKLSNkZWZpbmUgUl9EVUFSVF9GVUxMX0NUTAkgICAgMHgxNDAKLSNkZWZpbmUgUl9EVUFSVF9PUENSX1gJCSAgICAweDE4MAotI2RlZmluZSBSX0RVQVJUX0FVWENUTF9YCSAgICAweDE5MAotI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwKi8KKyNkZWZpbmUgUl9EVUFSVF9GVUxMX0NUTAkgICAgMHgwNDAKKyNkZWZpbmUgUl9EVUFSVF9PUENSX1gJCSAgICAweDA4MAorI2RlZmluZSBSX0RVQVJUX0FVWENUTF9YCSAgICAweDA5MAorI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwICovCiAKIAogLyoKICAqIFRoZSBJTVIgYW5kIElTUiBjYW4ndCBiZSBhZGRyZXNzZWQgd2l0aCBBX0RVQVJUX0NIQU5SRUcsCi0gKiBzbyB1c2UgdGhpcyBtYWNybyBpbnN0ZWFkLgorICogc28gdXNlIHRoZXNlIG1hY3JvcyBpbnN0ZWFkLgogICovCiAKLSNkZWZpbmUgUl9EVUFSVF9BVVhfQ1RSTCAgICAgICAgICAgIDB4MzEwCi0jZGVmaW5lIFJfRFVBUlRfSVNSX0EgICAgICAgICAgICAgICAweDMyMAotI2RlZmluZSBSX0RVQVJUX0lNUl9BICAgICAgICAgICAgICAgMHgzMzAKLSNkZWZpbmUgUl9EVUFSVF9JU1JfQiAgICAgICAgICAgICAgIDB4MzQwCi0jZGVmaW5lIFJfRFVBUlRfSU1SX0IgICAgICAgICAgICAgICAweDM1MAotI2RlZmluZSBSX0RVQVJUX09VVF9QT1JUICAgICAgICAgICAgMHgzNjAKLSNkZWZpbmUgUl9EVUFSVF9PUENSICAgICAgICAgICAgICAgIDB4MzcwCi0jZGVmaW5lIFJfRFVBUlRfSU5fUE9SVCAgICAgICAgICAgICAweDM4MAorI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMnggICAgLyogVGhpcyBNQyBvbmx5IG9uIDEyNTAgJiAxMTJ4ICovCisjZGVmaW5lIERVQVJUX0lNUklTUl9TUEFDSU5HCSAgICAweDIwCisjZGVmaW5lIERVQVJUX0lOQ0hOR19TUEFDSU5HCSAgICAweDEwCiAKLSNkZWZpbmUgUl9EVUFSVF9TRVRfT1BSCQkgICAgMHgzQjAKLSNkZWZpbmUgUl9EVUFSVF9DTEVBUl9PUFIJICAgIDB4M0MwCisjZGVmaW5lIEFfRFVBUlRfQ1RSTFJFRyhyZWcpCQkJCQkJXAorCShBX0RVQVJUICsgRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogMyArIChyZWcpKQogCi0jZGVmaW5lIERVQVJUX0lNUklTUl9TUEFDSU5HICAgICAgICAweDIwCisjZGVmaW5lIFJfRFVBUlRfSU1SUkVHKGNoYW4pCQkJCQkJXAorCShSX0RVQVJUX0lNUl9BICsgKGNoYW4pICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfRFVBUlRfSVNSUkVHKGNoYW4pCQkJCQkJXAorCShSX0RVQVJUX0lTUl9BICsgKGNoYW4pICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfRFVBUlRfSU5DSFJFRyhjaGFuKQkJCQkJCVwKKwkoUl9EVUFSVF9JTl9DSE5HX0EgKyAoY2hhbikgKiBEVUFSVF9JTkNITkdfU1BBQ0lORykKIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngJCS8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLwotI2RlZmluZSBSX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSU1SX0EgKyAoY2hhbikqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCi0jZGVmaW5lIFJfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JU1JfQSArIChjaGFuKSpEVUFSVF9JTVJJU1JfU1BBQ0lORykKLQotI2RlZmluZSBBX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKEFfRFVBUlQgKyBSX0RVQVJUX0lNUlJFRyhjaGFuKSkKLSNkZWZpbmUgQV9EVUFSVF9JU1JSRUcoY2hhbikJICAgIChBX0RVQVJUICsgUl9EVUFSVF9JU1JSRUcoY2hhbikpCisjZGVmaW5lIEFfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICBBX0RVQVJUX0NUUkxSRUcoUl9EVUFSVF9JTVJSRUcoY2hhbikpCisjZGVmaW5lIEFfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICBBX0RVQVJUX0NUUkxSRUcoUl9EVUFSVF9JU1JSRUcoY2hhbikpCisjZGVmaW5lIEFfRFVBUlRfSU5DSFJFRyhjaGFuKQkgICAgQV9EVUFSVF9DVFJMUkVHKFJfRFVBUlRfSU5DSFJFRyhjaGFuKSkKICNlbmRpZgkvKiAxMjUwICYgMTEyeCAqLwogCisjZGVmaW5lIFJfRFVBUlRfQVVYX0NUUkwJICAgIDB4MDEwCisjZGVmaW5lIFJfRFVBUlRfSVNSX0EJCSAgICAweDAyMAorI2RlZmluZSBSX0RVQVJUX0lNUl9BCQkgICAgMHgwMzAKKyNkZWZpbmUgUl9EVUFSVF9JU1JfQgkJICAgIDB4MDQwCisjZGVmaW5lIFJfRFVBUlRfSU1SX0IJCSAgICAweDA1MAorI2RlZmluZSBSX0RVQVJUX09VVF9QT1JUCSAgICAweDA2MAorI2RlZmluZSBSX0RVQVJUX09QQ1IJCSAgICAweDA3MAorI2RlZmluZSBSX0RVQVJUX0lOX1BPUlQJCSAgICAweDA4MAogCisjZGVmaW5lIFJfRFVBUlRfU0VUX09QUgkJICAgIDB4MEIwCisjZGVmaW5lIFJfRFVBUlRfQ0xFQVJfT1BSCSAgICAweDBDMAorI2RlZmluZSBSX0RVQVJUX0lOX0NITkdfQQkgICAgMHgwRDAKKyNkZWZpbmUgUl9EVUFSVF9JTl9DSE5HX0IJICAgIDB4MEUwCiAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oCmluZGV4IGU4NzA0NWUuLmNmNzRmZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaApAQCAtNzUsNyArNzUsOCBAQAogI2RlZmluZSBWX0RVQVJUX1BBUklUWV9NT0RFX0FERF9GSVhFRCBWX0RVQVJUX1BBUklUWV9NT0RFKEtfRFVBUlRfUEFSSVRZX01PREVfQUREX0ZJWEVEKQogI2RlZmluZSBWX0RVQVJUX1BBUklUWV9NT0RFX05PTkUgICAgICBWX0RVQVJUX1BBUklUWV9NT0RFKEtfRFVBUlRfUEFSSVRZX01PREVfTk9ORSkKIAotI2RlZmluZSBNX0RVQVJUX0VSUl9NT0RFICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg1KSAgICAvKiBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUgTV9EVUFSVF9UWF9JUlFfU0VMX1RYUkRZICAgIDAKKyNkZWZpbmUgTV9EVUFSVF9UWF9JUlFfU0VMX1RYRU1QVCAgIF9TQl9NQUtFTUFTSzEoNSkKIAogI2RlZmluZSBNX0RVQVJUX1JYX0lSUV9TRUxfUlhSRFkgICAgMAogI2RlZmluZSBNX0RVQVJUX1JYX0lSUV9TRUxfUlhGVUxMICAgX1NCX01BS0VNQVNLMSg2KQpAQCAtMjQ2LDEwICsyNDcsMTMgQEAKIAogI2RlZmluZSBNX0RVQVJUX0lTUl9CUktfQSAgICAgICAgICAgX1NCX01BS0VNQVNLMSgyKQogI2RlZmluZSBNX0RVQVJUX0lTUl9JTl9BICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgzKQorI2RlZmluZSBNX0RVQVJUX0lTUl9BTExfQQkgICAgX1NCX01BS0VNQVNLKDQsMCkKKwogI2RlZmluZSBNX0RVQVJUX0lTUl9UWF9CICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg0KQogI2RlZmluZSBNX0RVQVJUX0lTUl9SWF9CICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg1KQogI2RlZmluZSBNX0RVQVJUX0lTUl9CUktfQiAgICAgICAgICAgX1NCX01BS0VNQVNLMSg2KQogI2RlZmluZSBNX0RVQVJUX0lTUl9JTl9CICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg3KQorI2RlZmluZSBNX0RVQVJUX0lTUl9BTExfQgkgICAgX1NCX01BS0VNQVNLKDQsNCkKIAogLyoKICAqIERVQVJUIENoYW5uZWwgQSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChUYWJsZSAxMC0xNykKQEAgLTI2Miw2ICsyNjYsNyBAQAogI2RlZmluZSBNX0RVQVJUX0lTUl9SWCAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgxKQogI2RlZmluZSBNX0RVQVJUX0lTUl9CUksgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgyKQogI2RlZmluZSBNX0RVQVJUX0lTUl9JTiAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgzKQorI2RlZmluZSBNX0RVQVJUX0lTUl9BTEwJCSAgICBfU0JfTUFLRU1BU0soNCwwKQogI2RlZmluZSBNX0RVQVJUX0lTUl9SRVNFUlZFRCAgICAgICAgX1NCX01BS0VNQVNLKDQsNCkKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaAppbmRleCAxMWY0MjIyLi41YTg1ZDFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0CWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJCXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mYi5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ1MDNhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9fQ0FDSEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaAppbmRleCAzMTc4NTFmLi4xZTFjODI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaApAQCAtMywyMSArMywyMiBAQAogCiAvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCiAgICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KLSNkZWZpbmUgT19BUFBFTkQJMDAwMDAwMTAKLSNkZWZpbmUgT19CTEtTRUVLCTAwMDAwMTAwIC8qIEhQVVggb25seSAqLwotI2RlZmluZSBPX0NSRUFUCQkwMDAwMDQwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19FWENMCQkwMDAwMjAwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19MQVJHRUZJTEUJMDAwMDQwMDAKLSNkZWZpbmUgT19TWU5DCQkwMDEwMDAwMAotI2RlZmluZSBPX05PTkJMT0NLCTAwMjAwMDA0IC8qIEhQVVggaGFzIHNlcGFyYXRlIE5ERUxBWSAmIE5PTkJMT0NLICovCi0jZGVmaW5lIE9fTk9DVFRZCTAwNDAwMDAwIC8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0RTWU5DCQkwMTAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KLSNkZWZpbmUgT19SU1lOQwkJMDIwMDAwMDAgLyogSFBVWCBvbmx5ICovCi0jZGVmaW5lIE9fTk9BVElNRQkwNDAwMDAwMAorI2RlZmluZSBPX0FQUEVORAkwMDAwMDAwMTAKKyNkZWZpbmUgT19CTEtTRUVLCTAwMDAwMDEwMCAvKiBIUFVYIG9ubHkgKi8KKyNkZWZpbmUgT19DUkVBVAkJMDAwMDAwNDAwIC8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0VYQ0wJCTAwMDAwMjAwMCAvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19MQVJHRUZJTEUJMDAwMDA0MDAwCisjZGVmaW5lIE9fU1lOQwkJMDAwMTAwMDAwCisjZGVmaW5lIE9fTk9OQkxPQ0sJMDAwMjAwMDA0IC8qIEhQVVggaGFzIHNlcGFyYXRlIE5ERUxBWSAmIE5PTkJMT0NLICovCisjZGVmaW5lIE9fTk9DVFRZCTAwMDQwMDAwMCAvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19EU1lOQwkJMDAxMDAwMDAwIC8qIEhQVVggb25seSAqLworI2RlZmluZSBPX1JTWU5DCQkwMDIwMDAwMDAgLyogSFBVWCBvbmx5ICovCisjZGVmaW5lIE9fTk9BVElNRQkwMDQwMDAwMDAKKyNkZWZpbmUgT19DTE9FWEVDCTAxMDAwMDAwMCAvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLwogCi0jZGVmaW5lIE9fRElSRUNUT1JZCTAwMDEwMDAwIC8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgT19OT0ZPTExPVwkwMDAwMDIwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KLSNkZWZpbmUgT19JTlZJU0lCTEUJMDQwMDAwMDAgLyogaW52aXNpYmxlIEkvTywgZm9yIERNQVBJL1hEU00gKi8KKyNkZWZpbmUgT19ESVJFQ1RPUlkJMDAwMDEwMDAwIC8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgT19OT0ZPTExPVwkwMDAwMDAyMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCisjZGVmaW5lIE9fSU5WSVNJQkxFCTAwNDAwMDAwMCAvKiBpbnZpc2libGUgSS9PLCBmb3IgRE1BUEkvWERTTSAqLwogCiAjZGVmaW5lIEZfR0VUTEs2NAk4CiAjZGVmaW5lIEZfU0VUTEs2NAk5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaAppbmRleCBiZWIyYWRiLi5lODhjYWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ3RhYmxlLmgKQEAgLTMzNSwxOCArMzM1LDE0IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQUQ7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkgCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiAKLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9SRUFEOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1dSSVRFOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1dSSVRFOyByZXR1cm4gcHRlOyB9CkBAIC00NTEsMjEgKzQ0Nyw2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKCFwdGVfZGlydHkoKnB0ZXApKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KHhsYXRlX3BhYml0KF9QQUdFX0RJUlRZX0JJVCksICZwdGVfdmFsKCpwdGVwKSk7Ci0jZWxzZQotCXB0ZV90IHB0ZSA9ICpwdGVwOwotCWlmICghcHRlX2RpcnR5KHB0ZSkpCi0JCXJldHVybiAwOwotCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkciwgcHRlcCwgcHRlX21rY2xlYW4ocHRlKSk7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQogZXh0ZXJuIHNwaW5sb2NrX3QgcGFfZGJpdF9sb2NrOwogCiBzdHJ1Y3QgbW1fc3RydWN0OwpAQCAtNTMzLDcgKzUxNCw2IEBACiAjZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaAppbmRleCA2NDJiZTYyLi41MzUwNzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oCkBAIC0zNCw1ICszNCw5IEBACiBleHRlcm4gc3RydWN0IHBwYzY0X2NhY2hlcyBwcGM2NF9jYWNoZXM7CiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAmJiAhIF9fQVNTRU1CTFlfXyAqLwogCisjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQorI2RlZmluZSBfX3JlYWRfbW9zdGx5IF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5yZWFkX21vc3RseSIpKSkKKyNlbmRpZgorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaAppbmRleCBhYWNhYWJkLi42NGFiMWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmgKQEAgLTMzLDggKzMzLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CQljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAkJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKaW5kZXggODJkNTk1YS4uM2RjOGUyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaApAQCAtMTExLDcgKzExMSw3IEBACiAvKiBDUFUga2VybmVsIGZlYXR1cmVzICovCiAKIC8qIFJldGFpbiB0aGUgMzJiIGRlZmluaXRpb25zIGFsbCB1c2UgYm90dG9tIGhhbGYgb2Ygd29yZCAqLwotI2RlZmluZSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQorI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKICNkZWZpbmUgQ1BVX0ZUUl9MMkNSCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMikKICNkZWZpbmUgQ1BVX0ZUUl9TUEVDNzQ1MAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNCkKICNkZWZpbmUgQ1BVX0ZUUl9BTFRJVkVDCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKQEAgLTEzNSw2ICsxMzUsNyBAQAogI2RlZmluZSBDUFVfRlRSX1BQQ19MRQkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAyMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUkVBTF9MRQkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDA0MDAwMDApCiAjZGVmaW5lIENQVV9GVFJfRlBVX1VOQVZBSUxBQkxFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwODAwMDAwKQorI2RlZmluZSBDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMTAwMDAwMCkKIAogLyoKICAqIEFkZCB0aGUgNjQtYml0IHByb2Nlc3NvciB1bmlxdWUgZmVhdHVyZXMgaW4gdGhlIHRvcCBoYWxmIG9mIHRoZSB3b3JkOwpAQCAtMTU0LDcgKzE1NSw2IEBACiAjZGVmaW5lIENQVV9GVFJfTU1DUkEJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMDQwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfQ1RSTAkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwODAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9TTVQJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMTAwMDAwMDAwMDApCi0jZGVmaW5lIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMjAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfTE9DS0xFU1NfVExCSUUJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDA0MDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFCQlMT05HX0FTTV9DT05TVCgweDAwMDAxMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUEFVU0VfWkVSTwkJTE9OR19BU01fQ09OU1QoMHgwMDAwMjAwMDAwMDAwMDAwKQpAQCAtMjA2LDE2NCArMjA2LDE0OSBAQAogCQkgICAgICFkZWZpbmVkKENPTkZJR19QT1dFUjMpICYmICFkZWZpbmVkKENPTkZJR19QT1dFUjQpICYmIFwKIAkJICAgICAhZGVmaW5lZChDT05GSUdfQk9PS0UpKQogCi0jZGVmaW5lIENQVV9GVFJTX1BQQzYwMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSXzYwMSB8IENQVV9GVFJfSFBURV9UQUJMRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNjAzCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BQQzYwMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSXzYwMSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKKwlDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkKKyNkZWZpbmUgQ1BVX0ZUUlNfNjAzCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNjA0CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzYwNAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl82MDRfUEVSRl9NT04gfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0MAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MENMCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBGWDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IENQVV9GVFJfTk9fRFBNIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEZYMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX05PX0RQTSB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBGWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEdYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwMF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NTBDTAkoQ1BVX0ZUUlNfNzUwIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTKQorI2RlZmluZSBDUFVfRlRSU183NTBGWDEJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX05PX0RQTSkKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgyCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX05PX0RQTSkKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBcCisJCUNQVV9GVFJfSEFTX0hJR0hfQkFUUykKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwR1gJKENQVV9GVFJTXzc1MEZYKQorI2RlZmluZSBDUFVfRlRSU183NDAwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MDAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTBfMjAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDUwXzIxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTBfMjEJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0wzX0RJU0FCTEVfTkFQIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMwkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDUwXzIzCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTVfMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDU1XzEJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0wzQ1IgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDU1XzIwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTVfMjAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0wzX0RJU0FCTEVfTkFQIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDU1CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N18xMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ3XzEwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX05PX0JUSUMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0NwkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ3CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N0EJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N0EJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDQ4CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NDgJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU184MlhYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzgyWFgJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIpCi0jZGVmaW5lIENQVV9GVFJTX0cyX0xFCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfRzJfTEUJKENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTKQotI2RlZmluZSBDUFVfRlRSU19FMzAwCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfRTMwMAkoQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfQ09NTU9OKQotI2RlZmluZSBDUFVfRlRSU19FMzAwQzIJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAorI2RlZmluZSBDUFVfRlRSU19FMzAwQzIJKENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfRlBVX1VOQVZBSUxBQkxFKQotI2RlZmluZSBDUFVfRlRSU19DTEFTU0lDMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfQ0xBU1NJQzMyCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUpCi0jZGVmaW5lIENQVV9GVFJTXzhYWAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCKQotI2RlZmluZSBDUFVfRlRSU180MFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTXzQ0WAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTIwMAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTUwMAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTUwMF8yCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTXzhYWAkoQ1BVX0ZUUl9VU0VfVEIpCisjZGVmaW5lIENQVV9GVFJTXzQwWAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKKyNkZWZpbmUgQ1BVX0ZUUlNfNDRYCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQorI2RlZmluZSBDUFVfRlRSU19FMjAwCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOIHwgXAorCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkKKyNkZWZpbmUgQ1BVX0ZUUlNfRTUwMAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKKyNkZWZpbmUgQ1BVX0ZUUlNfRTUwMF8yCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9CSUdfUEhZUyB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQogI2RlZmluZSBDUFVfRlRSU19HRU5FUklDXzMyCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQogCiAvKiA2NC1iaXQgQ1BVcyAqLwotI2RlZmluZSBDUFVfRlRSU19QT1dFUjMJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVIzCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTX1JTNjQJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUlM2NAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCkKLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI0CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSNAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSkKLSNkZWZpbmUgQ1BVX0ZUUlNfUFBDOTcwCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BQQzk3MAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX01NQ1JBKQotI2RlZmluZSBDUFVfRlRSU19QT1dFUjUJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI1CShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSKQotI2RlZmluZSBDUFVfRlRSU19QT1dFUjYgKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI2IChDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSB8IFwKIAkgICAgQ1BVX0ZUUl9EU0NSKQotI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX1BBVVNFX1pFUk8gfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBDUFVfRlRSX0NFTExfVEJfQlVHKQotI2RlZmluZSBDUFVfRlRSU19QQTZUIChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BBNlQgKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFIHwgXAogCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUpCi0jZGVmaW5lIENQVV9GVFJTX0NPTVBBVElCTEUJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfQ09NUEFUSUJMRQkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMikKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTFhZjhkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mYi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCBvZmYgPj4gUEFHRV9TSElGVCwKKwkJCQkJCSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJCQkgdm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCmluZGV4IGFmYTcwMGQuLjM0MTQ2ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaApAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBmZF9mcmVlX2lycSgpICAgICAgICAgICBmcmVlX2lycShGTE9QUFlfSVJRLCBOVUxMKTsKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CS8qIGZvciBwcGM2NF9pc2FicmlkZ2VfZGV2ICovCisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4JLyogZm9yIGlzYV9icmlkZ2VfcGNpZGV2ICovCiAKICNkZWZpbmUgZmRfZG1hX3NldHVwKGFkZHIsc2l6ZSxtb2RlLGlvKSBmZF9vcHMtPl9kbWFfc2V0dXAoYWRkcixzaXplLG1vZGUsaW8pCiAKQEAgLTEzOSwxMiArMTM5LDEyIEBACiAJaWYgKGJ1c19hZGRyIAogCSAgICAmJiAoYWRkciAhPSBwcmV2X2FkZHIgfHwgc2l6ZSAhPSBwcmV2X3NpemUgfHwgZGlyICE9IHByZXZfZGlyKSkgewogCQkvKiBkaWZmZXJlbnQgZnJvbSBsYXN0IHRpbWUgLS0gdW5tYXAgcHJldiAqLwotCQlwY2lfdW5tYXBfc2luZ2xlKHBwYzY0X2lzYWJyaWRnZV9kZXYsIGJ1c19hZGRyLCBwcmV2X3NpemUsIHByZXZfZGlyKTsKKwkJcGNpX3VubWFwX3NpbmdsZShpc2FfYnJpZGdlX3BjaWRldiwgYnVzX2FkZHIsIHByZXZfc2l6ZSwgcHJldl9kaXIpOwogCQlidXNfYWRkciA9IDA7CiAJfQogCiAJaWYgKCFidXNfYWRkcikJLyogbmVlZCB0byBtYXAgaXQgKi8KLQkJYnVzX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwcGM2NF9pc2FicmlkZ2VfZGV2LCBhZGRyLCBzaXplLCBkaXIpOworCQlidXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGlzYV9icmlkZ2VfcGNpZGV2LCBhZGRyLCBzaXplLCBkaXIpOwogCiAJLyogcmVtZW1iZXIgdGhpcyBvbmUgYXMgcHJldiAqLwogCXByZXZfYWRkciA9IGFkZHI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaAppbmRleCA2MmVmZDlkLi5iZjZjZDdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKQEAgLTIwNiw2ICsyMDYsNyBAQAogI2RlZmluZSBIX0ZSRUVfTE9HSUNBTF9MQU5fQlVGRkVSIDB4MUQ0CiAjZGVmaW5lIEhfUVVFUllfSU5UX1NUQVRFICAgICAgIDB4MUU0CiAjZGVmaW5lIEhfUE9MTF9QRU5ESU5HCQkweDFEOAorI2RlZmluZSBIX0lMTEFOX0FUVFJJQlVURVMJMHgyNDQKICNkZWZpbmUgSF9KT0lOCQkJMHgyOTgKICNkZWZpbmUgSF9WQVNJX1NUQVRFICAgICAgICAgICAgMHgyQTQKICNkZWZpbmUgSF9FTkFCTEVfQ1JRCQkweDJCMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCmluZGV4IDM1MGM5YmQuLmJiOGQ5NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKQEAgLTYwNyw5ICs2MDcsOSBAQAogICoKICAqICogaW91bm1hcCB1bmRvZXMgc3VjaCBhIG1hcHBpbmcgYW5kIGNhbiBiZSBob29rZWQKICAqCi0gKiAqIF9faW9yZW1hcF9leHBsaWNpdCAoYW5kIHRoZSBwZW5kaW5nIF9faW91bm1hcF9leHBsaWNpdCkgYXJlIGxvdyBsZXZlbAotICogICBmdW5jdGlvbnMgdG8gY3JlYXRlIGhhbmQtbWFkZSBtYXBwaW5ncyBmb3IgdXNlIG9ubHkgYnkgdGhlIFBDSSBjb2RlCi0gKiAgIGFuZCBjYW5ub3QgY3VycmVudGx5IGJlIGhvb2tlZC4KKyAqICogX19pb3JlbWFwX2F0IChhbmQgdGhlIHBlbmRpbmcgX19pb3VubWFwX2F0KSBhcmUgbG93IGxldmVsIGZ1bmN0aW9ucyB0bworICogICBjcmVhdGUgaGFuZC1tYWRlIG1hcHBpbmdzIGZvciB1c2Ugb25seSBieSB0aGUgUENJIGNvZGUgYW5kIGNhbm5vdAorICogICBjdXJyZW50bHkgYmUgaG9va2VkLiBNdXN0IGJlIHBhZ2UgYWxpZ25lZC4KICAqCiAgKiAqIF9faW9yZW1hcCBpcyB0aGUgbG93IGxldmVsIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgaW9yZW1hcCBhbmQKICAqICAgaW9yZW1hcF9mbGFncyBhbmQgY2Fubm90IGJlIGhvb2tlZCAoYnV0IGNhbiBiZSB1c2VkIGJ5IGEgaG9vayBvbiBvbmUKQEAgLTYyOSwxOSArNjI5LDkgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiB2b2lkIF9faW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwogCi1leHRlcm4gaW50IF9faW9yZW1hcF9leHBsaWNpdChwaHlzX2FkZHJfdCBwX2FkZHIsIHVuc2lnbmVkIGxvbmcgdl9hZGRyLAotCQkgICAgIAkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCBfX2lvdW5tYXBfZXhwbGljaXQodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzdGFydCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiB2b2lkIF9faW9tZW0gKiByZXNlcnZlX3BoYl9pb3NwYWNlKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLS8qIFRob3NlIGFyZSBtb3JlIDMyIGJpdHMgb25seSBmdW5jdGlvbnMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGlvcGEodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1tX3B0b3YodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwotZXh0ZXJuIHZvaWQgaW9fYmxvY2tfbWFwcGluZyh1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpOwotCitleHRlcm4gdm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2F0KHBoeXNfYWRkcl90IHBhLCB2b2lkICplYSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgX19pb3VubWFwX2F0KHZvaWQgKmVhLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiAvKgogICogV2hlbiBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIHNldCwgd2UgdXNlIHRoZSBnZW5lcmljIGlvbWFwIGltcGxlbWVudGF0aW9uCkBAIC02NTEsOCArNjQxLDggQEAKICAqLwogI2RlZmluZSBIQVZFX0FSQ0hfUElPX1NJWkUJCTEKICNkZWZpbmUgUElPX09GRlNFVAkJCTB4MDAwMDAwMDBVTAotI2RlZmluZSBQSU9fTUFTSwkJCTB4M2ZmZmZmZmZVTAotI2RlZmluZSBQSU9fUkVTRVJWRUQJCQkweDQwMDAwMDAwVUwKKyNkZWZpbmUgUElPX01BU0sJCQkoRlVMTF9JT19TSVpFIC0gMSkKKyNkZWZpbmUgUElPX1JFU0VSVkVECQkJKEZVTExfSU9fU0laRSkKIAogI2RlZmluZSBtbWlvX3JlYWQxNmJlKGFkZHIpCQlyZWFkd19iZShhZGRyKQogI2RlZmluZSBtbWlvX3JlYWQzMmJlKGFkZHIpCQlyZWFkbF9iZShhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKaW5kZXggMDVkZDVhMy4uMDQ4NWM1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCkBAIC0yMjMsNiArMjIzLDE1IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGlycV9maW5kX21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0LAogCQkJCSAgICAgaXJxX2h3X251bWJlcl90IGh3aXJxKTsKIAorLyoqCisgKiBpcnFfY3JlYXRlX2RpcmVjdF9tYXBwaW5nIC0gQWxsb2NhdGUgYSB2aXJxIGZvciBkaXJlY3QgbWFwcGluZworICogQGhvc3Q6IGhvc3QgdG8gYWxsb2NhdGUgdGhlIHZpcnEgZm9yIG9yIE5VTEwgZm9yIGRlZmF1bHQgaG9zdAorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBpcnEgY29udHJvbGxlcnMgd2hpY2ggY2FuIGNob29zZSB0aGUgaGFyZHdhcmUKKyAqIGludGVycnVwdCBudW1iZXJzIHRoZXkgZ2VuZXJhdGUuIEluIHN1Y2ggYSBjYXNlIGl0J3Mgc2ltcGxlc3QgdG8gdXNlCisgKiB0aGUgbGludXggdmlycSBhcyB0aGUgaGFyZHdhcmUgaW50ZXJydXB0IG51bWJlci4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX2RpcmVjdF9tYXBwaW5nKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCk7CiAKIC8qKgogICogaXJxX3JhZGl4X3Jldm1hcCAtIEZpbmQgYSBsaW51eCB2aXJxIGZyb20gYSBodyBpcnEgbnVtYmVyLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaAppbmRleCBiMGU0MGZmLi45NTM3ZmRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaApAQCAtNjUsMTAgKzY1LDEwIEBACiAJCX0gZWxzZSBpZiAobmFtZVswXSAhPSAnLicpCQkJCVwKIAkJCWFkZHIgPSAqKGtwcm9iZV9vcGNvZGVfdCAqKilhZGRyOwkJXAogCX0gZWxzZSB7CQkJCQkJCVwKLQkJY2hhciBkb3RfbmFtZVtLU1lNX05BTUVfTEVOKzFdOwkJCQlcCisJCWNoYXIgZG90X25hbWVbS1NZTV9OQU1FX0xFTl07CQkJCVwKIAkJZG90X25hbWVbMF0gPSAnLic7CQkJCQlcCiAJCWRvdF9uYW1lWzFdID0gJ1wwJzsJCQkJCVwKLQkJc3RybmNhdChkb3RfbmFtZSwgbmFtZSwgS1NZTV9OQU1FX0xFTik7CQkJXAorCQlzdHJuY2F0KGRvdF9uYW1lLCBuYW1lLCBLU1lNX05BTUVfTEVOIC0gMik7CQlcCiAJCWFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopa2FsbHN5bXNfbG9va3VwX25hbWUoZG90X25hbWUpOyBcCiAJfQkJCQkJCQkJXAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKaW5kZXggODIxZWEwYy4uNTY3ZWQ5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCkBAIC05OCw3ICs5OCw3IEBACiAJdTY0CXNhdmVkX2dwcjU7CQkvLyBTYXZlZCBHUFI1ICAgICAgICAgICAgICAgICAgIHgzMC14MzcKIAogCXU4CXJlc2VydmVkNDsJCS8vIFJlc2VydmVkCQkJeDM4LXgzOAotCXU4CWNwdWN0bHNfdGFza19hdHRyczsJLy8gVGFzayBhdHRyaWJ1dGVzIGZvciBjcHVjdGxzICB4MzkteDM5CisJdTgJZG9uYXRlX2RlZGljYXRlZF9jcHU7CS8vIERvbmF0ZSBkZWRpY2F0ZWQgQ1BVIGN5Y2xlcyAgeDM5LXgzOQogCXU4CWZwcmVnc19pbl91c2U7CQkvLyBGUCByZWdzIGluIHVzZSAgICAgICAgICAgICAgIHgzQS14M0EKIAl1OAlwbWNyZWdzX2luX3VzZTsJCS8vIFBNQyByZWdzIGluIHVzZSAgICAgICAgICAgICAgeDNCLXgzQgogCXZvbGF0aWxlIHUzMiBzYXZlZF9kZWNyOwkvLyBTYXZlZCBEZWNyIFZhbHVlICAgICAgICAgICAgIHgzQy14M0YKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKaW5kZXggZjczM2JlZS4uODE3MTNhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKQEAgLTIzOCw2ICsyMzgsNyBAQAogTFYxX0NBTEwoY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAsICAgICAgICAgICAgICAgICAgICAzLCAwLCAgMTEgKQogTFYxX0NBTEwoY29ubmVjdF9pcnFfcGx1Z19leHQsICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAgMTIgKQogTFYxX0NBTEwocmVsZWFzZV9tZW1vcnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAgMTMgKQorTFYxX0NBTEwocHV0X2lvcHRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAgMTUgKQogTFYxX0NBTEwoZGlzY29ubmVjdF9pcnFfcGx1Z19leHQsICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAgMTcgKQogTFYxX0NBTEwoY29uc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgICAgICAgICAgICAwLCAxLCAgMTggKQogTFYxX0NBTEwoZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0LCAgICAgICAgICAgICAgICAgICAxLCAwLCAgMTkgKQpAQCAtMjY4LDYgKzI2OSw4IEBACiBMVjFfQ0FMTChyZWFkX2h0YWJfZW50cmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDUsICA5NSApCiBMVjFfQ0FMTChzZXRfZGFiciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsICA5NiApCiBMVjFfQ0FMTChnZXRfdG90YWxfZXhlY3V0aW9uX3RpbWUsICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIDEwMyApCitMVjFfQ0FMTChhbGxvY2F0ZV9pb19zZWdtZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDExNiApCitMVjFfQ0FMTChyZWxlYXNlX2lvX3NlZ21lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsIDExNyApCiBMVjFfQ0FMTChjb25zdHJ1Y3RfaW9faXJxX291dGxldCwgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEyMCApCiBMVjFfQ0FMTChkZXN0cnVjdF9pb19pcnFfb3V0bGV0LCAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEyMSApCiBMVjFfQ0FMTChtYXBfaHRhYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEyMiApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCmluZGV4IDZjZjFhODMuLjcxYzZlN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCkBAIC0yMTgsNyArMjE4LDcgQEAKIAlpbnQgICgqcGNpYmlvc19lbmFibGVfZGV2aWNlX2hvb2spKHN0cnVjdCBwY2lfZGV2ICosIGludCBpbml0aWFsKTsKIAogCS8qIENhbGxlZCBpbiBpbmRpcmVjdF8qIHRvIGF2b2lkIHRvdWNoaW5nIGRldmljZXMgKi8KLQlpbnQgKCpwY2lfZXhjbHVkZV9kZXZpY2UpKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOworCWludCAoKnBjaV9leGNsdWRlX2RldmljZSkoc3RydWN0IHBjaV9jb250cm9sbGVyICosIHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOwogCiAJLyogQ2FsbGVkIGF0IHRoZW4gdmVyeSBlbmQgb2YgcGNpYmlvc19pbml0KCkgKi8KIAl2b2lkICgqcGNpYmlvc19hZnRlcl9pbml0KSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LTh4eC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyYmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LTh4eC5oCkBAIC0wLDAgKzEsMTQ3IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfOFhYX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfOFhYX0hfCisvKgorICogUFBDOHh4IHN1cHBvcnQKKyAqLworCisvKiBDb250cm9sL3N0YXR1cyByZWdpc3RlcnMgZm9yIHRoZSBNUEM4eHguCisgKiBBIHdyaXRlIG9wZXJhdGlvbiB0byB0aGVzZSByZWdpc3RlcnMgY2F1c2VzIHNlcmlhbGl6ZWQgYWNjZXNzLgorICogRHVyaW5nIHNvZnR3YXJlIHRhYmxld2FsaywgdGhlIHJlZ2lzdGVycyB1c2VkIHBlcmZvcm0gbWFzay9zaGlmdC1hZGQKKyAqIG9wZXJhdGlvbnMgd2hlbiB3cml0dGVuL3JlYWQuICBBIFRMQiBlbnRyeSBpcyBjcmVhdGVkIHdoZW4gdGhlIE14X1JQTgorICogaXMgd3JpdHRlbiwgYW5kIHRoZSBjb250ZW50cyBvZiBzZXZlcmFsIHJlZ2lzdGVycyBhcmUgdXNlZCB0bworICogY3JlYXRlIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBTUFJOX01JX0NUUgk3ODQJLyogSW5zdHJ1Y3Rpb24gVExCIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlfR1BNCQkweDgwMDAwMDAwCS8qIFNldCBkb21haW4gbWFuYWdlciBtb2RlICovCisjZGVmaW5lIE1JX1BQTQkJMHg0MDAwMDAwMAkvKiBTZXQgc3VicGFnZSBwcm90ZWN0aW9uICovCisjZGVmaW5lIE1JX0NJREVGCTB4MjAwMDAwMDAJLyogU2V0IGNhY2hlIGluaGliaXQgd2hlbiBNTVUgZGlzICovCisjZGVmaW5lIE1JX1JTVjRJCTB4MDgwMDAwMDAJLyogUmVzZXJ2ZSA0IFRMQiBlbnRyaWVzICovCisjZGVmaW5lIE1JX1BQQ1MJCTB4MDIwMDAwMDAJLyogVXNlIE1JX1JQTiBwcm9iL3ByaXYgc3RhdGUgKi8KKyNkZWZpbmUgTUlfSURYTUFTSwkweDAwMDAxZjAwCS8qIFRMQiBpbmRleCB0byBiZSBsb2FkZWQgKi8KKyNkZWZpbmUgTUlfUkVTRVRWQUwJMHgwMDAwMDAwMAkvKiBWYWx1ZSBvZiByZWdpc3RlciBhdCByZXNldCAqLworCisvKiBUaGVzZSBhcmUgdGhlIEtzIGFuZCBLcCBmcm9tIHRoZSBQb3dlclBDIGJvb2tzLiAgRm9yIHByb3BlciBvcGVyYXRpb24sCisgKiBLcyA9IDAsIEtwID0gMS4KKyAqLworI2RlZmluZSBTUFJOX01JX0FQCTc4NgorI2RlZmluZSBNSV9LcwkJMHg4MDAwMDAwMAkvKiBTaG91bGQgbm90IGJlIHNldCAqLworI2RlZmluZSBNSV9LcAkJMHg0MDAwMDAwMAkvKiBTaG91bGQgYWx3YXlzIGJlIHNldCAqLworCisvKiBUaGUgZWZmZWN0aXZlIHBhZ2UgbnVtYmVyIHJlZ2lzdGVyLiAgV2hlbiByZWFkLCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBsYXN0IGluc3RydWN0aW9uIFRMQiBtaXNzLiAgV2hlbiBNSV9SUE4gaXMgd3JpdHRlbiwgYml0cyBpbgorICogdGhpcyByZWdpc3RlciBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIFRMQiBlbnRyeS4KKyAqLworI2RlZmluZSBTUFJOX01JX0VQTgk3ODcKKyNkZWZpbmUgTUlfRVBOTUFTSwkweGZmZmZmMDAwCS8qIEVmZmVjdGl2ZSBwYWdlIG51bWJlciBmb3IgZW50cnkgKi8KKyNkZWZpbmUgTUlfRVZBTElECTB4MDAwMDAyMDAJLyogRW50cnkgaXMgdmFsaWQgKi8KKyNkZWZpbmUgTUlfQVNJRE1BU0sJMHgwMDAwMDAwZgkvKiBBU0lEIG1hdGNoIHZhbHVlICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBBICJsZXZlbCAxIiBvciAic2VnbWVudCIgb3Igd2hhdGV2ZXIgeW91IHdhbnQgdG8gY2FsbCBpdCByZWdpc3Rlci4KKyAqIEZvciB0aGUgaW5zdHJ1Y3Rpb24gVExCLCBpdCBjb250YWlucyBiaXRzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIHRoZQorICogVExCIGVudHJ5IHdoZW4gdGhlIE1JX1JQTiBpcyB3cml0dGVuLgorICovCisjZGVmaW5lIFNQUk5fTUlfVFdDCTc4OQorI2RlZmluZSBNSV9BUEcJCTB4MDAwMDAxZTAJLyogQWNjZXNzIHByb3RlY3Rpb24gZ3JvdXAgKDApICovCisjZGVmaW5lIE1JX0dVQVJERUQJMHgwMDAwMDAxMAkvKiBHdWFyZGVkIHN0b3JhZ2UgKi8KKyNkZWZpbmUgTUlfUFNNQVNLCTB4MDAwMDAwMGMJLyogTWFzayBvZiBwYWdlIHNpemUgYml0cyAqLworI2RlZmluZSBNSV9QUzhNRUcJMHgwMDAwMDAwYwkvKiA4TSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTUlfUFM1MTJLCTB4MDAwMDAwMDQJLyogNTEySyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTUlfUFM0S18xNksJMHgwMDAwMDAwMAkvKiA0SyBvciAxNksgcGFnZSBzaXplICovCisjZGVmaW5lIE1JX1NWQUxJRAkweDAwMDAwMDAxCS8qIFNlZ21lbnQgZW50cnkgaXMgdmFsaWQgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKy8qIFJlYWwgcGFnZSBudW1iZXIuICBEZWZpbmVkIGJ5IHRoZSBwdGUuICBXcml0aW5nIHRoaXMgcmVnaXN0ZXIKKyAqIGNhdXNlcyBhIFRMQiBlbnRyeSB0byBiZSBjcmVhdGVkIGZvciB0aGUgaW5zdHJ1Y3Rpb24gVExCLCB1c2luZworICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNSV9FUE4sIGFuZCBNSV9UV0MgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFNQUk5fTUlfUlBOCTc5MAorCisvKiBEZWZpbmUgYW4gUlBOIHZhbHVlIGZvciBtYXBwaW5nIGtlcm5lbCBtZW1vcnkgdG8gbGFyZ2UgdmlydHVhbAorICogcGFnZXMgZm9yIGJvb3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGhhcyByZWFsIHBhZ2UgbnVtYmVyIG9mIDAsCisgKiBsYXJnZSBwYWdlIHNpemUsIHNoYXJlZCBwYWdlLCBjYWNoZSBlbmFibGVkLCBhbmQgdmFsaWQuCisgKiBBbHNvIG1hcmsgYWxsIHN1YnBhZ2VzIHZhbGlkIGFuZCB3cml0ZSBhY2Nlc3MuCisgKi8KKyNkZWZpbmUgTUlfQk9PVElOSVQJMHgwMDAwMDFmZAorCisjZGVmaW5lIFNQUk5fTURfQ1RSCTc5MgkvKiBEYXRhIFRMQiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1EX0dQTQkJMHg4MDAwMDAwMAkvKiBTZXQgZG9tYWluIG1hbmFnZXIgbW9kZSAqLworI2RlZmluZSBNRF9QUE0JCTB4NDAwMDAwMDAJLyogU2V0IHN1YnBhZ2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSBNRF9DSURFRgkweDIwMDAwMDAwCS8qIFNldCBjYWNoZSBpbmhpYml0IHdoZW4gTU1VIGRpcyAqLworI2RlZmluZSBNRF9XVERFRgkweDEwMDAwMDAwCS8qIFNldCB3cml0ZXRocm91Z2ggd2hlbiBNTVUgZGlzICovCisjZGVmaW5lIE1EX1JTVjRJCTB4MDgwMDAwMDAJLyogUmVzZXJ2ZSA0IFRMQiBlbnRyaWVzICovCisjZGVmaW5lIE1EX1RXQU0JCTB4MDQwMDAwMDAJLyogVXNlIDRLIHBhZ2UgaGFyZHdhcmUgYXNzaXN0ICovCisjZGVmaW5lIE1EX1BQQ1MJCTB4MDIwMDAwMDAJLyogVXNlIE1JX1JQTiBwcm9iL3ByaXYgc3RhdGUgKi8KKyNkZWZpbmUgTURfSURYTUFTSwkweDAwMDAxZjAwCS8qIFRMQiBpbmRleCB0byBiZSBsb2FkZWQgKi8KKyNkZWZpbmUgTURfUkVTRVRWQUwJMHgwNDAwMDAwMAkvKiBWYWx1ZSBvZiByZWdpc3RlciBhdCByZXNldCAqLworCisjZGVmaW5lIFNQUk5fTV9DQVNJRAk3OTMJLyogQWRkcmVzcyBzcGFjZSBJRCAoY29udGV4dCkgdG8gbWF0Y2ggKi8KKyNkZWZpbmUgTUNfQVNJRE1BU0sJMHgwMDAwMDAwZgkvKiBCaXRzIHVzZWQgZm9yIEFTSUQgdmFsdWUgKi8KKworCisvKiBUaGVzZSBhcmUgdGhlIEtzIGFuZCBLcCBmcm9tIHRoZSBQb3dlclBDIGJvb2tzLiAgRm9yIHByb3BlciBvcGVyYXRpb24sCisgKiBLcyA9IDAsIEtwID0gMS4KKyAqLworI2RlZmluZSBTUFJOX01EX0FQCTc5NAorI2RlZmluZSBNRF9LcwkJMHg4MDAwMDAwMAkvKiBTaG91bGQgbm90IGJlIHNldCAqLworI2RlZmluZSBNRF9LcAkJMHg0MDAwMDAwMAkvKiBTaG91bGQgYWx3YXlzIGJlIHNldCAqLworCisvKiBUaGUgZWZmZWN0aXZlIHBhZ2UgbnVtYmVyIHJlZ2lzdGVyLiAgV2hlbiByZWFkLCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KKyAqIGFib3V0IHRoZSBsYXN0IGluc3RydWN0aW9uIFRMQiBtaXNzLiAgV2hlbiBNRF9SUE4gaXMgd3JpdHRlbiwgYml0cyBpbgorICogdGhpcyByZWdpc3RlciBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIFRMQiBlbnRyeS4KKyAqLworI2RlZmluZSBTUFJOX01EX0VQTgk3OTUKKyNkZWZpbmUgTURfRVBOTUFTSwkweGZmZmZmMDAwCS8qIEVmZmVjdGl2ZSBwYWdlIG51bWJlciBmb3IgZW50cnkgKi8KKyNkZWZpbmUgTURfRVZBTElECTB4MDAwMDAyMDAJLyogRW50cnkgaXMgdmFsaWQgKi8KKyNkZWZpbmUgTURfQVNJRE1BU0sJMHgwMDAwMDAwZgkvKiBBU0lEIG1hdGNoIHZhbHVlICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBUaGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBsZXZlbCBwYWdlIHRhYmxlLgorICogRHVyaW5nIGEgc29mdHdhcmUgdGFibGV3YWxrLCByZWFkaW5nIHRoaXMgcmVnaXN0ZXIgcHJvdmlkZXMgdGhlIGFkZHJlc3MKKyAqIG9mIHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggTURfRVBOLgorICovCisjZGVmaW5lIFNQUk5fTV9UV0IJNzk2CisjZGVmaW5lCU1fTDFUQgkJMHhmZmZmZjAwMAkvKiBMZXZlbCAxIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBNX0wxSU5EWAkweDAwMDAwZmZjCS8qIExldmVsIDEgaW5kZXgsIHdoZW4gcmVhZCAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogQSAibGV2ZWwgMSIgb3IgInNlZ21lbnQiIG9yIHdoYXRldmVyIHlvdSB3YW50IHRvIGNhbGwgaXQgcmVnaXN0ZXIuCisgKiBGb3IgdGhlIGRhdGEgVExCLCBpdCBjb250YWlucyBiaXRzIHRoYXQgZ2V0IGxvYWRlZCBpbnRvIHRoZSBUTEIgZW50cnkKKyAqIHdoZW4gdGhlIE1EX1JQTiBpcyB3cml0dGVuLiAgSXQgaXMgYWxzbyBwcm92aWRlcyB0aGUgaGFyZHdhcmUgYXNzaXN0CisgKiBmb3IgZmluZGluZyB0aGUgUFRFIGFkZHJlc3MgZHVyaW5nIHNvZnR3YXJlIHRhYmxld2Fsay4KKyAqLworI2RlZmluZSBTUFJOX01EX1RXQwk3OTcKKyNkZWZpbmUgTURfTDJUQgkJMHhmZmZmZjAwMAkvKiBMZXZlbCAyIHRhYmxlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBNRF9MMklORFgJMHhmZmZmZmUwMAkvKiBMZXZlbCAyIGluZGV4ICgqcHRlKSwgd2hlbiByZWFkICovCisjZGVmaW5lIE1EX0FQRwkJMHgwMDAwMDFlMAkvKiBBY2Nlc3MgcHJvdGVjdGlvbiBncm91cCAoMCkgKi8KKyNkZWZpbmUgTURfR1VBUkRFRAkweDAwMDAwMDEwCS8qIEd1YXJkZWQgc3RvcmFnZSAqLworI2RlZmluZSBNRF9QU01BU0sJMHgwMDAwMDAwYwkvKiBNYXNrIG9mIHBhZ2Ugc2l6ZSBiaXRzICovCisjZGVmaW5lIE1EX1BTOE1FRwkweDAwMDAwMDBjCS8qIDhNIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNRF9QUzUxMksJMHgwMDAwMDAwNAkvKiA1MTJLIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNRF9QUzRLXzE2SwkweDAwMDAwMDAwCS8qIDRLIG9yIDE2SyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTURfV1QJCTB4MDAwMDAwMDIJLyogVXNlIHdyaXRldGhyb3VnaCBwYWdlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBNRF9TVkFMSUQJMHgwMDAwMDAwMQkvKiBTZWdtZW50IGVudHJ5IGlzIHZhbGlkICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisKKy8qIFJlYWwgcGFnZSBudW1iZXIuICBEZWZpbmVkIGJ5IHRoZSBwdGUuICBXcml0aW5nIHRoaXMgcmVnaXN0ZXIKKyAqIGNhdXNlcyBhIFRMQiBlbnRyeSB0byBiZSBjcmVhdGVkIGZvciB0aGUgZGF0YSBUTEIsIHVzaW5nCisgKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIE1EX0VQTiwgYW5kIE1EX1RXQyByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9SUE4JNzk4CisKKy8qIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSByZWdpc3RlciB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gc2F2ZQorICogYSBwcm9jZXNzb3Igd29ya2luZyByZWdpc3RlciBkdXJpbmcgYSB0YWJsZXdhbGsuCisgKi8KKyNkZWZpbmUgU1BSTl9NX1RXCTc5OQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKK30gbW1fY29udGV4dF90OworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NTVVfOFhYX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1mc2wtYm9va2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWZzbC1ib29rZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTgwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1mc2wtYm9va2UuaApAQCAtMCwwICsxLDg4IEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfRlNMX0JPT0tFX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfRlNMX0JPT0tFX0hfCisvKgorICogRnJlZXNjYWxlIEJvb2stRSBNTVUgc3VwcG9ydAorICovCisKKy8qIEJvb2stRSBkZWZpbmVkIHBhZ2Ugc2l6ZXMgKi8KKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFLCQkwCisjZGVmaW5lIEJPT0tFX1BBR0VTWl80SwkJMQorI2RlZmluZSBCT09LRV9QQUdFU1pfMTZLCTIKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzY0SwkzCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8yNTZLCTQKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFNCQk1CisjZGVmaW5lIEJPT0tFX1BBR0VTWl80TQkJNgorI2RlZmluZSBCT09LRV9QQUdFU1pfMTZNCTcKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzY0TQk4CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8yNTZNCTkKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFHQgkxMAorI2RlZmluZSBCT09LRV9QQUdFU1pfNEdCCTExCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xNkdCCTEyCisjZGVmaW5lIEJPT0tFX1BBR0VTWl82NEdCCTEzCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8yNTZHQgkxNAorI2RlZmluZSBCT09LRV9QQUdFU1pfMVRCCTE1CisKKyNkZWZpbmUgTUFTMF9UTEJTRUwoeCkJKCh4IDw8IDI4KSAmIDB4MzAwMDAwMDApCisjZGVmaW5lIE1BUzBfRVNFTCh4KQkoKHggPDwgMTYpICYgMHgwRkZGMDAwMCkKKyNkZWZpbmUgTUFTMF9OVih4KQkoKHgpICYgMHgwMDAwMEZGRikKKworI2RlZmluZSBNQVMxX1ZBTElEIAkweDgwMDAwMDAwCisjZGVmaW5lIE1BUzFfSVBST1QJMHg0MDAwMDAwMAorI2RlZmluZSBNQVMxX1RJRCh4KQkoKHggPDwgMTYpICYgMHgzRkZGMDAwMCkKKyNkZWZpbmUgTUFTMV9UUwkJMHgwMDAwMTAwMAorI2RlZmluZSBNQVMxX1RTSVpFKHgpCSgoeCA8PCA4KSAmIDB4MDAwMDBGMDApCisKKyNkZWZpbmUgTUFTMl9FUE4JMHhGRkZGRjAwMAorI2RlZmluZSBNQVMyX1gwCQkweDAwMDAwMDQwCisjZGVmaW5lIE1BUzJfWDEJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFTMl9XCQkweDAwMDAwMDEwCisjZGVmaW5lIE1BUzJfSQkJMHgwMDAwMDAwOAorI2RlZmluZSBNQVMyX00JCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFTMl9HCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BUzJfRQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1BUzNfUlBOCTB4RkZGRkYwMDAKKyNkZWZpbmUgTUFTM19VMAkJMHgwMDAwMDIwMAorI2RlZmluZSBNQVMzX1UxCQkweDAwMDAwMTAwCisjZGVmaW5lIE1BUzNfVTIJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUFTM19VMwkJMHgwMDAwMDA0MAorI2RlZmluZSBNQVMzX1VYCQkweDAwMDAwMDIwCisjZGVmaW5lIE1BUzNfU1gJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFTM19VVwkJMHgwMDAwMDAwOAorI2RlZmluZSBNQVMzX1NXCQkweDAwMDAwMDA0CisjZGVmaW5lIE1BUzNfVVIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFTM19TUgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1BUzRfVExCU0VMRCh4KSBNQVMwX1RMQlNFTCh4KQorI2RlZmluZSBNQVM0X1RJRERTRUwJMHgwMDBGMDAwMAorI2RlZmluZSBNQVM0X1RTSVpFRCh4KQlNQVMxX1RTSVpFKHgpCisjZGVmaW5lIE1BUzRfWDBECTB4MDAwMDAwNDAKKyNkZWZpbmUgTUFTNF9YMUQJMHgwMDAwMDAyMAorI2RlZmluZSBNQVM0X1dECQkweDAwMDAwMDEwCisjZGVmaW5lIE1BUzRfSUQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTNF9NRAkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVM0X0dECQkweDAwMDAwMDAyCisjZGVmaW5lIE1BUzRfRUQJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNQVM2X1NQSUQwCTB4M0ZGRjAwMDAKKyNkZWZpbmUgTUFTNl9TUElEMQkweDAwMDA3RkZFCisjZGVmaW5lIE1BUzZfU0FTCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFTNl9TUElECU1BUzZfU1BJRDAKKworI2RlZmluZSBNQVM3X1JQTgkweEZGRkZGRkZGCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZm5kZWYgQ09ORklHX1BIWVNfNjRCSVQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBwaHlzX2FkZHJfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKK30gbW1fY29udGV4dF90OworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NTVVfRlNMX0JPT0tFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2gzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDczNWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoMzIuaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfSEFTSDMyX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfSEFTSDMyX0hfCisvKgorICogMzItYml0IGhhc2ggdGFibGUgTU1VIHN1cHBvcnQKKyAqLworCisvKgorICogQkFUcworICovCisKKy8qIEJsb2NrIHNpemUgbWFza3MgKi8KKyNkZWZpbmUgQkxfMTI4SwkweDAwMAorI2RlZmluZSBCTF8yNTZLIDB4MDAxCisjZGVmaW5lIEJMXzUxMksgMHgwMDMKKyNkZWZpbmUgQkxfMU0gICAweDAwNworI2RlZmluZSBCTF8yTSAgIDB4MDBGCisjZGVmaW5lIEJMXzRNICAgMHgwMUYKKyNkZWZpbmUgQkxfOE0gICAweDAzRgorI2RlZmluZSBCTF8xNk0gIDB4MDdGCisjZGVmaW5lIEJMXzMyTSAgMHgwRkYKKyNkZWZpbmUgQkxfNjRNICAweDFGRgorI2RlZmluZSBCTF8xMjhNIDB4M0ZGCisjZGVmaW5lIEJMXzI1Nk0gMHg3RkYKKworLyogQkFUIEFjY2VzcyBQcm90ZWN0aW9uICovCisjZGVmaW5lIEJQUF9YWAkweDAwCQkvKiBObyBhY2Nlc3MgKi8KKyNkZWZpbmUgQlBQX1JYCTB4MDEJCS8qIFJlYWQgb25seSAqLworI2RlZmluZSBCUFBfUlcJMHgwMgkJLyogUmVhZC93cml0ZSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworc3RydWN0IHBwY19iYXQgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgYmVwaToxNTsJLyogRWZmZWN0aXZlIHBhZ2UgaW5kZXggKHZpcnR1YWwgYWRkcmVzcykgKi8KKwkJdW5zaWduZWQgbG9uZyA6NDsJLyogVW51c2VkICovCisJCXVuc2lnbmVkIGxvbmcgYmw6MTE7CS8qIEJsb2NrIHNpemUgbWFzayAqLworCQl1bnNpZ25lZCBsb25nIHZzOjE7CS8qIFN1cGVydmlzb3IgdmFsaWQgKi8KKwkJdW5zaWduZWQgbG9uZyB2cDoxOwkvKiBVc2VyIHZhbGlkICovCisJfSBiYXR1OyAJCS8qIFVwcGVyIHJlZ2lzdGVyICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBicnBuOjE1OwkvKiBSZWFsIHBhZ2UgaW5kZXggKHBoeXNpY2FsIGFkZHJlc3MpICovCisJCXVuc2lnbmVkIGxvbmcgOjEwOwkvKiBVbnVzZWQgKi8KKwkJdW5zaWduZWQgbG9uZyB3OjE7CS8qIFdyaXRlLXRocnUgY2FjaGUgKi8KKwkJdW5zaWduZWQgbG9uZyBpOjE7CS8qIENhY2hlIGluaGliaXQgKi8KKwkJdW5zaWduZWQgbG9uZyBtOjE7CS8qIE1lbW9yeSBjb2hlcmVuY2UgKi8KKwkJdW5zaWduZWQgbG9uZyBnOjE7CS8qIEd1YXJkZWQgKE1CWiBpbiBJQkFUKSAqLworCQl1bnNpZ25lZCBsb25nIDoxOwkvKiBVbnVzZWQgKi8KKwkJdW5zaWduZWQgbG9uZyBwcDoyOwkvKiBQYWdlIGFjY2VzcyBwcm90ZWN0aW9ucyAqLworCX0gYmF0bDsJCQkvKiBMb3dlciByZWdpc3RlciAqLworfTsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBIYXNoIHRhYmxlCisgKi8KKworLyogVmFsdWVzIGZvciBQUCAoYXNzdW1lcyBLcz0wLCBLcD0xKSAqLworI2RlZmluZSBQUF9SV1hYCTAJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIG5vbmUgKi8KKyNkZWZpbmUgUFBfUldSWCAxCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciByZWFkICovCisjZGVmaW5lIFBQX1JXUlcgMgkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgcmVhZC93cml0ZSAqLworI2RlZmluZSBQUF9SWFJYIDMJLyogU3VwZXJ2aXNvciByZWFkLCAgICAgICBVc2VyIHJlYWQgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogSGFyZHdhcmUgUGFnZSBUYWJsZSBFbnRyeSAqLworc3RydWN0IGhhc2hfcHRlIHsKKwl1bnNpZ25lZCBsb25nIHY6MTsJLyogRW50cnkgaXMgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIHZzaWQ6MjQ7CS8qIFZpcnR1YWwgc2VnbWVudCBpZGVudGlmaWVyICovCisJdW5zaWduZWQgbG9uZyBoOjE7CS8qIEhhc2ggYWxnb3JpdGhtIGluZGljYXRvciAqLworCXVuc2lnbmVkIGxvbmcgYXBpOjY7CS8qIEFiYnJldmlhdGVkIHBhZ2UgaW5kZXggKi8KKwl1bnNpZ25lZCBsb25nIHJwbjoyMDsJLyogUmVhbCAocGh5c2ljYWwpIHBhZ2UgbnVtYmVyICovCisJdW5zaWduZWQgbG9uZyAgICA6MzsJLyogVW51c2VkICovCisJdW5zaWduZWQgbG9uZyByOjE7CS8qIFJlZmVyZW5jZWQgKi8KKwl1bnNpZ25lZCBsb25nIGM6MTsJLyogQ2hhbmdlZCAqLworCXVuc2lnbmVkIGxvbmcgdzoxOwkvKiBXcml0ZS10aHJ1IGNhY2hlIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGk6MTsJLyogQ2FjaGUgaW5oaWJpdGVkICovCisJdW5zaWduZWQgbG9uZyBtOjE7CS8qIE1lbW9yeSBjb2hlcmVuY2UgKi8KKwl1bnNpZ25lZCBsb25nIGc6MTsJLyogR3VhcmRlZCAqLworCXVuc2lnbmVkIGxvbmcgIDoxOwkvKiBVbnVzZWQgKi8KKwl1bnNpZ25lZCBsb25nIHBwOjI7CS8qIFBhZ2UgcHJvdGVjdGlvbiAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01NVV9IQVNIMzJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKaW5kZXggYjhkY2EzMC4uNjk1OTYyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKQEAgLTk0LDYgKzk0LDkgQEAKICNkZWZpbmUgSFBURV9SX0MJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwODApCiAjZGVmaW5lIEhQVEVfUl9SCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMTAwKQogCisjZGVmaW5lIEhQVEVfVl8xVEJfU0VHCQlBU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBIUFRFX1ZfVlJNQV9NQVNLCUFTTV9DT05TVCgweDQwMDFmZmZmZmYwMDAwMDApCisKIC8qIFZhbHVlcyBmb3IgUFAgKGFzc3VtZXMgS3M9MCwgS3A9MSkgKi8KIC8qIHBwMCB3aWxsIGFsd2F5cyBiZSAwIGZvciBsaW51eCAgICAgKi8KICNkZWZpbmUgUFBfUldYWAkwCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciBub25lICovCkBAIC0xMDMsMTIgKzEwNiwxMiBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgaGFzaF9wdGUgewogCXVuc2lnbmVkIGxvbmcgdjsKIAl1bnNpZ25lZCBsb25nIHI7Ci19IGhwdGVfdDsKK307CiAKLWV4dGVybiBocHRlX3QgKmh0YWJfYWRkcmVzczsKK2V4dGVybiBzdHJ1Y3QgaGFzaF9wdGUgKmh0YWJfYWRkcmVzczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZV9ieXRlczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGh0YWJfaGFzaF9tYXNrOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaAppbmRleCBmZTUxMGZmLi5kNDRkMjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKQEAgLTUsMTMgKzUsMTggQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKIC8qIDY0LWJpdCBjbGFzc2ljIGhhc2ggdGFibGUgTU1VICovCiAjICBpbmNsdWRlIDxhc20vbW11LWhhc2g2NC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX1NURF9NTVUpCisvKiAzMi1iaXQgY2xhc3NpYyBoYXNoIHRhYmxlIE1NVSAqLworIyAgaW5jbHVkZSA8YXNtL21tdS1oYXNoMzIuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHXzQ0eCkKIC8qIDQ0eC1zdHlsZSBzb2Z0d2FyZSBsb2FkZWQgVExCICovCiAjICBpbmNsdWRlIDxhc20vbW11LTQ0eC5oPgotI2Vsc2UKLS8qIE90aGVyIDMyLWJpdC4gIEZJWE1FOiBzcGxpdCB1cCB0aGUgb3RoZXIgMzItYml0IE1NVSB0eXBlcywgYW5kCi0gKiByZXZpc2UgZm9yIGFyY2gvcG93ZXJwYyAqLwotIyAgaW5jbHVkZSA8YXNtLXBwYy9tbXUuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZTTF9CT09LRSkKKy8qIEZyZWVzY2FsZSBCb29rLUUgc29mdHdhcmUgbG9hZGVkIFRMQiAqLworIyAgaW5jbHVkZSA8YXNtL21tdS1mc2wtYm9va2UuaD4KKyNlbGlmIGRlZmluZWQgKENPTkZJR19QUENfOHh4KQorLyogTW90b3JvbGEvRnJlZXNjYWxlIDh4eCBzb2Z0d2FyZSBsb2FkZWQgVExCICovCisjICBpbmNsdWRlIDxhc20vbW11LTh4eC5oPgogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKaW5kZXggNDBjOWU1YS4uZjg2M2FjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaApAQCAtMiwxNiArMiwyMTAgQEAKICNkZWZpbmUgX19BU01fUE9XRVJQQ19NTVVfQ09OVEVYVF9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YXNtL21tdS5oPgkKKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbV9ob29rcy5oPgorCiAjaWZuZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGFzbS1wcGMvbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisvKgorICogT24gMzItYml0IFBvd2VyUEMgNnh4Lzd4eC83eHh4IENQVXMsIHdlIHVzZSBhIHNldCBvZiAxNiBWU0lEcworICogKHZpcnR1YWwgc2VnbWVudCBpZGVudGlmaWVycykgZm9yIGVhY2ggY29udGV4dC4gIEFsdGhvdWdoIHRoZQorICogaGFyZHdhcmUgc3VwcG9ydHMgMjQtYml0IFZTSURzLCBhbmQgdGh1cyA+MSBtaWxsaW9uIGNvbnRleHRzLAorICogd2Ugb25seSB1c2UgMzIsNzY4IG9mIHRoZW0uICBUaGF0IGlzIGFtcGxlLCBzaW5jZSB0aGVyZSBjYW4gYmUKKyAqIGF0IG1vc3QgYXJvdW5kIDMwLDAwMCB0YXNrcyBpbiB0aGUgc3lzdGVtIGFueXdheSwgYW5kIGl0IG1lYW5zCisgKiB0aGF0IHdlIGNhbiB1c2UgYSBiaXRtYXAgdG8gaW5kaWNhdGUgd2hpY2ggY29udGV4dHMgYXJlIGluIHVzZS4KKyAqIFVzaW5nIGEgYml0bWFwIG1lYW5zIHRoYXQgd2UgZW50aXJlbHkgYXZvaWQgYWxsIG9mIHRoZSBwcm9ibGVtcworICogdGhhdCB3ZSB1c2VkIHRvIGhhdmUgd2hlbiB0aGUgY29udGV4dCBudW1iZXIgb3ZlcmZsb3dlZCwKKyAqIHBhcnRpY3VsYXJseSBvbiBTTVAgc3lzdGVtcy4KKyAqICAtLSBwYXVsdXMuCisgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGNvbnRleHRzIHRvIFZTSURzICh2aXJ0dWFsCisgKiBzZWdtZW50IElEcykuICBXZSB1c2UgYSBza2V3IG9uIGJvdGggdGhlIGNvbnRleHQgYW5kIHRoZSBoaWdoIDQgYml0cworICogb2YgdGhlIDMyLWJpdCB2aXJ0dWFsIGFkZHJlc3MgKHRoZSAiZWZmZWN0aXZlIHNlZ21lbnQgSUQiKSBpbiBvcmRlcgorICogdG8gc3ByZWFkIG91dCB0aGUgZW50cmllcyBpbiB0aGUgTU1VIGhhc2ggdGFibGUuICBOb3RlLCBpZiB0aGlzCisgKiBmdW5jdGlvbiBpcyBjaGFuZ2VkIHRoZW4gYXJjaC9wcGMvbW0vaGFzaHRhYmxlLlMgd2lsbCBoYXZlIHRvIGJlCisgKiBjaGFuZ2VkIHRvIGNvcnJlc3BvbmQuCisgKi8KKyNkZWZpbmUgQ1RYX1RPX1ZTSUQoY3R4LCB2YSkJKCgoY3R4KSAqICg4OTcgKiAxNikgKyAoKHZhKSA+PiAyOCkgKiAweDExMSkgXAorCQkJCSAmIDB4ZmZmZmZmKQorCisvKgorICAgVGhlIE1QQzh4eCBoYXMgb25seSAxNiBjb250ZXh0cy4gIFdlIHJvdGF0ZSB0aHJvdWdoIHRoZW0gb24gZWFjaAorICAgdGFzayBzd2l0Y2guICBBIGJldHRlciB3YXkgd291bGQgYmUgdG8ga2VlcCB0cmFjayBvZiB0YXNrcyB0aGF0CisgICBvd24gY29udGV4dHMsIGFuZCBpbXBsZW1lbnQgYW4gTFJVIHVzYWdlLiAgVGhhdCB3YXkgdmVyeSBhY3RpdmUKKyAgIHRhc2tzIGRvbid0IGFsd2F5cyBoYXZlIHRvIHBheSB0aGUgVExCIHJlbG9hZCBvdmVyaGVhZC4gIFRoZQorICAga2VybmVsIHBhZ2VzIGFyZSBtYXBwZWQgc2hhcmVkLCBzbyB0aGUga2VybmVsIGNhbiBydW4gb24gYmVoYWxmCisgICBvZiBhbnkgdGFzayB0aGF0IG1ha2VzIGEga2VybmVsIGVudHJ5LiAgU2hhcmVkIGRvZXMgbm90IG1lYW4gdGhleQorICAgYXJlIG5vdCBwcm90ZWN0ZWQsIGp1c3QgdGhhdCB0aGUgQVNJRCBjb21wYXJpc29uIGlzIG5vdCBwZXJmb3JtZWQuCisgICAgICAgIC0tIERhbgorCisgICBUaGUgSUJNNHh4IGhhcyAyNTYgY29udGV4dHMsIHNvIHdlIGNhbiBqdXN0IHJvdGF0ZSB0aHJvdWdoIHRoZXNlCisgICBhcyBhIHdheSBvZiAic3dpdGNoaW5nIiBjb250ZXh0cy4gIElmIHRoZSBUSUQgb2YgdGhlIFRMQiBpcyB6ZXJvLAorICAgdGhlIFBJRC9USUQgY29tcGFyaXNvbiBpcyBkaXNhYmxlZCwgc28gd2UgY2FuIHVzZSBhIFRJRCBvZiB6ZXJvCisgICB0byByZXByZXNlbnQgYWxsIGtlcm5lbCBwYWdlcyBhcyBzaGFyZWQgYW1vbmcgYWxsIGNvbnRleHRzLgorICAgCS0tIERhbgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5X3RsYihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7Cit9CisKKyNpZmRlZiBDT05GSUdfOHh4CisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJMTYKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkxNQorI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkwCisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzR4eCkKKyNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkyNTYKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkyNTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19FMjAwKSB8fCBkZWZpbmVkKENPTkZJR19FNTAwKQorI2RlZmluZSBOT19DT05URVhUICAgICAgCTI1NgorI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTI1NQorI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCisKKyNlbHNlCisKKy8qIFBQQyA2eHgsIDd4eCBDUFVzICovCisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJKCh1bnNpZ25lZCBsb25nKSAtMSkKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkzMjc2NworI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCisjZW5kaWYKKworLyoKKyAqIFNldCB0aGUgY3VycmVudCBNTVUgY29udGV4dC4KKyAqIE9uIDMyLWJpdCBQb3dlclBDcyAob3RoZXIgdGhhbiB0aGUgOHh4IGVtYmVkZGVkIGNoaXBzKSwgdGhpcyBpcyBkb25lIGJ5CisgKiBsb2FkaW5nIHVwIHRoZSBzZWdtZW50IHJlZ2lzdGVycyBmb3IgdGhlIHVzZXIgcGFydCBvZiB0aGUgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBTaW5jZSB0aGUgUEdEIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwgaXQgaXMgbXVjaCBmYXN0ZXIgdG8gc2ltcGx5CisgKiBwYXNzIHRoaXMgYWxvbmcgYXMgYSBzZWNvbmQgcGFyYW1ldGVyLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgOHh4IGFuZAorICogY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBvbiBhbGwgcHJvY2Vzc29ycyAoaWYgeW91IGhhcHBlbiB0byBoYXZlCisgKiBhbiBBYmF0cm9uKS4KKyAqLworZXh0ZXJuIHZvaWQgc2V0X2NvbnRleHQodW5zaWduZWQgbG9uZyBjb250ZXh0aWQsIHBnZF90ICpwZ2QpOworCisvKgorICogQml0bWFwIG9mIGNvbnRleHRzIGluIHVzZS4KKyAqIFRoZSBzaXplIG9mIHRoaXMgYml0bWFwIGlzIExBU1RfQ09OVEVYVCArIDEgYml0cy4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29udGV4dF9tYXBbXTsKKworLyoKKyAqIFRoaXMgY2FjaGVzIHRoZSBuZXh0IGNvbnRleHQgbnVtYmVyIHRoYXQgd2UgZXhwZWN0IHRvIGJlIGZyZWUuCisgKiBJdHMgdXNlIGlzIGFuIG9wdGltaXphdGlvbiBvbmx5LCB3ZSBjYW4ndCByZWx5IG9uIHRoaXMgY29udGV4dAorICogbnVtYmVyIHRvIGJlIGZyZWUsIGJ1dCBpdCB1c3VhbGx5IHdpbGwgYmUuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIG5leHRfbW11X2NvbnRleHQ7CisKKy8qCisgKiBJZiB3ZSBkb24ndCBoYXZlIHN1ZmZpY2llbnQgY29udGV4dHMgdG8gZ2l2ZSBvbmUgdG8gZXZlcnkgdGFzaworICogdGhhdCBjb3VsZCBiZSBpbiB0aGUgc3lzdGVtLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc3RlYWwgY29udGV4dHMuCisgKiBUaGVzZSB2YXJpYWJsZXMgc3VwcG9ydCB0aGF0LgorICovCisjaWYgTEFTVF9DT05URVhUIDwgMzAwMDAKKyNkZWZpbmUgRkVXX0NPTlRFWFRTCTEKK2V4dGVybiBhdG9taWNfdCBucl9mcmVlX2NvbnRleHRzOworZXh0ZXJuIHN0cnVjdCBtbV9zdHJ1Y3QgKmNvbnRleHRfbW1bTEFTVF9DT05URVhUKzFdOworZXh0ZXJuIHZvaWQgc3RlYWxfY29udGV4dCh2b2lkKTsKKyNlbmRpZgorCisvKgorICogR2V0IGEgbmV3IG1tdSBjb250ZXh0IGZvciB0aGUgYWRkcmVzcyBzcGFjZSBkZXNjcmliZWQgYnkgYG1tJy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdldF9tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIGN0eDsKKworCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKQorCQlyZXR1cm47CisjaWZkZWYgRkVXX0NPTlRFWFRTCisJd2hpbGUgKGF0b21pY19kZWNfaWZfcG9zaXRpdmUoJm5yX2ZyZWVfY29udGV4dHMpIDwgMCkKKwkJc3RlYWxfY29udGV4dCgpOworI2VuZGlmCisJY3R4ID0gbmV4dF9tbXVfY29udGV4dDsKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChjdHgsIGNvbnRleHRfbWFwKSkgeworCQljdHggPSBmaW5kX25leHRfemVyb19iaXQoY29udGV4dF9tYXAsIExBU1RfQ09OVEVYVCsxLCBjdHgpOworCQlpZiAoY3R4ID4gTEFTVF9DT05URVhUKQorCQkJY3R4ID0gMDsKKwl9CisJbmV4dF9tbXVfY29udGV4dCA9IChjdHggKyAxKSAmIExBU1RfQ09OVEVYVDsKKwltbS0+Y29udGV4dC5pZCA9IGN0eDsKKyNpZmRlZiBGRVdfQ09OVEVYVFMKKwljb250ZXh0X21tW2N0eF0gPSBtbTsKKyNlbmRpZgorfQorCisvKgorICogU2V0IHVwIHRoZSBjb250ZXh0IGZvciBhIG5ldyBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworCW1tLT5jb250ZXh0LnZkc29fYmFzZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSdyZSBmaW5pc2hlZCB1c2luZyB0aGUgY29udGV4dCBmb3IgYW4gYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpZiAobW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkgeworCQljbGVhcl9iaXQobW0tPmNvbnRleHQuaWQsIGNvbnRleHRfbWFwKTsKKwkJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworI2lmZGVmIEZFV19DT05URVhUUworCQlhdG9taWNfaW5jKCZucl9mcmVlX2NvbnRleHRzKTsKKyNlbmRpZgorCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCisJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworI2lmZGVmIENPTkZJR19BTFRJVkVDCisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQorCWFzbSB2b2xhdGlsZSAoImRzc2FsbDtcbiIKKyNpZm5kZWYgQ09ORklHX1BPV0VSNAorCSAic3luYztcbiIgLyogRzQgbmVlZHMgYSBzeW5jIGhlcmUsIEc1IGFwcGFyZW50bHkgbm90ICovCisjZW5kaWYKKwkgOiA6ICk7CisjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KKworCXRzay0+dGhyZWFkLnBnZGlyID0gbmV4dC0+cGdkOworCisJLyogTm8gbmVlZCB0byBmbHVzaCB1c2Vyc3BhY2Ugc2VnbWVudHMgaWYgdGhlIG1tIGRvZXNudCBjaGFuZ2UgKi8KKwlpZiAocHJldiA9PSBuZXh0KQorCQlyZXR1cm47CisKKwkvKiBTZXR1cCBuZXcgdXNlcnNwYWNlIGNvbnRleHQgKi8KKwlnZXRfbW11X2NvbnRleHQobmV4dCk7CisJc2V0X2NvbnRleHQobmV4dC0+Y29udGV4dC5pZCwgbmV4dC0+cGdkKTsKK30KKworI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzayxtbSkJZG8geyB9IHdoaWxlICgwKQorCisvKgorICogQWZ0ZXIgd2UgaGF2ZSBzZXQgY3VycmVudC0+bW0gdG8gYSBuZXcgdmFsdWUsIHRoaXMgYWN0aXZhdGVzCisgKiB0aGUgY29udGV4dCBmb3IgdGhlIG5ldyBtbSBzbyB3ZSBzZWUgdGhlIG5ldyBtYXBwaW5ncy4KKyAqLworI2RlZmluZSBhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKSAgIHN3aXRjaF9tbShhY3RpdmVfbW0sIG1tLCBjdXJyZW50KQorCitleHRlcm4gdm9pZCBtbXVfY29udGV4dF9pbml0KHZvaWQpOworCisKICNlbHNlCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JCiAjaW5jbHVkZSA8bGludXgvbW0uaD4JCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vbW11Lmg+CQotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tX2hvb2tzLmg+CiAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUFBDIDY0IFRlYW0sIElCTSBDb3JwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCmluZGV4IGI4NWRmNDUuLjE1ZjY1MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCkBAIC0xOSwxMiArMTksNiBAQAogCiAjaWZkZWYgQ09ORklHX1BQQ184Nnh4CiAKLSNkZWZpbmUgX0lPX0JBU0UgICAgICAgIGlzYV9pb19iYXNlCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UgICBpc2FfbWVtX2Jhc2UKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCBwY2lfZHJhbV9vZmZzZXQKLSNlbmRpZgotCiAjZGVmaW5lIENQVTBfQk9PVF9SRUxFQVNFIDB4MDEwMDAwMDAKICNkZWZpbmUgQ1BVMV9CT09UX1JFTEVBU0UgMHgwMjAwMDAwMAogI2RlZmluZSBDUFVfQUxMX1JFTEVBU0VEIChDUFUwX0JPT1RfUkVMRUFTRSB8IENQVTFfQk9PVF9SRUxFQVNFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmgKaW5kZXggNTgwMzcxMS4uMmJlMDE0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzh4eC5oCkBAIC0yMyw2ICsyMywxMCBAQAogI2luY2x1ZGUgPHBsYXRmb3Jtcy84eHgvbXBjODg1YWRzLmg+CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorZXh0ZXJuIHN0cnVjdCBtcGM4eHhfcGNtY2lhX29wcyBtOHh4X3BjbWNpYV9vcHM7CisjZW5kaWYKKwogI2VuZGlmIC8qIENPTkZJR184eHggKi8KICNlbmRpZiAvKiBfX0NPTkZJR184eHhfREVGUyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKaW5kZXggZDliZjVhYi4uZTcyYzJhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmgKQEAgLTIsMTIgKzIsOTEgQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BDSV9CUklER0VfSAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2lmbmRlZiBDT05GSUdfUFBDNjQKLSNpbmNsdWRlIDxhc20tcHBjL3BjaS1icmlkZ2UuaD4KLSNlbHNlCi0KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpZm5kZWYgQ09ORklHX1BQQzY0CisKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBwY2lfY29udHJvbGxlcjsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIFBDSSBjb250cm9sbGVyIChob3N0IGJyaWRnZSkKKyAqLworc3RydWN0IHBjaV9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCWNoYXIgaXNfZHluYW1pYzsKKwl2b2lkICphcmNoX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CisJc3RydWN0IGRldmljZSAqcGFyZW50OworCisJaW50IGZpcnN0X2J1c25vOworCWludCBsYXN0X2J1c25vOworCWludCBzZWxmX2J1c25vOworCisJdm9pZCBfX2lvbWVtICppb19iYXNlX3ZpcnQ7CisJcmVzb3VyY2Vfc2l6ZV90IGlvX2Jhc2VfcGh5czsKKworCS8qIFNvbWUgbWFjaGluZXMgKFBSZVApIGhhdmUgYSBub24gMToxIG1hcHBpbmcgb2YKKwkgKiB0aGUgUENJIG1lbW9yeSBzcGFjZSBpbiB0aGUgQ1BVIGJ1cyBzcGFjZQorCSAqLworCXJlc291cmNlX3NpemVfdCBwY2lfbWVtX29mZnNldDsKKworCXN0cnVjdCBwY2lfb3BzICpvcHM7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IF9faW9tZW0gKmNmZ19hZGRyOworCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CisKKwkvKgorCSAqIFVzZWQgZm9yIHZhcmlhbnRzIG9mIFBDSSBpbmRpcmVjdCBoYW5kbGluZyBhbmQgcG9zc2libGUgcXVpcmtzOgorCSAqICBTRVRfQ0ZHX1RZUEUgLSB1c2VkIG9uIDR4eCBvciBhbnkgUEhCIHRoYXQgZG9lcyBleHBsaWNpdCB0eXBlMC8xCisJICogIEVYVF9SRUcgLSBwcm92aWRlcyBhY2Nlc3MgdG8gUENJLWUgZXh0ZW5kZWQgcmVnaXN0ZXJzCisJICogIFNVUlBSRVNTX1BSSU1BUllfQlVTIC0gd2Ugc3VycHJlc3MgdGhlIHNldHRpbmcgb2YgUENJX1BSSU1BUllfQlVTCisJICogICBvbiBGcmVlc2NhbGUgUENJLWUgY29udHJvbGxlcnMgc2luY2UgdGhleSB1c2VkIHRoZSBQQ0lfUFJJTUFSWV9CVVMKKwkgKiAgIHRvIGRldGVybWluZSB3aGljaCBidXMgbnVtYmVyIHRvIG1hdGNoIG9uIHdoZW4gZ2VuZXJhdGluZyB0eXBlMAorCSAqICAgY29uZmlnIGN5Y2xlcworCSAqLworI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9TRVRfQ0ZHX1RZUEUJCSgweDAwMDAwMDAxKQorI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9FWFRfUkVHCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMJKDB4MDAwMDAwMDQpCisJdTMyIGluZGlyZWN0X3R5cGU7CisKKwkvKiBDdXJyZW50bHksIHdlIGxpbWl0IG91cnNlbHZlcyB0byAxIElPIHJhbmdlIGFuZCAzIG1lbQorCSAqIHJhbmdlcyBzaW5jZSB0aGUgY29tbW9uIHBjaV9idXMgc3RydWN0dXJlIGNhbid0IGhhbmRsZSBtb3JlCisJICovCisJc3RydWN0IHJlc291cmNlCWlvX3Jlc291cmNlOworCXN0cnVjdCByZXNvdXJjZSBtZW1fcmVzb3VyY2VzWzNdOworCWludCBnbG9iYWxfbnVtYmVyOwkJLyogUENJIGRvbWFpbiBudW1iZXIgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2lfYnVzX3RvX2hvc3Qoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlyZXR1cm4gYnVzLT5zeXNkYXRhOworfQorCisvKiBUaGVzZSBhcmUgdXNlZCBmb3IgY29uZmlnIGFjY2VzcyBiZWZvcmUgYWxsIHRoZSBQQ0kgcHJvYmluZworICAgaGFzIGJlZW4gZG9uZS4gKi8KK2ludCBlYXJseV9yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgIGludCB3aGVyZSwgdTggKnZhbCk7CitpbnQgZWFybHlfcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICBpbnQgd2hlcmUsIHUxNiAqdmFsKTsKK2ludCBlYXJseV9yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICAgaW50IHdoZXJlLCB1MzIgKnZhbCk7CitpbnQgZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgIGludCB3aGVyZSwgdTggdmFsKTsKK2ludCBlYXJseV93cml0ZV9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICAgaW50IHdoZXJlLCB1MTYgdmFsKTsKK2ludCBlYXJseV93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgICBpbnQgd2hlcmUsIHUzMiB2YWwpOworCitleHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAorCQkJICAgICAgIHZvaWQgX19pb21lbSAqY2ZnX2FkZHIsIHZvaWQgX19pb21lbSAqY2ZnX2RhdGEpOworZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKKwkJCSAgICAgICB1MzIgY2ZnX2FkZHIsIHUzMiBjZmdfZGF0YSk7CitleHRlcm4gdm9pZCBzZXR1cF9ncmFja2xlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKKyNlbHNlCisKIAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTMxLDYgKzExMCw3IEBACiAJaW50IGxhc3RfYnVzbm87CiAKIAl2b2lkIF9faW9tZW0gKmlvX2Jhc2VfdmlydDsKKwl2b2lkICppb19iYXNlX2FsbG9jOwogCXJlc291cmNlX3NpemVfdCBpb19iYXNlX3BoeXM7CiAKIAkvKiBTb21lIG1hY2hpbmVzIGhhdmUgYSBub24gMToxIG1hcHBpbmcgb2YKQEAgLTQ4LDggKzEyOCw3IEBACiAJICovCiAJc3RydWN0IHJlc291cmNlIGlvX3Jlc291cmNlOwogCXN0cnVjdCByZXNvdXJjZSBtZW1fcmVzb3VyY2VzWzNdOwotCWludCBnbG9iYWxfbnVtYmVyOwkJCi0JaW50IGxvY2FsX251bWJlcjsJCQorCWludCBnbG9iYWxfbnVtYmVyOwogCXVuc2lnbmVkIGxvbmcgYnVpZDsKIAl1bnNpZ25lZCBsb25nIGRtYV93aW5kb3dfYmFzZV9jdXI7CiAJdW5zaWduZWQgbG9uZyBkbWFfd2luZG93X3NpemU7CkBAIC03MCwxOSArMTQ5LDIyIEBACiAJaW50CWRldmZuOwkJCS8qIHBjaSBkZXZpY2UgYW5kIGZ1bmN0aW9uIG51bWJlciAqLwogCWludAljbGFzc19jb2RlOwkJLyogcGNpIGRldmljZSBjbGFzcyAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCisJc3RydWN0ICBwY2lfY29udHJvbGxlciAqcGhiOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KKwlzdHJ1Y3QJaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOwkvKiBmb3IgcGhiJ3Mgb3IgYnJpZGdlcyAqLworCXN0cnVjdAlwY2lfZGV2ICpwY2lkZXY7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgcGNpIGRldmljZSAqLworCXN0cnVjdAlkZXZpY2Vfbm9kZSAqbm9kZTsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBkZXZpY2Vfbm9kZSAqLworCisJaW50CXBjaV9leHRfY29uZmlnX3NwYWNlOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KKworI2lmZGVmIENPTkZJR19FRUgKIAlpbnQJZWVoX21vZGU7CQkvKiBTZWUgZWVoLmggZm9yIHBvc3NpYmxlIEVFSF9NT0RFcyAqLwogCWludAllZWhfY29uZmlnX2FkZHI7CiAJaW50CWVlaF9wZV9jb25maWdfYWRkcjsgLyogbmV3LXN0eWxlIHBhcnRpdGlvbiBlbmRwb2ludCBhZGRyZXNzICovCiAJaW50IAllZWhfY2hlY2tfY291bnQ7CS8qICMgdGltZXMgZHJpdmVyIGlnbm9yZWQgZXJyb3IgKi8KIAlpbnQgCWVlaF9mcmVlemVfY291bnQ7CS8qICMgdGltZXMgdGhpcyBkZXZpY2UgZnJvemUgdXAuICovCi0jZW5kaWYKLQlpbnQJcGNpX2V4dF9jb25maWdfc3BhY2U7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCXN0cnVjdCAgcGNpX2NvbnRyb2xsZXIgKnBoYjsJLyogZm9yIHBjaSBkZXZpY2VzICovCi0Jc3RydWN0CWlvbW11X3RhYmxlICppb21tdV90YWJsZTsJLyogZm9yIHBoYidzIG9yIGJyaWRnZXMgKi8KLQlzdHJ1Y3QJcGNpX2RldiAqcGNpZGV2OwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIHBjaSBkZXZpY2UgKi8KLQlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5vZGU7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgZGV2aWNlX25vZGUgKi8KKwlpbnQgCWVlaF9mYWxzZV9wb3NpdGl2ZXM7CS8qICMgdGltZXMgdGhpcyBkZXZpY2UgcmVwb3J0ZWQgI2ZmJ3MgKi8KIAl1MzIJY29uZmlnX3NwYWNlWzE2XTsJLyogc2F2ZWQgUENJIGNvbmZpZyBzcGFjZSAqLworI2VuZGlmCiB9OwogCiAvKiBHZXQgdGhlIHBvaW50ZXIgdG8gYSBkZXZpY2Vfbm9kZSdzIHBjaV9kbiAqLwpAQCAtMTI4LDkgKzIxMCw2IEBACiAvKiogRmluZCB0aGUgYnVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGljYXRlZCBkZXZpY2Ugbm9kZSAqLwogc3RydWN0IHBjaV9idXMgKiBwY2liaW9zX2ZpbmRfcGNpX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAotZXh0ZXJuIHZvaWQgcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IHByaW1hcnkpOwotCiAvKiogUmVtb3ZlIGFsbCBvZiB0aGUgUENJIGRldmljZXMgdW5kZXIgdGhpcyBidXMgKi8KIHZvaWQgcGNpYmlvc19yZW1vdmVfcGNpX2RldmljZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKQEAgLTE0OCwyMSArMjI3LDEyIEBACiAJcmV0dXJuIFBDSV9ETihidXNkbiktPnBoYjsKIH0KIAotZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlcioKLXBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpOwotCi1leHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyICoKLXBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiBleHRlcm4gdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CiAKLSNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQotewotCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLX0KLSNlbmRpZgorZXh0ZXJuIHZvaWQgaXNhX2JyaWRnZV9maW5kX2Vhcmx5KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKK2V4dGVybiBpbnQgcGNpYmlvc191bm1hcF9pb19zcGFjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK2V4dGVybiBpbnQgcGNpYmlvc19tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIHBwY19tZC5wY2lfcHJvYmVfbW9kZSBmdW5jdGlvbiAqLwogI2RlZmluZSBQQ0lfUFJPQkVfTk9ORQkJLTEJLyogRG9uJ3QgbG9vayBhdCB0aGlzIGJ1cyBhdCBhbGwgKi8KQEAgLTE3Niw1ICsyNDYsMjkgQEAKICNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKy8qIEdldCB0aGUgUENJIGhvc3QgY29udHJvbGxlciBmb3IgYW4gT0YgZGV2aWNlICovCitleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyKgorcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSk7CisKKy8qIEZpbGwgdXAgaG9zdCBjb250cm9sbGVyIHJlc291cmNlcyBmcm9tIHRoZSBPRiBub2RlICovCitleHRlcm4gdm9pZAorcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IHByaW1hcnkpOworCisvKiBBbGxvY2F0ZSBhIG5ldyBQQ0kgaG9zdCBicmlkZ2Ugc3RydWN0dXJlICovCitleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyICoKK3BjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Cit9CisjZW5kaWYKKworCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCmluZGV4IGUxNmU3YmMuLjdiMTE3NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaApAQCAtOTUsOCArOTUsNiBAQAogI2RlZmluZSBnZXRfcGNpX2RtYV9vcHMoKQlOVUxMCiAjZW5kaWYKIAotZXh0ZXJuIGludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCiAvKiBEZWNpZGUgd2hldGhlciB0byBkaXNwbGF5IHRoZSBkb21haW4gbnVtYmVyIGluIC9wcm9jICovCiBleHRlcm4gaW50IHBjaV9wcm9jX2RvbWFpbihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIApAQCAtMTEyLDkgKzExMCw2IEBACiB9CiAjZW5kaWYKIAotLyogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgUENJIGNvbnRyb2xsZXIgZm9yIGRldmljZSBQREVWLiAqLwotI2RlZmluZSBwY2lfZG9tYWluX25yKGJ1cykgKChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKikoYnVzKS0+c3lzZGF0YSktPmluZGV4Ci0KIC8qIFNldCB0aGUgbmFtZSBvZiB0aGUgYnVzIGFzIGl0IGFwcGVhcnMgaW4gL3Byb2MvYnVzL3BjaSAqLwogc3RhdGljIGlubGluZSBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CkBAIC0xMjMsNiArMTE4LDggQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCitleHRlcm4gaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cyk7CisKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKIC8qIE1hcCBhIHJhbmdlIG9mIFBDSSBtZW1vcnkgb3IgSS9PIHNwYWNlIGZvciBhIGRldmljZSBpbnRvIHVzZXIgc3BhY2UgKi8KIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKQEAgLTIwMiwxMCArMTk5LDYgQEAKIAlyZXR1cm4gcm9vdDsKIH0KIAotZXh0ZXJuIGludCB1bm1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci0KLWV4dGVybiBpbnQgcmVtYXBfYnVzX3JhbmdlKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCiBleHRlcm4gdm9pZCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCXN0cnVjdCBwY2lfYnVzICpidXMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGMzMi5oCmluZGV4IDdmYjczMGMuLjg2YTU0YTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaApAQCAtNiwxMSArNiw3IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KLSNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4JCQkvKiBGb3Igc3ViLWFyY2ggc3BlY2lmaWMgUFBDX1BJTl9TSVpFICovCi1zdHJ1Y3QgbW1fc3RydWN0OwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB2YV90b19waHlzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiBleHRlcm4gcHRlX3QgKnZhX3RvX3B0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwpAQCAtNDg4LDE0ICs0ODQsNiBAQAogI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJX19wdGUoKChwdGVfYmFzaWNfdCkocGZuKSA8PCBQRk5fU0hJRlRfT0ZGU0VUKSB8XAogCQkJCQlwZ3Byb3RfdmFsKHByb3QpKQogI2RlZmluZSBta19wdGUocGFnZSwgcHJvdCkJcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgcHJvdCkKLQotLyoKLSAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCi0gKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVsxMDI0XTsKLSNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCi0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2RlZmluZSBwdGVfbm9uZShwdGUpCQkoKHB0ZV92YWwocHRlKSAmIH5fUFRFX05PTkVfTUFTSykgPT0gMCkKQEAgLTUxMiw5ICs1MDAsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CkBAIC01MjIsMjEgKzUwOCwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV91bmNhY2hlKHB0ZV90IHB0ZSkgICAgICAgeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTk9fQ0FDSEU7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2FjaGUocHRlX3QgcHRlKSAgICAgICAgIHsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9OT19DQUNIRTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcgfCBfUEFHRV9IV1dSSVRFKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9ESVJUWSB8IF9QQUdFX0hXV1JJVEUpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSIHwgX1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKSB7CkBAIC02NDMsMTMgKzYyMSw2IEBACiAjZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoX192bWEsIF9fYWRkciwgX19wdGVwKSBcCiAJX19wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKChfX3ZtYSktPnZtX21tLT5jb250ZXh0LmlkLCBfX2FkZHIsIF9fcHRlcCkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi1zdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlyZXR1cm4gKHB0ZV91cGRhdGUocHRlcCwgKF9QQUdFX0RJUlRZIHwgX1BBR0VfSFdXUklURSksIDApICYgX1BBR0VfRElSVFkpICE9IDA7Ci19Ci0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgICBwdGVfdCAqcHRlcCkKQEAgLTczNCwxMCArNzA1LDYgQEAKICNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCWt1bm1hcF9hdG9taWMocHRlLCBLTV9QVEUwKQogI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkJa3VubWFwX2F0b21pYyhwdGUsIEtNX1BURTEpCiAKLWV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOwotCi1leHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKLQogLyoKICAqIEVuY29kZSBhbmQgZGVjb2RlIGEgc3dhcCBlbnRyeS4KICAqIE5vdGUgdGhhdCB0aGUgYml0cyB3ZSB1c2UgaW4gYSBQVEUgZm9yIHJlcHJlc2VudGluZyBhIHN3YXAgZW50cnkKQEAgLTc1NSw0MCArNzIyLDYgQEAKICNkZWZpbmUgcHRlX3RvX3Bnb2ZmKHB0ZSkJKHB0ZV92YWwocHRlKSA+PiAzKQogI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKQkoKHB0ZV90KSB7ICgob2ZmKSA8PCAzKSB8IF9QQUdFX0ZJTEUgfSkKIAotLyogQ09ORklHX0FQVVMgKi8KLS8qIEZvciB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyBjb252ZXJzaW9uICovCi1leHRlcm4gdm9pZCBjYWNoZV9jbGVhcihfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKLWV4dGVybiB2b2lkIGNhY2hlX3B1c2goX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1leHRlcm4gaW50IG1tX2VuZF9vZl9jaHVuayAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlvcGEodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1tX3B0b3YodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwotCi0vKiBWYWx1ZXMgZm9yIG5vY2FjaGVmbGFnIGFuZCBjbW9kZSAqLwotLyogVGhlc2UgYXJlIG5vdCB1c2VkIGJ5IHRoZSBBUFVTIGtlcm5lbF9tYXAsIGJ1dCBwcmV2ZW50cwotICAgY29tcGlsYXRpb24gZXJyb3JzLiAqLwotI2RlZmluZQlLRVJORUxNQVBfRlVMTF9DQUNISU5HCQkwCi0jZGVmaW5lCUtFUk5FTE1BUF9OT0NBQ0hFX1NFUgkJMQotI2RlZmluZQlLRVJORUxNQVBfTk9DQUNIRV9OT05TRVIJMgotI2RlZmluZQlLRVJORUxNQVBfTk9fQ09QWUJBQ0sJCTMKLQotLyoKLSAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5lbF9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCWludCBub2NhY2hlZmxhZywgdW5zaWduZWQgbG9uZyAqbWVtYXZhaWxwICk7Ci0KLS8qCi0gKiBTZXQgY2FjaGUgbW9kZSBvZiAoa2VybmVsIHNwYWNlKSBhZGRyZXNzIHJhbmdlLgotICovCi1leHRlcm4gdm9pZCBrZXJuZWxfc2V0X2NhY2hlbW9kZSAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21vZGUpOwotCi0vKiBOZWVkcyB0byBiZSBkZWZpbmVkIGhlcmUgYW5kIG5vdCBpbiBsaW51eC9tbS5oLCBhcyBpdCBpcyBhcmNoIGRlcGVuZGVudCAqLwotI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikJKDEpCi0KLSNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkJCVwKLQkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKLQogLyoKICAqIE5vIHBhZ2UgdGFibGUgY2FjaGVzIHRvIGluaXRpYWxpc2UKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaAppbmRleCAzY2ZkOThmLi4zMDBmOWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaApAQCAtNywxMSArNyw3IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogRm9yIFRBU0tfU0laRSAqLwotI2luY2x1ZGUgPGFzbS9tbXUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotc3RydWN0IG1tX3N0cnVjdDsKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCkBAIC0yNyw3ICsyMyw3IEBACiAgKi8KICNkZWZpbmUgUEdUQUJMRV9FQUREUl9TSVpFIChQVEVfSU5ERVhfU0laRSArIFBNRF9JTkRFWF9TSVpFICsgXAogICAgICAgICAgICAgICAgIAkgICAgUFVEX0lOREVYX1NJWkUgKyBQR0RfSU5ERVhfU0laRSArIFBBR0VfU0hJRlQpCi0jZGVmaW5lIFBHVEFCTEVfUkFOR0UgKDFVTCA8PCBQR1RBQkxFX0VBRERSX1NJWkUpCisjZGVmaW5lIFBHVEFCTEVfUkFOR0UgKEFTTV9DT05TVCgxKSA8PCBQR1RBQkxFX0VBRERSX1NJWkUpCiAKICNpZiBUQVNLX1NJWkVfVVNFUjY0ID4gUEdUQUJMRV9SQU5HRQogI2Vycm9yIFRBU0tfU0laRV9VU0VSNjQgZXhjZWVkcyBwYWdldGFibGUgcmFuZ2UKQEAgLTM3LDE5ICszMywyOCBAQAogI2Vycm9yIFRBU0tfU0laRV9VU0VSNjQgZXhjZWVkcyB1c2VyIFZTSUQgcmFuZ2UKICNlbmRpZgogCisKIC8qCiAgKiBEZWZpbmUgdGhlIGFkZHJlc3MgcmFuZ2Ugb2YgdGhlIHZtYWxsb2MgVk0gYXJlYS4KICAqLwogI2RlZmluZSBWTUFMTE9DX1NUQVJUIEFTTV9DT05TVCgweEQwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFZNQUxMT0NfU0laRSAgQVNNX0NPTlNUKDB4ODAwMDAwMDAwMDApCisjZGVmaW5lIFZNQUxMT0NfU0laRSAgKFBHVEFCTEVfUkFOR0UgPj4gMSkKICNkZWZpbmUgVk1BTExPQ19FTkQgICAoVk1BTExPQ19TVEFSVCArIFZNQUxMT0NfU0laRSkKIAogLyoKLSAqIERlZmluZSB0aGUgYWRkcmVzcyByYW5nZSBvZiB0aGUgaW1hbGxvYyBWTSBhcmVhLgorICogRGVmaW5lIHRoZSBhZGRyZXNzIHJhbmdlcyBmb3IgTU1JTyBhbmQgSU8gc3BhY2UgOgorICoKKyAqICBJU0FfSU9fQkFTRSA9IFZNQUxMT0NfRU5ELCA2NEsgcmVzZXJ2ZWQgYXJlYQorICogIFBIQl9JT19CQVNFID0gSVNBX0lPX0JBU0UgKyA2NEsgdG8gSVNBX0lPX0JBU0UgKyAyRywgUEhCIElPIHNwYWNlcworICogSU9SRU1BUF9CQVNFID0gSVNBX0lPX0JBU0UgKyAyRyB0byBWTUFMTE9DX1NUQVJUICsgUEdUQUJMRV9SQU5HRQogICovCi0jZGVmaW5lIFBIQlNfSU9fQkFTRQlWTUFMTE9DX0VORAotI2RlZmluZSBJTUFMTE9DX0JBU0UJKFBIQlNfSU9fQkFTRSArIDB4ODAwMDAwMDB1bCkJLyogUmVzZXJ2ZSAyIGdpZ3MgZm9yIFBIQnMgKi8KLSNkZWZpbmUgSU1BTExPQ19FTkQJKFZNQUxMT0NfU1RBUlQgKyBQR1RBQkxFX1JBTkdFKQorI2RlZmluZSBGVUxMX0lPX1NJWkUJMHg4MDAwMDAwMHVsCisjZGVmaW5lICBJU0FfSU9fQkFTRQkoVk1BTExPQ19FTkQpCisjZGVmaW5lICBJU0FfSU9fRU5ECShWTUFMTE9DX0VORCArIDB4MTAwMDB1bCkKKyNkZWZpbmUgIFBIQl9JT19CQVNFCShJU0FfSU9fRU5EKQorI2RlZmluZSAgUEhCX0lPX0VORAkoVk1BTExPQ19FTkQgKyBGVUxMX0lPX1NJWkUpCisjZGVmaW5lIElPUkVNQVBfQkFTRQkoUEhCX0lPX0VORCkKKyNkZWZpbmUgSU9SRU1BUF9FTkQJKFZNQUxMT0NfU1RBUlQgKyBQR1RBQkxFX1JBTkdFKQogCiAvKgogICogUmVnaW9uIElEcwpAQCAtMTM0LDE2ICsxMzksNiBAQAogI2RlZmluZSBfX1MxMTAJUEFHRV9TSEFSRURfWAogI2RlZmluZSBfX1MxMTEJUEFHRV9TSEFSRURfWAogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0vKgotICogWkVST19QQUdFIGlzIGEgZ2xvYmFsIHNoYXJlZCBwYWdlIHRoYXQgaXMgYWx3YXlzIHplcm86IHVzZWQKLSAqIGZvciB6ZXJvLW1hcHBlZCBtZW1vcnkgYXJlYXMgZXRjLi4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRS9zaXplb2YodW5zaWduZWQgbG9uZyldOwotI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKLSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KLQogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIAogI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQpAQCAtMjMyLDkgKzIyNyw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7fQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQzt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7fQpAQCAtMjQyLDIwICsyMzUsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfdW5jYWNoZShwdGVfdCBwdGUpIHsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX05PX0NBQ0hFOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NhY2hlKHB0ZV90IHB0ZSkgICB7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfTk9fQ0FDSEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9ESVJUWSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSIHwgX1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKSB7CkBAIC0zMDcsMjkgKzI5Miw2IEBACiAJX19yOwkJCQkJCQkJICAgXAogfSkKIAotLyoKLSAqIE9uIFJXL0RJUlRZIGJpdCB0cmFuc2l0aW9ucyB3ZSBjYW4gYXZvaWQgZmx1c2hpbmcgdGhlIGhwdGUuIEZvciB0aGUKLSAqIG1vbWVudCB3ZSBhbHdheXMgZmx1c2ggYnV0IHdlIG5lZWQgdG8gZml4IGhwdGVfdXBkYXRlIGFuZCB0ZXN0IGlmIHRoZQotICogb3B0aW1pc2F0aW9uIGlzIHdvcnRoIGl0LgotICovCi1zdGF0aWMgaW5saW5lIGludCBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JdW5zaWduZWQgbG9uZyBvbGQ7Ci0KLSAgICAgICAJaWYgKChwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX0RJUlRZKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlvbGQgPSBwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCBfUEFHRV9ESVJUWSwgMCk7Ci0JcmV0dXJuIChvbGQgJiBfUEFHRV9ESVJUWSkgIT0gMDsKLX0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KF9fdm1hLCBfX2FkZHIsIF9fcHRlcCkJCSAgIFwKLSh7CQkJCQkJCQkJICAgXAotCWludCBfX3I7CQkJCQkJCSAgIFwKLQlfX3IgPSBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoKF9fdm1hKS0+dm1fbW0sIF9fYWRkciwgX19wdGVwKTsgXAotCV9fcjsJCQkJCQkJCSAgIFwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlcF9zZXRfd3Jwcm90ZWN0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICAgcHRlX3QgKnB0ZXApCkBAIC0zNTcsMTQgKzMxOSw2IEBACiAJX195b3VuZzsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICi0jZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fZGlydHkgPSBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoKF9fdm1hKS0+dm1fbW0sIF9fYWRkcmVzcywgXAotCQkJCQkJICBfX3B0ZXApOyAJCVwKLQlfX2RpcnR5OwkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCkBAIC00NDIsMTAgKzM5Niw2IEBACiAjZGVmaW5lIHBnZF9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHBnZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcGdkX3ZhbChlKSkKIAotZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW107Ci0KLWV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwotCiAvKiBFbmNvZGUgYW5kIGRlLWNvZGUgYSBzd2FwIGVudHJ5ICovCiAjZGVmaW5lIF9fc3dwX3R5cGUoZW50cnkpCSgoKGVudHJ5KS52YWwgPj4gMSkgJiAweDNmKQogI2RlZmluZSBfX3N3cF9vZmZzZXQoZW50cnkpCSgoZW50cnkpLnZhbCA+PiA4KQpAQCAtNDU2LDE3ICs0MDYsNiBAQAogI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKQkoKHB0ZV90KSB7KChvZmYpIDw8IFBURV9SUE5fU0hJRlQpfF9QQUdFX0ZJTEV9KQogI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkoQklUU19QRVJfTE9ORyAtIFBURV9SUE5fU0hJRlQpCiAKLS8qCi0gKiBrZXJuX2FkZHJfdmFsaWQgaXMgaW50ZW5kZWQgdG8gaW5kaWNhdGUgd2hldGhlciBhbiBhZGRyZXNzIGlzIGEgdmFsaWQKLSAqIGtlcm5lbCBhZGRyZXNzLiAgTW9zdCAzMi1iaXQgYXJjaHMgZGVmaW5lIGl0IGFzIGFsd2F5cyB0cnVlIChsaWtlIHRoaXMpCi0gKiBidXQgbW9zdCA2NC1iaXQgYXJjaHMgYWN0dWFsbHkgcGVyZm9ybSBhIHRlc3QuICBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPwotICogVGhlIG9ubHkgdXNlIGlzIGluIGZzL25jcGZzL2Rpci5jCi0gKi8KLSNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgxKQotCi0jZGVmaW5lIGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCQlcCi0JCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCi0KIHZvaWQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaAppbmRleCA3OGJmNGFlNy4uZDE4ZmZlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKQEAgLTIsNiArMiwxMyBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfUEdUQUJMRV9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KK3N0cnVjdCBtbV9zdHJ1Y3Q7CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpCiAjICBpbmNsdWRlIDxhc20vcGd0YWJsZS1wcGM2NC5oPgogI2Vsc2UKQEAgLTksNiArMTYsMjcgQEAKICNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCisgKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVtdOworI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKKworZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW107CisKK2V4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOworCisvKgorICoga2Vybl9hZGRyX3ZhbGlkIGlzIGludGVuZGVkIHRvIGluZGljYXRlIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBhIHZhbGlkCisgKiBrZXJuZWwgYWRkcmVzcy4gIE1vc3QgMzItYml0IGFyY2hzIGRlZmluZSBpdCBhcyBhbHdheXMgdHJ1ZSAobGlrZSB0aGlzKQorICogYnV0IG1vc3QgNjQtYml0IGFyY2hzIGFjdHVhbGx5IHBlcmZvcm0gYSB0ZXN0LiAgV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KKyAqLworI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikJKDEpCisKKyNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkJCVwKKwkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUuaD4KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAppbmRleCA4ZTIwMDUxLi5iODQ3YWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaApAQCAtMjYsNyArMjYsNyBAQAogCiBleHRlcm4gdm9pZCBmaW5kX2FuZF9pbml0X3BoYnModm9pZCk7CiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqcHBjNjRfaXNhYnJpZGdlX2RldjsJLyogbWF5IGJlIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLworZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlX3BjaWRldjsJLyogbWF5IGJlIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLwogCiAvKiogQnVzIFVuaXQgSUQgbWFjcm9zOyBnZXQgbG93IGFuZCBoaSAzMi1iaXRzIG9mIHRoZSA2NC1iaXQgQlVJRCAqLwogI2RlZmluZSBCVUlEX0hJKGJ1aWQpICgoYnVpZCkgPj4gMzIpCkBAIC00Nyw4ICs0Nyw4IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfcGhiX2J1aWQgKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKIGV4dGVybiBpbnQgcnRhc19zZXR1cF9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwogCi0vKiBGcm9tIHBTZXJpZXNfcGNpLmggKi8KLWV4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7CisvKiBGcm9tIGlTZXJpZXMgUENJICovCitleHRlcm4gdm9pZCBpU2VyaWVzX3BjaWJpb3NfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX3Byb2JlX29ubHk7CiAKQEAgLTEzOSw2ICsxMzksOSBAQAogICovCiBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBmaW5kX2RldmljZV9wZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAordm9pZCBlZWhfc3lzZnNfYWRkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Cit2b2lkIGVlaF9zeXNmc19yZW1vdmVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwogI2VuZGlmIC8qIENPTkZJR19FRUggKi8KIAogI2Vsc2UgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKaW5kZXggZDk0N2IxNi4uZTI4YjEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCkBAIC00MywxNCArNDMsNiBAQAogLyogd2hhdCBraW5kIG9mIHByZXAgd29ya3N0YXRpb24gd2UgYXJlICovCiBleHRlcm4gaW50IF9wcmVwX3R5cGU7CiAKLS8qCi0gKiBUaGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGJvYXJkIHR5cGUgZnJvbSBhIGdpdmVuIFBSZVAgYm9hcmQKLSAqIHZlbmRvci4gQm9hcmQgcmV2aXNpb24gaXMgYWxzbyBtYWRlIGF2YWlsYWJsZS4gVGhpcyB3aWxsIGJlIG1vdmVkCi0gKiBlbHNld2hlcmUgc29vbgotICovCi1leHRlcm4gdW5zaWduZWQgY2hhciB1Y0JvYXJkUmV2OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldk1haiwgdWNCb2FyZFJldk1pbjsKLQogI2VuZGlmIC8qIENPTkZJR19QUENfUFJFUCAqLwogCiAjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggNjg0NWFmOS4uMTYzMmJhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTk4LDEwICs5OCwxOSBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfY2hvc2VuOwogCiAvKiBmbGFnIGRlc2NyaXB0aW9ucyAqLwotI2RlZmluZSBPRl9EWU5BTUlDIDEgLyogbm9kZSBhbmQgcHJvcGVydGllcyB3ZXJlIGFsbG9jYXRlZCB2aWEga21hbGxvYyAqLworI2RlZmluZSBPRl9EWU5BTUlDCTEgLyogbm9kZSBhbmQgcHJvcGVydGllcyB3ZXJlIGFsbG9jYXRlZCB2aWEga21hbGxvYyAqLworI2RlZmluZSBPRl9ERVRBQ0hFRAkyIC8qIG5vZGUgaGFzIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KIAotI2RlZmluZSBPRl9JU19EWU5BTUlDKHgpIHRlc3RfYml0KE9GX0RZTkFNSUMsICZ4LT5fZmxhZ3MpCi0jZGVmaW5lIE9GX01BUktfRFlOQU1JQyh4KSBzZXRfYml0KE9GX0RZTkFNSUMsICZ4LT5fZmxhZ3MpCitzdGF0aWMgaW5saW5lIGludCBvZl9ub2RlX2NoZWNrX2ZsYWcoc3RydWN0IGRldmljZV9ub2RlICpuLCB1bnNpZ25lZCBsb25nIGZsYWcpCit7CisJcmV0dXJuIHRlc3RfYml0KGZsYWcsICZuLT5fZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb2Zfbm9kZV9zZXRfZmxhZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm4sIHVuc2lnbmVkIGxvbmcgZmxhZykKK3sKKwlzZXRfYml0KGZsYWcsICZuLT5fZmxhZ3MpOworfQorCiAKICNkZWZpbmUgSEFWRV9BUkNIX0RFVlRSRUVfRklYVVBTCiAKQEAgLTEyNCw2ICsxMzMsOSBAQAogCSAgICAgZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShkbiwgdHlwZSkpCiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX2NvbXBhdGlibGVfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCiAJY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqY29tcGF0KTsKKyNkZWZpbmUgZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKGRuLCB0eXBlLCBjb21wYXRpYmxlKSBcCisJZm9yIChkbiA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIHR5cGUsIGNvbXBhdGlibGUpOyBkbjsgXAorCSAgICAgZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShkbiwgdHlwZSwgY29tcGF0aWJsZSkpCiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGUgaGFuZGxlKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfYWxsX25vZGVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczMuaAppbmRleCAxZTA0NjUxLi5hNmYzZjVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmgKQEAgLTM1LDcgKzM1LDggQEAKIAl9OwogfTsKIAotaW50IHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdik7Cit2b2lkIHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdik7CitpbnQgcHMzX2NvbXBhcmVfZmlybXdhcmVfdmVyc2lvbih1MTYgbWFqb3IsIHUxNiBtaW5vciwgdTE2IHJldik7CiAKIC8qICdPdGhlciBPUycgYXJlYSAqLwogCkBAIC00OCwxOCArNDksNiBAQAogCiBlbnVtIHBzM19wYXJhbV9hdl9tdWx0aV9vdXQgcHMzX29zX2FyZWFfZ2V0X2F2X211bHRpX291dCh2b2lkKTsKIAotLyoqCi0gKiBzdHJ1Y3QgcHMzX2RldmljZV9pZCAtIEhWIGJ1cyBkZXZpY2UgaWRlbnRpZmllciBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeQotICogQGJ1c19pZDogSFYgYnVzIGlkLCB7MS4ufSAoemVybyBpbnZhbGlkKQotICogQGRldl9pZDogSFYgZGV2aWNlIGlkLCB7MC4ufQotICovCi0KLXN0cnVjdCBwczNfZGV2aWNlX2lkIHsKLQl1bnNpZ25lZCBpbnQgYnVzX2lkOwotCXVuc2lnbmVkIGludCBkZXZfaWQ7Ci19OwotCi0KIC8qIGRtYSByb3V0aW5lcyAqLwogCiBlbnVtIHBzM19kbWFfcGFnZV9zaXplIHsKQEAgLTc0LDYgKzYzLDggQEAKIAlQUzNfRE1BX0lOVEVSTkFMID0gMiwKIH07CiAKK3N0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHM7CisKIC8qKgogICogc3RydWN0IHBzM19kbWFfcmVnaW9uIC0gQSBwZXIgZGV2aWNlIGRtYSBzdGF0ZSB2YXJpYWJsZXMgc3RydWN0dXJlCiAgKiBAZGlkOiBUaGUgSFYgZGV2aWNlIGlkLgpAQCAtODEsMjEgKzcyLDQyIEBACiAgKiBAcmVnaW9uX3R5cGU6IFRoZSBIViByZWdpb24gdHlwZS4KICAqIEBidXNfYWRkcjogVGhlICd0cmFuc2xhdGVkJyBidXMgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgogICogQGxlbjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcmVnaW9uLgorICogQG9mZnNldDogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBtZW1vcnkgb2YgdGhlIHJlZ2lvbi4KKyAqIEBpb2lkOiBUaGUgSU9JRCBvZiB0aGUgZGV2aWNlIHdobyBvd25zIHRoaXMgcmVnaW9uCiAgKiBAY2h1bmtfbGlzdDogT3BhcXVlIHZhcmlhYmxlIHVzZWQgYnkgdGhlIGlvYyBwYWdlIG1hbmFnZXIuCisgKiBAcmVnaW9uX29wczogc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyAtIGRtYSByZWdpb24gb3BlcmF0aW9ucwogICovCiAKIHN0cnVjdCBwczNfZG1hX3JlZ2lvbiB7Ci0Jc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsKKwkvKiBkZXZpY2UgdmFyaWFibGVzICovCisJY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyAqcmVnaW9uX29wczsKKwl1bnNpZ25lZCBjaGFyIGlvaWQ7CiAJZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemU7CiAJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlOwotCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwkvKiBkcml2ZXIgdmFyaWFibGVzICAoc2V0IGJ5IHBzM19kbWFfcmVnaW9uX2NyZWF0ZSkgKi8KKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCXN0cnVjdCB7CiAJCXNwaW5sb2NrX3QgbG9jazsKIAkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCX0gY2h1bmtfbGlzdDsKIH07CiAKK3N0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgeworCWludCAoKmNyZWF0ZSkoc3RydWN0IHBzM19kbWFfcmVnaW9uICopOworCWludCAoKmZyZWUpKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqKTsKKwlpbnQgKCptYXApKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqLAorCQkgICB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkJICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCSAgIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCQkgICB1NjQgaW9wdGVfcHApOworCWludCAoKnVubWFwKShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKiwKKwkJICAgICB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgbGVuKTsKK307CiAvKioKICAqIHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9pbml0IC0gSGVscGVyIHRvIGluaXRpYWxpemUgc3RydWN0dXJlIHZhcmlhYmxlcwogICoKQEAgLTEwMywxOCArMTE1LDE2IEBACiAgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkKiBkaWQsIGVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplLAotCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZSkKLXsKLQlyLT5kaWQgPSAqZGlkOwotCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKLQlyLT5yZWdpb25fdHlwZSA9IHJlZ2lvbl90eXBlOwotfQorc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZTsKKworaW50IHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCisJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CiBpbnQgcHMzX2RtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcik7CiBpbnQgcHMzX2RtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpOwogaW50IHBzM19kbWFfbWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKTsKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJdTY0IGlvcHRlX3BwKTsKIGludCBwczNfZG1hX3VubWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbik7CiAKQEAgLTEyNSw2ICsxMzUsNyBAQAogCVBTM19NTUlPXzY0SyA9IDE2VQogfTsKIAorc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9vcHM7CiAvKioKICAqIHN0cnVjdCBwczNfbW1pb19yZWdpb24gLSBhIHBlciBkZXZpY2UgbW1pbyBzdGF0ZSB2YXJpYWJsZXMgc3RydWN0dXJlCiAgKgpAQCAtMTMyLDEzICsxNDMsMTggQEAKICAqLwogCiBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIHsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OworCWNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzICptbWlvX29wczsKIAl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCXVuc2lnbmVkIGxvbmcgbGVuOwogCWVudW0gcHMzX21taW9fcGFnZV9zaXplIHBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKIH07CiAKK3N0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHsKKwlpbnQgKCpjcmVhdGUpKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKik7CisJaW50ICgqZnJlZSkoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqKTsKK307CiAvKioKICAqIHN0cnVjdCBwczNfbW1pb19yZWdpb25faW5pdCAtIEhlbHBlciB0byBpbml0aWFsaXplIHN0cnVjdHVyZSB2YXJpYWJsZXMKICAqCkBAIC0xNDYsMTUgKzE2Miw5IEBACiAgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIsCi0JY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQqIGRpZCwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplKQotewotCXItPmRpZCA9ICpkaWQ7Ci0Jci0+YnVzX2FkZHIgPSBidXNfYWRkcjsKLQlyLT5sZW4gPSBsZW47Ci0Jci0+cGFnZV9zaXplID0gcGFnZV9zaXplOwotfQoraW50IHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwllbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpOwogaW50IHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcik7CiBpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcik7CiB1bnNpZ25lZCBsb25nIHBzM19tbV9waHlzX3RvX2xwYXIodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOwpAQCAtMTg3LDExICsxOTcsMTAgQEAKIAl1bnNpZ25lZCBpbnQgY2xhc3MsIHVuc2lnbmVkIGludCAqdmlycSk7CiBpbnQgcHMzX3NwZV9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSk7CiAKLWludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKGVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwKLQljb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLCB1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLAotCXVuc2lnbmVkIGludCAqdmlycSk7Ci1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCi0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCWVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwgdW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXVuc2lnbmVkIGludCB2aXJxKTsKIAogLyogbHYxIHJlc3VsdCBjb2RlcyAqLwogCkBAIC0yODksMTEgKzI5OCwzMyBAQAogLyogc3lzdGVtIGJ1cyByb3V0aW5lcyAqLwogCiBlbnVtIHBzM19tYXRjaF9pZCB7Ci0JUFMzX01BVENIX0lEX0VIQ0kgPSAxLAotCVBTM19NQVRDSF9JRF9PSENJLAotCVBTM19NQVRDSF9JRF9HRUxJQywKLQlQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsCi0JUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAorCVBTM19NQVRDSF9JRF9FSENJICAgICAgICAgICA9IDEsCisJUFMzX01BVENIX0lEX09IQ0kgICAgICAgICAgID0gMiwKKwlQUzNfTUFUQ0hfSURfR0VMSUMgICAgICAgICAgPSAzLAorCVBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUyAgICA9IDQsCisJUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSID0gNSwKKwlQUzNfTUFUQ0hfSURfU1RPUl9ESVNLICAgICAgPSA2LAorCVBTM19NQVRDSF9JRF9TVE9SX1JPTSAgICAgICA9IDcsCisJUFMzX01BVENIX0lEX1NUT1JfRkxBU0ggICAgID0gOCwKKwlQUzNfTUFUQ0hfSURfU09VTkQgICAgICAgICAgPSA5LAorCVBTM19NQVRDSF9JRF9HUkFQSElDUyAgICAgICA9IDEwLAorfTsKKworI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0VIQ0kgICAgICAgICAgICJwczM6MSIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19PSENJICAgICAgICAgICAicHMzOjIiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR0VMSUMgICAgICAgICAgInBzMzozIgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0FWX1NFVFRJTkdTICAgICJwczM6NCIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TWVNURU1fTUFOQUdFUiAicHMzOjUiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9ESVNLICAgICAgInBzMzo2IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX1NUT1JfUk9NICAgICAgICJwczM6NyIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TVE9SX0ZMQVNIICAgICAicHMzOjgiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU09VTkQgICAgICAgICAgInBzMzo5IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0dSQVBISUNTICAgICAgICJwczM6MTAiCisKK2VudW0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3R5cGUgeworCVBTM19ERVZJQ0VfVFlQRV9JT0MwID0gMSwKKwlQUzNfREVWSUNFX1RZUEVfU0IsCisJUFMzX0RFVklDRV9UWVBFX1ZVQVJULAogfTsKIAogLyoqCkBAIC0zMDIsMTQgKzMzMywyMyBAQAogCiBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIHsKIAllbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZDsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7Ci0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsKLS8qCXN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7IC0tIHdhaXRpbmcgZm9yIEJlbidzIGNsZWFudXBzICovCi0Jc3RydWN0IHBzM19kbWFfcmVnaW9uICpkX3JlZ2lvbjsKLQlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICptX3JlZ2lvbjsKKwllbnVtIHBzM19zeXN0ZW1fYnVzX2RldmljZV90eXBlIGRldl90eXBlOworCisJdW5zaWduZWQgaW50IGJ1c19pZDsgICAgICAgICAgICAgIC8qIFNCICovCisJdW5zaWduZWQgaW50IGRldl9pZDsgICAgICAgICAgICAgIC8qIFNCICovCisJdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsgICAgICAgIC8qIFNCICovCisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpkX3JlZ2lvbjsgIC8qIFNCLCBJT0MwICovCisJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqbV9yZWdpb247IC8qIFNCLCBJT0MwKi8KKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7ICAgICAgICAgLyogVlVBUlQgKi8KKworLyoJc3RydWN0IGlvbW11X3RhYmxlICppb21tdV90YWJsZTsgLS0gd2FpdGluZyBmb3IgQmVuSCdzIGNsZWFudXBzICovCiAJc3RydWN0IGRldmljZSBjb3JlOworCXZvaWQgKmRyaXZlcl9wcml2OyAvKiBwcml2YXRlIGRyaXZlciB2YXJpYWJsZXMgKi8KIH07CiAKK2ludCBwczNfb3Blbl9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKK2ludCBwczNfY2xvc2VfaHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7CisKIC8qKgogICogc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAtIGEgZHJpdmVyIGZvciBhIGRldmljZSBvbiB0aGUgc3lzdGVtIGJ1cwogICovCkBAIC0zMTksNiArMzU5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBjb3JlOwogCWludCAoKnByb2JlKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOwogCWludCAoKnJlbW92ZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwlpbnQgKCpzaHV0ZG93bikoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKIC8qCWludCAoKnN1c3BlbmQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsgKi8KIC8qCWludCAoKnJlc3VtZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsgKi8KIH07CkBAIC0zMjYsMTYgKzM2NywyNCBAQAogaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOwogaW50IHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpOwogdm9pZCBwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpOwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICp0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqcHMzX2Rydl90b19zeXN0ZW1fYnVzX2RydigKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIsIGNvcmUpOwogfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICp0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKnBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoCiAJc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UsIGNvcmUpOwogfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICoKKwlwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqX2RldikKK3sKKwlCVUdfT04oIV9kZXYpOworCUJVR19PTighX2Rldi0+Y29yZS5kcml2ZXIpOworCXJldHVybiBwczNfZHJ2X3RvX3N5c3RlbV9idXNfZHJ2KF9kZXYtPmNvcmUuZHJpdmVyKTsKK30KIAogLyoqCiAgKiBwczNfc3lzdGVtX2J1c19zZXRfZHJ2ZGF0YSAtCkBAIC0zNTgsMzIgKzQwNywxNyBAQAogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHBzM19zeXN0ZW1fYnVzX3R5cGU7CiAKLS8qIHZ1YXJ0IHJvdXRpbmVzICovCi0KLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2OwotCi0vKioKLSAqIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgLSBhIGRldmljZSBvbiBhIHZ1YXJ0IHBvcnQKLSAqLwotCi1zdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlIHsKLQllbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZDsKLQlzdHJ1Y3QgZGV2aWNlIGNvcmU7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYqIHByaXY7IC8qIHByaXZhdGUgZHJpdmVyIHZhcmlhYmxlcyAqLwotCi19OwotCi1pbnQgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci0KIC8qIHN5c3RlbSBtYW5hZ2VyICovCiAKLSNpZmRlZiBDT05GSUdfUFMzX1NZU19NQU5BR0VSCi12b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpOworc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgeworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsKKwl2b2lkICgqcG93ZXJfb2ZmKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZXN0YXJ0KShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworfTsKKwordm9pZCBwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzKGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfb3BzICpvcHMpOwogdm9pZCBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYodm9pZCkge30KLSNlbmRpZgordm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKTsKIAogc3RydWN0IHBzM19wcmVhbGxvYyB7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKQEAgLTM5Myw1ICs0MjcsNyBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmJfdmlkZW9tZW1vcnk7CitleHRlcm4gc3RydWN0IHBzM19wcmVhbGxvYyBwczNmbGFzaF9ib3VuY2VfYnVmZmVyOworCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNhdi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNhdi5oCmluZGV4IDllZmM0MGYuLjdkZjQyNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzYXYuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2F2LmgKQEAgLTEsMjAgKzEsMjMgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3IFNvbnkgQ29ycG9yYXRpb24KKyAqICBQUzMgQVYgYmFja2VuZCBzdXBwb3J0LgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KKwogI2lmbmRlZiBfQVNNX1BPV0VSUENfUFMzQVZfSF8KICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BTM0FWX0hfCiAKQEAgLTE1OSw2ICsxNjIsOSBAQAogI2RlZmluZSBQUzNBVl9DTURfVklERU9fRk1UX1g4UjhHOEI4CQkJMHgwMDAwCiAvKiB2aWRlb19vdXRfZm9ybWF0ICovCiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19PVVRfRk9STUFUX1JHQl8xMkJJVAkJMHgwMDAwCisvKiB2aWRlb19jbF9jbnYgKi8KKyNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9FTkFCTEVfTFVUCQkweDAwMDAKKyNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9ESVNBQkxFX0xVVAkJMHgwMDEwCiAvKiB2aWRlb19zeW5jICovCiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19TWU5DX1ZTWU5DCQkJMHgwMDAxCiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19TWU5DX0NTWU5DCQkJMHgwMDA0CkBAIC0zMTEsNiArMzE3LDggQEAKICNkZWZpbmUgUFMzQVZfTU9ERV9NQVNLCQkJCTB4MDAwRgogI2RlZmluZSBQUzNBVl9NT0RFX0hEQ1BfT0ZGCQkJMHgxMDAwCS8qIFJldGFpbCBQUzMgcHJvZHVjdCBkb2Vzbid0IHN1cHBvcnQgdGhpcyAqLwogI2RlZmluZSBQUzNBVl9NT0RFX0RJVEhFUgkJCTB4MDgwMAorI2RlZmluZSBQUzNBVl9NT0RFX0NPTE9SCQkJMHgwNDAwCisjZGVmaW5lIFBTM0FWX01PREVfV0hJVEUJCQkweDAyMDAKICNkZWZpbmUgUFMzQVZfTU9ERV9GVUxMCQkJCTB4MDA4MAogI2RlZmluZSBQUzNBVl9NT0RFX0RWSQkJCQkweDAwNDAKICNkZWZpbmUgUFMzQVZfTU9ERV9SR0IJCQkJMHgwMDIwCkBAIC01MjksOSArNTM3LDkgQEAKIAl1MzIgdmlkZW9fb3V0X2Zvcm1hdDsJLyogaW46IG91dCBmb3JtYXQgKi8KIAl1MzIgdmlkZW9fZm9ybWF0OwkvKiBpbjogaW5wdXQgZnJhbWUgYnVmZmVyIGZvcm1hdCAqLwogCXU4IHJlc2VydmVkMzsKLQl1OCByZXNlcnZlZDQ7CisJdTggdmlkZW9fY2xfY252OwkvKiBpbjogY29sb3IgY29udmVyc2lvbiAqLwogCXUxNiB2aWRlb19vcmRlcjsJLyogaW46IGlucHV0IFJHQiBvcmRlciAqLwotCXUzMiByZXNlcnZlZDU7CisJdTMyIHJlc2VydmVkNDsKIH07CiAKIC8qIHZpZGVvOiBmb3JtYXQgKi8KQEAgLTUzOSw3ICs1NDcsOCBAQAogCXN0cnVjdCBwczNhdl9zZW5kX2hkciBzZW5kX2hkcjsKIAl1MzIgdmlkZW9faGVhZDsJCS8qIGluOiBoZWFkICovCiAJdTMyIHZpZGVvX2Zvcm1hdDsJLyogaW46IGZyYW1lIGJ1ZmZlciBmb3JtYXQgKi8KLQl1MTYgcmVzZXJ2ZWQ7CisJdTggcmVzZXJ2ZWQ7CisJdTggdmlkZW9fY2xfY252OwkvKiBpbjogY29sb3IgY29udmVyc2lvbiAqLwogCXUxNiB2aWRlb19vcmRlcjsJLyogaW46IGlucHV0IFJHQiBvcmRlciAqLwogfTsKIApAQCAtNjk4LDEyICs3MDcsNiBAQAogZXh0ZXJuIGludCBwczNhdl9jbWRfdmlkZW9fZ2V0X21vbml0b3JfaW5mbyhzdHJ1Y3QgcHMzYXZfcGt0X2F2X2dldF9tb25pdG9yX2luZm8gKiwKIAkJCQkJICAgIHUzMik7CiAKLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2U7Ci1leHRlcm4gaW50IHBzM2F2X3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKLQkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIGludCBwczNhdl92dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHRpbWVvdXQpOwotCiBleHRlcm4gaW50IHBzM2F2X3NldF92aWRlb19tb2RlKHUzMiwgaW50KTsKIGV4dGVybiBpbnQgcHMzYXZfc2V0X2F1ZGlvX21vZGUodTMyLCB1MzIsIHUzMiwgdTMyLCB1MzIpOwogZXh0ZXJuIGludCBwczNhdl9nZXRfYXV0b19tb2RlKGludCk7CkBAIC03MTYsNSArNzE5LDggQEAKIGV4dGVybiBpbnQgcHMzYXZfYXVkaW9fbXV0ZShpbnQpOwogZXh0ZXJuIGludCBwczNhdl9kZXZfb3Blbih2b2lkKTsKIGV4dGVybiBpbnQgcHMzYXZfZGV2X2Nsb3NlKHZvaWQpOworZXh0ZXJuIHZvaWQgcHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwodm9pZCAoKmZsaXBfY3RsKShpbnQgb24sIHZvaWQgKmRhdGEpLAorCQkJCSAgICB2b2lkICpmbGlwX2RhdGEpOworZXh0ZXJuIHZvaWQgcHMzYXZfZmxpcF9jdGwoaW50IG9uKTsKIAogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19QUzNBVl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNmYi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNmYi5oCmluZGV4IGFkODFjZjQuLjNmMTIxZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzZmIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2ZiLmgKQEAgLTQxLDE2ICs0MSw0IEBACiAJX191MzIgbnVtX2ZyYW1lczsgLyogbnVtIG9mIGZyYW1lIGJ1ZmZlcnMgKi8KIH07CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZmRlZiBDT05GSUdfRkJfUFMzCi1leHRlcm4gdm9pZCBwczNmYl9mbGlwX2N0bChpbnQgb24pOwotZXh0ZXJuIHZvaWQgcHMzZmJfY2xlYW51cCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcHMzZmJfZmxpcF9jdGwoaW50IG9uKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHBzM2ZiX2NsZWFudXAodm9pZCkge30KLSNlbmRpZgotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BTM0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM3N0b3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzc3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2FmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM3N0b3IuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogUFMzIFN0b3JhZ2UgRGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1BTM1NUT1JfSF8KKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1BTM1NUT1JfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisKK3N0cnVjdCBwczNfc3RvcmFnZV9yZWdpb24geworCXVuc2lnbmVkIGludCBpZDsKKwl1NjQgc3RhcnQ7CisJdTY0IHNpemU7Cit9OworCitzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlIHsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIHNiZDsKKworCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkbWFfcmVnaW9uOworCXVuc2lnbmVkIGludCBpcnE7CisJdTY0IGJsa19zaXplOworCisJdTY0IHRhZzsKKwl1NjQgbHYxX3N0YXR1czsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCisJdW5zaWduZWQgbG9uZyBib3VuY2Vfc2l6ZTsKKwl2b2lkICpib3VuY2VfYnVmOworCXU2NCBib3VuY2VfbHBhcjsKKwlkbWFfYWRkcl90IGJvdW5jZV9kbWE7CisKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnM7CisJdW5zaWduZWQgbG9uZyBhY2Nlc3NpYmxlX3JlZ2lvbnM7CisJdW5zaWduZWQgaW50IHJlZ2lvbl9pZHg7CQkvKiBmaXJzdCBhY2Nlc3NpYmxlIHJlZ2lvbiAqLworCXN0cnVjdCBwczNfc3RvcmFnZV9yZWdpb24gcmVnaW9uc1swXTsJLyogTXVzdCBiZSBsYXN0ICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKnRvX3BzM19zdG9yYWdlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UsIHNiZC5jb3JlKTsKK30KKworZXh0ZXJuIGludCBwczNzdG9yX3NldHVwKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwKKwkJCSBpcnFfaGFuZGxlcl90IGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgcHMzc3Rvcl90ZWFyZG93bihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYpOworZXh0ZXJuIHU2NCBwczNzdG9yX3JlYWRfd3JpdGVfc2VjdG9ycyhzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIHU2NCBscGFyLAorCQkJCSAgICAgIHU2NCBzdGFydF9zZWN0b3IsIHU2NCBzZWN0b3JzLAorCQkJCSAgICAgIGludCB3cml0ZSk7CitleHRlcm4gdTY0IHBzM3N0b3Jfc2VuZF9jb21tYW5kKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgdTY0IGNtZCwKKwkJCQl1NjQgYXJnMSwgdTY0IGFyZzIsIHU2NCBhcmczLCB1NjQgYXJnNCk7CisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUFMzU1RPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKaW5kZXggNGFkNzdhMS4uMTNmY2NjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCkBAIC05Miw2ICs5MiwxMSBAQAogCQlzZXRfdGhyZWFkX2ZsYWcoVElGX05PRVJST1IpOyBcCiAJfSB3aGlsZSgwKQogCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwdHJhY2VfZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubyk7CitleHRlcm4gaW50IHB0cmFjZV9wdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vLAorCQkJICB1bnNpZ25lZCBsb25nIGRhdGEpOworCiAvKgogICogV2UgdXNlIHRoZSBsZWFzdC1zaWduaWZpY2FudCBiaXQgb2YgdGhlIHRyYXAgZmllbGQgdG8gaW5kaWNhdGUKICAqIHdoZXRoZXIgd2UgaGF2ZSBzYXZlZCB0aGUgZnVsbCBzZXQgb2YgcmVnaXN0ZXJzLCBvciBvbmx5IGEKQEAgLTE1OCw5ICsxNjMsNyBAQAogCiAjZGVmaW5lIFBUX05JUAkzMgogI2RlZmluZSBQVF9NU1IJMzMKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFBUX09SSUdfUjMgMzQKLSNlbmRpZgogI2RlZmluZSBQVF9DVFIJMzUKICNkZWZpbmUgUFRfTE5LCTM2CiAjZGVmaW5lIFBUX1hFUgkzNwpAQCAtMTY5LDExICsxNzIsMTIgQEAKICNkZWZpbmUgUFRfTVEJMzkKICNlbHNlCiAjZGVmaW5lIFBUX1NPRlRFIDM5CisjZW5kaWYKICNkZWZpbmUgUFRfVFJBUAk0MAogI2RlZmluZSBQVF9EQVIJNDEKICNkZWZpbmUgUFRfRFNJU1IgNDIKICNkZWZpbmUgUFRfUkVTVUxUIDQzCi0jZW5kaWYKKyNkZWZpbmUgUFRfUkVHU19DT1VOVCA0NAogCiAjZGVmaW5lIFBUX0ZQUjAJNDgJLyogZWFjaCBGUCByZWcgb2NjdXBpZXMgMiBzbG90cyBpbiB0aGlzIHNwYWNlICovCiAKQEAgLTIyOSw3ICsyMzMsMTcgQEAKICNkZWZpbmUgUFRSQUNFX0dFVF9ERUJVR1JFRwkyNQogI2RlZmluZSBQVFJBQ0VfU0VUX0RFQlVHUkVHCTI2CiAKLS8qIEFkZGl0aW9uYWwgUFRSQUNFIHJlcXVlc3RzIGltcGxlbWVudGVkIG9uIFBvd2VyUEMuICovCisvKiAobmV3KSBQVFJBQ0UgcmVxdWVzdHMgdXNpbmcgdGhlIHNhbWUgbnVtYmVycyBhcyB4ODYgYW5kIHRoZSBzYW1lCisgKiBhcmd1bWVudCBvcmRlcmluZy4gQWRkaXRpb25hbGx5LCB0aGV5IHN1cHBvcnQgbW9yZSByZWdpc3RlcnMgdG9vCisgKi8KKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKKyNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQorI2RlZmluZSBQVFJBQ0VfR0VUUkVHUzY0CSAgMjIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1M2NAkgIDIzCisKKy8qIChvbGQpIFBUUkFDRSByZXF1ZXN0cyB3aXRoIGludmVydGVkIGFyZ3VtZW50cyAqLwogI2RlZmluZSBQUENfUFRSQUNFX0dFVFJFR1MJMHg5OQkvKiBHZXQgR1BScyAwIC0gMzEgKi8KICNkZWZpbmUgUFBDX1BUUkFDRV9TRVRSRUdTCTB4OTgJLyogU2V0IEdQUnMgMCAtIDMxICovCiAjZGVmaW5lIFBQQ19QVFJBQ0VfR0VURlBSRUdTCTB4OTcJLyogR2V0IEZQUnMgMCAtIDMxICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAppbmRleCA3NDljN2Y5Li4yODEwMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKQEAgLTQ1Myw2ICs0NTMsOCBAQAogI2RlZmluZSBTUFJOX01NQ1JBCTB4MzEyCiAjZGVmaW5lICAgTU1DUkFfU0lIVgkweDEwMDAwMDAwVUwgLyogc3RhdGUgb2YgTVNSIEhWIHdoZW4gU0lBUiBzZXQgKi8KICNkZWZpbmUgICBNTUNSQV9TSVBSCTB4MDgwMDAwMDBVTCAvKiBzdGF0ZSBvZiBNU1IgUFIgd2hlbiBTSUFSIHNldCAqLworI2RlZmluZSAgIE1NQ1JBX1NMT1QJMHgwNzAwMDAwMFVMIC8qIFNMT1QgYml0cyAoMzctMzkpICovCisjZGVmaW5lICAgTU1DUkFfU0xPVF9TSElGVAkyNAogI2RlZmluZSAgIE1NQ1JBX1NBTVBMRV9FTkFCTEUgMHgwMDAwMDAwMVVMIC8qIGVuYWJsZSBzYW1wbGluZyAqLwogI2RlZmluZSAgIFBPV0VSNl9NTUNSQV9TSUhWICAgMHgwMDAwMDQwMDAwMDAwMDAwVUxMCiAjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NJUFIgICAweDAwMDAwMjAwMDAwMDAwMDBVTEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCmluZGV4IDMxZDUwNTQuLmVlZGM4MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaApAQCAtMTA2LDYgKzEwNiwxNCBAQAogc3RydWN0IHNwdV9ydW5xdWV1ZTsKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKIAorZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgeworCVNQVV9VVElMX1NZU1RFTSwKKwlTUFVfVVRJTF9VU0VSLAorCVNQVV9VVElMX0lPV0FJVCwKKwlTUFVfVVRJTF9JRExFLAorCVNQVV9VVElMX01BWAorfTsKKwogc3RydWN0IHNwdSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBsb25nIGxvY2FsX3N0b3JlX3BoeXM7CkBAIC0xNTYsNiArMTY0LDIxIEBACiAJdTY0IHNoYWRvd19pbnRfbWFza19SV1szXTsKIAogCXN0cnVjdCBzeXNfZGV2aWNlIHN5c2RldjsKKworCXN0cnVjdCB7CisJCS8qIHByb3RlY3RlZCBieSBpbnRlcnJ1cHQgcmVlbnRyYW5jeSAqLworCQllbnVtIHNwdV91dGlsaXphdGlvbl9zdGF0ZSB1dGlsaXphdGlvbl9zdGF0ZTsKKwkJdW5zaWduZWQgbG9uZyB0c3RhbXA7CQkvKiB0aW1lIG9mIGxhc3QgY3R4IHN3aXRjaCAqLworCQl1bnNpZ25lZCBsb25nIHRpbWVzW1NQVV9VVElMX01BWF07CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB2b2xfY3R4X3N3aXRjaDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGludm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWFqX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGhhc2hfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgbGliYXNzaXN0OworCX0gc3RhdHM7CiB9OwogCiBzdHJ1Y3Qgc3B1ICpzcHVfYWxsb2Modm9pZCk7CkBAIC00NDgsNiArNDcxLDcgQEAKICNkZWZpbmUgTUZDX1NUQVRFMV9QUk9CTEVNX1NUQVRFX01BU0sJCTB4MDh1bGwKICNkZWZpbmUgTUZDX1NUQVRFMV9SRUxPQ0FURV9NQVNLCQkweDEwdWxsCiAjZGVmaW5lIE1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0sJMHgyMHVsbAorI2RlZmluZSBNRkNfU1RBVEUxX1RBQkxFX1NFQVJDSF9NQVNLCQkweDQwdWxsCiAJdTY0IG1mY19scGlkX1JXOwkJCQkJLyogMHgwMDggKi8KIAl1NjQgc3B1X2lkcl9SVzsJCQkJCQkvKiAweDAxMCAqLwogCXU2NCBtZmNfdnJfUk87CQkJCQkJLyogMHgwMTggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzY2FsbHMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzY2FsbHMuaAppbmRleCBjMmZlNzlkLi5iM2NhNDFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXNjYWxscy5oCkBAIC00MywxNiArNDMsOSBAQAogCiBhc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQoc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LAogCQlzaXplX3Qgc2lnc2V0c2l6ZSk7Ci0KLSNpZm5kZWYgX19wb3dlcnBjNjRfXwotYXNtbGlua2FnZSBsb25nIHN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLAotCQlzdGFja190IF9fdXNlciAqdW9zcywgaW50IHI1LCBpbnQgcjYsIGludCByNywgaW50IHI4LAotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZWxzZSAvKiBfX3Bvd2VycGM2NF9fICovCiBhc21saW5rYWdlIGxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsCiAJCXN0YWNrX3QgX191c2VyICp1b3NzLCB1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LAogCQl1bnNpZ25lZCBsb25nIHI3LCB1bnNpZ25lZCBsb25nIHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfU1lTQ0FMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKaW5kZXggMDk2MjFmNi4uMzJhYTQyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCkBAIC00Myw3ICs0Myw3IEBACiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBzbXBfbWIoKQltYigpCiAjZGVmaW5lIHNtcF9ybWIoKQlybWIoKQotI2RlZmluZSBzbXBfd21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHNtcF93bWIoKQllaWVpbygpCiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCXJlYWRfYmFycmllcl9kZXBlbmRzKCkKICNlbHNlCiAjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQpAQCAtNTU5LDUgKzU1OSw3IEBACiBleHRlcm4gdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAjZW5kaWYKIAorZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnBvd2VycGNfZGVidWdmc19yb290OworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCmluZGV4IDVlNzkxOTguLjY2OTgxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKQEAgLTE1Miw2ICsxNTIsMTAgQEAKICNkZWZpbmUgQjMwMDAwMDAgIDAwMDM0CiAjZGVmaW5lIEIzNTAwMDAwICAwMDAzNQogI2RlZmluZSBCNDAwMDAwMCAgMDAwMzYKKyNkZWZpbmUgICBCT1RIRVIgIDAwMDM3CisKKyNkZWZpbmUgQ0lCQVVECTA3NzYwMDAwMAorI2RlZmluZSBJQlNISUZUCTE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLwogCiAjZGVmaW5lIENTSVpFCTAwMDAxNDAwCiAjZGVmaW5lICAgQ1M1CTAwMDAwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKaW5kZXggM2YzMmNhOC4uOWQ5YWVjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaApAQCAtMTEzLDggKzExMyw4IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwk0CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZwogCQkJCQkgICBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl8zMkJJVAkJNQkvKiAzMiBiaXQgYmluYXJ5ICovCi0jZGVmaW5lIFRJRl9SVU5MQVRDSAkJNgkvKiBJcyB0aGUgcnVubGF0Y2ggZW5hYmxlZD8gKi8KLSNkZWZpbmUgVElGX0FCSV9QRU5ESU5HCQk3CS8qIDMyLzY0IGJpdCBzd2l0Y2ggbmVlZGVkICovCisjZGVmaW5lIFRJRl9QRVJGTU9OX1dPUksJNgkvKiB3b3JrIGZvciBwZm1faGFuZGxlX3dvcmsoKSAqLworI2RlZmluZSBUSUZfUEVSRk1PTl9DVFhTVwk3CS8qIHBlcmZtb24gbmVlZHMgY3R4c3cgY2FsbHMgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJOAkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0lOR0xFU1RFUAkJOQkvKiBzaW5nbGVzdGVwcGluZyBhY3RpdmUgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTAKQEAgLTEyMyw2ICsxMjMsOCBAQAogI2RlZmluZSBUSUZfTk9FUlJPUgkJMTQJLyogRm9yY2Ugc3VjY2Vzc2Z1bCBzeXNjYWxsIHJldHVybiAqLwogI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTE1CS8qIFJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE2CS8qIEZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9SVU5MQVRDSAkJMTcJLyogSXMgdGhlIHJ1bmxhdGNoIGVuYWJsZWQ/ICovCisjZGVmaW5lIFRJRl9BQklfUEVORElORwkJMTgJLyogMzIvNjQgYml0IHN3aXRjaCBuZWVkZWQgKi8KIAogLyogYXMgYWJvdmUsIGJ1dCBhcyBiaXQgdmFsdWVzICovCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCkBAIC0xMzEsOCArMTMzLDggQEAKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDE8PFRJRl9ORUVEX1JFU0NIRUQpCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKICNkZWZpbmUgX1RJRl8zMkJJVAkJKDE8PFRJRl8zMkJJVCkKLSNkZWZpbmUgX1RJRl9SVU5MQVRDSAkJKDE8PFRJRl9SVU5MQVRDSCkKLSNkZWZpbmUgX1RJRl9BQklfUEVORElORwkoMTw8VElGX0FCSV9QRU5ESU5HKQorI2RlZmluZSBfVElGX1BFUkZNT05fV09SSwkoMTw8VElGX1BFUkZNT05fV09SSykKKyNkZWZpbmUgX1RJRl9QRVJGTU9OX0NUWFNXCSgxPDxUSUZfUEVSRk1PTl9DVFhTVykKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxPDxUSUZfU1lTQ0FMTF9BVURJVCkKICNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQCQkoMTw8VElGX1NJTkdMRVNURVApCiAjZGVmaW5lIF9USUZfU0VDQ09NUAkJKDE8PFRJRl9TRUNDT01QKQpAQCAtMTQwLDYgKzE0Miw4IEBACiAjZGVmaW5lIF9USUZfTk9FUlJPUgkJKDE8PFRJRl9OT0VSUk9SKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKICNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxPDxUSUZfRlJFRVpFKQorI2RlZmluZSBfVElGX1JVTkxBVENICQkoMTw8VElGX1JVTkxBVENIKQorI2RlZmluZSBfVElGX0FCSV9QRU5ESU5HCSgxPDxUSUZfQUJJX1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UX09SX0EJKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TRUNDT01QKQogCiAjZGVmaW5lIF9USUZfVVNFUl9XT1JLX01BU0sJKF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfU0lHUEVORElORyB8IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKaW5kZXggM2ZkNTdjMC4uZDdmNWRkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKQEAgLTIzMiw3ICsyMzIsNyBAQAogI2RlZmluZSBhY2NvdW50X3Byb2Nlc3NfdnRpbWUodHNrKQkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HKSAmJiBkZWZpbmVkKENPTkZJR19QUENfU1BMUEFSKQorI2lmIGRlZmluZWQoQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcpCiBleHRlcm4gdm9pZCBjYWxjdWxhdGVfc3RlYWxfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHNuYXBzaG90X3RpbWViYXNlcyh2b2lkKTsKICNlbHNlCkBAIC0yNDAsNSArMjQwLDcgQEAKICNkZWZpbmUgc25hcHNob3RfdGltZWJhc2VzKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgaVNlcmllc190aW1lX2luaXRfZWFybHkodm9pZCk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19QT1dFUlBDX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oCmluZGV4IDg2ZTYyNjYuLjk5YTA0MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYmZsdXNoLmgKQEAgLTE1NSw2ICsxNTUsMTEgQEAKIHsKIH0KIAorLyogUHJpdmF0ZSBmdW5jdGlvbiBmb3IgdXNlIGJ5IFBDSSBJTyBtYXBwaW5nIGNvZGUgKi8KK2V4dGVybiB2b2lkIF9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oCmluZGV4IDlkMGNlOWYuLmMxNTkzMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3BndGFibGUuaApAQCAtNTMzLDkgKzUzMyw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KQEAgLTU0MywyMSArNTQxLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VuY2FjaGUocHRlX3QgcHRlKSAgICAgICB7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9OT19DQUNIRTsgfQogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jYWNoZShwdGVfdCBwdGUpICAgICAgICAgeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX05PX0NBQ0hFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SVyB8IF9QQUdFX0hXV1JJVEUpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX0RJUlRZIHwgX1BBR0VfSFdXUklURSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVIgfCBfUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpIHsKQEAgLTY2NCwxMyArNjU0LDYgQEAKICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXApIFwKIAlfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoKF9fdm1hKS0+dm1fbW0tPmNvbnRleHQuaWQsIF9fYWRkciwgX19wdGVwKQogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXJldHVybiAocHRlX3VwZGF0ZShwdGVwLCAoX1BBR0VfRElSVFkgfCBfUEFHRV9IV1dSSVRFKSwgMCkgJiBfUEFHRV9ESVJUWSkgIT0gMDsKLX0KLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICAgIHB0ZV90ICpwdGVwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmgKaW5kZXggMjk2ZjRmMS4uN2Y0YWQ2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oCkBAIC02MCw4ICs2MCwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhjMTJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvZG1hLW1hcHBpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiAgaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oCi0gKgotICogIFMzOTAgdmVyc2lvbgotICoKLSAqICBUaGlzIGZpbGUgZXhpc3RzIHNvIHRoYXQgI2luY2x1ZGUgPGRtYS1tYXBwaW5nLmg+IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcuCi0gKi8KLQotI2lmbmRlZiBfQVNNX0RNQV9NQVBQSU5HX0gKLSNkZWZpbmUgX0FTTV9ETUFfTUFQUElOR19ICi0KLSNlbmRpZiAvKiBfQVNNX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZmIuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tczM5MC9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oCmluZGV4IDA1ZWE2ZjEuLmYzMjY0NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oCkBAIC02NCw3ICs2NCw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKaW5kZXggMGEzMDdiYi4uMzIwOGRjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKQEAgLTUzMCwxNCArNTMwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCS8qIEFsbCBwYWdlcyBhcmUgcmVhZGFibGUgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoZSBmZXRjaAotCSAqIHByb3RlY3Rpb24gYml0IGluIHRoZSBzdG9yYWdlIGtleS4KLQkgKi8KLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIHBnZC9wbWQvcHRlIG1vZGlmaWNhdGlvbiBmdW5jdGlvbnMKICAqLwpAQCAtNjc3LDE5ICs2NjksNiBAQAogCXJldHVybiBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKLXsKLQkvKiBObyBuZWVkIHRvIGZsdXNoIFRMQjsgYml0cyBhcmUgaW4gc3RvcmFnZSBrZXkgKi8KLQlyZXR1cm4gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSh2bWEsIGFkZHJlc3MsIHB0ZXApOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlwdGVfdCBwdGUgPSAqcHRlcDsKQEAgLTcxNSwxNiArNjk0LDE5IEBACiAJcHRlX3ZhbCgqcHRlcCkgPSBfUEFHRV9UWVBFX0VNUFRZOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90Ci1wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX2ludmFsaWRhdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3sKKwlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKKwlwdGVwID0gZ2V0X3NoYWRvd19wdGUocHRlcCk7CisJaWYgKHB0ZXApCisJCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfY2xlYXJfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQogewogCXB0ZV90IHB0ZSA9ICpwdGVwOwotCXB0ZV90ICpzaGFkb3dfcHRlID0gZ2V0X3NoYWRvd19wdGUocHRlcCk7Ci0KLQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKLQlpZiAoc2hhZG93X3B0ZSkKLQkJX19wdGVwX2lwdGUoYWRkcmVzcywgc2hhZG93X3B0ZSk7CisJcHRlcF9pbnZhbGlkYXRlKGFkZHJlc3MsIHB0ZXApOwogCXJldHVybiBwdGU7CiB9CiAKQEAgLTczNCwyMSArNzE2LDE0IEBACiAJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlX3dycHJvdGVjdChvbGRfcHRlKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcHRlcF9lc3RhYmxpc2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIAotCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLAotCSAgICAgICBwdGVfdCBlbnRyeSkKLXsKLQlwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHRlcCk7Ci0Jc2V0X3B0ZShwdGVwLCBlbnRyeSk7Ci19Ci0KLSNkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSwgX19kaXJ0eSkgXAotKHsJCQkJCQkJCQkgIFwKLQlpbnQgX19jaGFuZ2VkID0gIXB0ZV9zYW1lKCooX19wdGVwKSwgX19lbnRyeSk7CQkJICBcCi0JaWYgKF9fY2hhbmdlZCkJCQkJCQkJICBcCi0JCXB0ZXBfZXN0YWJsaXNoKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSk7CSAgXAotCV9fY2hhbmdlZDsJCQkJCQkJICBcCisjZGVmaW5lIHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnksIF9fZGlydHkpCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQlcCisJaWYgKF9fY2hhbmdlZCkgewkJCQkJCVwKKwkJcHRlcF9pbnZhbGlkYXRlKF9fYWRkciwgX19wdGVwKTsJCQlcCisJCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIF9fYWRkciwgX19wdGVwLCBfX2VudHJ5KTsJXAorCX0JCQkJCQkJCVwKKwlfX2NoYW5nZWQ7CQkJCQkJCVwKIH0pCiAKIC8qCkBAIC05NDgsMTIgKzkyMyw5IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1BUF9JTklUCiBleHRlcm4gdm9pZCBtZW1tYXBfaW5pdCh1bnNpZ25lZCBsb25nLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfRVNUQUJMSVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfWU9VTkdfRkxVU0gKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0ZMVVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYnVncy5oIGIvaW5jbHVkZS9hc20tc2gvYnVncy5oCmluZGV4IDVhMTE3ZWMuLmFlZWU4ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAljdXJyZW50X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIAogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS50eXBlKSB7Ci0JY2FzZSBDUFVfU0g3NjA0IC4uLiBDUFVfU0g3NjE5OgorCWNhc2UgQ1BVX1NINzYxOToKIAkJKnArKyA9ICcyJzsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfU0g3MjA2OgpAQCAtMzUsNyArMzUsNyBAQAogCWNhc2UgQ1BVX1NINzc1MCAuLi4gQ1BVX1NINF81MDE6CiAJCSpwKysgPSAnNCc7CiAJCWJyZWFrOwotCWNhc2UgQ1BVX1NINzc3MCAuLi4gQ1BVX1NINzc4NToKKwljYXNlIENQVV9TSDc3NzAgLi4uIENQVV9TSFgzOgogCQkqcCsrID0gJzQnOwogCQkqcCsrID0gJ2EnOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oCmluZGV4IDlhM2NiNmIuLjdhMTg2NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY2FjaGUuaApAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgX19BU01fU0hfQ0FDSEVfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vY3B1L2NhY2hlLmg+CiAKICNkZWZpbmUgU0hfQ0FDSEVfVkFMSUQJCTEKQEAgLTQ4LDYgKzQ5LDkgQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OworCitpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKTsKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmgKaW5kZXggMjBiOTc5Ni4uZjAyYmE3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGUuaApAQCAtMTIsMjMgKzEyLDcgQEAKIAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAk0CiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0jZGVmaW5lIENDUgkJMHhmZmZmZmU5MgkvKiBBZGRyZXNzIG9mIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBDQ1JfQ0FDSEVfQ0UJMHgwMQkvKiBDYWNoZSBlbmFibGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX0lECTB4MDIJLyogSW5zdHJ1Y3Rpb24gUmVwbGFjZW1lbnQgZGlzYWJsZSAqLwotI2RlZmluZSBDQ1JfQ0FDSEVfT0QJMHgwNAkvKiBEYXRhIFJlcGxhY2VtZW50IGRpc2FibGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX1RXCTB4MDgJLyogVHdvLXdheSBtb2RlICovCi0jZGVmaW5lIENDUl9DQUNIRV9DUAkweDEwCS8qIENhY2hlIHB1cmdlICovCi0KLSNkZWZpbmUgQ0FDSEVfT0NfQUREUkVTU19BUlJBWQkweDYwMDAwMDAwCi0KLSNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKLSNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NQCi0jZGVmaW5lIENDUl9DQUNIRV9PUkEJCUNDUl9DQUNIRV9UVwotI2RlZmluZSBDQ1JfQ0FDSEVfV1QJCTB4MDAJLyogU0gtMiBpcyBfYWx3YXlzXyB3cml0ZS10aHJvdWdoICovCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCiAjZGVmaW5lIENDUjEJCTB4ZmZmZmZmZWMKICNkZWZpbmUgQ0NSCQlDQ1IxCiAKQEAgLTQ5LDUgKzMzLDUgQEAKICNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKICNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NGCiAjZW5kaWYKLSNlbmRpZiAvKiBfX0FTTV9DUFVfU0gyX0NBQ0hFX0ggKi8KIAorI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oCmluZGV4IGIyMzk0Y2YuLjQ5MjhiMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCi0jZGVmaW5lIFRNVV9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhhNDEyZmU5NAkvKiBMb25nIGFjY2VzcyAqLwogI2RlZmluZSBUTVUwX1RDTlQJMHhhNDEyZmU5OAkvKiBMb25nIGFjY2VzcyAqLwpAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBUTVUyX1RDUgkweGE0MTJmZWI0CS8qIFdvcmQgYWNjZXNzICovCiAKICNlbHNlCi0jZGVmaW5lIFRNVV9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhmZmZmZmU5NAkvKiBMb25nIGFjY2VzcyAqLwogI2RlZmluZSBUTVUwX1RDTlQJMHhmZmZmZmU5OAkvKiBMb25nIGFjY2VzcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAppbmRleCAzOWY0MWZjLi4wMjYwMjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaApAQCAtMjIsNiArMjIsOCBAQAogI2RlZmluZSBGUlFDUjAJCQkweGZmYzgwMDAwCiAjZGVmaW5lIEZSUUNSMQkJCTB4ZmZjODAwMDQKICNkZWZpbmUgRlJRTVIxCQkJMHhmZmM4MDAxNAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKKyNkZWZpbmUgRlJRQ1IJCQkweGZmYzAwMDE0CiAjZWxzZQogI2RlZmluZSBGUlFDUgkJCTB4ZmZjMDAwMDAKICNkZWZpbmUgRlJRQ1JfUFNUQlkJCTB4MDIwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCmluZGV4IDhhNGFmMTIuLmQxZTc5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3RpbWVyLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IExpbmVvIFNvbHV0aW9ucywgSW5jLiAKKyAqIENvcHlyaWdodCAoQykgMjAwNCBMaW5lbyBTb2x1dGlvbnMsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMTYsMzYgKzE2LDQ1IEBACiAgKglTSDc3NTBTL1NINzc1MFIKICAqCVNINzc1MS9TSDc3NTFSCiAgKglTSDc3NjAKKyAqCVNILVgzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotCi0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLSNkZWZpbmUgVE1VX1RPQ1IgICAgICAgIDB4ZmZkODAwMDAgICAgICAvKiBCeXRlIGFjY2VzcyAqLworI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzCisjZGVmaW5lIFRNVV8wMTJfQkFTRQkweGZmYzEwMDAwCisjZGVmaW5lIFRNVV8zNDVfQkFTRQkweGZmYzIwMDAwCisjZWxzZQorI2RlZmluZSBUTVVfMDEyX0JBU0UJMHhmZmQ4MDAwMAorI2RlZmluZSBUTVVfMzQ1X0JBU0UJMHhmZTEwMDAwMAogI2VuZGlmCi0jZGVmaW5lIFRNVV9UU1RSICAgICAgICAweGZmZDgwMDA0ICAgICAgLyogQnl0ZSBhY2Nlc3MgKi8KIAotI2RlZmluZSBUTVUwX1RDT1IgICAgICAgMHhmZmQ4MDAwOCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENOVCAgICAgICAweGZmZDgwMDBjICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMF9UQ1IgICAgICAgIDB4ZmZkODAwMTAgICAgICAvKiBXb3JkIGFjY2VzcyAqLworI2RlZmluZSBUTVVfVE9DUglUTVVfMDEyX0JBU0UJLyogTm90IHN1cHBvcnRlZCBvbiBhbGwgQ1BVcyAqLwogCi0jZGVmaW5lIFRNVTFfVENPUiAgICAgICAweGZmZDgwMDE0ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMV9UQ05UICAgICAgIDB4ZmZkODAwMTggICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDUiAgICAgICAgMHhmZmQ4MDAxYyAgICAgIC8qIFdvcmQgYWNjZXNzICovCisjZGVmaW5lIFRNVV8wMTJfVFNUUgkoVE1VXzAxMl9CQVNFICsgMHgwNCkKKyNkZWZpbmUgVE1VXzM0NV9UU1RSCShUTVVfMzQ1X0JBU0UgKyAweDA0KQogCi0jZGVmaW5lIFRNVTJfVENPUiAgICAgICAweGZmZDgwMDIwICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ05UICAgICAgIDB4ZmZkODAwMjQgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUyX1RDUiAgICAgICAgMHhmZmQ4MDAyOCAgICAgIC8qIFdvcmQgYWNjZXNzICovCi0jZGVmaW5lIFRNVTJfVENQUgkweGZmZDgwMDJjCS8qIExvbmcgYWNjZXNzICovCisjZGVmaW5lIFRNVTBfVENPUgkoVE1VXzAxMl9CQVNFICsgMHgwOCkKKyNkZWZpbmUgVE1VMF9UQ05UCShUTVVfMDEyX0JBU0UgKyAweDBjKQorI2RlZmluZSBUTVUwX1RDUgkoVE1VXzAxMl9CQVNFICsgMHgxMCkKIAotI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCi0jZGVmaW5lIFRNVTNfVENPUiAgICAgICAweGZlMTAwMDA4ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VM19UQ05UICAgICAgIDB4ZmUxMDAwMGMgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUzX1RDUiAgICAgICAgMHhmZTEwMDAxMCAgICAgIC8qIFdvcmQgYWNjZXNzICovCisjZGVmaW5lIFRNVTFfVENPUiAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgxNCkKKyNkZWZpbmUgVE1VMV9UQ05UICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDE4KQorI2RlZmluZSBUTVUxX1RDUiAgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MWMpCiAKLSNkZWZpbmUgVE1VNF9UQ09SICAgICAgIDB4ZmUxMDAwMTQgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVU0X1RDTlQgICAgICAgMHhmZTEwMDAxOCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTRfVENSICAgICAgICAweGZlMTAwMDFjICAgICAgLyogV29yZCBhY2Nlc3MgKi8KLSNlbmRpZgorI2RlZmluZSBUTVUyX1RDT1IgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MjApCisjZGVmaW5lIFRNVTJfVENOVCAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgyNCkKKyNkZWZpbmUgVE1VMl9UQ1IJKFRNVV8wMTJfQkFTRSArIDB4MjgpCisjZGVmaW5lIFRNVTJfVENQUgkoVE1VXzAxMl9CQVNFICsgMHgyYykKKworI2RlZmluZSBUTVUzX1RDT1IJKFRNVV8zNDVfQkFTRSArIDB4MDgpCisjZGVmaW5lIFRNVTNfVENOVAkoVE1VXzM0NV9CQVNFICsgMHgwYykKKyNkZWZpbmUgVE1VM19UQ1IJKFRNVV8zNDVfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgVE1VNF9UQ09SCShUTVVfMzQ1X0JBU0UgKyAweDE0KQorI2RlZmluZSBUTVU0X1RDTlQJKFRNVV8zNDVfQkFTRSArIDB4MTgpCisjZGVmaW5lIFRNVTRfVENSCShUTVVfMzQ1X0JBU0UgKyAweDFjKQorCisjZGVmaW5lIFRNVTVfVENPUgkoVE1VXzM0NV9CQVNFICsgMHgyMCkKKyNkZWZpbmUgVE1VNV9UQ05UCShUTVVfMzQ1X0JBU0UgKyAweDI0KQorI2RlZmluZSBUTVU1X1RDUgkoVE1VXzM0NV9CQVNFICsgMHgyOCkKIAogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfVElNRVJfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mYi5oIGIvaW5jbHVkZS9hc20tc2gvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJlOTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZnV0ZXgtaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9mdXRleC1pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYxNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXgtaXJxLmgKQEAgLTAsMCArMSwxMTEgQEAKKyNpZm5kZWYgX19BU01fU0hfRlVURVhfSVJRX0gKKyNkZWZpbmUgX19BU01fU0hfRlVURVhfSVJRX0gKKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfc2V0KGludCBvcGFyZywgaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCSAgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIob3BhcmcsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19mdXRleF9vcF94Y2hnX2FkZChpbnQgb3BhcmcsIGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkgICBpbnQgKm9sZHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcigqb2xkdmFsLCB1YWRkcik7CisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyKCpvbGR2YWwgKyBvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfb3IoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICBpbnQgKm9sZHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcigqb2xkdmFsLCB1YWRkcik7CisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyKCpvbGR2YWwgfCBvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfYW5kKGludCBvcGFyZywgaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCSAgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKm9sZHZhbCAmIG9wYXJnLCB1YWRkcik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ194b3IoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICAgaW50ICpvbGR2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIoKm9sZHZhbCwgdWFkZHIpOworCWlmICghcmV0KQorCQlyZXQgPSBwdXRfdXNlcigqb2xkdmFsIF4gb3BhcmcsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19mdXRleF9vcF9jbXB4Y2hnX2luYXRvbWljKGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkJICAgaW50IG9sZHZhbCwgaW50IG5ld3ZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQsIHByZXYgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIocHJldiwgdWFkZHIpOworCWlmICghcmV0ICYmIG9sZHZhbCA9PSBwcmV2KQorCQlyZXQgPSBwdXRfdXNlcihuZXd2YWwsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcHJldjsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NIX0ZVVEVYX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mdXRleC5oIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaAppbmRleCA2YTMzMmE5Li43NGVkMzY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmgKQEAgLTEsNiArMSw3NyBAQAotI2lmbmRlZiBfQVNNX0ZVVEVYX0gKLSNkZWZpbmUgX0FTTV9GVVRFWF9ICisjaWZuZGVmIF9fQVNNX1NIX0ZVVEVYX0gKKyNkZWZpbmUgX19BU01fU0hfRlVURVhfSAogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KKyNpZmRlZiBfX0tFUk5FTF9fCiAKLSNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogWFhYOiBVUCB2YXJpYW50cywgZml4IGZvciBTSC00QSBhbmQgU01QLi4gKi8KKyNpbmNsdWRlIDxhc20vZnV0ZXgtaXJxLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGZ1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCXJldCA9IGF0b21pY19mdXRleF9vcF94Y2hnX3NldChvcGFyZywgdWFkZHIsICZvbGR2YWwpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX0FERDoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfYWRkKG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfT1I6CisJCXJldCA9IGF0b21pY19mdXRleF9vcF94Y2hnX29yKG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQU5ETjoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfYW5kKH5vcGFyZywgdWFkZHIsICZvbGR2YWwpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX1hPUjoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfeG9yKG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKGludCBfX3VzZXIgKnVhZGRyLCBpbnQgb2xkdmFsLCBpbnQgbmV3dmFsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gYXRvbWljX2Z1dGV4X29wX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIG9sZHZhbCwgbmV3dmFsKTsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9TSF9GVVRFWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmggYi9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmgKaW5kZXggMjdlNWMzNC4uNGRkODU5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEuaApAQCAtMSwyMDAgKzEsMjQxIEBACiAjaWZuZGVmIF9fQVNNX1NIX0hENjQ0NjEKICNkZWZpbmUgX19BU01fU0hfSEQ2NDQ2MQogLyoKLSAqCSRJZDogaGQ2NDQ2MS5oLHYgMS41IDIwMDQvMDMvMTYgMDA6MDc6NTEgbGV0aGFsIEV4cCAkCisgKglDb3B5cmlnaHQgKEMpIDIwMDcgS3Jpc3RvZmZlciBFcmljc29uIDxLcmlzdG9mZmVyLkVyaWNzb25AZ21haWwuY29tPgorICoJQ29weXJpZ2h0IChDKSAyMDA0IFBhdWwgTXVuZHQKICAqCUNvcHlyaWdodCAoQykgMjAwMCBZQUVHQVNISSBUYWtlc2hpCi0gKglIaXRhY2hpIEhENjQ0NjEgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAorICoKKyAqCQlIaXRhY2hpIEhENjQ0NjEgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAorICoJKHBsZWFzZSBub3RlIG1hbnVhbCByZWZlcmVuY2UgMHgxMDAwMDAwMCA9IDB4YjAwMDAwMDApCiAgKi8KIAogLyogQ29uc3RhbnRzIGZvciBQQ01DSUEgbWFwcGluZ3MgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NfV0lORE9XCTB4MDEwMDAwMDAKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NfV0lORE9XCTB4MDEwMDAwMDAKIAotI2RlZmluZSBIRDY0NDYxX1BDQzBfQkFTRQkweGI4MDAwMDAwCS8qIGFyZWEgNiAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBfQVRUUgkoSEQ2NDQ2MV9QQ0MwX0JBU0UpCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9DT01NCShIRDY0NDYxX1BDQzBfQkFTRStIRDY0NDYxX1BDQ19XSU5ET1cpCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9JTwkJKEhENjQ0NjFfUENDMF9CQVNFKzIqSEQ2NDQ2MV9QQ0NfV0lORE9XKQorLyogQXJlYSA2IC0gU2xvdCAwIC0gbWVtb3J5IGFuZC9vciBJTyBjYXJkICovCisjZGVmaW5lCUhENjQ0NjFfUENDMF9CQVNFCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDgwMDAwMDApCisjZGVmaW5lCUhENjQ0NjFfUENDMF9BVFRSCShIRDY0NDYxX1BDQzBfQkFTRSkJCQkJLyogMHhiODAwMDAwMDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0NPTU0JKEhENjQ0NjFfUENDMF9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykJCS8qIDB4YjkwMDAwMDAwICovCisjZGVmaW5lCUhENjQ0NjFfUENDMF9JTwkJKEhENjQ0NjFfUENDMF9CQVNFKzIqSEQ2NDQ2MV9QQ0NfV0lORE9XKQkvKiAweGJhMDAwMDAwMCAqLwogCi0jZGVmaW5lIEhENjQ0NjFfUENDMV9CQVNFCTB4YjQwMDAwMDAJLyogYXJlYSA1ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMV9BVFRSCShIRDY0NDYxX1BDQzFfQkFTRSkKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxX0NPTU0JKEhENjQ0NjFfUENDMV9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykKKy8qIEFyZWEgNSAtIFNsb3QgMSAtIG1lbW9yeSBjYXJkIG9ubHkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxX0JBU0UJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwMDAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxX0FUVFIJKEhENjQ0NjFfUENDMV9CQVNFKQkJCQkvKiAweGI0MDAwMDAwICovCisjZGVmaW5lCUhENjQ0NjFfUENDMV9DT01NCShIRDY0NDYxX1BDQzFfQkFTRStIRDY0NDYxX1BDQ19XSU5ET1cpCQkvKiAweGI1MDAwMDAwICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUgkweDEwMDAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfQ0tJT19TVEJZCQkJMHgyMDAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9JU1QJCTB4MTAwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NMQ0tFX0lTVAkJCTB4MDgwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NBRkVDS0VfT1NUCQkweDA0MDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TTENLRV9PU1QJCQkweDAyMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TTUlBU1QJCQkweDAxMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TTENEU1QJCQkweDAwODAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TUEMwU1QJCQkweDAwNDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TUEMxU1QJCQkweDAwMjAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TQUZFU1QJCQkweDAwMTAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TVE0wU1QJCQkweDAwMDgKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TVE0xU1QJCQkweDAwMDQKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TSVJTVAkJCQkweDAwMDIKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TVVJUU1QJCQkweDAwMDEKKy8qIFN0YW5kYnkgQ29udHJvbCBSZWdpc3RlciBmb3IgSEQ2NDQ2MSAqLworI2RlZmluZQlIRDY0NDYxX1NUQkNSCQkJQ09ORklHX0hENjQ0NjFfSU9CQVNFCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfQ0tJT19TVEJZCQkweDIwMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TQUZFQ0tFX0lTVAkweDEwMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TTENLRV9JU1QJCTB4MDgwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVDS0VfT1NUCTB4MDQwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0tFX09TVAkJMHgwMjAwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU01JQVNUCQkweDAxMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TTENEU1QJCTB4MDA4MAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NQQzBTVAkJMHgwMDQwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1BDMVNUCQkweDAwMjAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TQUZFU1QJCTB4MDAxMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NUTTBTVAkJMHgwMDA4CisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1RNMVNUCQkweDAwMDQKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TSVJTVAkJMHgwMDAyCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1VSVFNUCQkweDAwMDEKIAotI2RlZmluZSBIRDY0NDYxX1NZU0NSCTB4MTAwMDIKLSNkZWZpbmUgSEQ2NDQ2MV9TQ1BVQ1IJMHgxMDAwNAorLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9TWVNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MDIpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQkFSCQkweDExMDAwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0xPUgkJMHgxMTAwMgotI2RlZmluZSBIRDY0NDYxX0xDRENDUgkJMHgxMTAwNAotI2RlZmluZSBIRDY0NDYxX0xDRENDUl9TVEJBQ0sJMHgwNDAwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NUUkVRCTB4MDEwMAotI2RlZmluZSBIRDY0NDYxX0xDRENDUl9NT0ZGCTB4MDA4MAotI2RlZmluZSBIRDY0NDYxX0xDRENDUl9SRUZTRUwJMHgwMDQwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX0VQT04JMHgwMDIwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NQT04JMHgwMDEwCisvKiBDUFUgRGF0YSBCdXMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1NDUFVDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MDQpCiAKLSNkZWZpbmUJSEQ2NDQ2MV9MRFIxCQkweDExMDEwCi0jZGVmaW5lCUhENjQ0NjFfTERSMV9ET04JMHgwMQotI2RlZmluZQlIRDY0NDYxX0xEUjFfRElOVgkweDgwCisvKiBCYXNlIEFkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0xDRENCQVIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMDApCiAKLSNkZWZpbmUJSEQ2NDQ2MV9MRFIyCQkweDExMDEyCi0jZGVmaW5lCUhENjQ0NjFfTERITkNSCQkweDExMDE0Ci0jZGVmaW5lCUhENjQ0NjFfTERITlNSCQkweDExMDE2Ci0jZGVmaW5lIEhENjQ0NjFfTERWTlRSCQkweDExMDE4Ci0jZGVmaW5lIEhENjQ0NjFfTERWTkRSCQkweDExMDFhCi0jZGVmaW5lIEhENjQ0NjFfTERWU1BSCQkweDExMDFjCi0jZGVmaW5lIEhENjQ0NjFfTERSMwkJMHgxMTAxZQorLyogTGluZSBpbmNyZW1lbnQgYWRyZXNzICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0xPUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwMikKIAotI2RlZmluZSBIRDY0NDYxX0NQVFdBUgkJMHgxMTAzMAotI2RlZmluZSBIRDY0NDYxX0NQVFdEUgkJMHgxMTAzMgotI2RlZmluZSBIRDY0NDYxX0NQVFJBUgkJMHgxMTAzNAotI2RlZmluZSBIRDY0NDYxX0NQVFJEUgkJMHgxMTAzNgorLyogQ29udHJvbHMgTENEIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMDQpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9HUkRPUgkJMHgxMTA0MAotI2RlZmluZSBIRDY0NDYxX0dSU0NSCQkweDExMDQyCi0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSCQkweDExMDQ0Ci0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSX0FDQ1NUQVRVUwkJMHgxMAotI2RlZmluZSBIRDY0NDYxX0dSQ0ZHUl9BQ0NSRVNFVAkJCTB4MDgKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBUlRfQklUQkxUCTB4MDYKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBUlRfTElORQkweDA0Ci0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSX0NPTE9SREVQVEgxNgkJMHgwMQorLyogTENDRFIgY29udHJvbCBiaXRzICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NUQkFDSwkweDA0MDAJLyogU3RhbmRieSBCYWNrICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NUUkVRCTB4MDEwMAkvKiBTdGFuZGJ5IFJlcXVlc3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfTU9GRgkweDAwODAJLyogTWVtb3J5IE9mZiAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUl9SRUZTRUwJMHgwMDQwCS8qIFJlZnJlc2ggU2VsZWN0ICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX0VQT04JMHgwMDIwCS8qIEVuZCBQb3dlciBPbiAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUl9TUE9OCTB4MDAxMAkvKiBTdGFydCBQb3dlciBPbiAqLwogCi0jZGVmaW5lIEhENjQ0NjFfTE5TQVJICQkweDExMDQ2Ci0jZGVmaW5lIEhENjQ0NjFfTE5TQVJMCQkweDExMDQ4Ci0jZGVmaW5lIEhENjQ0NjFfTE5BWExSCQkweDExMDRhCi0jZGVmaW5lIEhENjQ0NjFfTE5ER1IJCTB4MTEwNGMKLSNkZWZpbmUgSEQ2NDQ2MV9MTkFYUgkJMHgxMTA0ZQotI2RlZmluZSBIRDY0NDYxX0xORVJUUgkJMHgxMTA1MAotI2RlZmluZSBIRDY0NDYxX0xOTURSCQkweDExMDUyCi0jZGVmaW5lIEhENjQ0NjFfQkJUU1NBUkgJMHgxMTA1NAotI2RlZmluZSBIRDY0NDYxX0JCVFNTQVJMCTB4MTEwNTYKLSNkZWZpbmUgSEQ2NDQ2MV9CQlREU0FSSAkweDExMDU4Ci0jZGVmaW5lIEhENjQ0NjFfQkJURFNBUkwJMHgxMTA1YQotI2RlZmluZSBIRDY0NDYxX0JCVERXUgkJMHgxMTA1YwotI2RlZmluZSBIRDY0NDYxX0JCVERIUgkJMHgxMTA1ZQotI2RlZmluZSBIRDY0NDYxX0JCVFBBUkgJCTB4MTEwNjAKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRQQVJMCQkweDExMDYyCi0jZGVmaW5lIEhENjQ0NjFfQkJUTUFSSAkJMHgxMTA2NAotI2RlZmluZSBIRDY0NDYxX0JCVE1BUkwJCTB4MTEwNjYKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRST1BSCQkweDExMDY4Ci0jZGVmaW5lIEhENjQ0NjFfQkJUTURSCQkweDExMDZhCisvKiBDb250cm9scyBMQ0QgKDEpICovCisjZGVmaW5lCUhENjQ0NjFfTERSMQkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxMCkKKyNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RPTgkweDAxCS8qIERpc3BsYXkgT24gKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RJTlYJMHg4MAkvKiBEaXNwbGF5IEludmVydCAqLworCisvKiBDb250cm9scyBMQ0QgKDIpICovCisjZGVmaW5lCUhENjQ0NjFfTERSMgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxMikKKyNkZWZpbmUJSEQ2NDQ2MV9MREhOQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTQpCS8qIE51bWJlciBvZiBob3Jpem9udGFsIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MREhOU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTYpCS8qIFNwZWNpZnkgb3V0cHV0IHN0YXJ0IHBvc2l0aW9uICsgd2lkdGggb2YgQ0wxICovCisjZGVmaW5lCUhENjQ0NjFfTERWTlRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDE4KQkvKiBTcGVjaWZ5IHRvdGFsIHZlcnRpY2FsIGxpbmVzICovCisjZGVmaW5lCUhENjQ0NjFfTERWTkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFhKQkvKiBzcGVjaWZ5IG51bWJlciBvZiBkaXNwbGF5IHZlcnRpY2FsIGxpbmVzICovCisjZGVmaW5lCUhENjQ0NjFfTERWU1BSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFjKQkvKiBzcGVjaWZ5IHZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwb3MgYW5kIEFDIG5yICovCisKKy8qIENvbnRyb2xzIExDRCAoMykgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIzCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFlKQorCisvKiBQYWxldHRlIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0NQVFdBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzMCkJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBBZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9DUFRXRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMzIpCS8qIENvbG9yIFBhbGV0dGUgV3JpdGUgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFJBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzNCkJLyogQ29sb3IgUGFsZXR0ZSBSZWFkIEFkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFJEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzNikJLyogQ29sb3IgUGFsZXR0ZSBSZWFkIERhdGEgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlIRDY0NDYxX0dSRE9SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQwKQkvKiBEaXNwbGF5IFJlc29sdXRpb24gT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfR1JTQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDIpCS8qIFNvbGlkIENvbG9yIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQ0KQkvKiBBY2NlbGVyYXRvciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBVFVTCTB4MTAJLyogQWNjZWxlcmF0b3IgU3RhdHVzICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1JFU0VUCQkweDA4CS8qIEFjY2VsZXJhdG9yIFJlc2V0ICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1NUQVJUX0JJVEJMVAkweDA2CS8qIEFjY2VsZXJhdG9yIFN0YXJ0IEJJVEJMVCAqLworI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFSVF9MSU5FCTB4MDQJLyogQWNjZWxlcmF0b3IgU3RhcnQgTGluZSBEcmF3aW5nICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0NPTE9SREVQVEgxNgkweDAxCS8qIFNldHMgQ29sb3JkZXB0aCAxNiBmb3IgQWNjZWxlcmF0b3IgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQ09MT1JERVBUSDgJMHgwMQkvKiBTZXRzIENvbG9yZGVwdGggOCBmb3IgQWNjZWxlcmF0b3IgKi8KKworLyogTGluZSBEcmF3aW5nIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0xOU0FSSAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0NikJLyogTGluZSBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfTE5TQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQ4KQkvKiBMaW5lIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkFYTFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGEpCS8qIEF4aXMgUGl4ZWwgTGVuZ3RoIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5ER1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGMpCS8qIERpYWdvbmFsIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5BWFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGUpCS8qIEF4aWFsIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5FUlRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDUwKQkvKiBTdGFydCBFcnJvciBUZXJtIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5NRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTIpCS8qIExpbmUgTW9kZSBSZWdpc3RlciAqLworCisvKiBCaXRCTFQgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfQkJUU1NBUkgJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1NCkJLyogU291cmNlIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRTU0FSTAkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDU2KQkvKiBTb3VyY2UgU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChMKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVERTQVJICShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTgpCS8qIERlc3RpbmF0aW9uIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlREU0FSTAkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVhKQkvKiBEZXN0aW5hdGlvbiBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJURFdSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVjKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBXaWR0aCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0JCVERIUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1ZSkJLyogRGVzdGluYXRpb24gQmxvY2sgSGVpZ2h0IFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQkJUUEFSSAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2MCkJLyogUGF0dGVybiBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUUEFSTAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2MikJLyogUGF0dGVybiBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUTUFSSAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2NCkJLyogTWFzayBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUTUFSTAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2NikJLyogTWFzayBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUUk9QUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2OCkJLyogUk9QIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQkJUTURSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDZhKQkvKiBCaXRCTFQgTW9kZSBSZWdpc3RlciAqLwogCiAvKiBQQyBDYXJkIENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMElTUiAgICAgICAgIDB4MTIwMDAgLyogc29ja2V0IDAgaW50ZXJmYWNlIHN0YXR1cyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBHQ1IgICAgICAgICAweDEyMDAyIC8qIHNvY2tldCAwIGdlbmVyYWwgY29udHJvbCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBDU0NSICAgICAgICAweDEyMDA0IC8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzBDU0NJRVIgICAgICAweDEyMDA2IC8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMFNDUiAgICAgICAgIDB4MTIwMDggLyogc29ja2V0IDAgc29mdHdhcmUgY29udHJvbCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFJU1IgICAgICAgICAweDEyMDEwIC8qIHNvY2tldCAxIGludGVyZmFjZSBzdGF0dXMgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxR0NSICAgICAgICAgMHgxMjAxMiAvKiBzb2NrZXQgMSBnZW5lcmFsIGNvbnRyb2wgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxQ1NDUiAgICAgICAgMHgxMjAxNCAvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxQ1NDSUVSICAgICAgMHgxMjAxNiAvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFTQ1IgICAgICAgICAweDEyMDE4IC8qIHNvY2tldCAxIHNvZnR3YXJlIGNvbnRyb2wgKi8KKy8qIE1hcHMgdG8gUGh5c2ljYWwgQXJlYSA2ICovCisjZGVmaW5lCUhENjQ0NjFfUENDMElTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwMCkJLyogc29ja2V0IDAgaW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDIpCS8qIHNvY2tldCAwIGdlbmVyYWwgY29udHJvbCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBDU0NSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDQpCS8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBDU0NJRVIJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwNikJLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDA4KQkvKiBzb2NrZXQgMCBzb2Z0d2FyZSBjb250cm9sICovCisvKiBNYXBzIHRvIFBoeXNpY2FsIEFyZWEgNSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTApCS8qIHNvY2tldCAxIGludGVyZmFjZSBzdGF0dXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxR0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDEyKQkvKiBzb2NrZXQgMSBnZW5lcmFsIGNvbnRyb2wgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxQ1NDUgkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDE0KQkvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxQ1NDSUVSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTYpCS8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDMVNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxOCkJLyogc29ja2V0IDEgc29mdHdhcmUgY29udHJvbCAqLwogCiAvKiBQQ0MgSW50ZXJmYWNlIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9SRUFEWQkJMHg4MAkvKiBjYXJkIHJlYWR5ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX01XUAkJMHg0MAkvKiBjYXJkIHdyaXRlLXByb3RlY3RlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9WUzIJCTB4MjAJLyogdm9sdGFnZSBzZWxlY3QgcGluIDIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfVlMxCQkweDEwCS8qIHZvbHRhZ2Ugc2VsZWN0IHBpbiAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0NEMgkJMHgwOAkvKiBjYXJkIGRldGVjdCAyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0NEMQkJMHgwNAkvKiBjYXJkIGRldGVjdCAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRDIJCTB4MDIJLyogYmF0dGVyeSAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRDEJCTB4MDEJLyogYmF0dGVyeSAxICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX1JFQURZCQkweDgwCS8qIGNhcmQgcmVhZHkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfTVdQCQkweDQwCS8qIGNhcmQgd3JpdGUtcHJvdGVjdGVkICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX1ZTMgkJMHgyMAkvKiB2b2x0YWdlIHNlbGVjdCBwaW4gMiAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9WUzEJCTB4MTAJLyogdm9sdGFnZSBzZWxlY3QgcGluIDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQ0QyCQkweDA4CS8qIGNhcmQgZGV0ZWN0IDIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQ0QxCQkweDA0CS8qIGNhcmQgZGV0ZWN0IDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEMgkJMHgwMgkvKiBiYXR0ZXJ5IDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEMQkJMHgwMQkvKiBiYXR0ZXJ5IDEgKi8KIAotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9QQ0RfTUFTSwkJMHgwYyAgICAvKiBjYXJkIGRldGVjdCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfTUFTSwkJMHgwMyAgICAvKiBiYXR0ZXJ5IHZvbHRhZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVEdPT0QJMHgwMyAgICAvKiBiYXR0ZXJ5IGdvb2QgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVFdBUk4JMHgwMSAgICAvKiBiYXR0ZXJ5IGxvdyB3YXJuaW5nICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9CQVRERUFEMQkweDAyICAgIC8qIGJhdHRlcnkgZGVhZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDIJMHgwMCAgICAvKiBiYXR0ZXJ5IGRlYWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfUENEX01BU0sJCTB4MGMJLyogY2FyZCBkZXRlY3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX01BU0sJCTB4MDMJLyogYmF0dGVyeSB2b2x0YWdlICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX0JWRF9CQVRHT09ECTB4MDMJLyogYmF0dGVyeSBnb29kICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX0JWRF9CQVRXQVJOCTB4MDEJLyogYmF0dGVyeSBsb3cgd2FybmluZyAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDEJMHgwMgkvKiBiYXR0ZXJ5IGRlYWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVERFQUQyCTB4MDAJLyogYmF0dGVyeSBkZWFkICovCiAKIC8qIFBDQyBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfRFJWRQkJMHg4MCAgICAvKiBvdXRwdXQgZHJpdmUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUENDUgkJMHg0MCAgICAvKiBQQyBjYXJkIHJlc2V0ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BDQ1QJCTB4MjAgICAgLyogUEMgY2FyZCB0eXBlLCAxPUlPJm1lbSwgMD1tZW0gKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfVkNDMAkJMHgxMCAgICAvKiB2b2x0YWdlIGNvbnRyb2wgcGluIFZDQzBTRUwwICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BNTU9ECQkweDA4ICAgIC8qIG1lbW9yeSBtb2RlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BBMjUJCTB4MDQgICAgLyogcGluIEEyNSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9QQTI0CQkweDAyICAgIC8qIHBpbiBBMjQgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUkVHCQkweDAxICAgIC8qIHBpbiBQQ0MwUkVHIyAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9EUlZFCQkweDgwCS8qIG91dHB1dCBkcml2ZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QQ0NSCQkweDQwCS8qIFBDIGNhcmQgcmVzZXQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUENDVAkJMHgyMAkvKiBQQyBjYXJkIHR5cGUsIDE9SU8mbWVtLCAwPW1lbSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9WQ0MwCQkweDEwCS8qIHZvbHRhZ2UgY29udHJvbCBwaW4gVkNDMFNFTDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUE1NT0QJCTB4MDgJLyogbWVtb3J5IG1vZGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUEEyNQkJMHgwNAkvKiBwaW4gQTI1ICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1BBMjQJCTB4MDIJLyogcGluIEEyNCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9SRUcJCTB4MDEJLyogcGluIFBDQzBSRUcjICovCiAKIC8qIFBDQyBDYXJkIFN0YXR1cyBDaGFuZ2UgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX1NDREkJCTB4ODAgICAgLyogc3cgY2FyZCBkZXRlY3QgaW50ciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfU1JWMQkJMHg0MCAgICAvKiByZXNlcnZlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfSVJFUQkJMHgyMCAgICAvKiBJUkVRIGludHIgcmVxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9TQwkJMHgxMCAgICAvKiBTVFNDSEcgKHN0YXR1cyBjaGFuZ2UpIHBpbiAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfQ0RDCQkweDA4ICAgIC8qIENEIChjYXJkIGRldGVjdCkgY2hhbmdlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9SQwkJMHgwNCAgICAvKiBSRUFEWSBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX0JXCQkweDAyICAgIC8qIGJhdHRlcnkgd2FybmluZyBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX0JECQkweDAxICAgIC8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX1NDREkJCTB4ODAJLyogc3cgY2FyZCBkZXRlY3QgaW50ciAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfU1JWMQkJMHg0MAkvKiByZXNlcnZlZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfSVJFUQkJMHgyMAkvKiBJUkVRIGludHIgcmVxICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9TQwkJMHgxMAkvKiBTVFNDSEcgKHN0YXR1cyBjaGFuZ2UpIHBpbiAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfQ0RDCQkweDA4CS8qIENEIChjYXJkIGRldGVjdCkgY2hhbmdlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9SQwkJMHgwNAkvKiBSRUFEWSBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX0JXCQkweDAyCS8qIGJhdHRlcnkgd2FybmluZyBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX0JECQkweDAxCS8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgKi8KIAogLyogUENDIENhcmQgU3RhdHVzIENoYW5nZSBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0NSRQkJMHg4MCAgICAvKiBjaGFuZ2UgcmVzZXQgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX01BU0sJMHg2MCAgIC8qIElSRVEgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0RJU0FCTEVECTB4MDAgICAvKiBJUkVRIGRpc2FibGVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0xFVkVMCTB4MjAgICAvKiBJUkVRIGxldmVsLXRyaWdnZXJlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9GQUxMSU5HCTB4NDAgICAvKiBJUkVRIGZhbGxpbmctZWRnZS10cmlnICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX1JJU0lORwkweDYwICAgLyogSVJFUSByaXNpbmctZWRnZS10cmlnICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0NSRQkJMHg4MAkvKiBjaGFuZ2UgcmVzZXQgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX01BU0sJMHg2MAkvKiBJUkVRIGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9ESVNBQkxFRCAweDAwCS8qIElSRVEgZGlzYWJsZWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTEVWRUwJMHgyMAkvKiBJUkVRIGxldmVsLXRyaWdnZXJlZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9GQUxMSU5HCTB4NDAJLyogSVJFUSBmYWxsaW5nLWVkZ2UtdHJpZyAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9SSVNJTkcJMHg2MAkvKiBJUkVRIHJpc2luZy1lZGdlLXRyaWcgKi8KIAotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9TQ0UJCTB4MTAgICAgLyogc3RhdHVzIGNoYW5nZSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQ0RFCQkweDA4ICAgIC8qIGNhcmQgZGV0ZWN0IGNoYW5nZSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfUkUJCTB4MDQgICAgLyogcmVhZHkgY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9CV0UJCTB4MDIgICAgLyogYmF0dGVyeSB3YXJuIGNoYW5nZSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQkRFCQkweDAxICAgIC8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgZW5hYmxlKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfU0NFCQkweDEwCS8qIHN0YXR1cyBjaGFuZ2UgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0NERQkJMHgwOAkvKiBjYXJkIGRldGVjdCBjaGFuZ2UgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX1JFCQkweDA0CS8qIHJlYWR5IGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQldFCQkweDAyCS8qIGJhdHRlcnkgd2FybiBjaGFuZ2UgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0JERQkJMHgwMQkvKiBiYXR0ZXJ5IGRlYWQgY2hhbmdlIGVuYWJsZSovCiAKIC8qIFBDQyBTb2Z0d2FyZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDU0NSX1ZDQzEJCTB4MDIJLyogdm9sdGFnZSBjb250cm9sIHBpbiAxICovCi0jZGVmaW5lIEhENjQ0NjFfUENDU0NSX1NXUAkJMHgwMSAgICAvKiB3cml0ZSBwcm90ZWN0ICovCisjZGVmaW5lCUhENjQ0NjFfUENDU0NSX1ZDQzEJCTB4MDIJLyogdm9sdGFnZSBjb250cm9sIHBpbiAxICovCisjZGVmaW5lCUhENjQ0NjFfUENDU0NSX1NXUAkJMHgwMQkvKiB3cml0ZSBwcm90ZWN0ICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9QME9DUiAgICAgICAgICAgMHgxMjAyYQotI2RlZmluZSBIRDY0NDYxX1AxT0NSICAgICAgICAgICAweDEyMDJjCi0jZGVmaW5lIEhENjQ0NjFfUEdDUiAgICAgICAgICAgIDB4MTIwMmUKKy8qIFBDQzAgT3V0cHV0IFBpbnMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1AwT0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDJhKQogCi0jZGVmaW5lIEhENjQ0NjFfR1BBQ1IJCTB4MTQwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9HUEJDUgkJMHgxNDAwMgotI2RlZmluZSBIRDY0NDYxX0dQQ0NSCQkweDE0MDA0Ci0jZGVmaW5lIEhENjQ0NjFfR1BEQ1IJCTB4MTQwMDYKLSNkZWZpbmUgSEQ2NDQ2MV9HUEFEUgkJMHgxNDAxMAotI2RlZmluZSBIRDY0NDYxX0dQQkRSCQkweDE0MDEyCi0jZGVmaW5lIEhENjQ0NjFfR1BDRFIJCTB4MTQwMTQKLSNkZWZpbmUgSEQ2NDQ2MV9HUEREUgkJMHgxNDAxNgotI2RlZmluZSBIRDY0NDYxX0dQQUlDUgkJMHgxNDAyMAotI2RlZmluZSBIRDY0NDYxX0dQQklDUgkJMHgxNDAyMgotI2RlZmluZSBIRDY0NDYxX0dQQ0lDUgkJMHgxNDAyNAotI2RlZmluZSBIRDY0NDYxX0dQRElDUgkJMHgxNDAyNgotI2RlZmluZSBIRDY0NDYxX0dQQUlTUgkJMHgxNDA0MAotI2RlZmluZSBIRDY0NDYxX0dQQklTUgkJMHgxNDA0MgotI2RlZmluZSBIRDY0NDYxX0dQQ0lTUgkJMHgxNDA0NAotI2RlZmluZSBIRDY0NDYxX0dQRElTUgkJMHgxNDA0NgorLyogUENDMSBPdXRwdXQgUGlucyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfUDFPQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmMpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9OSVJSCQkweDE1MDAwCi0jZGVmaW5lIEhENjQ0NjFfTklNUgkJMHgxNTAwMgorLyogUEMgQ2FyZCBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QR0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDJlKQogCi0jZGVmaW5lIEhENjQ0NjFfSVJRQkFTRQkJT0ZGQ0hJUF9JUlFfQkFTRQotI2RlZmluZSBIRDY0NDYxX0lSUV9OVU0JCTE2CisvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfR1BBQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDApCS8qIFBvcnQgQSAtIEhhbmRsZXMgSVJEQS9USU1FUiAqLworI2RlZmluZQlIRDY0NDYxX0dQQkNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDAyKQkvKiBQb3J0IEIgLSBIYW5kbGVzIFVBUlQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwNCkJLyogUG9ydCBDIC0gSGFuZGxlcyBQQ01DSUEgMSAqLworI2RlZmluZQlIRDY0NDYxX0dQRENSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDA2KQkvKiBQb3J0IEQgLSBIYW5kbGVzIFBDTUNJQSAxICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfVUFSVAkoSEQ2NDQ2MV9JUlFCQVNFKzUpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX0lSREEJKEhENjQ0NjFfSVJRQkFTRSs2KQotI2RlZmluZSBIRDY0NDYxX0lSUV9UTVUxCShIRDY0NDYxX0lSUUJBU0UrOSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfVE1VMAkoSEQ2NDQ2MV9JUlFCQVNFKzEwKQotI2RlZmluZSBIRDY0NDYxX0lSUV9HUElPCShIRDY0NDYxX0lSUUJBU0UrMTEpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX0FGRQkJKEhENjQ0NjFfSVJRQkFTRSsxMikKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfUENDMQkoSEQ2NDQ2MV9JUlFCQVNFKzEzKQotI2RlZmluZSBIRDY0NDYxX0lSUV9QQ0MwCShIRDY0NDYxX0lSUUJBU0UrMTQpCisvKiBQb3J0IENvbnRyb2wgRGF0YSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxMCkJLyogQSAqLworI2RlZmluZQlIRDY0NDYxX0dQQkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDEyKQkvKiBCICovCisjZGVmaW5lCUhENjQ0NjFfR1BDRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMTQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEREUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxNikJLyogRCAqLworCisvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjApCS8qIEEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEJJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUERJQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMjYpCS8qIEQgKi8KKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDApCS8qIEEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEJJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUERJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwNDYpCS8qIEQgKi8KKworLyogSW50ZXJydXB0IFJlcXVlc3QgUmVnaXN0ZXIgJiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX05JUlIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDUwMDApCisjZGVmaW5lCUhENjQ0NjFfTklNUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NTAwMikKKworI2RlZmluZQlIRDY0NDYxX0lSUUJBU0UJCU9GRkNISVBfSVJRX0JBU0UKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfTlVNCQkxNgorCisjZGVmaW5lCUhENjQ0NjFfSVJRX1VBUlQJKEhENjQ0NjFfSVJRQkFTRSs1KQorI2RlZmluZQlIRDY0NDYxX0lSUV9JUkRBCShIRDY0NDYxX0lSUUJBU0UrNikKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfVE1VMQkoSEQ2NDQ2MV9JUlFCQVNFKzkpCisjZGVmaW5lCUhENjQ0NjFfSVJRX1RNVTAJKEhENjQ0NjFfSVJRQkFTRSsxMCkKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfR1BJTwkoSEQ2NDQ2MV9JUlFCQVNFKzExKQorI2RlZmluZQlIRDY0NDYxX0lSUV9BRkUJCShIRDY0NDYxX0lSUUJBU0UrMTIpCisjZGVmaW5lCUhENjQ0NjFfSVJRX1BDQzEJKEhENjQ0NjFfSVJRQkFTRSsxMykKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfUENDMAkoSEQ2NDQ2MV9JUlFCQVNFKzE0KQogCiAjZGVmaW5lIF9fSU9fUFJFRklYCWhkNjQ0NjEKICNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9od19pcnEuaAppbmRleCA4MGVlMWNkLi40Y2EzZjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9od19pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9od19pcnEuaApAQCAtNSw0ICs1LDQ2IEBACiAKIGV4dGVybiBhdG9taWNfdCBpcnFfZXJyX2NvdW50OwogCitzdHJ1Y3QgaW50YzJfZGF0YSB7CisJdW5zaWduZWQgc2hvcnQgaXJxOworCXVuc2lnbmVkIGNoYXIgaXByX29mZnNldCwgaXByX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIgbXNrX29mZnNldCwgbXNrX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIgcHJpb3JpdHk7Cit9OworCitzdHJ1Y3QgaW50YzJfZGVzYyB7CisJdW5zaWduZWQgbG9uZyBwcmlvX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtc2tfYmFzZTsKKwl1bnNpZ25lZCBsb25nIG1za2Nscl9iYXNlOworCXN0cnVjdCBpbnRjMl9kYXRhICppbnRjMl9kYXRhOworCXVuc2lnbmVkIGludCBucl9pcnFzOworCXN0cnVjdCBpcnFfY2hpcCBjaGlwOworfTsKKwordm9pZCByZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKHN0cnVjdCBpbnRjMl9kZXNjICopOwordm9pZCBpbml0X0lSUV9pbnRjMih2b2lkKTsKKworc3RydWN0IGlwcl9kYXRhIHsKKwl1bnNpZ25lZCBjaGFyIGlycTsKKwl1bnNpZ25lZCBjaGFyIGlwcl9pZHg7CQkvKiBJbmRleCBmb3IgdGhlIElQUiByZWdpc3RlcmVkICovCisJdW5zaWduZWQgY2hhciBzaGlmdDsJCS8qIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBkYXRhICovCisJdW5zaWduZWQgY2hhciBwcmlvcml0eTsJCS8qIFRoZSBwcmlvcml0eSAqLworfTsKKworc3RydWN0IGlwcl9kZXNjIHsKKwl1bnNpZ25lZCBsb25nICppcHJfb2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQgbnJfb2Zmc2V0czsKKwlzdHJ1Y3QgaXByX2RhdGEgKmlwcl9kYXRhOworCXVuc2lnbmVkIGludCBucl9pcnFzOworCXN0cnVjdCBpcnFfY2hpcCBjaGlwOworfTsKKwordm9pZCByZWdpc3Rlcl9pcHJfY29udHJvbGxlcihzdHJ1Y3QgaXByX2Rlc2MgKik7Cit2b2lkIGluaXRfSVJRX2lwcih2b2lkKTsKKworLyoKKyAqIEVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbCBJUFIgSVJRcy4KKyAqLwordm9pZCBpcHJfaXJxX2VuYWJsZV9pcmxtKHZvaWQpOworCiAjZW5kaWYgLyogX19BU01fU0hfSFdfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycS5oIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKaW5kZXggZTgxYmYyMS4uYzYxZDkwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKQEAgLTMxLDQ3ICszMSw3IEBACiAgKiBQSU5UIElSUXMKICAqLwogdm9pZCBpbml0X0lSUV9waW50KHZvaWQpOwotCi0vKgotICogVGhlIHNoaWZ0IHZhbHVlIGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQsIG5vdCB0aGUgbnVtYmVyIG9mCi0gKiBiaXRzLzQuIFRoaXMgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUKLSAqIGRhdGFzaGVldHMuIFRoZSBJUFIgYWRkcmVzcywgYWRkciwgd2lsbCBiZSBzZXQgZnJvbSBpcHJfaWR4IHZpYSB0aGUKLSAqIG1hcF9pcHJpZHhfdG9fYWRkciBmdW5jdGlvbi4KLSAqLwotc3RydWN0IGlwcl9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCWludCBpcHJfaWR4OwkJLyogSW5kZXggZm9yIHRoZSBJUFIgcmVnaXN0ZXJlZCAqLwotCWludCBzaGlmdDsJCS8qIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBkYXRhICovCi0JaW50IHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCi0JdW5zaWduZWQgaW50IGFkZHI7CS8qIEFkZHJlc3Mgb2YgSW50ZXJydXB0IFByaW9yaXR5IFJlZ2lzdGVyICovCi19OwotCi0vKgotICogR2l2ZW4gYW4gSVBSIElEWCwgbWFwIHRoZSB2YWx1ZSB0byBhbiBJUFIgcmVnaXN0ZXIgYWRkcmVzcy4KLSAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KTsKLQotLyoKLSAqIEVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbCBJUFIgSVJRcy4KLSAqLwotdm9pZCBpcHJfaXJxX2VuYWJsZV9pcmxtKHZvaWQpOwotCi0vKgotICogRnVuY3Rpb24gZm9yICJvbiBjaGlwIHN1cHBvcnQgbW9kdWxlcyIuCi0gKi8KLXZvaWQgbWFrZV9pcHJfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKTsKIHZvaWQgbWFrZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSk7Ci12b2lkIGluaXRfSVJRX2lwcih2b2lkKTsKLQotc3RydWN0IGludGMyX2RhdGEgewotCXVuc2lnbmVkIHNob3J0IGlycTsKLQl1bnNpZ25lZCBjaGFyIGlwcl9vZmZzZXQsIGlwcl9zaGlmdDsKLQl1bnNpZ25lZCBjaGFyIG1za19vZmZzZXQsIG1za19zaGlmdDsKLQl1bnNpZ25lZCBjaGFyIHByaW9yaXR5OwotfTsKLQotdm9pZCBtYWtlX2ludGMyX2lycShzdHJ1Y3QgaW50YzJfZGF0YSAqLCB1bnNpZ25lZCBpbnQgbnJfaXJxcyk7Ci12b2lkIGluaXRfSVJRX2ludGMyKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBnZW5lcmljX2lycV9kZW11eChpbnQgaXJxKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oIGIvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oCmluZGV4IDcwMzg5YjcuLjA4ODY5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWNfaW5pdC5oPgogCiBzdHJ1Y3QgZGV2aWNlOwogCkBAIC02OCw0ICs2Nyw3IEBACiAKICNkZWZpbmUgZ2V0X3N5c3RlbV90eXBlKCkJc2hfbXYubXZfbmFtZQogCisjZGVmaW5lIF9faW5pdG12IFwKKwlfX2F0dHJpYnV0ZV91c2VkX18gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18gKCIubWFjaHZlYy5pbml0IikpKQorCiAjZW5kaWYgLyogX0FTTV9TSF9NQUNIVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWNfaW5pdC5oIGIvaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTc3OTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMCBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGhhcyBnb29kaWVzIHRvIGhlbHAgc2ltcGxpZnkgaW5zdGFudGlhdGlvbiBvZiBtYWNoaW5lIHZlY3RvcnMuCi0gKi8KLQotI2lmbmRlZiBfX1NIX01BQ0hWRUNfSU5JVF9ICi0jZGVmaW5lIF9fU0hfTUFDSFZFQ19JTklUX0gKLQotCi0vKgotICogSW4gYSBHRU5FUklDIGtlcm5lbCwgd2UgaGF2ZSBsb3RzIG9mIHRoZXNlIHZlY3RvcnMgZmxvYXRpbmcgYWJvdXQsCi0gKiBhbGwgYnV0IG9uZSBvZiB3aGljaCB3ZSB3YW50IHRvIGdvIGF3YXkuICBJbiBhIG5vbi1HRU5FUklDIGtlcm5lbCwKLSAqIHdlIHdhbnQgb25seSBvbmUsIGV2ZXIuCi0gKgotICogQWNjb21wbGlzaCB0aGlzIGluIHRoZSBHRU5FUklDIGtlcm5lbCBieSBwdXRpbmcgYWxsIG9mIHRoZSB2ZWN0b3JzCi0gKiBpbiB0aGUgLmluaXQuZGF0YSBzZWN0aW9uIHdoZXJlIHRoZXknbGwgZ28gYXdheS4gIFdlJ2xsIGNvcHkgdGhlCi0gKiBvbmUgd2Ugd2FudCB0byB0aGUgcmVhbCBhbHBoYV9tdiB2ZWN0b3IgaW4gc2V0dXBfYXJjaC4KLSAqCi0gKiBBY2NvbXBsaXNoIHRoaXMgaW4gYSBub24tR0VORVJJQyBrZXJuZWwgYnkgaWZkZWYnaW5nIG91dCBhbGwgYnV0Ci0gKiBvbmUgb2YgdGhlIHZlY3RvcnMsIHdoaWNoIHdpbGwgbm90IHJlc2lkZSBpbiAuaW5pdC5kYXRhLiAgV2UgdGhlbgotICogYWxpYXMgdGhpcyBvbmUgdmVjdG9yIHRvIGFscGhhX212LCBzbyBubyBjb3B5IGlzIG5lZWRlZC4KLSAqCi0gKiBVcHNob3Q6IHNldCBfX2luaXRkYXRhIHRvIG5vdGhpbmcgZm9yIG5vbi1HRU5FUklDIGtlcm5lbHMuCi0gKgotICogTm90ZSB3ZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIFVOS05PV04ga2VybmVsLCBhcyB3ZSBuZWVkIHRvIHdyaXRlCi0gKiB0byB0aGUgbWFjaGluZSB2ZWN0b3Igd2hpbGUgc2V0dGluZyBpdCB1cC4KLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfU0hfVU5LTk9XTikKLSNkZWZpbmUgX19pbml0bXYgX19hdHRyaWJ1dGVfXygodW51c2VkLF9fc2VjdGlvbl9fICgiLm1hY2h2ZWMuaW5pdCIpKSkKLSNkZWZpbmUgQUxJQVNfTVYoeCkKLSNlbHNlCi0jZGVmaW5lIF9faW5pdG12Ci0KLS8qIEdDQyBhY3R1YWxseSBoYXMgYSBzeW50YXggZm9yIGRlZmluaW5nIGFsaWFzZXMsIGJ1dCBpcyB1bmRlciBzb21lCi0gICBkZWx1c2lvbiB0aGF0IHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBkZWNsYXJlIGl0IGV4dGVybiBzb21ld2hlcmUKLSAgIGVsc2UgYmVmb3JlaGFuZC4gIEZpbmUuICBXZSdsbCBkbyBpdCBvdXJzZWx2ZXMuICAqLwotI2lmIDAKLSNkZWZpbmUgQUxJQVNfTVYoc3lzdGVtKSBcCi0gIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBzaF9tdiBfX2F0dHJpYnV0ZV9fKChhbGlhcygibXZfIiNzeXN0ZW0pKSk7Ci0jZWxzZQotI2RlZmluZSBBTElBU19NVihzeXN0ZW0pIFwKLSAgYXNtKCIuZ2xvYmFsIHNoX212XG5zaF9tdiA9IG12XyIjc3lzdGVtICk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBHRU5FUklDICovCi0KLSNlbmRpZiAvKiBfX1NIX01BQ0hWRUNfSU5JVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tbXpvbmUuaCBiL2luY2x1ZGUvYXNtLXNoL21tem9uZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjlmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9tbXpvbmUuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9fQVNNX1NIX01NWk9ORV9ICisjZGVmaW5lIF9fQVNNX1NIX01NWk9ORV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUworZXh0ZXJuIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW107CisjZGVmaW5lIE5PREVfREFUQShuaWQpCQkobm9kZV9kYXRhW25pZF0pCisKKyNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQorI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuICsgXAorCQkJCSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zcGFubmVkX3BhZ2VzKQorCitzdGF0aWMgaW5saW5lIGludCBwZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCWludCBuaWQ7CisKKwlmb3IgKG5pZCA9IDA7IG5pZCA8IE1BWF9OVU1OT0RFUzsgbmlkKyspCisJCWlmIChwZm4gPj0gbm9kZV9zdGFydF9wZm4obmlkKSAmJiBwZm4gPD0gbm9kZV9lbmRfcGZuKG5pZCkpCisJCQlicmVhazsKKworCXJldHVybiBuaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBnbGlzdF9kYXRhICpwZm5fdG9fcGdkYXQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJcmV0dXJuIE5PREVfREFUQShwZm5fdG9fbmlkKHBmbikpOworfQorCisvKiBhcmNoL3NoL21tL251bWEuYyAqLwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldHVwX2Jvb3RtZW1fbm9kZShpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLworCisvKiBQbGF0Zm9ybSBzcGVjaWZpYyBtZW0gaW5pdCAqLwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCk7CisKKy8qIGFyY2gvc2gva2VybmVsL3NldHVwLmMgKi8KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX0FTTV9TSF9NTVpPTkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oIGIvaW5jbHVkZS9hc20tc2gvcGFnZS5oCmluZGV4IDc0NjRkZTQuLjZiYzliYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKQEAgLTYwLDYgKzYwLDcgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2htX2FsaWduX21hc2s7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbiwgbWluX2xvd19wZm47CitleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CiAKICNpZmRlZiBDT05GSUdfTU1VCiBleHRlcm4gdm9pZCBjbGVhcl9wYWdlX3Nsb3codm9pZCAqdG8pOwpAQCAtMTM0LDcgKzEzNSw5IEBACiAjZGVmaW5lIFBGTl9TVEFSVAkJKF9fTUVNT1JZX1NUQVJUID4+IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkJKFBGTl9TVEFSVCkKICNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2lmZGVmIENPTkZJR19GTEFUTUVNCiAjZGVmaW5lIHBmbl92YWxpZChwZm4pCQkoKHBmbikgPj0gbWluX2xvd19wZm4gJiYgKHBmbikgPCBtYXhfbG93X3BmbikKKyNlbmRpZgogI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogCiAjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKQEAgLTE0OCw1ICsxNTEsMTIgQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfR0FURV9BUkVBCiAjZW5kaWYKIAorLyoKKyAqIFNsdWIgZGVmYXVsdHMgdG8gOC1ieXRlIGFsaWdubWVudCwgd2UncmUgb25seSBpbnRlcmVzdGVkIGluIDQuCisgKiBTbGFiIGRlZmF1bHRzIHRvIEJZVEVTX1BFUl9XT1JELCB3aGljaCBlbmRzIHVwIGJlaW5nIHRoZSBzYW1lIGFueXdheXMuCisgKi8KKyNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOCTQKKyNkZWZpbmUgQVJDSF9TTEFCX01JTkFMSUdOCTQKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BhcnBvcnQuaCBiL2luY2x1ZGUvYXNtLXNoL3BhcnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdiYTYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvcGFycG9ydC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIFRpbSBXYXVnaCA8dGltQGN5YmVyZWxrLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBieSBkcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jLgorICovCisjaWZuZGVmIF9fQVNNX1NIX1BBUlBPUlRfSAorI2RlZmluZSBfX0FTTV9TSF9QQVJQT1JUX0gKKworc3RhdGljIGludCBfX2RldmluaXQgcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyhpbnQgYXV0b2lycSwgaW50IGF1dG9kbWEpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X3BjX2ZpbmRfbm9ucGNpX3BvcnRzKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKK3sKKwlyZXR1cm4gcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyhhdXRvaXJxLCBhdXRvZG1hKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NIX1BBUlBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCmluZGV4IDViNTIzYzcuLjIyZWZmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKQEAgLTQwMiwxMiArNDAyLDggQEAKICNkZWZpbmUgcHRlX2ZpbGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEUpCiAKICNpZmRlZiBDT05GSUdfWDJUTEIKLSNkZWZpbmUgcHRlX3JlYWQocHRlKQkJKChwdGUpLnB0ZV9oaWdoICYgX1BBR0VfRVhUX1VTRVJfUkVBRCkKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKChwdGUpLnB0ZV9oaWdoICYgX1BBR0VfRVhUX1VTRVJfRVhFQykKICNkZWZpbmUgcHRlX3dyaXRlKHB0ZSkJCSgocHRlKS5wdGVfaGlnaCAmIF9QQUdFX0VYVF9VU0VSX1dSSVRFKQogI2Vsc2UKLSNkZWZpbmUgcHRlX3JlYWQocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVIpCi0jZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXKQogI2VuZGlmCiAKQEAgLTQyMCwyMCArNDE2LDEyIEBACiAgKiBpbmRpdmlkdWFsbHkgdG9nZ2xlZCAoYW5kIHVzZXIgcGVybWlzc2lvbnMgYXJlIGVudGlyZWx5IGRlY291cGxlZCBmcm9tCiAgKiBrZXJuZWwgcGVybWlzc2lvbnMpLCB3ZSBhdHRlbXB0IHRvIGNvdXBsZSB0aGVtIGEgYml0IG1vcmUgc2FuZWx5IGhlcmUuCiAgKi8KLVBURV9CSVRfRlVOQyhoaWdoLCByZHByb3RlY3QsICY9IH5fUEFHRV9FWFRfVVNFUl9SRUFEKTsKLVBURV9CSVRfRlVOQyhoaWdoLCBta3JlYWQsIHw9IF9QQUdFX0VYVF9VU0VSX1JFQUQgfCBfUEFHRV9FWFRfS0VSTl9SRUFEKTsKIFBURV9CSVRfRlVOQyhoaWdoLCB3cnByb3RlY3QsICY9IH5fUEFHRV9FWFRfVVNFUl9XUklURSk7CiBQVEVfQklUX0ZVTkMoaGlnaCwgbWt3cml0ZSwgfD0gX1BBR0VfRVhUX1VTRVJfV1JJVEUgfCBfUEFHRV9FWFRfS0VSTl9XUklURSk7Ci1QVEVfQklUX0ZVTkMoaGlnaCwgZXhwcm90ZWN0LCAmPSB+X1BBR0VfRVhUX1VTRVJfRVhFQyk7Ci1QVEVfQklUX0ZVTkMoaGlnaCwgbWtleGVjLCB8PSBfUEFHRV9FWFRfVVNFUl9FWEVDIHwgX1BBR0VfRVhUX0tFUk5fRVhFQyk7CiBQVEVfQklUX0ZVTkMoaGlnaCwgbWtodWdlLCB8PSBfUEFHRV9TWkhVR0UpOwogI2Vsc2UKLVBURV9CSVRfRlVOQyhsb3csIHJkcHJvdGVjdCwgJj0gfl9QQUdFX1VTRVIpOwotUFRFX0JJVF9GVU5DKGxvdywgbWtyZWFkLCB8PSBfUEFHRV9VU0VSKTsKIFBURV9CSVRfRlVOQyhsb3csIHdycHJvdGVjdCwgJj0gfl9QQUdFX1JXKTsKIFBURV9CSVRfRlVOQyhsb3csIG1rd3JpdGUsIHw9IF9QQUdFX1JXKTsKLVBURV9CSVRfRlVOQyhsb3csIGV4cHJvdGVjdCwgJj0gfl9QQUdFX1VTRVIpOwotUFRFX0JJVF9GVU5DKGxvdywgbWtleGVjLCB8PSBfUEFHRV9VU0VSKTsKIFBURV9CSVRfRlVOQyhsb3csIG1raHVnZSwgfD0gX1BBR0VfU1pIVUdFKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCmluZGV4IGQ0MmY2OGUuLjIyNTJlNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCkBAIC0zNiw3ICszNiw3IEBACiAgKi8KIGVudW0gY3B1X3R5cGUgewogCS8qIFNILTIgdHlwZXMgKi8KLQlDUFVfU0g3NjA0LCBDUFVfU0g3NjE5LAorCUNQVV9TSDc2MTksCiAKIAkvKiBTSC0yQSB0eXBlcyAqLwogCUNQVV9TSDcyMDYsCkBAIC01Miw3ICs1Miw3IEBACiAJQ1BVX1NINzc2MCwgQ1BVX1NUNDBSQSwgQ1BVX1NUNDBHWDEsIENQVV9TSDRfMjAyLCBDUFVfU0g0XzUwMSwKIAogCS8qIFNILTRBIHR5cGVzICovCi0JQ1BVX1NINzc3MCwgQ1BVX1NINzc4MCwgQ1BVX1NINzc4MSwgQ1BVX1NINzc4NSwKKwlDUFVfU0g3NzcwLCBDUFVfU0g3NzgwLCBDUFVfU0g3NzgxLCBDUFVfU0g3Nzg1LCBDUFVfU0hYMywKIAogCS8qIFNINEFMLURTUCB0eXBlcyAqLwogCUNQVV9TSDczMTgwLCBDUFVfU0g3MzQzLCBDUFVfU0g3NzIyLApAQCAtMjI4LDExICsyMjgsNyBAQAogCXJlZ3MtPnNyICY9IH5TUl9GRDsKIH0KIAotI2lmZGVmIENPTkZJR19DUFVfU0g0CiBleHRlcm4gdm9pZCBzYXZlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZWxzZQotI2RlZmluZSBzYXZlX2ZwdSh0c2spCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgogCiAjZGVmaW5lIHVubGF6eV9mcHUodHNrLCByZWdzKSBkbyB7CQkJXAogCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKSkgewlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oIGIvaW5jbHVkZS9hc20tc2gvcndzZW0uaAppbmRleCA0OTMxYmE4Li4xOTg3ZjNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmgKQEAgLTEsMTEgKzEsMTUgQEAKIC8qCi0gKiBpbmNsdWRlL2FzbS1wcGMvcndzZW0uaDogUi9XIHNlbWFwaG9yZXMgZm9yIFNIIHVzaW5nIHRoZSBzdHVmZgorICogaW5jbHVkZS9hc20tc2gvcndzZW0uaDogUi9XIHNlbWFwaG9yZXMgZm9yIFNIIHVzaW5nIHRoZSBzdHVmZgogICogaW4gbGliL3J3c2VtLmMuCiAgKi8KIAogI2lmbmRlZiBfQVNNX1NIX1JXU0VNX0gKICNkZWZpbmUgX0FTTV9TSF9SV1NFTV9ICiAKKyNpZm5kZWYgX0xJTlVYX1JXU0VNX0gKKyNlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgYXNtL3J3c2VtLmggZGlyZWN0bHksIHVzZSBsaW51eC9yd3NlbS5oIGluc3RlYWQiCisjZW5kaWYKKwogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NhdHVybi9pby5oIGIvaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjliNWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmgKLSAqCi0gKiBJL08gZnVuY3Rpb25zIGZvciB1c2Ugb24gdGhlIFNlZ2EgU2F0dXJuLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLSNpZm5kZWYgX19BU01fU0hfU0FUVVJOX0lPX0gKLSNkZWZpbmUgX19BU01fU0hfU0FUVVJOX0lPX0gKLQotLyogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNhdHVybl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLWV4dGVybiB2b2lkICpzYXR1cm5faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiB2b2lkIHNhdHVybl9pb3VubWFwKHZvaWQgKmFkZHIpOwotCi0jZW5kaWYgLyogX19BU01fU0hfU0FUVVJOX0lPX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL3NtcGMuaCBiL2luY2x1ZGUvYXNtLXNoL3NhdHVybi9zbXBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTVjMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL3NtcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9zYXR1cm4vc21wYy5oCi0gKgotICogU3lzdGVtIE1hbmFnZXIgLyBQZXJpcGhlcmFsIENvbnRyb2wgZGVmaW5pdGlvbnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2lmbmRlZiBfX0FTTV9TSF9TQVRVUk5fU01QQ19ICi0jZGVmaW5lIF9fQVNNX1NIX1NBVFVSTl9TTVBDX0gKLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jZGVmaW5lIFNNUENfQ09NTUFORAkweDIwMTAwMDFmCS8qIFNNUEMgY29tbWFuZCByZWdpc3RlciAqLwotI2RlZmluZSBTTVBDX1JFU1VMVAkweDIwMTAwMDVmCS8qIFNNUEMgcmVzdWx0IHJlZ2lzdGVyICovCi0jZGVmaW5lIFNNUENfU1RBVFVTCTB4MjAxMDAwNjMJLyogU01QQyBzdGF0dXMgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBTTVBDX0NNRF9NU0hPTgkweDAwMDEJCS8qIE1hc3RlciBTSCBPbiAqLwotI2RlZmluZSBTTVBDX0NNRF9TU0hPTgkweDAwMDIJCS8qIFNsYXZlIFNIIE9uICovCi0jZGVmaW5lIFNNUENfQ01EX1NTSE9GRgkweDAwMDMJCS8qIFNsYXZlIFNIIE9mZiAqLwotI2RlZmluZSBTTVBDX0NNRF9TTkRPTgkweDAwMDQJCS8qIFNvdW5kIE9uICovCi0jZGVmaW5lIFNNUENfQ01EX1NORE9GRgkweDAwMDUJCS8qIFNvdW5kIE9mZiAqLwotI2RlZmluZSBTTVBDX0NNRF9DRE9OCTB4MDAwNgkJLyogQ0QgT24gKi8KLSNkZWZpbmUgU01QQ19DTURfQ0RPRkYJMHgwMDA3CQkvKiBDRCBPZmYgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHNtcGNfYmFycmllcih2b2lkKQotewotCXdoaWxlICgoY3RybF9pbmIoU01QQ19TVEFUVVMpICYgMHgwMDAxKSA9PSAweDAwMDEpCi0JCTsKLX0KLQotI2VuZGlmIC8qIF9fQVNNX1NIX1NBVFVSTl9TTVBDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2VjdGlvbnMuaCBiL2luY2x1ZGUvYXNtLXNoL3NlY3Rpb25zLmgKaW5kZXggNTdhYmQ3MC4uMmE2OTZiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2VjdGlvbnMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zZWN0aW9ucy5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KIAotZXh0ZXJuIGNoYXIgX2VuZFtdOworZXh0ZXJuIGxvbmcgX19tYWNodmVjX3N0YXJ0LCBfX21hY2h2ZWNfZW5kOwogCiAjZW5kaWYgLyogX19BU01fU0hfU0VDVElPTlNfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oIGIvaW5jbHVkZS9hc20tc2gvc2V0dXAuaAppbmRleCAxNTgzYzZiLi41ODZhOTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NldHVwLmgKQEAgLTYsNiArNiw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiBpbnQgc2V0dXBfZWFybHlfcHJpbnRrKGNoYXIgKik7Cit2b2lkIHNoX212X3NldHVwKHZvaWQpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmgKaW5kZXggZGYzYjE4Ny4uNGZmMWViOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2gwMy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaApAQCAtMTQsMjIgKzE0LDE4IEBACiAjZGVmaW5lIElOVENfSVBSRAkweGZmZDAwMDEwVUwKIAogI2RlZmluZSBJUkwwX0lSUQkyCi0jZGVmaW5lIElSTDBfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDBfSVBSX1BPUwkzCiAjZGVmaW5lIElSTDBfUFJJT1JJVFkJMTMKIAogI2RlZmluZSBJUkwxX0lSUQk1Ci0jZGVmaW5lIElSTDFfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDFfSVBSX1BPUwkyCiAjZGVmaW5lIElSTDFfUFJJT1JJVFkJMTAKIAogI2RlZmluZSBJUkwyX0lSUQk4Ci0jZGVmaW5lIElSTDJfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDJfSVBSX1BPUwkxCiAjZGVmaW5lIElSTDJfUFJJT1JJVFkJNwogCiAjZGVmaW5lIElSTDNfSVJRCTExCi0jZGVmaW5lIElSTDNfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDNfSVBSX1BPUwkwCiAjZGVmaW5lIElSTDNfUFJJT1JJVFkJNAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zbXAuaCBiL2luY2x1ZGUvYXNtLXNoL3NtcC5oCmluZGV4IGNhYTdiOTMuLmI5OWNhNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NtcC5oCkBAIC0zOSw0ICszOSw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKKyNkZWZpbmUgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkJKDApCisKICNlbmRpZiAvKiBfX0FTTV9TSF9TTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIuaCBiL2luY2x1ZGUvYXNtLXNoL3NuYXBnZWFyLmgKaW5kZXggMmQ3MTJlNy4uMzU1NGUzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oCkBAIC0yMCwyMiArMjAsMTggQEAKICAqLwogCiAjZGVmaW5lIElSTDBfSVJRCQkyCi0jZGVmaW5lIElSTDBfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDBfSVBSX1BPUwkzCiAjZGVmaW5lIElSTDBfUFJJT1JJVFkJMTMKIAogI2RlZmluZSBJUkwxX0lSUQkJNQotI2RlZmluZSBJUkwxX0lQUl9BRERSCUlOVENfSVBSRAogI2RlZmluZSBJUkwxX0lQUl9QT1MJMgogI2RlZmluZSBJUkwxX1BSSU9SSVRZCTEwCiAKICNkZWZpbmUgSVJMMl9JUlEJCTgKLSNkZWZpbmUgSVJMMl9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMl9JUFJfUE9TCTEKICNkZWZpbmUgSVJMMl9QUklPUklUWQk3CiAKICNkZWZpbmUgSVJMM19JUlEJCTExCi0jZGVmaW5lIElSTDNfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDNfSVBSX1BPUwkwCiAjZGVmaW5lIElSTDNfUFJJT1JJVFkJNAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zcGFyc2VtZW0uaCBiL2luY2x1ZGUvYXNtLXNoL3NwYXJzZW1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2E1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9zcGFyc2VtZW0uaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9fQVNNX1NIX1NQQVJTRU1FTV9ICisjZGVmaW5lIF9fQVNNX1NIX1NQQVJTRU1FTV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogU0VDVElPTl9TSVpFX0JJVFMJCTJeTjogaG93IGJpZyBlYWNoIHNlY3Rpb24gd2lsbCBiZQorICogTUFYX1BIWVNBRERSX0JJVFMJCTJeTjogaG93IG11Y2ggcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSB3ZSBoYXZlCisgKiBNQVhfUEhZU01FTV9CSVRTCQkyXk46IGhvdyBtdWNoIG1lbW9yeSB3ZSBjYW4gaGF2ZSBpbiB0aGF0IHNwYWNlCisgKi8KKyNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMJMjYKKyNkZWZpbmUgTUFYX1BIWVNBRERSX0JJVFMJMzIKKyNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUwkzMgorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX1NIX1NQQVJTRU1FTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCmluZGV4IDgyZjNlMjIuLjdjNzUwNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCkBAIC04LDkgKzgsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOworCiAvKgogICoJc3dpdGNoX3RvKCkgc2hvdWxkIHN3aXRjaCB0YXNrcyB0byB0YXNrIG5yIG4sIGZpcnN0CiAgKi8KQEAgLTEyMiw3ICsxMjYsNyBAQAogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyAodm9pZCl4Y2hnKCZ2YXIsIHZhbHVlKTsgfSB3aGlsZSAoMCkKIAogLyoKICAqIEp1bXAgdG8gUDIgYXJlYS4KQEAgLTI3MSw2ICsyNzUsMTYgQEAKIHZvaWQgZGlzYWJsZV9obHQodm9pZCk7CiB2b2lkIGVuYWJsZV9obHQodm9pZCk7CiAKK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworCithc21saW5rYWdlIHZvaWQgYnJlYWtfcG9pbnRfdHJhcCh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBkZWJ1Z190cmFwX2hhbmRsZXIodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJCSAgIHN0cnVjdCBwdF9yZWdzIF9fcmVncyk7Cithc21saW5rYWdlIHZvaWQgYnVnX3RyYXBfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCSB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJCSBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpOworCiAjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLXNoL3RvcG9sb2d5LmgKaW5kZXggY2ZmMDAxYy4uZjQwMmEzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1zaC90b3BvbG9neS5oCkBAIC0xLDYgKzEsMzYgQEAKICNpZm5kZWYgX0FTTV9TSF9UT1BPTE9HWV9ICiAjZGVmaW5lIF9BU01fU0hfVE9QT0xPR1lfSAogCisjaWZkZWYgQ09ORklHX05VTUEKKworLyogc2NoZWRfZG9tYWlucyBTRF9OT0RFX0lOSVQgZm9yIHNoIG1hY2hpbmVzICovCisjZGVmaW5lIFNEX05PREVfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewkJXAorCS5zcGFuCQkJPSBDUFVfTUFTS19OT05FLAlcCisJLnBhcmVudAkJCT0gTlVMTCwJCQlcCisJLmNoaWxkCQkJPSBOVUxMLAkJCVwKKwkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKKwkubWluX2ludGVydmFsCQk9IDgsCQkJXAorCS5tYXhfaW50ZXJ2YWwJCT0gMzIsCQkJXAorCS5idXN5X2ZhY3RvcgkJPSAzMiwJCQlcCisJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKKwkuY2FjaGVfbmljZV90cmllcwk9IDIsCQkJXAorCS5idXN5X2lkeAkJPSAzLAkJCVwKKwkuaWRsZV9pZHgJCT0gMiwJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDAsCQkJXAorCS53YWtlX2lkeAkJPSAxLAkJCVwKKwkuZm9ya2V4ZWNfaWR4CQk9IDEsCQkJXAorCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKKwkJCQl8IFNEX0JBTEFOQ0VfRk9SSwlcCisJCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAorCQkJCXwgU0RfU0VSSUFMSVpFCQlcCisJCQkJfCBTRF9XQUtFX0JBTEFOQ0UsCVwKKwkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCisJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKKwkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKK30KKworI2VuZGlmCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgogCiAjZW5kaWYgLyogX0FTTV9TSF9UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmgKaW5kZXggNWM0OWVkNi4uZjE4YTFhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaApAQCAtNjEsOCArNjEsNiBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBfX2FjY2Vzc19vayh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7Ci0KIAlyZXR1cm4gKChhZGRyID49IG1lbW9yeV9zdGFydCkgJiYgKChhZGRyICsgc2l6ZSkgPCBtZW1vcnlfZW5kKSk7CiB9CiAjZWxzZSAvKiBDT05GSUdfTU1VICovCkBAIC03Niw3ICs3NCw3IEBACiAgKiBfX2FjY2Vzc19vazogQ2hlY2sgaWYgYWRkcmVzcyB3aXRoIHNpemUgaXMgT0sgb3Igbm90LgogICoKICAqIFdlIGRvIHRocmVlIGNoZWNrczoKLSAqICgxKSBpcyBpdCB1c2VyIHNwYWNlPyAKKyAqICgxKSBpcyBpdCB1c2VyIHNwYWNlPwogICogKDIpIGFkZHIgKyBzaXplIC0tPiBjYXJyeT8KICAqICgzKSBhZGRyICsgc2l6ZSA+PSAweDgwMDAwMDAwICAoUEFHRV9PRkZTRVQpCiAgKgpAQCAtMTQyLDExICsxNDAsMTIgQEAKICAgX19nZXRfdXNlcl9ub2NoZWNrKCh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkKIAogc3RydWN0IF9fbGFyZ2Vfc3RydWN0IHsgdW5zaWduZWQgbG9uZyBidWZbMTAwXTsgfTsKLSNkZWZpbmUgX19tKHgpICgqKHN0cnVjdCBfX2xhcmdlX3N0cnVjdCAqKSh4KSkKKyNkZWZpbmUgX19tKHgpICgqKHN0cnVjdCBfX2xhcmdlX3N0cnVjdCBfX3VzZXIgKikoeCkpCiAKICNkZWZpbmUgX19nZXRfdXNlcl9zaXplKHgscHRyLHNpemUscmV0dmFsKQkJCVwKIGRvIHsJCQkJCQkJCVwKIAlyZXR2YWwgPSAwOwkJCQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCVwKIAkJX19nZXRfdXNlcl9hc20oeCwgcHRyLCByZXR2YWwsICJiIik7CQlcCkBAIC0xNzUsNiArMTc0LDcgQEAKICNkZWZpbmUgX19nZXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCQlcCiAoewkJCQkJCQkJXAogCWxvbmcgX19ndV9lcnIsIF9fZ3VfdmFsOwkJCQlcCisJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCVwKIAlzd2l0Y2ggKHNpemUpIHsJCQkJCQlcCiAJY2FzZSAxOgkJCQkJCQlcCiAJCV9fZ2V0X3VzZXJfMShfX2d1X3ZhbCwgKHB0ciksIF9fZ3VfZXJyKTsJXApAQCAtMzAwLDYgKzMwMCw3IEBACiAjZGVmaW5lIF9fcHV0X3VzZXJfc2l6ZSh4LHB0cixzaXplLHJldHZhbCkJCVwKIGRvIHsJCQkJCQkJXAogCXJldHZhbCA9IDA7CQkJCQlcCisJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJXAogCWNhc2UgMToJCQkJCQlcCiAJCV9fcHV0X3VzZXJfYXNtKHgsIHB0ciwgcmV0dmFsLCAiYiIpOwlcCkBAIC0zMjgsNyArMzI5LDcgQEAKICNkZWZpbmUgX19wdXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCQlcCiAoewkJCQkJCQkJXAogCWxvbmcgX19wdV9lcnIgPSAtRUZBVUxUOwkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpICpfX3B1X2FkZHIgPSAocHRyKTsJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqX19wdV9hZGRyID0gKHB0cik7CQlcCiAJCQkJCQkJCVwKIAlpZiAoX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpX19wdV9hZGRyLHNpemUpKQkJXAogCQlfX3B1dF91c2VyX3NpemUoKHgpLF9fcHVfYWRkciwoc2l6ZSksX19wdV9lcnIpOwlcCkBAIC00MDYsMTAgKzQwNywxMCBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIF9fcHV0X3VzZXJfdW5rbm93bih2b2lkKTsKLQwKKwogLyogR2VuZXJpYyBhcmJpdHJhcnkgc2l6ZWQgY29weS4gICovCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBOT1QgY29waWVkICovCi1leHRlcm4gX19rZXJuZWxfc2l6ZV90IF9fY29weV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBfX2tlcm5lbF9zaXplX3Qgbik7CitfX2tlcm5lbF9zaXplX3QgX19jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIF9fa2VybmVsX3NpemVfdCBuKTsKIAogI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sZnJvbSxuKSAoeyBcCiB2b2lkICpfX2NvcHlfdG8gPSAodm9pZCAqKSAodG8pOyBcCkBAIC00MjAsMTQgKzQyMSw2IEBACiB9IGVsc2UgX19jb3B5X3JlcyA9IF9fY29weV9zaXplOyBcCiBfX2NvcHlfcmVzOyB9KQogCi0jZGVmaW5lIF9fY29weV90b191c2VyKHRvLGZyb20sbikJCVwKLQlfX2NvcHlfdXNlcigodm9pZCAqKSh0byksCQlcCi0JCSAgICAodm9pZCAqKShmcm9tKSwgbikKLQotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKLQotCiAjZGVmaW5lIGNvcHlfZnJvbV91c2VyKHRvLGZyb20sbikgKHsgXAogdm9pZCAqX19jb3B5X3RvID0gKHZvaWQgKikgKHRvKTsgXAogdm9pZCAqX19jb3B5X2Zyb20gPSAodm9pZCAqKSAoZnJvbSk7IFwKQEAgLTQzOCw5ICs0MzEsMjAgQEAKIH0gZWxzZSBfX2NvcHlfcmVzID0gX19jb3B5X3NpemU7IFwKIF9fY29weV9yZXM7IH0pCiAKLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0byxmcm9tLG4pCQlcCi0JX19jb3B5X3VzZXIoKHZvaWQgKikodG8pLAkJXAotCQkgICAgKHZvaWQgKikoZnJvbSksIG4pCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJcmV0dXJuIF9fY29weV91c2VyKHRvLCAoX19mb3JjZSB2b2lkICopZnJvbSwgbik7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK19fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBfX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkICopdG8sIGZyb20sIG4pOworfQorCisjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljIF9fY29weV90b191c2VyCisjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMgX19jb3B5X2Zyb21fdXNlcgogCiAvKgogICogQ2xlYXIgdGhlIGFyZWEgYW5kIHJldHVybiByZW1haW5pbmcgbnVtYmVyIG9mIGJ5dGVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC91YmMuaCBiL2luY2x1ZGUvYXNtLXNoL3ViYy5oCmluZGV4IGFlOWJiZGUuLjM4ZDQ2ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3ViYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3ViYy5oCkBAIC01MSw5ICs1MSwxNCBAQAogI2RlZmluZSBCUkNSX1VCREUJCSgxIDw8IDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKiBhcmNoL3NoL2tlcm5lbC91YmMuUyAqLwotZXh0ZXJuIHZvaWQgdWJjX3dha2V1cCh2b2lkKTsKKy8qIGFyY2gvc2gva2VybmVsL2NwdS91YmMuUyAqLwogZXh0ZXJuIHZvaWQgdWJjX3NsZWVwKHZvaWQpOworCisjaWZkZWYgQ09ORklHX1VCQ19XQUtFVVAKK2V4dGVybiB2b2lkIHViY193YWtldXAodm9pZCk7CisjZWxzZQorI2RlZmluZSB1YmNfd2FrZXVwKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvZmIuaCBiL2luY2x1ZGUvYXNtLXNoNjQvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJlOTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCmluZGV4IGI4NzU0ODIuLjM0ODhmZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oCkBAIC00MTUsMjIgKzQxNSwxNSBAQAogLyoKICAqIFRoZSBmb2xsb3dpbmcgaGF2ZSBkZWZpbmVkIGJlaGF2aW9yIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDVVRFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SRUFEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfV1JJVEUpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9FWEVDVVRFKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9SRUFEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfV1JJVEUpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0VYRUNVVEUpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9TWkhVR0UpKTsgcmV0dXJuIHB0ZTsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZmIuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaAppbmRleCA1OTIyOWFlLi5hNTVmNGMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oCkBAIC0xNTEsNyArMTUxLDYgQEAKIEJURklYVVBERUZfU0VUSEkobm9uZV9tYXNrKQogQlRGSVhVUERFRl9DQUxMX0NPTlNUKGludCwgcHRlX3ByZXNlbnQsIHB0ZV90KQogQlRGSVhVUERFRl9DQUxMKHZvaWQsIHB0ZV9jbGVhciwgcHRlX3QgKikKLUJURklYVVBERUZfQ0FMTChpbnQsIHB0ZV9yZWFkLCBwdGVfdCkKIAogc3RhdGljIGlubGluZSBpbnQgcHRlX25vbmUocHRlX3QgcHRlKQogewpAQCAtMTYwLDcgKzE1OSw2IEBACiAKICNkZWZpbmUgcHRlX3ByZXNlbnQocHRlKSBCVEZJWFVQX0NBTEwocHRlX3ByZXNlbnQpKHB0ZSkKICNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIscHRlKSBCVEZJWFVQX0NBTEwocHRlX2NsZWFyKShwdGUpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkgQlRGSVhVUF9DQUxMKHB0ZV9yZWFkKShwdGUpCiAKIEJURklYVVBERUZfQ0FMTF9DT05TVChpbnQsIHBtZF9iYWQsIHBtZF90KQogQlRGSVhVUERFRl9DQUxMX0NPTlNUKGludCwgcG1kX3ByZXNlbnQsIHBtZF90KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9idWdzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaAppbmRleCBiZjM5ZDg2Li4xMWFkZTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaApAQCAtNCwxMiArNCw3IEBACiAgKi8KICNpbmNsdWRlIDxhc20vc3N0YXRlLmg+CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKLQogc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2J1Z3Modm9pZCkKIHsKLSNpZm5kZWYgQ09ORklHX1NNUAotCWNwdV9kYXRhKDApLnVkZWxheV92YWwgPSBsb29wc19wZXJfamlmZnk7Ci0jZW5kaWYKIAlzc3RhdGVfcnVubmluZygpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKaW5kZXggMzY1MTFjYS4uMDFmZTY2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jcHVkYXRhLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaAppbmRleCA0NDUwMjZmLi45OGE2ZTYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaApAQCAtMTksNyArMTksNyBAQAogCXVuc2lnbmVkIGludAlfX3NvZnRpcnFfcGVuZGluZzsgLyogbXVzdCBiZSAxc3QsIHNlZSBydHJhcC5TICovCiAJdW5zaWduZWQgaW50CV9fcGFkMDsKIAl1bnNpZ25lZCBsb25nCWNsb2NrX3RpY2s7CS8qICV0aWNrJ3MgcGVyIHNlY29uZCAqLwotCXVuc2lnbmVkIGxvbmcJdWRlbGF5X3ZhbDsKKwl1bnNpZ25lZCBsb25nCV9fcGFkOwogCXVuc2lnbmVkIGludAlfX3BhZDE7CiAJdW5zaWduZWQgaW50CV9fcGFkMjsKIApAQCAtODAsNyArODAsOCBAQAogCXVuc2lnbmVkIGludAkJZGV2X21vbmRvX3FtYXNrOwogCXVuc2lnbmVkIGludAkJcmVzdW1fcW1hc2s7CiAJdW5zaWduZWQgaW50CQlub25yZXN1bV9xbWFzazsKLQl1bnNpZ25lZCBpbnQJCV9fcGFkMlszXTsKKwl1bnNpZ25lZCBpbnQJCV9fcGFkMlsxXTsKKwl2b2lkCQkJKmhkZXNjOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDY0KSkpOwogZXh0ZXJuIHN0cnVjdCB0cmFwX3Blcl9jcHUgdHJhcF9ibG9ja1tOUl9DUFVTXTsKIGV4dGVybiB2b2lkIGluaXRfY3VyX2NwdV90cmFwKHN0cnVjdCB0aHJlYWRfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGVsYXkuaAppbmRleCBhNGFhZTZmLi5hNzdhYTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZWxheS5oCkBAIC0xLDM3ICsxLDE3IEBACiAvKiBkZWxheS5oOiBMaW51eCBkZWxheSByb3V0aW5lcyBvbiBzcGFyYzY0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMjAwNCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpLgotICoKLSAqIEJhc2VkIGhlYXZpbHkgdXBvbiB4ODYgdmFyaWFudCB3aGljaCBpczoKLSAqIENvcHlyaWdodCAoQykgMTk5MyBMaW51cyBUb3J2YWxkcwotICoKLSAqIERlbGF5IHJvdXRpbmVzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGFyY2gvc3BhcmM2NC9saWIvZGVsYXkuYworICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA0LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkuCiAgKi8KIAotI2lmbmRlZiBfX1NQQVJDNjRfREVMQVlfSAotI2RlZmluZSBfX1NQQVJDNjRfREVMQVlfSAotCi0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgorI2lmbmRlZiBfU1BBUkM2NF9ERUxBWV9ICisjZGVmaW5lIF9TUEFSQzY0X0RFTEFZX0gKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotZXh0ZXJuIHZvaWQgX19iYWRfdWRlbGF5KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19iYWRfbmRlbGF5KHZvaWQpOwotCi1leHRlcm4gdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKLWV4dGVybiB2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpOwotZXh0ZXJuIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwotCi0jZGVmaW5lIHVkZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCi0JKChuKSA+IDIwMDAwID8gX19iYWRfdWRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiAweDEwYzd1bCkpIDogXAotCV9fdWRlbGF5KG4pKQotCQotI2RlZmluZSBuZGVsYXkobikgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotCSgobikgPiAyMDAwMCA/IF9fYmFkX25kZWxheSgpIDogX19jb25zdF91ZGVsYXkoKG4pICogNXVsKSkgOiBcCi0JX19uZGVsYXkobikpCitleHRlcm4gdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CisjZGVmaW5lIG1kZWxheShuKQl1ZGVsYXkoKG4pICogMTAwMCkKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmIC8qIGRlZmluZWQoX19TUEFSQzY0X0RFTEFZX0gpICovCisjZW5kaWYgLyogX1NQQVJDNjRfREVMQVlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mYi5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2QzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2h2dHJhbXAuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHZ0cmFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGQ2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2h2dHJhbXAuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9TUEFSQzY0X0hWVFJBUF9ICisjZGVmaW5lIF9TUEFSQzY0X0hWVFJBUF9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaHZ0cmFtcF9tYXBwaW5nIHsKKwlfX3U2NAkJdmFkZHI7CisJX191NjQJCXR0ZTsKK307CisKK3N0cnVjdCBodnRyYW1wX2Rlc2NyIHsKKwlfX3UzMgkJCWNwdTsKKwlfX3UzMgkJCW51bV9tYXBwaW5nczsKKwlfX3U2NAkJCWZhdWx0X2luZm9fdmE7CisJX191NjQJCQlmYXVsdF9pbmZvX3BhOworCV9fdTY0CQkJdGhyZWFkX3JlZzsKKwlzdHJ1Y3QgaHZ0cmFtcF9tYXBwaW5nCW1hcHNbMl07Cit9OworCitleHRlcm4gdm9pZCBodl9jcHVfc3RhcnR1cCh1bnNpZ25lZCBsb25nIGh2ZGVzY3JfcGEpOworCisjZW5kaWYKKworI2RlZmluZSBIVlRSQU1QX0RFU0NSX0NQVQkJMHgwMAorI2RlZmluZSBIVlRSQU1QX0RFU0NSX05VTV9NQVBQSU5HUwkweDA0CisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfRkFVTFRfSU5GT19WQQkweDA4CisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfRkFVTFRfSU5GT19QQQkweDEwCisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfVEhSRUFEX1JFRwkweDE4CisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfTUFQUwkJMHgyMAorCisjZGVmaW5lIEhWVFJBTVBfTUFQUElOR19WQUREUgkJMHgwMAorI2RlZmluZSBIVlRSQU1QX01BUFBJTkdfVFRFCQkweDA4CisjZGVmaW5lIEhWVFJBTVBfTUFQUElOR19TSVpFCQkweDEwCisKKyNlbmRpZiAvKiBfU1BBUkM2NF9IVlRSQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9oeXBlcnZpc29yLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaAppbmRleCBkYjIxMzBhLi41MjRkNDk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaApAQCAtOTgsNyArOTgsNyBAQAogI2RlZmluZSBIVl9GQVNUX01BQ0hfRVhJVAkJMHgwMAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotZXh0ZXJuIHZvaWQgc3VuNHZfbWFjaF9leGl0KHVuc2lnbmVkIGxvbmcgZXhpdF9jb3JlKTsKK2V4dGVybiB2b2lkIHN1bjR2X21hY2hfZXhpdCh1bnNpZ25lZCBsb25nIGV4aXRfY29kZSk7CiAjZW5kaWYKIAogLyogRG9tYWluIHNlcnZpY2VzLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCmluZGV4IDkwNzgxZTMuLmU2YzQzNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaApAQCAtNTMsNiArNTMsOCBAQAogZXh0ZXJuIHZvaWQgc3VuNHZfZGVzdHJveV9tc2kodW5zaWduZWQgaW50IHZpcnRfaXJxKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEodm9pZCAqc2J1cywgdW5zaWduZWQgaW50IGlubyk7CiAKK2V4dGVybiB2b2lkIGZpeHVwX2lycXModm9pZCk7CisKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3NvZnRpbnQodW5zaWduZWQgbG9uZyBiaXRzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cgklMCwgMHgwLCAlJXNldF9zb2Z0aW50IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9sZGMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbGRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiNTI0YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbGRjLmgKQEAgLTAsMCArMSwxMzggQEAKKyNpZm5kZWYgX1NQQVJDNjRfTERDX0gKKyNkZWZpbmUgX1NQQVJDNjRfTERDX0gKKworI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisKK2V4dGVybiBpbnQgbGRvbV9kb21haW5pbmdfZW5hYmxlZDsKK2V4dGVybiB2b2lkIGxkb21fc2V0X3Zhcihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGxkb21fcmVib290KGNvbnN0IGNoYXIgKmJvb3RfY29tbWFuZCk7CitleHRlcm4gdm9pZCBsZG9tX3Bvd2VyX29mZih2b2lkKTsKKworLyogVGhlIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBldm9rZWQgd2hlbiBsaW5rIHN0YXRlIGNoYW5nZXMKKyAqIG9yIGRhdGEgYmVjb21lcyBhdmFpbGFibGUgb24gdGhlIHJlY2VpdmUgc2lkZS4KKyAqCisgKiBGb3Igbm9uLVJBVyBsaW5rcywgaWYgdGhlIExEQ19FVkVOVF9SRVNFVCBldmVudCBhcnJpdmVzIHRoZQorICogZHJpdmVyIHNob3VsZCByZXNldCBhbGwgb2YgaXQncyBpbnRlcm5hbCBzdGF0ZSBhbmQgcmVpbnZva2UKKyAqIGxkY19jb25uZWN0KCkgdG8gdHJ5IGFuZCBicmluZyB0aGUgbGluayB1cCBhZ2Fpbi4KKyAqCisgKiBGb3IgUkFXIGxpbmtzLCBsZGNfY29ubmVjdCgpIGlzIG5vdCB1c2VkLiAgSW5zdGVhZCB0aGUgZHJpdmVyCisgKiBqdXN0IHdhaXRzIGZvciB0aGUgTERDX0VWRU5UX1VQIGV2ZW50LgorICovCitzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIHsKKwl2b2lkICgqZXZlbnQpKHZvaWQgKmFyZywgaW50IGV2ZW50KTsKKworCXUzMgkJCW10dTsKKwl1bnNpZ25lZCBpbnQJCXJ4X2lycTsKKwl1bnNpZ25lZCBpbnQJCXR4X2lycTsKKwl1OAkJCW1vZGU7CisjZGVmaW5lIExEQ19NT0RFX1JBVwkJMHgwMAorI2RlZmluZSBMRENfTU9ERV9VTlJFTElBQkxFCTB4MDEKKyNkZWZpbmUgTERDX01PREVfUkVTRVJWRUQJMHgwMgorI2RlZmluZSBMRENfTU9ERV9TVFJFQU0JCTB4MDMKKworCXU4CQkJZGVidWc7CisjZGVmaW5lIExEQ19ERUJVR19IUwkJMHgwMQorI2RlZmluZSBMRENfREVCVUdfU1RBVEUJCTB4MDIKKyNkZWZpbmUgTERDX0RFQlVHX1JYCQkweDA0CisjZGVmaW5lIExEQ19ERUJVR19UWAkJMHgwOAorI2RlZmluZSBMRENfREVCVUdfREFUQQkJMHgxMAorfTsKKworI2RlZmluZSBMRENfRVZFTlRfUkVTRVQJCTB4MDEKKyNkZWZpbmUgTERDX0VWRU5UX1VQCQkweDAyCisjZGVmaW5lIExEQ19FVkVOVF9EQVRBX1JFQURZCTB4MDQKKworI2RlZmluZSBMRENfU1RBVEVfSU5WQUxJRAkweDAwCisjZGVmaW5lIExEQ19TVEFURV9JTklUCQkweDAxCisjZGVmaW5lIExEQ19TVEFURV9CT1VORAkJMHgwMgorI2RlZmluZSBMRENfU1RBVEVfUkVBRFkJCTB4MDMKKyNkZWZpbmUgTERDX1NUQVRFX0NPTk5FQ1RFRAkweDA0CisKK3N0cnVjdCBsZGNfY2hhbm5lbDsKKworLyogQWxsb2NhdGUgc3RhdGUgZm9yIGEgY2hhbm5lbC4gICovCitleHRlcm4gc3RydWN0IGxkY19jaGFubmVsICpsZGNfYWxsb2ModW5zaWduZWQgbG9uZyBpZCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgKmNmZ3AsCisJCQkJICAgICB2b2lkICpldmVudF9hcmcpOworCisvKiBTaHV0IGRvd24gYW5kIGZyZWUgc3RhdGUgZm9yIGEgY2hhbm5lbC4gICovCitleHRlcm4gdm9pZCBsZGNfZnJlZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKTsKKworLyogUmVnaXN0ZXIgVFggYW5kIFJYIHF1ZXVlcyBvZiB0aGUgbGluayB3aXRoIHRoZSBoeXBlcnZpc29yLiAgKi8KK2V4dGVybiBpbnQgbGRjX2JpbmQoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIEZvciBub24tUkFXIHByb3RvY29scyB3ZSBuZWVkIHRvIGNvbXBsZXRlIGEgaGFuZHNoYWtlIGJlZm9yZQorICogY29tbXVuaWNhdGlvbiBjYW4gcHJvY2VlZC4gIGxkY19jb25uZWN0KCkgZG9lcyB0aGF0LCBpZiB0aGUKKyAqIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBhbiBMRENfRVZFTlRfVVAgZXZlbnQgd2lsbAorICogYmUgc2VudCB1cCB0byB0aGUgZHJpdmVyLgorICovCitleHRlcm4gaW50IGxkY19jb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApOworZXh0ZXJuIGludCBsZGNfZGlzY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKTsKKworZXh0ZXJuIGludCBsZGNfc3RhdGUoc3RydWN0IGxkY19jaGFubmVsICpscCk7CisKKy8qIFJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuICBPbmx5IHZhbGlkIHdoZW4gdGhlIGxpbmsgaXMgdXAuICAqLworZXh0ZXJuIGludCBsZGNfd3JpdGUoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLAorCQkgICAgIHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiBpbnQgbGRjX3JlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKyNkZWZpbmUgTERDX01BUF9TSEFET1cJMHgwMQorI2RlZmluZSBMRENfTUFQX0RJUkVDVAkweDAyCisjZGVmaW5lIExEQ19NQVBfSU8JMHgwNAorI2RlZmluZSBMRENfTUFQX1IJMHgwOAorI2RlZmluZSBMRENfTUFQX1cJMHgxMAorI2RlZmluZSBMRENfTUFQX1gJMHgyMAorI2RlZmluZSBMRENfTUFQX1JXCShMRENfTUFQX1IgfCBMRENfTUFQX1cpCisjZGVmaW5lIExEQ19NQVBfUldYCShMRENfTUFQX1IgfCBMRENfTUFQX1cgfCBMRENfTUFQX1gpCisjZGVmaW5lIExEQ19NQVBfQUxMCTB4MDNmCisKK3N0cnVjdCBsZGNfdHJhbnNfY29va2llIHsKKwl1NjQJCQljb29raWVfYWRkcjsKKwl1NjQJCQljb29raWVfc2l6ZTsKK307CisKK3N0cnVjdCBzY2F0dGVybGlzdDsKK2V4dGVybiBpbnQgbGRjX21hcF9zZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbnVtX3NnLAorCQkgICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pOworCitleHRlcm4gaW50IGxkY19tYXBfc2luZ2xlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCSAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkJCSAgdW5zaWduZWQgaW50IG1hcF9wZXJtKTsKKworZXh0ZXJuIHZvaWQgbGRjX3VubWFwKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkgICAgICBpbnQgbmNvb2tpZXMpOworCitleHRlcm4gaW50IGxkY19jb3B5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGludCBjb3B5X2RpciwKKwkJICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCSAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKTsKKworc3RhdGljIGlubGluZSBpbnQgbGRjX2dldF9kcmluZ19lbnRyeShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSAgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywKKwkJCQkgICAgICBpbnQgbmNvb2tpZXMpCit7CisJcmV0dXJuIGxkY19jb3B5KGxwLCBMRENfQ09QWV9JTiwgYnVmLCBsZW4sIG9mZnNldCwgY29va2llcywgbmNvb2tpZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZGNfcHV0X2RyaW5nX2VudHJ5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkJCSAgICAgIGludCBuY29va2llcykKK3sKKwlyZXR1cm4gbGRjX2NvcHkobHAsIExEQ19DT1BZX09VVCwgYnVmLCBsZW4sIG9mZnNldCwgY29va2llcywgbmNvb2tpZXMpOworfQorCitleHRlcm4gdm9pZCAqbGRjX2FsbG9jX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywKKwkJCQkgaW50ICpuY29va2llcywgdW5zaWduZWQgaW50IG1hcF9wZXJtKTsKKworZXh0ZXJuIHZvaWQgbGRjX2ZyZWVfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMpOworCisjZW5kaWYgLyogX1NQQVJDNjRfTERDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbWRlc2MuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbWRlc2MuaAppbmRleCBjNjM4Mzk4Li5lOTdjNDMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L21kZXNjLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tZGVzYy5oCkBAIC0yLDM4ICsyLDY2IEBACiAjZGVmaW5lIF9TUEFSQzY0X01ERVNDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKLXN0cnVjdCBtZGVzY19ub2RlOwotc3RydWN0IG1kZXNjX2FyYyB7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0Jc3RydWN0IG1kZXNjX25vZGUJKmFyYzsKLX07CitzdHJ1Y3QgbWRlc2NfaGFuZGxlOwogCi1zdHJ1Y3QgbWRlc2Nfbm9kZSB7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0JdTY0CQkJbm9kZTsKLQl1bnNpZ25lZCBpbnQJCXVuaXF1ZV9pZDsKLQl1bnNpZ25lZCBpbnQJCW51bV9hcmNzOwotCXVuc2lnbmVkIGludAkJaXJxc1syXTsKLQlzdHJ1Y3QgcHJvcGVydHkJCSpwcm9wZXJ0aWVzOwotCXN0cnVjdCBtZGVzY19ub2RlCSpoYXNoX25leHQ7Ci0Jc3RydWN0IG1kZXNjX25vZGUJKmFsbG5vZGVzX25leHQ7Ci0Jc3RydWN0IG1kZXNjX2FyYwlhcmNzWzBdOwotfTsKKy8qIE1hY2hpbmUgZGVzY3JpcHRpb24gb3BlcmF0aW9ucyBhcmUgdG8gYmUgc3Vycm91bmRlZCBieSBncmFiIGFuZAorICogcmVsZWFzZSBjYWxscy4gIFRoZSBtZGVzY19oYW5kbGUgcmV0dXJuZWQgZnJvbSB0aGUgZ3JhYiBpcworICogdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGFsbCBvZiB0aGUgb3BlcmF0aW9uYWwgY2FsbHMgdGhhdCB3b3JrCisgKiBvbiBtZGVzY3MuCisgKi8KK2V4dGVybiBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19ncmFiKHZvaWQpOworZXh0ZXJuIHZvaWQgbWRlc2NfcmVsZWFzZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICopOwogCi1leHRlcm4gc3RydWN0IG1kZXNjX25vZGUgKm1kX2ZpbmRfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19ub2RlICpmcm9tLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSk7Ci0jZGVmaW5lIG1kX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShfX21uLCBfX25hbWUpIFwKLQlmb3IgKF9fbW4gPSBtZF9maW5kX25vZGVfYnlfbmFtZShOVUxMLCBfX25hbWUpOyBfX21uOyBcCi0JICAgICBfX21uID0gbWRfZmluZF9ub2RlX2J5X25hbWUoX19tbiwgX19uYW1lKSkKKyNkZWZpbmUgTURFU0NfTk9ERV9OVUxMCQkofih1NjQpMCkKIAotZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqbWRfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsCi0JCQkJCSBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgaW50ICpsZW5wKTsKLWV4dGVybiBjb25zdCB2b2lkICptZF9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IG1kZXNjX25vZGUgKm1wLAotCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgaW50ICpsZW5wKTsKK2V4dGVybiB1NjQgbWRlc2Nfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgIHU2NCBmcm9tX25vZGUsIGNvbnN0IGNoYXIgKm5hbWUpOworI2RlZmluZSBtZGVzY19mb3JfZWFjaF9ub2RlX2J5X25hbWUoX19oZGwsIF9fbm9kZSwgX19uYW1lKSBcCisJZm9yIChfX25vZGUgPSBtZGVzY19ub2RlX2J5X25hbWUoX19oZGwsIE1ERVNDX05PREVfTlVMTCwgX19uYW1lKTsgXAorCSAgICAgKF9fbm9kZSkgIT0gTURFU0NfTk9ERV9OVUxMOyBcCisJICAgICBfX25vZGUgPSBtZGVzY19ub2RlX2J5X25hbWUoX19oZGwsIF9fbm9kZSwgX19uYW1lKSkKKworLyogQWNjZXNzIHRvIHByb3BlcnR5IHZhbHVlcyByZXR1cm5lZCBmcm9tIG1kZXNjX2dldF9wcm9wZXJ0eSgpIGFyZQorICogb25seSB2YWxpZCBpbnNpZGUgb2YgYSBtZGVzY19ncmFiKCkvbWRlc2NfcmVsZWFzZSgpIHNlcXVlbmNlLgorICogT25jZSBtZGVzY19yZWxlYXNlKCkgaXMgY2FsbGVkLCB0aGUgbWVtb3J5IGJhY2tlZCB1cCBieSB0aGVzZQorICogcG9pbnRlcnMgbWF5IHJlZmVyZW5jZSBmcmVlZCB1cCBtZW1vcnkuCisgKgorICogVGhlcmVmb3JlIGNhbGxlcnMgbXVzdCBtYWtlIGNvcGllcyBvZiBhbnkgcHJvcGVydHkgdmFsdWVzCisgKiB0aGV5IG5lZWQuCisgKgorICogVGhlc2Ugc2FtZSBydWxlcyBhcHBseSB0byBtZGVzY19ub2RlX25hbWUoKS4KKyAqLworZXh0ZXJuIGNvbnN0IHZvaWQgKm1kZXNjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICAgdTY0IG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCk7CitleHRlcm4gY29uc3QgY2hhciAqbWRlc2Nfbm9kZV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSk7CisKKy8qIE1EIGFyYyBpdGVyYXRpb24sIHRoZSBzdGFuZGFyZCBzZXF1ZW5jZSBpczoKKyAqCisgKgl1bnNpZ25lZCBsb25nIGFyYzsKKyAqCW1kZXNjX2Zvcl9lYWNoX2FyYyhhcmMsIGhhbmRsZSwgbm9kZSwgTURFU0NfQVJDX1RZUEVfe0ZXRCxCQUNLfSkgeworICoJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChoYW5kbGUsIGFyYyk7CisgKgkJLi4uCisgKgl9CisgKi8KKworI2RlZmluZSBNREVTQ19BUkNfVFlQRV9GV0QJImZ3ZCIKKyNkZWZpbmUgTURFU0NfQVJDX1RZUEVfQkFDSwkiYmFjayIKKworZXh0ZXJuIHU2NCBtZGVzY19uZXh0X2FyYyhzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUsIHU2NCBmcm9tLAorCQkJICBjb25zdCBjaGFyICphcmNfdHlwZSk7CisjZGVmaW5lIG1kZXNjX2Zvcl9lYWNoX2FyYyhfX2FyYywgX19oZGwsIF9fbm9kZSwgX190eXBlKSBcCisJZm9yIChfX2FyYyA9IG1kZXNjX25leHRfYXJjKF9faGRsLCBfX25vZGUsIF9fdHlwZSk7IFwKKwkgICAgIChfX2FyYykgIT0gTURFU0NfTk9ERV9OVUxMOyBcCisJICAgICBfX2FyYyA9IG1kZXNjX25leHRfYXJjKF9faGRsLCBfX2FyYywgX190eXBlKSkKKworZXh0ZXJuIHU2NCBtZGVzY19hcmNfdGFyZ2V0KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgYXJjKTsKKworZXh0ZXJuIHZvaWQgbWRlc2NfdXBkYXRlKHZvaWQpOworCitleHRlcm4gdm9pZCBtZGVzY19maWxsX2luX2NwdV9kYXRhKGNwdW1hc2tfdCBtYXNrKTsKIAogZXh0ZXJuIHZvaWQgc3VuNHZfbWRlc2NfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oCmluZGV4IDhkMTI5MDMuLjlmYzIyNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmgKQEAgLTc2LDYgKzc2LDkgQEAKIAl1bnNpZ25lZCBsb25nIGN0eF92YWxpZCwgZmxhZ3M7CiAJaW50IGNwdTsKIAorCWlmICh1bmxpa2VseShtbSA9PSAmaW5pdF9tbSkpCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZtbS0+Y29udGV4dC5sb2NrLCBmbGFncyk7CiAJY3R4X3ZhbGlkID0gQ1RYX1ZBTElEKG1tLT5jb250ZXh0KTsKIAlpZiAoIWN0eF92YWxpZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmgKaW5kZXggOWU4MGFkNC4uMDM5MzM4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmgKQEAgLTU3MywyNCArNTczLDYgQEAKIAlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIG1hc2spOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSJcbjY2MToJbW92CQklMSwgJTBcbiIKLQkiCW5vcFxuIgotCSIJLnNlY3Rpb24JLnN1bjR2XzJpbnNuX3BhdGNoLCBcImF4XCJcbiIKLQkiCS53b3JkCQk2NjFiXG4iCi0JIglzZXRoaQkJJSV1aGkoJTIpLCAlMFxuIgotCSIJc2xseAkJJTAsIDMyLCAlMFxuIgotCSIJLnByZXZpb3VzXG4iCi0JOiAiPXIiIChtYXNrKQotCTogImkiIChfUEFHRV9SRUFEXzRVKSwgImkiIChfUEFHRV9SRUFEXzRWKSk7Ci0KLQlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIG1hc2spOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX2ZpbGUocHRlX3QgcHRlKQogewogCXVuc2lnbmVkIGxvbmcgdmFsID0gcHRlX3ZhbChwdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wb3dlci5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDk1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvd2VyLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9TUEFSQzY0X1BPV0VSX0gKKyNkZWZpbmUgX1NQQVJDNjRfUE9XRVJfSAorCitleHRlcm4gdm9pZCB3YWtlX3VwX3Bvd2VyZCh2b2lkKTsKK2V4dGVybiBpbnQgc3RhcnRfcG93ZXJkKHZvaWQpOworCisjZW5kaWYgLyogIShfU1BBUkM2NF9QT1dFUl9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc21wLmgKaW5kZXggNGZiOGM0Yi4uZThhOTZhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oCkBAIC0yOSw5ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAotZXh0ZXJuIGNwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcDsKLSNkZWZpbmUgY3B1X3Bvc3NpYmxlX21hcCBwaHlzX2NwdV9wcmVzZW50X21hcAotCiBleHRlcm4gY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXTsKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2NvcmVfbWFwW05SX0NQVVNdOwogZXh0ZXJuIGludCBzcGFyYzY0X211bHRpX2NvcmU7CkBAIC00NCw3ICs0MSwxMiBAQAogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKIAogZXh0ZXJuIHZvaWQgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcyh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOworZXh0ZXJuIHZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorZXh0ZXJuIGludCBfX2NwdV9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpOworI2VuZGlmCiAKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIApAQCAtNTIsNyArNTQsNiBAQAogCiAjZGVmaW5lIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpCQkwCiAjZGVmaW5lIHNtcF9maWxsX2luX3NpYl9jb3JlX21hcHMoKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGJvb3RfY3B1X2lkCSgwKQogCiAjZW5kaWYgLyogIShDT05GSUdfU01QKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Zpby5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC92aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M5NjQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC92aW8uaApAQCAtMCwwICsxLDQwNCBAQAorI2lmbmRlZiBfU1BBUkM2NF9WSU9fSAorI2RlZmluZSBfU1BBUkM2NF9WSU9fSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL21kZXNjLmg+CisKK3N0cnVjdCB2aW9fbXNnX3RhZyB7CisJdTgJCQl0eXBlOworI2RlZmluZSBWSU9fVFlQRV9DVFJMCQkweDAxCisjZGVmaW5lIFZJT19UWVBFX0RBVEEJCTB4MDIKKyNkZWZpbmUgVklPX1RZUEVfRVJSCQkweDA0CisKKwl1OAkJCXN0eXBlOworI2RlZmluZSBWSU9fU1VCVFlQRV9JTkZPCTB4MDEKKyNkZWZpbmUgVklPX1NVQlRZUEVfQUNLCQkweDAyCisjZGVmaW5lIFZJT19TVUJUWVBFX05BQ0sJMHgwNAorCisJdTE2CQkJc3R5cGVfZW52OworI2RlZmluZSBWSU9fVkVSX0lORk8JCTB4MDAwMQorI2RlZmluZSBWSU9fQVRUUl9JTkZPCQkweDAwMDIKKyNkZWZpbmUgVklPX0RSSU5HX1JFRwkJMHgwMDAzCisjZGVmaW5lIFZJT19EUklOR19VTlJFRwkJMHgwMDA0CisjZGVmaW5lIFZJT19SRFgJCQkweDAwMDUKKyNkZWZpbmUgVklPX1BLVF9EQVRBCQkweDAwNDAKKyNkZWZpbmUgVklPX0RFU0NfREFUQQkJMHgwMDQxCisjZGVmaW5lIFZJT19EUklOR19EQVRBCQkweDAwNDIKKyNkZWZpbmUgVk5FVF9NQ0FTVF9JTkZPCQkweDAxMDEKKworCXUzMgkJc2lkOworfTsKKworc3RydWN0IHZpb19yZHggeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJcmVzdls2XTsKK307CisKK3N0cnVjdCB2aW9fdmVyX2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTE2CQkJbWFqb3I7CisJdTE2CQkJbWlub3I7CisJdTgJCQlkZXZfY2xhc3M7CisjZGVmaW5lIFZERVZfTkVUV09SSwkJMHgwMQorI2RlZmluZSBWREVWX05FVFdPUktfU1dJVENICTB4MDIKKyNkZWZpbmUgVkRFVl9ESVNLCQkweDAzCisjZGVmaW5lIFZERVZfRElTS19TRVJWRVIJMHgwNAorCisJdTgJCQlyZXN2MVszXTsKKwl1NjQJCQlyZXN2Mls1XTsKK307CisKK3N0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJZHJpbmdfaWRlbnQ7CisJdTMyCQkJbnVtX2Rlc2NyOworCXUzMgkJCWRlc2NyX3NpemU7CisJdTE2CQkJb3B0aW9uczsKKyNkZWZpbmUgVklPX1RYX0RSSU5HCQkweDAwMDEKKyNkZWZpbmUgVklPX1JYX0RSSU5HCQkweDAwMDIKKwl1MTYJCQlyZXN2OworCXUzMgkJCW51bV9jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMF07Cit9OworCitzdHJ1Y3QgdmlvX2RyaW5nX3VucmVnaXN0ZXIgeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJZHJpbmdfaWRlbnQ7CisJdTY0CQkJcmVzdls1XTsKK307CisKKy8qIERhdGEgdHJhbnNmZXIgbW9kZXMgKi8KKyNkZWZpbmUgVklPX1BLVF9NT0RFCQkweDAxIC8qIFBhY2tldCBiYXNlZCB0cmFuc2ZlcgkqLworI2RlZmluZSBWSU9fREVTQ19NT0RFCQkweDAyIC8qIEluLWJhbmQgZGVzY3JpcHRvcnMJKi8KKyNkZWZpbmUgVklPX0RSSU5HX01PREUJCTB4MDMgLyogRGVzY3JpcHRvciByaW5ncwkqLworCitzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgeworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTY0CQkJc2VxOworCXU2NAkJCWRyaW5nX2lkZW50OworCXUzMgkJCXN0YXJ0X2lkeDsKKwl1MzIJCQllbmRfaWR4OworCXU4CQkJc3RhdGU7CisjZGVmaW5lIFZJT19EUklOR19BQ1RJVkUJMHgwMQorI2RlZmluZSBWSU9fRFJJTkdfU1RPUFBFRAkweDAyCisKKwl1OAkJCV9fcGFkMTsKKwl1MTYJCQlfX3BhZDI7CisJdTMyCQkJX19wYWQzOworCXU2NAkJCV9fcGFyNFsyXTsKK307CisKK3N0cnVjdCB2aW9fZHJpbmdfaGRyIHsKKwl1OAkJCXN0YXRlOworI2RlZmluZSBWSU9fREVTQ19GUkVFCQkweDAxCisjZGVmaW5lIFZJT19ERVNDX1JFQURZCQkweDAyCisjZGVmaW5lIFZJT19ERVNDX0FDQ0VQVEVECTB4MDMKKyNkZWZpbmUgVklPX0RFU0NfRE9ORQkJMHgwNAorCXU4CQkJYWNrOworI2RlZmluZSBWSU9fQUNLX0VOQUJMRQkJMHgwMQorI2RlZmluZSBWSU9fQUNLX0RJU0FCTEUJCTB4MDAKKworCXUxNgkJCV9fcGFkMTsKKwl1MzIJCQlfX3BhZDI7Cit9OworCisvKiBWSU8gZGlzayBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzICovCitzdHJ1Y3QgdmlvX2Rpc2tfYXR0cl9pbmZvIHsKKwlzdHJ1Y3QgdmlvX21zZ190YWcJdGFnOworCXU4CQkJeGZlcl9tb2RlOworCXU4CQkJdmRpc2tfdHlwZTsKKyNkZWZpbmUgVkRfRElTS19UWVBFX1NMSUNFCTB4MDEgLyogU2xpY2UgaW4gYmxvY2sgZGV2aWNlCSovCisjZGVmaW5lIFZEX0RJU0tfVFlQRV9ESVNLCTB4MDIgLyogRW50aXJlIGJsb2NrIGRldmljZQkqLworCXUxNgkJCXJlc3YxOworCXUzMgkJCXZkaXNrX2Jsb2NrX3NpemU7CisJdTY0CQkJb3BlcmF0aW9uczsKKwl1NjQJCQl2ZGlza19zaXplOworCXU2NAkJCW1heF94ZmVyX3NpemU7CisJdTY0CQkJcmVzdjJbMl07Cit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyB7CisJc3RydWN0IHZpb19kcmluZ19oZHIJaGRyOworCXU2NAkJCXJlcV9pZDsKKwl1OAkJCW9wZXJhdGlvbjsKKyNkZWZpbmUgVkRfT1BfQlJFQUQJCTB4MDEgLyogQmxvY2sgcmVhZAkJCSovCisjZGVmaW5lIFZEX09QX0JXUklURQkJMHgwMiAvKiBCbG9jayB3cml0ZQkJCSovCisjZGVmaW5lIFZEX09QX0ZMVVNICQkweDAzIC8qIEZsdXNoIGRpc2sgY29udGVudHMJCSovCisjZGVmaW5lIFZEX09QX0dFVF9XQ0UJCTB4MDQgLyogR2V0IHdyaXRlLWNhY2hlIHN0YXR1cwkJKi8KKyNkZWZpbmUgVkRfT1BfU0VUX1dDRQkJMHgwNSAvKiBFbmFibGUvZGlzYWJsZSB3cml0ZS1jYWNoZQkqLworI2RlZmluZSBWRF9PUF9HRVRfVlRPQwkJMHgwNiAvKiBHZXQgVlRPQwkJCSovCisjZGVmaW5lIFZEX09QX1NFVF9WVE9DCQkweDA3IC8qIFNldCBWVE9DCQkJKi8KKyNkZWZpbmUgVkRfT1BfR0VUX0RJU0tHRU9NCTB4MDggLyogR2V0IGRpc2sgZ2VvbWV0cnkJCSovCisjZGVmaW5lIFZEX09QX1NFVF9ESVNLR0VPTQkweDA5IC8qIFNldCBkaXNrIGdlb21ldHJ5CQkqLworI2RlZmluZSBWRF9PUF9TQ1NJQ01ECQkweDBhIC8qIFNDU0kgY29udHJvbCBjb21tYW5kCQkqLworI2RlZmluZSBWRF9PUF9HRVRfREVWSUQJCTB4MGIgLyogR2V0IGRldmljZSBJRAkJCSovCisjZGVmaW5lIFZEX09QX0dFVF9FRkkJCTB4MGMgLyogR2V0IEVGSQkJCQkqLworI2RlZmluZSBWRF9PUF9TRVRfRUZJCQkweDBkIC8qIFNldCBFRkkJCQkJKi8KKwl1OAkJCXNsaWNlOworCXUxNgkJCXJlc3YxOworCXUzMgkJCXN0YXR1czsKKwl1NjQJCQlvZmZzZXQ7CisJdTY0CQkJc2l6ZTsKKwl1MzIJCQluY29va2llczsKKwl1MzIJCQlyZXN2MjsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQljb29raWVzWzBdOworfTsKKworI2RlZmluZSBWSU9fRElTS19WTkFNRV9MRU4JOAorI2RlZmluZSBWSU9fRElTS19BTEFCRUxfTEVOCTEyOAorI2RlZmluZSBWSU9fRElTS19OVU1fUEFSVAk4CisKK3N0cnVjdCB2aW9fZGlza192dG9jIHsKKwl1OAkJCXZvbHVtZV9uYW1lW1ZJT19ESVNLX1ZOQU1FX0xFTl07CisJdTE2CQkJc2VjdG9yX3NpemU7CisJdTE2CQkJbnVtX3BhcnRpdGlvbnM7CisJdTgJCQlhc2NpaV9sYWJlbFtWSU9fRElTS19BTEFCRUxfTEVOXTsKKwlzdHJ1Y3QgeworCQl1MTYJCWlkOworCQl1MTYJCXBlcm1fZmxhZ3M7CisJCXUzMgkJcmVzdjsKKwkJdTY0CQlzdGFydF9ibG9jazsKKwkJdTY0CQludW1fYmxvY2tzOworCX0gcGFydGl0aW9uc1tWSU9fRElTS19OVU1fUEFSVF07Cit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZ2VvbSB7CisJdTE2CQkJbnVtX2N5bDsgLyogTnVtIGRhdGEgY3lsaW5kZXJzCQkqLworCXUxNgkJCWFsdF9jeWw7IC8qIE51bSBhbHRlcm5hdGUgY3lsaW5kZXJzCSovCisJdTE2CQkJYmVnX2N5bDsgLyogQ3lsIG9mZiBvZiBmaXhlZCBoZWFkIGFyZWEJKi8KKwl1MTYJCQludW1faGQ7ICAvKiBOdW0gaGVhZHMJCQkqLworCXUxNgkJCW51bV9zZWM7IC8qIE51bSBzZWN0b3JzCQkJKi8KKwl1MTYJCQlpZmFjdDsgICAvKiBJbnRlcmxlYXZlIGZhY3RvcgkJKi8KKwl1MTYJCQlhcGM7ICAgICAvKiBBbHRzIHBlciBjeWxpbmRlciAoU0NTSSkJKi8KKwl1MTYJCQlycG07CSAvKiBSZXZvbHV0aW9ucyBwZXIgbWludXRlCSovCisJdTE2CQkJcGh5X2N5bDsgLyogTnVtIHBoeXNpY2FsIGN5bGluZGVycwkqLworCXUxNgkJCXdyX3NraXA7IC8qIE51bSBzZWN0cyB0byBza2lwLCB3cml0ZXMJKi8KKwl1MTYJCQlyZF9za2lwOyAvKiBOdW0gc2VjdHMgdG8gc2tpcCwgd3JpdGVzCSovCit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZGV2aWQgeworCXUxNgkJCXJlc3Y7CisJdTE2CQkJdHlwZTsKKwl1MzIJCQlsZW47CisJY2hhcgkJCWlkWzBdOworfTsKKworc3RydWN0IHZpb19kaXNrX2VmaSB7CisJdTY0CQkJbGJhOworCXU2NAkJCWxlbjsKKwljaGFyCQkJZGF0YVswXTsKK307CisKKy8qIFZJTyBuZXQgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyAqLworc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvIHsKKwlzdHJ1Y3QgdmlvX21zZ190YWcJdGFnOworCXU4CQkJeGZlcl9tb2RlOworCXU4CQkJYWRkcl90eXBlOworI2RlZmluZSBWTkVUX0FERFJfRVRIRVJNQUMJMHgwMQorCXUxNgkJCWFja19mcmVxOworCXUzMgkJCXJlc3YxOworCXU2NAkJCWFkZHI7CisJdTY0CQkJbXR1OworCXU2NAkJCXJlc3YyWzNdOworfTsKKworI2RlZmluZSBWTkVUX05VTV9NQ0FTVAkJNworCitzdHJ1Y3QgdmlvX25ldF9tY2FzdF9pbmZvIHsKKwlzdHJ1Y3QgdmlvX21zZ190YWcJdGFnOworCXU4CQkJc2V0OworCXU4CQkJY291bnQ7CisJdTgJCQltY2FzdF9hZGRyW1ZORVRfTlVNX01DQVNUICogNl07CisJdTMyCQkJcmVzdjsKK307CisKK3N0cnVjdCB2aW9fbmV0X2Rlc2MgeworCXN0cnVjdCB2aW9fZHJpbmdfaGRyCWhkcjsKKwl1MzIJCQlzaXplOworCXUzMgkJCW5jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMF07Cit9OworCisjZGVmaW5lIFZJT19NQVhfUklOR19DT09LSUVTCTI0CisKK3N0cnVjdCB2aW9fZHJpbmdfc3RhdGUgeworCXU2NAkJCWlkZW50OworCXZvaWQJCQkqYmFzZTsKKwl1NjQJCQlzbmRfbnh0OworCXU2NAkJCXJjdl9ueHQ7CisJdTMyCQkJZW50cnlfc2l6ZTsKKwl1MzIJCQludW1fZW50cmllczsKKwl1MzIJCQlwcm9kOworCXUzMgkJCWNvbnM7CisJdTMyCQkJcGVuZGluZzsKKwlpbnQJCQluY29va2llczsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQljb29raWVzW1ZJT19NQVhfUklOR19DT09LSUVTXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlvX2RyaW5nX2N1cihzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlyZXR1cm4gZHItPmJhc2UgKyAoZHItPmVudHJ5X3NpemUgKiBkci0+cHJvZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlvX2RyaW5nX2VudHJ5KHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGRyLT5iYXNlICsgKGRyLT5lbnRyeV9zaXplICogaW5kZXgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB2aW9fZHJpbmdfYXZhaWwoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkJICB1bnNpZ25lZCBpbnQgcmluZ19zaXplKQoreworCS8qIEVuc3VyZSBidWlsZC10aW1lIHBvd2VyLW9mLTIuICAqLworCUJVSUxEX0JVR19PTihyaW5nX3NpemUgJiAocmluZ19zaXplIC0gMSkpOworCisJcmV0dXJuIChkci0+cGVuZGluZyAtCisJCSgoZHItPnByb2QgLSBkci0+Y29ucykgJiAocmluZ19zaXplIC0gMSkpKTsKK30KKworI2RlZmluZSBWSU9fTUFYX1RZUEVfTEVOCTY0CisjZGVmaW5lIFZJT19NQVhfQ09NUEFUX0xFTgk2NAorCitzdHJ1Y3QgdmlvX2RldiB7CisJdTY0CQkJbXA7CisJc3RydWN0IGRldmljZV9ub2RlCSpkcDsKKworCWNoYXIJCQl0eXBlW1ZJT19NQVhfVFlQRV9MRU5dOworCWNoYXIJCQljb21wYXRbVklPX01BWF9DT01QQVRfTEVOXTsKKwlpbnQJCQljb21wYXRfbGVuOworCisJdW5zaWduZWQgbG9uZwkJY2hhbm5lbF9pZDsKKworCXVuc2lnbmVkIGludAkJdHhfaXJxOworCXVuc2lnbmVkIGludAkJcnhfaXJxOworCisJc3RydWN0IGRldmljZQkJZGV2OworfTsKKworc3RydWN0IHZpb19kcml2ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJCW5vZGU7CisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQJKmlkX3RhYmxlOworCWludCAoKnByb2JlKShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpOworCWludCAoKnJlbW92ZSkoc3RydWN0IHZpb19kZXYgKmRldik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKKwl1bnNpZ25lZCBsb25nCQkJZHJpdmVyX2RhdGE7CisJc3RydWN0IGRldmljZV9kcml2ZXIJCWRyaXZlcjsKK307CisKK3N0cnVjdCB2aW9fdmVyc2lvbiB7CisJdTE2CQltYWpvcjsKKwl1MTYJCW1pbm9yOworfTsKKworc3RydWN0IHZpb19kcml2ZXJfc3RhdGU7CitzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgeworCWludAkoKnNlbmRfYXR0cikoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CisJaW50CSgqaGFuZGxlX2F0dHIpKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCk7CisJdm9pZAkoKmhhbmRzaGFrZV9jb21wbGV0ZSkoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7Cit9OworCitzdHJ1Y3QgdmlvX2NvbXBsZXRpb24geworCXN0cnVjdCBjb21wbGV0aW9uCWNvbTsKKwlpbnQJCQllcnI7CisJaW50CQkJd2FpdGluZ19mb3I7Cit9OworCitzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSB7CisJLyogUHJvdGVjdHMgVklPIGhhbmRzaGFrZSBhbmQsIG9wdGlvbmFsbHksIGRyaXZlciBwcml2YXRlIHN0YXRlLiAgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IGxkY19jaGFubmVsCSpscDsKKworCXUzMgkJCV9wZWVyX3NpZDsKKwl1MzIJCQlfbG9jYWxfc2lkOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUJZHJpbmdzWzJdOworI2RlZmluZSBWSU9fRFJJVkVSX1RYX1JJTkcJMAorI2RlZmluZSBWSU9fRFJJVkVSX1JYX1JJTkcJMQorCisJdTgJCQloc19zdGF0ZTsKKyNkZWZpbmUgVklPX0hTX0lOVkFMSUQJCTB4MDAKKyNkZWZpbmUgVklPX0hTX0dPVFZFUlMJCTB4MDEKKyNkZWZpbmUgVklPX0hTX0dPVF9BVFRSCQkweDA0CisjZGVmaW5lIFZJT19IU19TRU5UX0RSRUcJMHgwOAorI2RlZmluZSBWSU9fSFNfU0VOVF9SRFgJCTB4MTAKKyNkZWZpbmUgVklPX0hTX0dPVF9SRFhfQUNLCTB4MjAKKyNkZWZpbmUgVklPX0hTX0dPVF9SRFgJCTB4NDAKKyNkZWZpbmUgVklPX0hTX1NFTlRfUkRYX0FDSwkweDgwCisjZGVmaW5lIFZJT19IU19DT01QTEVURQkJKFZJT19IU19HT1RfUkRYX0FDSyB8IFZJT19IU19TRU5UX1JEWF9BQ0spCisKKwl1OAkJCWRldl9jbGFzczsKKworCXU4CQkJZHJfc3RhdGU7CisjZGVmaW5lIFZJT19EUl9TVEFURV9UWFJFRwkweDAxCisjZGVmaW5lIFZJT19EUl9TVEFURV9SWFJFRwkweDAyCisjZGVmaW5lIFZJT19EUl9TVEFURV9UWFJFUQkweDEwCisjZGVmaW5lIFZJT19EUl9TVEFURV9SWFJFUQkweDIwCisKKwl1OAkJCWRlYnVnOworI2RlZmluZSBWSU9fREVCVUdfSFMJCTB4MDEKKyNkZWZpbmUgVklPX0RFQlVHX0RBVEEJCTB4MDIKKworCXZvaWQJCQkqZGVzY19idWY7CisJdW5zaWduZWQgaW50CQlkZXNjX2J1Zl9sZW47CisKKwlzdHJ1Y3QgdmlvX2NvbXBsZXRpb24JKmNtcDsKKworCXN0cnVjdCB2aW9fZGV2CQkqdmRldjsKKworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCisJc3RydWN0IHZpb192ZXJzaW9uCXZlcjsKKworCXN0cnVjdCB2aW9fdmVyc2lvbgkqdmVyX3RhYmxlOworCWludAkJCXZlcl90YWJsZV9lbnRyaWVzOworCisJY2hhcgkJCSpuYW1lOworCisJc3RydWN0IHZpb19kcml2ZXJfb3BzCSpvcHM7Cit9OworCisjZGVmaW5lIHZpb2RiZyhUWVBFLCBmLCBhLi4uKSBcCitkbyB7CWlmICh2aW8tPmRlYnVnICYgVklPX0RFQlVHXyMjVFlQRSkgXAorCQlwcmludGsoS0VSTl9JTkZPICJ2aW86IElEWyVsdV0gIiBmLCBcCisJCSAgICAgICB2aW8tPnZkZXYtPmNoYW5uZWxfaWQsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCitleHRlcm4gaW50IHZpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpb19kcml2ZXIgKmRydik7CitleHRlcm4gdm9pZCB2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpb19kcml2ZXIgKmRydik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZpb19kcml2ZXIgKnRvX3Zpb19kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRydiwgc3RydWN0IHZpb19kcml2ZXIsIGRyaXZlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZpb19kZXYgKnRvX3Zpb19kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdmlvX2RldiwgZGV2KTsKK30KKworZXh0ZXJuIGludCB2aW9fbGRjX3NlbmQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqZGF0YSwgaW50IGxlbik7CitleHRlcm4gdm9pZCB2aW9fbGlua19zdGF0ZV9jaGFuZ2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgaW50IGV2ZW50KTsKK2V4dGVybiB2b2lkIHZpb19jb25uX3Jlc2V0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pOworZXh0ZXJuIGludCB2aW9fY29udHJvbF9wa3RfZW5naW5lKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCk7CitleHRlcm4gaW50IHZpb192YWxpZGF0ZV9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX21zZ190YWcgKnRwKTsKK2V4dGVybiB1MzIgdmlvX3NlbmRfc2lkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pOworZXh0ZXJuIGludCB2aW9fbGRjX2FsbG9jKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyAqYmFzZV9jZmcsIHZvaWQgKmV2ZW50X2FyZyk7CitleHRlcm4gdm9pZCB2aW9fbGRjX2ZyZWUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CitleHRlcm4gaW50IHZpb19kcml2ZXJfaW5pdChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgIHU4IGRldl9jbGFzcywgc3RydWN0IHZpb192ZXJzaW9uICp2ZXJfdGFibGUsCisJCQkgICBpbnQgdmVyX3RhYmxlX3NpemUsIHN0cnVjdCB2aW9fZHJpdmVyX29wcyAqb3BzLAorCQkJICAgY2hhciAqbmFtZSk7CisKK2V4dGVybiB2b2lkIHZpb19wb3J0X3VwKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pOworCisjZW5kaWYgLyogX1NQQVJDNjRfVklPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaAppbmRleCAxYjEwOTBhLi44MzBmYzZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oCkBAIC0xNzUsMTIgKzE3NSw2IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4oKHB0ZV9nZXRfYml0cyhwdGUsIF9QQUdFX1VTRVIpKSAmJgotCSAgICAgICAhKHB0ZV9nZXRfYml0cyhwdGUsIF9QQUdFX1BST1ROT05FKSkpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCiB7IAogCXJldHVybigocHRlX2dldF9iaXRzKHB0ZSwgX1BBR0VfVVNFUikpICYmCkBAIC0yMzgsMTggKzIzMiw2IEBACiAJcmV0dXJuKHB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17IAotCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfVVNFUik7Ci0JcmV0dXJuKHB0ZV9ta25ld3Byb3QocHRlKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17IAotCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfVVNFUik7Ci0JcmV0dXJuKHB0ZV9ta25ld3Byb3QocHRlKSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZV9jbGVhcl9iaXRzKHB0ZSwgX1BBR0VfRElSVFkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKaW5kZXggMThhMTNiYS4uNmU1ZmQ1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCkBAIC01MiwxMCArNTIsMjEgQEAKIAlyZXR1cm4gdGk7CiB9CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKKworI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIFwKKwkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBcCisJCQkJCQkgQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikpCisjZWxzZQorCiAvKiB0aHJlYWQgaW5mb3JtYXRpb24gYWxsb2NhdGlvbiAqLwogI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIFwKLQkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBrbWFsbG9jKFRIUkVBRF9TSVpFLCBHRlBfS0VSTkVMKSkKLSNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkga2ZyZWUodGkpCisJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBcCisJCQkJCQkgQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikpCisjZW5kaWYKKworI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBcCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykodGkpLENPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2ZiLmggYi9pbmNsdWRlL2FzbS12ODUwL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLXY4NTAvaW9jdGxzLmgKaW5kZXggMDVjMGRjOS4uNTMxM2FiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2lvY3Rscy5oCkBAIC00Niw2ICs0NiwxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oCmluZGV4IDM1NDEyZjcuLjI5NWQ3YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTU2LDEwICsxNTcsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZQlJQlNISUZUCTE2CQkvKiBTaGlmciBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oCmluZGV4IGMyYzJiMWQuLmZjZDE3MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oCkBAIC04MCw4ICs4MCwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAppbmRleCBiMzdhYjgyLi41M2NiOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCkBAIC0zMyw4ICszMywxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIGNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ZiLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU0OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaAppbmRleCBlOTBlMTY3Li4yYWNiOWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCkBAIC0zNSw2ICszNSw4IEBACiAJVlNZU0NBTExfTEFTVF9QQUdFLAogCVZTWVNDQUxMX0ZJUlNUX1BBR0UgPSBWU1lTQ0FMTF9MQVNUX1BBR0UgKyAoKFZTWVNDQUxMX0VORC1WU1lTQ0FMTF9TVEFSVCkgPj4gUEFHRV9TSElGVCkgLSAxLAogCVZTWVNDQUxMX0hQRVQsCisJRklYX0RCR1BfQkFTRSwKKwlGSVhfRUFSTFlDT05fTUVNX0JBU0UsCiAJRklYX0hQRVRfQkFTRSwKIAlGSVhfQVBJQ19CQVNFLAkvKiBsb2NhbCAoQ1BVKSBBUElDKSAtLSByZXF1aXJlZCBmb3IgU01QIG9yIG5vdCAqLwogCUZJWF9JT19BUElDX0JBU0VfMCwKQEAgLTg0LDcgKzg2LDcgQEAKIAlpZiAoaWR4ID49IF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcykKIAkJX190aGlzX2ZpeG1hcF9kb2VzX25vdF9leGlzdCgpOwogCi0gICAgICAgIHJldHVybiBfX2ZpeF90b192aXJ0KGlkeCk7CisJcmV0dXJuIF9fZml4X3RvX3ZpcnQoaWR4KTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaW8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oCmluZGV4IGRlMmNkOWEuLjc0NzUwOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oCkBAIC0xNDQsNiArMTQ0LDcgQEAKICAqLwogZXh0ZXJuIHZvaWQgX19pb21lbSAqIGlvcmVtYXBfbm9jYWNoZSAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CitleHRlcm4gdm9pZCBfX2lvbWVtICpmaXhfaW9yZW1hcCh1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxvbmcgcGh5cyk7CiAKIC8qCiAgKiBJU0EgSS9PIGJ1cyBtZW1vcnkgYWRkcmVzc2VzIGFyZSAxOjEgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCmluZGV4IGUzMjdjODMuLjg4YWRmMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaApAQCAtNDgsNyArNDgsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCmluZGV4IDBhNzFlMGIuLjNiYTUzMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaApAQCAtMjY2LDIxICsyNjYsMTUgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwogI2RlZmluZSBfX0xBUkdFX1BURSAoX1BBR0VfUFNFfF9QQUdFX1BSRVNFTlQpCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2h1Z2UocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUFNFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1VTRVIpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfUlcpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1VTRVIpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9OWCkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQpAQCAtMjkwLDEzICsyODQsNiBAQAogCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JaWYgKCFwdGVfZGlydHkoKnB0ZXApKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwgJnB0ZXAtPnB0ZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CiAJaWYgKCFwdGVfeW91bmcoKnB0ZXApKQpAQCAtNDMzLDcgKzQyMCw2IEBACiAgICAoKChvKSAmICgxVUwgPDwgKF9fVklSVFVBTF9NQVNLX1NISUZULTEpKSkgPyAoKG8pIHwgKH5fX1ZJUlRVQUxfTUFTSykpIDogKG8pKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSX0ZVTEwKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZmIuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKaW5kZXggMmQ0YjVkYi4uMDY4NTBmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCkBAIC0xOTcsMTYgKzE5NywxMyBAQAogCiAvKiBOb3RlOiBXZSB1c2UgdGhlIF9QQUdFX1VTRVIgYml0IHRvIGluZGljYXRlIHdyaXRlLXByb3RlY3Qga2VybmVsIG1lbW9yeSAqLwogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXIHwgX1BBR0VfV1JFTkFCTEUpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KQEAgLTI3MCwxNyArMjY3LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLXB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKLSAgIAkJCSAgcHRlX3QgKnB0ZXApCi17Ci0JcHRlX3QgcHRlID0gKnB0ZXA7Ci0JaWYgKCFwdGVfZGlydHkocHRlKSkKLQkJcmV0dXJuIDA7Ci0JdXBkYXRlX3B0ZShwdGVwLCBwdGVfbWtjbGVhbihwdGUpKTsKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdAogcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewpAQCAtNDIxLDcgKzQwNyw2IEBACiAjZW5kaWYgLyogIWRlZmluZWQgKF9fQVNTRU1CTFlfXykgKi8KIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX01LRElSVFkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggMTI3ZDJkMS4uYmNmODc1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTI0Nyw3ICsyNDcsNiBAQAogdW5pZmRlZi15ICs9IGlzZG5pZi5oCiB1bmlmZGVmLXkgKz0gaXNkbl9kaXZlcnRpZi5oCiB1bmlmZGVmLXkgKz0gaXNkbl9wcHAuaAotdW5pZmRlZi15ICs9IGlzaWNvbS5oCiB1bmlmZGVmLXkgKz0gamJkLmgKIHVuaWZkZWYteSArPSBqb3lzdGljay5oCiB1bmlmZGVmLXkgKz0ga2Rldl90LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXR0cmlidXRlX2NvbnRhaW5lci5oIGIvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKaW5kZXggOTNiZmIwYi4uOGZmMjc0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmgKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciB7CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCmluZGV4IGZjY2M2ZTUuLjhjYTdjYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTYzLDkgKzYzLDEyIEBACiAjZGVmaW5lIEFVRElUX0FERF9SVUxFCQkxMDExCS8qIEFkZCBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCiAjZGVmaW5lIEFVRElUX0RFTF9SVUxFCQkxMDEyCS8qIERlbGV0ZSBzeXNjYWxsIGZpbHRlcmluZyBydWxlICovCiAjZGVmaW5lIEFVRElUX0xJU1RfUlVMRVMJMTAxMwkvKiBMaXN0IHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGVzICovCisjZGVmaW5lIEFVRElUX1RUWV9HRVQJCTEwMTQJLyogR2V0IFRUWSBhdWRpdGluZyBzdGF0dXMgKi8KKyNkZWZpbmUgQVVESVRfVFRZX1NFVAkJMTAxNQkvKiBTZXQgVFRZIGF1ZGl0aW5nIHN0YXR1cyAqLwogCiAjZGVmaW5lIEFVRElUX0ZJUlNUX1VTRVJfTVNHCTExMDAJLyogVXNlcnNwYWNlIG1lc3NhZ2VzIG1vc3RseSB1bmludGVyZXN0aW5nIHRvIGtlcm5lbCAqLwogI2RlZmluZSBBVURJVF9VU0VSX0FWQwkJMTEwNwkvKiBXZSBmaWx0ZXIgdGhpcyBkaWZmZXJlbnRseSAqLworI2RlZmluZSBBVURJVF9VU0VSX1RUWQkJMTEyNAkvKiBOb24tSUNBTk9OIFRUWSBpbnB1dCBtZWFuaW5nICovCiAjZGVmaW5lIEFVRElUX0xBU1RfVVNFUl9NU0cJMTE5OQogI2RlZmluZSBBVURJVF9GSVJTVF9VU0VSX01TRzIJMjEwMAkvKiBNb3JlIHVzZXIgc3BhY2UgbWVzc2FnZXMgKi8KICNkZWZpbmUgQVVESVRfTEFTVF9VU0VSX01TRzIJMjk5OQpAQCAtOTIsNiArOTUsNyBAQAogI2RlZmluZSBBVURJVF9LRVJORUxfT1RIRVIJMTMxNgkvKiBGb3IgdXNlIGJ5IDNyZCBwYXJ0eSBtb2R1bGVzICovCiAjZGVmaW5lIEFVRElUX0ZEX1BBSVIJCTEzMTcgICAgLyogYXVkaXQgcmVjb3JkIGZvciBwaXBlL3NvY2tldHBhaXIgKi8KICNkZWZpbmUgQVVESVRfT0JKX1BJRAkJMTMxOAkvKiBwdHJhY2UgdGFyZ2V0ICovCisjZGVmaW5lIEFVRElUX1RUWQkJMTMxOQkvKiBJbnB1dCBvbiBhbiBhZG1pbmlzdHJhdGl2ZSBUVFkgKi8KIAogI2RlZmluZSBBVURJVF9BVkMJCTE0MDAJLyogU0UgTGludXggYXZjIGRlbmlhbCBvciBncmFudCAqLwogI2RlZmluZSBBVURJVF9TRUxJTlVYX0VSUgkxNDAxCS8qIEludGVybmFsIFNFIExpbnV4IEVycm9ycyAqLwpAQCAtMjg5LDYgKzI5MywxMCBAQAogCV9fdTMyCQliYWNrbG9nOwkvKiBtZXNzYWdlcyB3YWl0aW5nIGluIHF1ZXVlICovCiB9OwogCitzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cyB7CisJX191MzIJCWVuYWJsZWQ7IC8qIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KK307CisKIC8qIGF1ZGl0X3J1bGVfZGF0YSBzdXBwb3J0cyBmaWx0ZXIgcnVsZXMgd2l0aCBib3RoIGludGVnZXIgYW5kIHN0cmluZwogICogZmllbGRzLiAgSXQgY29ycmVzcG9uZHMgd2l0aCBBVURJVF9BRERfUlVMRSwgQVVESVRfREVMX1JVTEUgYW5kCiAgKiBBVURJVF9MSVNUX1JVTEVTIHJlcXVlc3RzLgpAQCAtNTE1LDExICs1MjMsMTMgQEAKIAkJCQkJICAgICBjb25zdCBjaGFyICpwcmVmaXgsCiAJCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50KTsKK2V4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2xvc3QoY29uc3QgY2hhciAqbWVzc2FnZSk7CiAJCQkJLyogUHJpdmF0ZSBBUEkgKGZvciBhdWRpdC5jIG9ubHkpICovCiBleHRlcm4gaW50IGF1ZGl0X2ZpbHRlcl91c2VyKHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqY2IsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgYXVkaXRfZmlsdGVyX3R5cGUoaW50IHR5cGUpOwogZXh0ZXJuIGludCAgYXVkaXRfcmVjZWl2ZV9maWx0ZXIoaW50IHR5cGUsIGludCBwaWQsIGludCB1aWQsIGludCBzZXEsCiAJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFzeiwgdWlkX3QgbG9naW51aWQsIHUzMiBzaWQpOworZXh0ZXJuIGludCBhdWRpdF9lbmFibGVkOwogI2Vsc2UKICNkZWZpbmUgYXVkaXRfbG9nKGMsZyx0LGYsLi4uKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX3N0YXJ0KGMsZyx0KSAoeyBOVUxMOyB9KQpAQCAtNTMwLDYgKzU0MCw3IEBACiAjZGVmaW5lIGF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYSxzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGEsbixzKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfbG9nX2RfcGF0aChiLHAsZCx2KSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXVkaXRfZW5hYmxlZCAwCiAjZW5kaWYKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKaW5kZXggZjI1NDJjMi4uNzAxMWQ2MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKQEAgLTkzLDcgKzkzLDYgQEAKIHZvaWQgY2xlYXJfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwogdm9pZCBzZXRfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwogbG9uZyBjb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpOwotbG9uZyBjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZShpbnQgcncsIGxvbmcgdGltZW91dCk7CiB2b2lkIGNvbmdlc3Rpb25fZW5kKGludCBydyk7CiAKICNkZWZpbmUgYmRpX2NhcF93cml0ZWJhY2tfZGlydHkoYmRpKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBmYWUxMzhiZC4uZjc4OTY1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvYnNnLmg+CiAKICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIApAQCAtNDEsNiArNDIsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgZWxldmF0b3JfcXVldWUgZWxldmF0b3JfdDsKIHN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlOwogc3RydWN0IGJsa190cmFjZTsKK3N0cnVjdCByZXF1ZXN0Oworc3RydWN0IHNnX2lvX2hkcjsKIAogI2RlZmluZSBCTEtERVZfTUlOX1JRCTQKICNkZWZpbmUgQkxLREVWX01BWF9SUQkxMjgJLyogRGVmYXVsdCBtYXhpbXVtICovCkBAIC0zMTQsNiArMzE3LDkgQEAKIAkgKi8KIAlycV9lbmRfaW9fZm4gKmVuZF9pbzsKIAl2b2lkICplbmRfaW9fZGF0YTsKKworCS8qIGZvciBiaWRpICovCisJc3RydWN0IHJlcXVlc3QgKm5leHRfcnE7CiB9OwogCiAvKgpAQCAtNDY4LDYgKzQ3NCwxMCBAQAogCXVuc2lnbmVkIGludAkJYmlfc2l6ZTsKIAogCXN0cnVjdCBtdXRleAkJc3lzZnNfbG9jazsKKworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfQlNHKQorCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlIGJzZ19kZXY7CisjZW5kaWYKIH07CiAKICNkZWZpbmUgUVVFVUVfRkxBR19DTFVTVEVSCTAJLyogY2x1c3RlciBzZXZlcmFsIHNlZ21lbnRzIGludG8gMSAqLwpAQCAtNDc5LDYgKzQ4OSw3IEBACiAjZGVmaW5lIFFVRVVFX0ZMQUdfUkVFTlRFUgk2CS8qIFJlLWVudHJhbmN5IGF2b2lkYW5jZSAqLwogI2RlZmluZSBRVUVVRV9GTEFHX1BMVUdHRUQJNwkvKiBxdWV1ZSBpcyBwbHVnZ2VkICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfRUxWU1dJVENICTgJLyogZG9uJ3QgdXNlIGVsZXZhdG9yLCBqdXN0IGRvIEZJRk8gKi8KKyNkZWZpbmUgUVVFVUVfRkxBR19CSURJCQk5CS8qIHF1ZXVlIHN1cHBvcnRzIGJpZGkgcmVxdWVzdHMgKi8KIAogZW51bSB7CiAJLyoKQEAgLTU0Myw2ICs1NTQsNyBAQAogI2RlZmluZSBibGtfc29ydGVkX3JxKHJxKQkoKHJxKS0+Y21kX2ZsYWdzICYgUkVRX1NPUlRFRCkKICNkZWZpbmUgYmxrX2JhcnJpZXJfcnEocnEpCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfSEFSREJBUlJJRVIpCiAjZGVmaW5lIGJsa19mdWFfcnEocnEpCQkoKHJxKS0+Y21kX2ZsYWdzICYgUkVRX0ZVQSkKKyNkZWZpbmUgYmxrX2JpZGlfcnEocnEpCQkoKHJxKS0+bmV4dF9ycSAhPSBOVUxMKQogCiAjZGVmaW5lIGxpc3RfZW50cnlfcnEocHRyKQlsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KQogCkBAIC02MDcsNyArNjE5LDEyIEBACiAjZGVmaW5lIEJMS19CT1VOQ0VfQU5ZCQkoKHU2NClibGtfbWF4X3BmbiA8PCBQQUdFX1NISUZUKQogI2RlZmluZSBCTEtfQk9VTkNFX0lTQQkJKElTQV9ETUFfVEhSRVNIT0xEKQogCi0jaWZkZWYgQ09ORklHX01NVQorLyoKKyAqIGRlZmF1bHQgdGltZW91dCBmb3IgU0dfSU8gaWYgbm9uZSBzcGVjaWZpZWQKKyAqLworI2RlZmluZSBCTEtfREVGQVVMVF9TR19USU1FT1VUCSg2MCAqIEhaKQorCisjaWZkZWYgQ09ORklHX0JPVU5DRQogZXh0ZXJuIGludCBpbml0X2VtZXJnZW5jeV9pc2FfcG9vbCh2b2lkKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9ib3VuY2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICoqYmlvKTsKICNlbHNlCkBAIC02MzcsNyArNjU0LDggQEAKIGV4dGVybiB2b2lkIGJsa19wbHVnX2RldmljZShyZXF1ZXN0X3F1ZXVlX3QgKik7CiBleHRlcm4gaW50IGJsa19yZW1vdmVfcGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKik7CiBleHRlcm4gdm9pZCBibGtfcmVjb3VudF9zZWdtZW50cyhyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGJpbyAqKTsKLWV4dGVybiBpbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IGdlbmRpc2sgKiwgdW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKK2V4dGVybiBpbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKKwkJCSAgc3RydWN0IGdlbmRpc2sgKiwgdW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiBpbnQgc2dfc2NzaV9pb2N0bChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLAogCQlzdHJ1Y3QgZ2VuZGlzayAqLCBzdHJ1Y3Qgc2NzaV9pb2N0bF9jb21tYW5kIF9fdXNlciAqKTsKIApAQCAtNjgwLDYgKzY5OCwxMiBAQAogCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLAogCQkJCSAgc3RydWN0IHJlcXVlc3QgKiwgaW50LCBycV9lbmRfaW9fZm4gKik7CitleHRlcm4gaW50IGJsa19maWxsX3NnaGRyX3JxKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLAorCQkgICAgICBzdHJ1Y3Qgc2dfaW9faGRyICosIGludCk7CitleHRlcm4gaW50IGJsa191bm1hcF9zZ2hkcl9ycShzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3Qgc2dfaW9faGRyICopOworZXh0ZXJuIGludCBibGtfY29tcGxldGVfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IHNnX2lvX2hkciAqLAorCQkJICBzdHJ1Y3QgYmlvICopOworZXh0ZXJuIGludCBibGtfdmVyaWZ5X2NvbW1hbmQodW5zaWduZWQgY2hhciAqLCBpbnQpOwogCiBzdGF0aWMgaW5saW5lIHJlcXVlc3RfcXVldWVfdCAqYmRldl9nZXRfcXVldWUoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnNnLmggYi9pbmNsdWRlL2xpbnV4L2JzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTk4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2JzZy5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgQlNHX0gKKyNkZWZpbmUgQlNHX0gKKworI2RlZmluZSBCU0dfUFJPVE9DT0xfU0NTSQkJMAorCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9DTUQJMAorI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfVE1GCTEKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RSQU5TUE9SVAkyCisKK3N0cnVjdCBzZ19pb192NCB7CisJX19zMzIgZ3VhcmQ7CQkvKiBbaV0gJ1EnIHRvIGRpZmZlcmVudGlhdGUgZnJvbSB2MyAqLworCV9fdTMyIHByb3RvY29sOwkJLyogW2ldIDAgLT4gU0NTSSAsIC4uLi4gKi8KKwlfX3UzMiBzdWJwcm90b2NvbDsJLyogW2ldIDAgLT4gU0NTSSBjb21tYW5kLCAxIC0+IFNDU0kgdGFzaworCQkJCSAgIG1hbmFnZW1lbnQgZnVuY3Rpb24sIC4uLi4gKi8KKworCV9fdTMyIHJlcXVlc3RfbGVuOwkvKiBbaV0gaW4gYnl0ZXMgKi8KKwlfX3U2NCByZXF1ZXN0OwkJLyogW2ldLCBbKmldIHtTQ1NJOiBjZGJ9ICovCisJX191MzIgcmVxdWVzdF9hdHRyOwkvKiBbaV0ge1NDU0k6IHRhc2sgYXR0cmlidXRlfSAqLworCV9fdTMyIHJlcXVlc3RfdGFnOwkvKiBbaV0ge1NDU0k6IHRhc2sgdGFnIChvbmx5IGlmIGZsYWdnZWQpfSAqLworCV9fdTMyIHJlcXVlc3RfcHJpb3JpdHk7CS8qIFtpXSB7U0NTSTogdGFzayBwcmlvcml0eX0gKi8KKwlfX3UzMiBtYXhfcmVzcG9uc2VfbGVuOwkvKiBbaV0gaW4gYnl0ZXMgKi8KKwlfX3U2NCByZXNwb25zZTsJCS8qIFtpXSwgWypvXSB7U0NTSTogKGF1dG8pc2Vuc2UgZGF0YX0gKi8KKworCS8qICJkaW5fIiBmb3IgZGF0YSBpbiAoZnJvbSBkZXZpY2UpOyAiZG91dF8iIGZvciBkYXRhIG91dCAodG8gZGV2aWNlKSAqLworCV9fdTMyIGRvdXRfeGZlcl9sZW47CS8qIFtpXSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZCB0byBkZXZpY2UgKi8KKwlfX3UzMiBkaW5feGZlcl9sZW47CS8qIFtpXSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSAqLworCV9fdTY0IGRvdXRfeGZlcnA7CS8qIFtpXSwgWyppXSAqLworCV9fdTY0IGRpbl94ZmVycDsJLyogW2ldLCBbKm9dICovCisKKwlfX3UzMiB0aW1lb3V0OwkJLyogW2ldIHVuaXRzOiBtaWxsaXNlY29uZCAqLworCV9fdTMyIGZsYWdzOwkJLyogW2ldIGJpdCBtYXNrICovCisJX191NjQgdXNyX3B0cjsJCS8qIFtpLT5vXSB1bnVzZWQgaW50ZXJuYWxseSAqLworCV9fdTMyIHNwYXJlX2luOwkJLyogW2ldICovCisKKwlfX3UzMiBkcml2ZXJfc3RhdHVzOwkvKiBbb10gMCAtPiBvayAqLworCV9fdTMyIHRyYW5zcG9ydF9zdGF0dXM7CS8qIFtvXSAwIC0+IG9rICovCisJX191MzIgZGV2aWNlX3N0YXR1czsJLyogW29dIHtTQ1NJOiBjb21tYW5kIGNvbXBsZXRpb24gc3RhdHVzfSAqLworCV9fdTMyIHJldHJ5X2RlbGF5OwkvKiBbb10ge1NDU0k6IHN0YXR1cyBhdXhpbGlhcnkgaW5mb3JtYXRpb259ICovCisJX191MzIgaW5mbzsJCS8qIFtvXSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCisJX191MzIgZHVyYXRpb247CQkvKiBbb10gdGltZSB0byBjb21wbGV0ZSwgaW4gbWlsbGlzZWNvbmRzICovCisJX191MzIgcmVzcG9uc2VfbGVuOwkvKiBbb10gYnl0ZXMgb2YgcmVzcG9uc2UgYWN0dWFsbHkgd3JpdHRlbiAqLworCV9fczMyIGRpbl9yZXNpZDsJLyogW29dIGFjdHVhbF9kaW5feGZlcl9sZW4gLSBkaW5feGZlcl9sZW4gKi8KKwlfX3UzMiBnZW5lcmF0ZWRfdGFnOwkvKiBbb10ge1NDU0k6IHRhc2sgdGFnIHRoYXQgdHJhbnNwb3J0IGNob3NlfSAqLworCV9fdTMyIHNwYXJlX291dDsJLyogW29dICovCisKKwlfX3UzMiBwYWRkaW5nOworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfQlNHKQorc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgeworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IG1pbm9yOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7Cit9OworCitleHRlcm4gaW50IGJzZ19yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgYnNnX3VucmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CisjZWxzZQorc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgeyB9OworI2RlZmluZSBic2dfcmVnaXN0ZXJfcXVldWUoZGlzaywgbmFtZSkJCSgwKQorI2RlZmluZSBic2dfdW5yZWdpc3Rlcl9xdWV1ZShkaXNrKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J1Zy5oIGIvaW5jbHVkZS9saW51eC9idWcuaAppbmRleCA0MmFhMGE1Li41NDM5OGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J1Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvYnVnLmgKQEAgLTEwLDYgKzEwLDggQEAKIAlCVUdfVFJBUF9UWVBFX0JVRyA9IDIsCiB9OwogCitzdHJ1Y3QgcHRfcmVnczsKKwogI2lmZGVmIENPTkZJR19HRU5FUklDX0JVRwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2J1Zy5oPgogCkBAIC0yMCw3ICsyMiw3IEBACiAKIGNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcik7CiAKLWVudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIpOworZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdfYWRkciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBpbnQgIG1vZHVsZV9idWdfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKiwgY29uc3QgRWxmX1NoZHIgKiwKIAkJCSBzdHJ1Y3QgbW9kdWxlICopOwpAQCAtMzEsNyArMzMsOCBAQAogCiAjZWxzZQkvKiAhQ09ORklHX0dFTkVSSUNfQlVHICovCiAKLXN0YXRpYyBpbmxpbmUgZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdfYWRkcikKK3N0YXRpYyBpbmxpbmUgZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdfYWRkciwKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJldHVybiBCVUdfVFJBUF9UWVBFX0JVRzsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKaW5kZXggYmJmOGRmNy4uMmRmYTU4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICAgCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogCiAvKiAjZGVmaW5lIFNUUklDVF9DQVBfVF9UWVBFQ0hFQ0tTICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nkcm9tLmggYi9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKaW5kZXggZjUwZjA0Yi4uMmI2NDFiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZHJvbS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2Ryb20uaApAQCAtNDE0LDggKzQxNCw4IEBACiAjZGVmaW5lIENET19DSEVDS19UWVBFCQkweDEwICAgIC8qIGNoZWNrIHR5cGUgb24gb3BlbiBmb3IgZGF0YSAqLwogCiAvKiBTcGVjaWFsIGNvZGVzIHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGNoYW5nZXIgc2xvdHMuICovCi0jZGVmaW5lIENEU0xfTk9ORSAgICAgICAJKChpbnQpICh+MFU+PjEpLTEpCi0jZGVmaW5lIENEU0xfQ1VSUkVOVCAgICAJKChpbnQpICh+MFU+PjEpKQorI2RlZmluZSBDRFNMX05PTkUgICAgICAgCShJTlRfTUFYLTEpCisjZGVmaW5lIENEU0xfQ1VSUkVOVCAgICAJSU5UX01BWAogCiAvKiBGb3IgcGFydGl0aW9uIGJhc2VkIG11bHRpc2Vzc2lvbiBhY2Nlc3MuIElERSBjYW4gaGFuZGxlIDY0IHBhcnRpdGlvbnMKICAqIHBlciBkcml2ZSAtIFNDU0kgQ0QtUk9NJ3MgdXNlIG1pbm9ycyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvYmFsdC1udnJhbS5oIGIvaW5jbHVkZS9saW51eC9jb2JhbHQtbnZyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0Mjk1Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvYmFsdC1udnJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiAkSWQ6IGNvYmFsdC1udnJhbS5oLHYgMS4yMCAyMDAxLzEwLzE3IDIzOjE2OjU1IHRob2NraW4gRXhwICQKLSAqIGNvYmFsdC1udnJhbS5oIDogZGVmaW5lcyBmb3IgdGhlIHZhcmlvdXMgZmllbGRzIGluIHRoZSBjb2JhbHQgTlZSQU0KLSAqCi0gKiBDb3B5cmlnaHQgMjAwMSwyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqLwotCi0jaWZuZGVmIENPQkFMVF9OVlJBTV9ICi0jZGVmaW5lIENPQkFMVF9OVlJBTV9ICi0KLSNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgotCi0jZGVmaW5lIENPQlRfQ01PU19JTkZPX01BWAkJMHg3ZgkvKiB0b3AgYWRkcmVzcyBhbGxvd2VkICovCi0jZGVmaW5lIENPQlRfQ01PU19CSU9TX0RSSVZFX0lORk8JMHgxMgkvKiBkcml2ZSBpbmZvIHdvdWxkIGdvIGhlcmUgKi8KLQotI2RlZmluZSBDT0JUX0NNT1NfQ0tTX1NUQVJUCQlOVlJBTV9PRkZTRVQoMHgwZSkKLSNkZWZpbmUgQ09CVF9DTU9TX0NLU19FTkQJCU5WUkFNX09GRlNFVCgweDdmKQotCi0vKiBmbGFnIGJ5dGVzIC0gMTYgZmxhZ3MgZm9yIG5vdywgbGVhdmUgcm9vbSBmb3IgbW9yZSAqLwotI2RlZmluZSBDT0JUX0NNT1NfRkxBR19CWVRFXzAJCU5WUkFNX09GRlNFVCgweDEwKQotI2RlZmluZSBDT0JUX0NNT1NfRkxBR19CWVRFXzEJCU5WUkFNX09GRlNFVCgweDExKQotCi0vKiBmbGFncyBpbiBmbGFnIGJ5dGVzIC0gdXAgdG8gMTYgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0ZMQUdfTUlOCQkweDAwMDEKLSNkZWZpbmUgQ09CVF9DTU9TX0NPTlNPTEVfRkxBRwkJMHgwMDAxIC8qIGNvbnNvbGUgb24vb2ZmICovCi0jZGVmaW5lIENPQlRfQ01PU19ERUJVR19GTEFHCQkweDAwMDIgLyogUk9NIGRlYnVnIG1lc3NhZ2VzICovCi0jZGVmaW5lIENPQlRfQ01PU19BVVRPX1BST01QVF9GTEFHCTB4MDAwNCAvKiBib290IHRvIFJPTSBwcm9tcHQ/ICovCi0jZGVmaW5lIENPQlRfQ01PU19DTEVBTl9CT09UX0ZMQUcJMHgwMDA4IC8qIHNldCBieSBhIGNsZWFuIHNodXRkb3duICovCi0jZGVmaW5lIENPQlRfQ01PU19IV19OT1BST0JFX0ZMQUcJMHgwMDEwIC8qIGdvIGVhc3kgb24gdGhlIHByb2JpbmcgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1NZU0ZBVUxUX0ZMQUcJCTB4MDAyMCAvKiBzeXN0ZW0gZmF1bHQgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX09PUFNQQU5JQ19GTEFHCTB4MDA0MCAvKiBwYW5pYyBvbiBvb3BzICovCi0jZGVmaW5lIENPQlRfQ01PU19ERUxBWV9DQUNIRV9GTEFHCTB4MDA4MCAvKiBkZWxheSBjYWNoZSBpbml0aWFsaXphdGlvbiAqLwotI2RlZmluZSBDT0JUX0NNT1NfTk9MT0dPX0ZMQUcJCTB4MDEwMCAvKiBoaWRlICJDIiBsb2dvIEAgYm9vdCAqLwotI2RlZmluZSBDT0JUX0NNT1NfVkVSU0lPTl9GTEFHCQkweDAyMDAgLyogdGhlIHZlcnNpb24gZmllbGQgaXMgdmFsaWQgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0ZMQUdfTUFYCQkweDAyMDAKLQotLyogbGVhdmUgYnl0ZSAweDEyIGJsYW5rIC0gTGludXggbG9va3MgZm9yIGRyaXZlIGluZm8gaGVyZSAqLwotCi0vKiBDTU9TIHN0cnVjdHVyZSB2ZXJzaW9uLCB2YWxpZCBpZiBDT0JUX0NNT1NfVkVSU0lPTl9GTEFHIGlzIHRydWUgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1ZFUlNJT04JCU5WUkFNX09GRlNFVCgweDEzKQotI2RlZmluZSBDT0JUX0NNT1NfVkVSX0JUT0NPREUJCTEgLyogbWluLiB2ZXJzaW9uIG5lZWRlZCBmb3IgYnRvY29kZSAqLwotCi0vKiBpbmRleCBvZiBkZWZhdWx0IGJvb3QgbWV0aG9kICovCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX01FVEhPRAkJTlZSQU1fT0ZGU0VUKDB4MjApCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX01FVEhPRF9ESVNLCTAKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX1JPTQkxCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX01FVEhPRF9ORVQJMgotCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVl9NSU4JCU5WUkFNX09GRlNFVCgweDIxKQotLyogbWFqb3IgIywgbWlub3IgIyBvZiBmaXJzdCB0aHJvdWdoIGZvdXJ0aCBib290IGRldmljZSAqLwotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYwX01BSgkJTlZSQU1fT0ZGU0VUKDB4MjEpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjBfTUlOCQlOVlJBTV9PRkZTRVQoMHgyMikKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMV9NQUoJCU5WUkFNX09GRlNFVCgweDIzKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYxX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjQpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjJfTUFKCQlOVlJBTV9PRkZTRVQoMHgyNSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMl9NSU4JCU5WUkFNX09GRlNFVCgweDI2KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYzX01BSgkJTlZSQU1fT0ZGU0VUKDB4MjcpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjNfTUlOCQlOVlJBTV9PRkZTRVQoMHgyOCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWX01BWAkJTlZSQU1fT0ZGU0VUKDB4MjgpCi0KLS8qIGNoZWNrc3VtIG9mIGJ5dGVzIDB4ZS0weDdmICovCi0jZGVmaW5lIENPQlRfQ01PU19DSEVDS1NVTQkJTlZSQU1fT0ZGU0VUKDB4MmUpCi0KLS8qIHJ1bm5pbmcgdXB0aW1lIGNvdW50ZXIsIHVuaXRzIG9mIDUgbWludXRlcyAoMzIgYml0cyA9fiA0MTAwMCB5ZWFycykgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1VQVElNRV8wCQlOVlJBTV9PRkZTRVQoMHgzMCkKLSNkZWZpbmUgQ09CVF9DTU9TX1VQVElNRV8xCQlOVlJBTV9PRkZTRVQoMHgzMSkKLSNkZWZpbmUgQ09CVF9DTU9TX1VQVElNRV8yCQlOVlJBTV9PRkZTRVQoMHgzMikKLSNkZWZpbmUgQ09CVF9DTU9TX1VQVElNRV8zCQlOVlJBTV9PRkZTRVQoMHgzMykKLQotLyogY291bnQgb2Ygc3VjY2Vzc2Z1bCBib290cyAoMzIgYml0cykgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RDT1VOVF8wCQlOVlJBTV9PRkZTRVQoMHgzOCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RDT1VOVF8xCQlOVlJBTV9PRkZTRVQoMHgzOSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RDT1VOVF8yCQlOVlJBTV9PRkZTRVQoMHgzYSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RDT1VOVF8zCQlOVlJBTV9PRkZTRVQoMHgzYikKLQotLyogMTMgYnl0ZXM6IHN5c3RlbSBzZXJpYWwgbnVtYmVyLCBzYW1lIGFzIG9uIHRoZSBiYWNrIG9mIHRoZSBzeXN0ZW0gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fTEVOCTEzCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzAJCU5WUkFNX09GRlNFVCgweDQwKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8xCQlOVlJBTV9PRkZTRVQoMHg0MSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMgkJTlZSQU1fT0ZGU0VUKDB4NDIpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzMJCU5WUkFNX09GRlNFVCgweDQzKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV80CQlOVlJBTV9PRkZTRVQoMHg0NCkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNQkJTlZSQU1fT0ZGU0VUKDB4NDUpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzYJCU5WUkFNX09GRlNFVCgweDQ2KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV83CQlOVlJBTV9PRkZTRVQoMHg0NykKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fOAkJTlZSQU1fT0ZGU0VUKDB4NDgpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzkJCU5WUkFNX09GRlNFVCgweDQ5KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8xMAkJTlZSQU1fT0ZGU0VUKDB4NGEpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzExCQlOVlJBTV9PRkZTRVQoMHg0YikKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMTIJCU5WUkFNX09GRlNFVCgweDRjKQotLyogY2hlY2tzdW0gZm9yIHNlcmlhbCBudW0gLSAxIGJ5dGUgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fQ1NVTQlOVlJBTV9PRkZTRVQoMHg0ZikKLQotI2RlZmluZSBDT0JUX0NNT1NfUk9NX1JFVl9NQUoJCU5WUkFNX09GRlNFVCgweDUwKQotI2RlZmluZSBDT0JUX0NNT1NfUk9NX1JFVl9NSU4JCU5WUkFNX09GRlNFVCgweDUxKQotI2RlZmluZSBDT0JUX0NNT1NfUk9NX1JFVl9SRVYJCU5WUkFNX09GRlNFVCgweDUyKQotCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fQ09ERV8wCQlOVlJBTV9PRkZTRVQoMHg1MykKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzEJCU5WUkFNX09GRlNFVCgweDU0KQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMgkJTlZSQU1fT0ZGU0VUKDB4NTUpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fQ09ERV8zCQlOVlJBTV9PRkZTRVQoMHg1NikKLQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0lQX0NTVU0JCU5WUkFNX09GRlNFVCgweDU3KQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0lQXzAJCU5WUkFNX09GRlNFVCgweDU4KQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0lQXzEJCU5WUkFNX09GRlNFVCgweDU5KQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0lQXzIJCU5WUkFNX09GRlNFVCgweDVhKQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0lQXzMJCU5WUkFNX09GRlNFVCgweDViKQotCi0jZW5kaWYgLyogQ09CQUxUX05WUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaCBiL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaAppbmRleCBmZWY2ZjNkLi44YzY5NjdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCkBAIC00MCw5ICs0MCw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjZGVmaW5lIENPTkZJR0ZTX0lURU1fTkFNRV9MRU4JMjAKIApAQCAtNzUsNyArNzUsNiBAQAogZXh0ZXJuIHZvaWQgY29uZmlnX2l0ZW1faW5pdF90eXBlX25hbWUoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLAogCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgICAgICBzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSAqdHlwZSk7Ci1leHRlcm4gdm9pZCBjb25maWdfaXRlbV9jbGVhbnVwKHN0cnVjdCBjb25maWdfaXRlbSAqKTsKIAogZXh0ZXJuIHN0cnVjdCBjb25maWdfaXRlbSAqIGNvbmZpZ19pdGVtX2dldChzdHJ1Y3QgY29uZmlnX2l0ZW0gKik7CiBleHRlcm4gdm9pZCBjb25maWdfaXRlbV9wdXQoc3RydWN0IGNvbmZpZ19pdGVtICopOwpAQCAtODcsMTIgKzg2LDEwIEBACiAJc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZQkJKipjdF9hdHRyczsKIH07CiAKLQogLyoqCiAgKglncm91cCAtIGEgZ3JvdXAgb2YgY29uZmlnX2l0ZW1zIG9mIGEgc3BlY2lmaWMgdHlwZSwgYmVsb25naW5nCiAgKgl0byBhIHNwZWNpZmljIHN1YnN5c3RlbS4KICAqLwotCiBzdHJ1Y3QgY29uZmlnX2dyb3VwIHsKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0JCWNnX2l0ZW07CiAJc3RydWN0IGxpc3RfaGVhZAkJY2dfY2hpbGRyZW47CkBAIC0xMDAsMTMgKzk3LDExIEBACiAJc3RydWN0IGNvbmZpZ19ncm91cAkJKipkZWZhdWx0X2dyb3VwczsKIH07CiAKLQogZXh0ZXJuIHZvaWQgY29uZmlnX2dyb3VwX2luaXQoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXApOwogZXh0ZXJuIHZvaWQgY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLAogCQkJCQljb25zdCBjaGFyICpuYW1lLAogCQkJCQlzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSAqdHlwZSk7CiAKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgY29uZmlnX2dyb3VwICp0b19jb25maWdfZ3JvdXAoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQogewogCXJldHVybiBpdGVtID8gY29udGFpbmVyX29mKGl0ZW0sc3RydWN0IGNvbmZpZ19ncm91cCxjZ19pdGVtKSA6IE5VTEw7CkBAIC0xMjIsNyArMTE3LDggQEAKIAljb25maWdfaXRlbV9wdXQoJmdyb3VwLT5jZ19pdGVtKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBjb25maWdfaXRlbSAqY29uZmlnX2dyb3VwX2ZpbmRfb2JqKHN0cnVjdCBjb25maWdfZ3JvdXAgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgY29uZmlnX2l0ZW0gKmNvbmZpZ19ncm91cF9maW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19ncm91cCAqLAorCQkJCQkJICBjb25zdCBjaGFyICopOwogCiAKIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgewpAQCAtMTMxLDYgKzEyNywyMiBAQAogCW1vZGVfdAkJCWNhX21vZGU7CiB9OwogCisvKgorICogVXNlcnMgb2Z0ZW4gbmVlZCB0byBjcmVhdGUgYXR0cmlidXRlIHN0cnVjdHVyZXMgZm9yIHRoZWlyIGNvbmZpZ3VyYWJsZQorICogYXR0cmlidXRlcywgY29udGFpbmluZyBhIGNvbmZpZ2ZzX2F0dHJpYnV0ZSBtZW1iZXIgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzCisgKiBmb3IgdGhlIHNob3coKSBhbmQgc3RvcmUoKSBvcGVyYXRpb25zIG9uIHRoYXQgYXR0cmlidXRlLiBUaGV5IGNhbiB1c2UKKyAqIHRoaXMgbWFjcm8gKHNpbWlsYXIgdG8gc3lzZnMnIF9fQVRUUikgdG8gbWFrZSBkZWZpbmluZyBhdHRyaWJ1dGVzIGVhc2llci4KKyAqLworI2RlZmluZSBfX0NPTkZJR0ZTX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJCVwKK3sJCQkJCQkJCQlcCisJLmF0dHIJPSB7CQkJCQkJCVwKKwkJCS5jYV9uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLAkJCVwKKwkJCS5jYV9tb2RlID0gX21vZGUsCQkJCVwKKwkJCS5jYV9vd25lciA9IFRISVNfTU9EVUxFLAkJCVwKKwl9LAkJCQkJCQkJXAorCS5zaG93CT0gX3Nob3csCQkJCQkJXAorCS5zdG9yZQk9IF9zdG9yZSwJCQkJCQlcCit9CiAKIC8qCiAgKiBJZiBhbGxvd19saW5rKCkgZXhpc3RzLCB0aGUgaXRlbSBjYW4gc3ltbGluaygyKSBvdXQgdG8gb3RoZXIKQEAgLTE1NywxMiArMTY5LDEzIEBACiAJc3RydWN0IGNvbmZpZ19pdGVtICooKm1ha2VfaXRlbSkoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsIGNvbnN0IGNoYXIgKm5hbWUpOwogCXN0cnVjdCBjb25maWdfZ3JvdXAgKigqbWFrZV9ncm91cCkoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsIGNvbnN0IGNoYXIgKm5hbWUpOwogCWludCAoKmNvbW1pdF9pdGVtKShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOworCXZvaWQgKCpkaXNjb25uZWN0X25vdGlmeSkoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CiAJdm9pZCAoKmRyb3BfaXRlbSkoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CiB9OwogCiBzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtIHsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwCXN1X2dyb3VwOwotCXN0cnVjdCBzZW1hcGhvcmUJc3Vfc2VtOworCXN0cnVjdCBtdXRleAkJc3VfbXV0ZXg7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnRvX2NvbmZpZ2ZzX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCkKQEAgLTE3NSw2ICsxODgsMTEgQEAKIGludCBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzKTsKIHZvaWQgY29uZmlnZnNfdW5yZWdpc3Rlcl9zdWJzeXN0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzKTsKIAorLyogVGhlc2UgZnVuY3Rpb25zIGNhbiBzbGVlcCBhbmQgY2FuIGFsbG9jIHdpdGggR0ZQX0tFUk5FTCAqLworLyogV0FSTklORzogVGhlc2UgY2Fubm90IGJlIGNhbGxlZCB1bmRlcm5lYXRoIGNvbmZpZ2ZzIGNhbGxiYWNrcyEhICovCitpbnQgY29uZmlnZnNfZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKnRhcmdldCk7Cit2b2lkIGNvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKnRhcmdldCk7CisKICNlbmRpZiAgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0NPTkZJR0ZTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaCBiL2luY2x1ZGUvbGludXgvY29uc29sZS5oCmluZGV4IDYyZWY2ZTEuLjU2YTdiY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29uc29sZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY29uc29sZS5oCkBAIC0xNSw3ICsxNSw2IEBACiAjZGVmaW5lIF9MSU5VWF9DT05TT0xFX0hfIDEKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogc3RydWN0IHZjX2RhdGE7CiBzdHJ1Y3QgY29uc29sZV9mb250X29wOwpAQCAtOTksNiArOTgsNyBAQAogCXN0cnVjdCB0dHlfZHJpdmVyICooKmRldmljZSkoc3RydWN0IGNvbnNvbGUgKiwgaW50ICopOwogCXZvaWQJKCp1bmJsYW5rKSh2b2lkKTsKIAlpbnQJKCpzZXR1cCkoc3RydWN0IGNvbnNvbGUgKiwgY2hhciAqKTsKKwlpbnQJKCplYXJseV9zZXR1cCkodm9pZCk7CiAJc2hvcnQJZmxhZ3M7CiAJc2hvcnQJaW5kZXg7CiAJaW50CWNmbGFnOwpAQCAtMTA3LDYgKzEwNyw3IEBACiB9OwogCiBleHRlcm4gaW50IGFkZF9wcmVmZXJyZWRfY29uc29sZShjaGFyICpuYW1lLCBpbnQgaWR4LCBjaGFyICpvcHRpb25zKTsKK2V4dGVybiBpbnQgdXBkYXRlX2NvbnNvbGVfY21kbGluZShjaGFyICpuYW1lLCBpbnQgaWR4LCBjaGFyICpuYW1lX25ldywgaW50IGlkeF9uZXcsIGNoYXIgKm9wdGlvbnMpOwogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfY29uc29sZShzdHJ1Y3QgY29uc29sZSAqKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9jb25zb2xlKHN0cnVjdCBjb25zb2xlICopOwogZXh0ZXJuIHN0cnVjdCBjb25zb2xlICpjb25zb2xlX2RyaXZlcnM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaCBiL2luY2x1ZGUvbGludXgvY29uc29sZW1hcC5oCmluZGV4IDgyYzlhMWYuLjA2YjI3NjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29uc29sZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29uc29sZW1hcC5oCkBAIC04LDkgKzgsMTIgQEAKICNkZWZpbmUgSUJNUENfTUFQIDIKICNkZWZpbmUgVVNFUl9NQVAgMwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogc3RydWN0IHZjX2RhdGE7CiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGludmVyc2VfdHJhbnNsYXRlKHN0cnVjdCB2Y19kYXRhICpjb25wLCBpbnQgZ2x5cGgpOworZXh0ZXJuIHUxNiBpbnZlcnNlX3RyYW5zbGF0ZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgaW50IGdseXBoLCBpbnQgdXNlX3VuaWNvZGUpOwogZXh0ZXJuIHVuc2lnbmVkIHNob3J0ICpzZXRfdHJhbnNsYXRlKGludCBtLCBzdHJ1Y3QgdmNfZGF0YSAqdmMpOwogZXh0ZXJuIGludCBjb252X3VuaV90b19wYyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgbG9uZyB1Y3MpOworZXh0ZXJuIHUzMiBjb252XzhiaXRfdG9fdW5pKHVuc2lnbmVkIGNoYXIgYyk7CiB2b2lkIGNvbnNvbGVfbWFwX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCAzYjJkZjI1Li5jMjIzNmJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTEyMCw3ICsxMjAsNiBAQAogCiAjZGVmaW5lIGxvY2tfY3B1X2hvdHBsdWcoKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHVubG9ja19jcHVfaG90cGx1ZygpCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbG9ja19jcHVfaG90cGx1Z19pbnRlcnJ1cHRpYmxlKCkgMAogI2RlZmluZSBob3RjcHVfbm90aWZpZXIoZm4sIHByaSkJZG8geyAodm9pZCkoZm4pOyB9IHdoaWxlICgwKQogI2RlZmluZSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIobmIpCWRvIHsgKHZvaWQpKG5iKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIobmIpCWRvIHsgKHZvaWQpKG5iKTsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3JjNy5oIGIvaW5jbHVkZS9saW51eC9jcmM3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4NmU3NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3JjNy5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0xJTlVYX0NSQzdfSAorI2RlZmluZSBfTElOVVhfQ1JDN19ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworZXh0ZXJuIGNvbnN0IHU4IGNyYzdfc3luZHJvbWVfdGFibGVbMjU2XTsKKworc3RhdGljIGlubGluZSB1OCBjcmM3X2J5dGUodTggY3JjLCB1OCBkYXRhKQoreworCXJldHVybiBjcmM3X3N5bmRyb21lX3RhYmxlWyhjcmMgPDwgMSkgXiBkYXRhXTsKK30KKworZXh0ZXJuIHU4IGNyYzcodTggY3JjLCBjb25zdCB1OCAqYnVmZmVyLCBzaXplX3QgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKaW5kZXggOWE2NjNjNi4uMmRjMjFjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaApAQCAtMzEsNyArMzEsMTEgQEAKIAkJKGRtYV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSEFTX0RNQQogI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KKyNlbmRpZgogCiAvKiBCYWNrd2FyZHMgY29tcGF0LCByZW1vdmUgaW4gMi43LnggKi8KICNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmggYi9pbmNsdWRlL2xpbnV4L2RzMTcyODdydGMuaAppbmRleCBjMjgxYmE0Li5kODVkM2Y0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RzMTcyODdydGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RzMTcyODdydGMuaApAQCAtMTEsNyArMTEsNiBAQAogI2RlZmluZSBfX0xJTlVYX0RTMTcyODdSVENfSAogCiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CQkJLyogZ2V0IHRoZSB1c2VyLWxldmVsIEFQSSAqLwotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CQkvKiBzcGlubG9ja190ICovCiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KIAogLyogUmVnaXN0ZXIgQSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvZWZzX2ZzLmgKaW5kZXggZGZlZDgwMC4uMTZjYjI1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oCkBAIC00NSw2ICs0NSw3IEBACiBleHRlcm4gaW50IGVmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKIAogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmVmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICplZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCk7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqZWZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBpbnQgZWZzX2JtYXAoc3RydWN0IGlub2RlICosIGludCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXhwb3J0ZnMuaCBiL2luY2x1ZGUvbGludXgvZXhwb3J0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODcyZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9leHBvcnRmcy5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIExJTlVYX0VYUE9SVEZTX0gKKyNkZWZpbmUgTElOVVhfRVhQT1JURlNfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgZGVudHJ5Oworc3RydWN0IHN1cGVyX2Jsb2NrOworc3RydWN0IHZmc21vdW50OworCisKKy8qKgorICogc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIC0gZm9yIG5mc2QgdG8gY29tbXVuaWNhdGUgd2l0aCBmaWxlIHN5c3RlbXMKKyAqIEBkZWNvZGVfZmg6ICAgICAgZGVjb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgYW5kIHJldHVybiBhICZzdHJ1Y3QgZGVudHJ5CisgKiBAZW5jb2RlX2ZoOiAgICAgIGVuY29kZSBhIGZpbGUgaGFuZGxlIGZyYWdtZW50IGZyb20gYSBkZW50cnkKKyAqIEBnZXRfbmFtZTogICAgICAgZmluZCB0aGUgbmFtZSBmb3IgYSBnaXZlbiBpbm9kZSBpbiBhIGdpdmVuIGRpcmVjdG9yeQorICogQGdldF9wYXJlbnQ6ICAgICBmaW5kIHRoZSBwYXJlbnQgb2YgYSBnaXZlbiBkaXJlY3RvcnkKKyAqIEBnZXRfZGVudHJ5OiAgICAgZmluZCBhIGRlbnRyeSBmb3IgdGhlIGlub2RlIGdpdmVuIGEgZmlsZSBoYW5kbGUgc3ViLWZyYWdtZW50CisgKiBAZmluZF9leHBvcnRlZF9kZW50cnk6CisgKglzZXQgYnkgdGhlIGV4cG9ydGluZyBtb2R1bGUgdG8gYSBzdGFuZGFyZCBoZWxwZXIgZnVuY3Rpb24uCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBUaGUgZXhwb3J0X29wZXJhdGlvbnMgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgZm9yIG5mc2QgdG8gY29tbXVuaWNhdGUKKyAqICAgIHdpdGggYSBwYXJ0aWN1bGFyIGV4cG9ydGVkIGZpbGUgc3lzdGVtICAtIHBhcnRpY3VsYXJseSBlbmFibGluZyBuZnNkIGFuZAorICogICAgdGhlIGZpbGVzeXN0ZW0gdG8gY28tb3BlcmF0ZSB3aGVuIGRlYWxpbmcgd2l0aCBmaWxlIGhhbmRsZXMuCisgKgorICogICAgZXhwb3J0X29wZXJhdGlvbnMgY29udGFpbnMgdHdvIGJhc2ljIG9wZXJhdGlvbiBmb3IgZGVhbGluZyB3aXRoIGZpbGUKKyAqICAgIGhhbmRsZXMsIGRlY29kZV9maCgpIGFuZCBlbmNvZGVfZmgoKSwgYW5kIGFsbG93cyBmb3Igc29tZSBvdGhlcgorICogICAgb3BlcmF0aW9ucyB0byBiZSBkZWZpbmVkIHdoaWNoIHN0YW5kYXJkIGhlbHBlciByb3V0aW5lcyB1c2UgdG8gZ2V0CisgKiAgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlc3lzdGVtLgorICoKKyAqICAgIG5mc2QgZW5jb2RlcyBpbmZvcm1hdGlvbiB1c2UgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpbGVzeXN0ZW0gYSBmaWxlaGFuZGxlCisgKiAgICBhcHBsaWVzIHRvIGluIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIGZpbGUgaGFuZGxlLiAgVGhlIHJlbWFpbmRlciwgdGVybWVkCisgKiAgICBhIGZpbGUgaGFuZGxlIGZyYWdtZW50LCBpcyBjb250cm9sbGVkIGNvbXBsZXRlbHkgYnkgdGhlIGZpbGVzeXN0ZW0uICBUaGUKKyAqICAgIHN0YW5kYXJkIGhlbHBlciByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGlzIGZyYWdtZW50IHdpbGwgY29udGFpbiBvbmUgb3IKKyAqICAgIHR3byBzdWItZnJhZ21lbnRzLCBvbmUgd2hpY2ggaWRlbnRpZmllcyB0aGUgZmlsZSwgYW5kIG9uZSB3aGljaCBtYXkgYmUKKyAqICAgIHVzZWQgdG8gaWRlbnRpZnkgdGhlIChhKSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZS4KKyAqCisgKiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIG5mc2QgbmVlZHMgdG8gZ2V0IGEgZGVudHJ5IHdoaWNoIGlzIGNvbm5lY3RlZCBpbnRvIGEKKyAqICAgIHNwZWNpZmljIHBhcnQgb2YgdGhlIGZpbGUgdHJlZS4gIFRvIGFsbG93IGZvciB0aGlzLCBpdCBwYXNzZXMgdGhlCisgKiAgICBmdW5jdGlvbiBhY2NlcHRhYmxlKCkgdG9nZXRoZXIgd2l0aCBhIEBjb250ZXh0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlZQorICogICAgaWYgdGhlIGRlbnRyeSBpcyBhY2NlcHRhYmxlLiAgQXMgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGRlbnRyeXMgZm9yIGEKKyAqICAgIGdpdmVuIGZpbGUsIHRoZSBmaWxlc3lzdGVtIHNob3VsZCBjaGVjayBlYWNoIG9uZSBmb3IgYWNjZXB0YWJpbGl0eSBiZWZvcmUKKyAqICAgIGxvb2tpbmcgZm9yIHRoZSBuZXh0LiAgQXMgc29vbiBhcyBhbiBhY2NlcHRhYmxlIG9uZSBpcyBmb3VuZCwgaXQgc2hvdWxkCisgKiAgICBiZSByZXR1cm5lZC4KKyAqCisgKiBkZWNvZGVfZmg6CisgKiAgICBAZGVjb2RlX2ZoIGlzIGdpdmVuIGEgJnN0cnVjdCBzdXBlcl9ibG9jayAoQHNiKSwgYSBmaWxlIGhhbmRsZSBmcmFnbWVudAorICogICAgKEBmaCwgQGZoX2xlbikgYW5kIGFuIGFjY2VwdGFiaWxpdHkgdGVzdGluZyBmdW5jdGlvbiAoQGFjY2VwdGFibGUsCisgKiAgICBAY29udGV4dCkuICBJdCBzaG91bGQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkgd2hpY2ggcmVmZXJzIHRvIHRoZSBzYW1lCisgKiAgICBmaWxlIHRoYXQgdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IHJlZmVycyB0bywgIGFuZCB3aGljaCBwYXNzZXMgdGhlCisgKiAgICBhY2NlcHRhYmlsaXR5IHRlc3QuICBJZiBpdCBjYW5ub3QsIGl0IHNob3VsZCByZXR1cm4gYSAlTlVMTCBwb2ludGVyIGlmCisgKiAgICB0aGUgZmlsZSB3YXMgZm91bmQgYnV0IG5vIGFjY2VwdGFibGUgJmRlbnRyaWVzIHdlcmUgYXZhaWxhYmxlLCBvciBhCisgKiAgICAlRVJSX1BUUiBlcnJvciBjb2RlIGluZGljYXRpbmcgd2h5IGl0IGNvdWxkbid0IGJlIGZvdW5kIChlLmcuICVFTk9FTlQgb3IKKyAqICAgICVFTk9NRU0pLgorICoKKyAqIGVuY29kZV9maDoKKyAqICAgIEBlbmNvZGVfZmggc2hvdWxkIHN0b3JlIGluIHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudCBAZmggKHVzaW5nIGF0IG1vc3QKKyAqICAgIEBtYXhfbGVuIGJ5dGVzKSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IEBkZWNvZGVfZmggdG8gcmVjb3ZlciB0aGUKKyAqICAgIGZpbGUgcmVmZXJlZCB0byBieSB0aGUgJnN0cnVjdCBkZW50cnkgQGRlLiAgSWYgdGhlIEBjb25uZWN0YWJsZSBmbGFnIGlzCisgKiAgICBzZXQsIHRoZSBlbmNvZGVfZmgoKSBzaG91bGQgc3RvcmUgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBzbyB0aGF0IGEgZ29vZAorICogICAgYXR0ZW1wdCBjYW4gYmUgbWFkZSB0byBmaW5kIG5vdCBvbmx5IHRoZSBmaWxlIGJ1dCBhbHNvIGl0J3MgcGxhY2UgaW4gdGhlCisgKiAgICBmaWxlc3lzdGVtLiAgIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHN0b3JpbmcgYSByZWZlcmVuY2UgdG8gZGUtPmRfcGFyZW50IGluCisgKiAgICB0aGUgZmlsZWhhbmRsZSBmcmFnbWVudC4gIGVuY29kZV9maCgpIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcworICogICAgc3RvcmVkIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBzdWNoIGFzICUtRU5PU1BDCisgKgorICogZ2V0X25hbWU6CisgKiAgICBAZ2V0X25hbWUgc2hvdWxkIGZpbmQgYSBuYW1lIGZvciB0aGUgZ2l2ZW4gQGNoaWxkIGluIHRoZSBnaXZlbiBAcGFyZW50CisgKiAgICBkaXJlY3RvcnkuICBUaGUgbmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBAbmFtZSAod2l0aCB0aGUKKyAqICAgIHVuZGVyc3RhbmRpbmcgdGhhdCBpdCBpcyBhbHJlYWR5IHBvaW50aW5nIHRvIGEgYSAlTkFNRV9NQVgrMSBzaXplZAorICogICAgYnVmZmVyLiAgIGdldF9uYW1lKCkgc2hvdWxkIHJldHVybiAlMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqICAgIG9yIGVycm9yLiAgQGdldF9uYW1lIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgQHBhcmVudC0+aV9tdXRleCBoZWxkLgorICoKKyAqIGdldF9wYXJlbnQ6CisgKiAgICBAZ2V0X3BhcmVudCBzaG91bGQgZmluZCB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIEBjaGlsZCB3aGljaAorICogICAgaXMgYWxzbyBhIGRpcmVjdG9yeS4gIEluIHRoZSBldmVudCB0aGF0IGl0IGNhbm5vdCBiZSBmb3VuZCwgb3Igc3RvcmFnZQorICogICAgc3BhY2UgY2Fubm90IGJlIGFsbG9jYXRlZCwgYSAlRVJSX1BUUiBzaG91bGQgYmUgcmV0dXJuZWQuCisgKgorICogZ2V0X2RlbnRyeToKKyAqICAgIEdpdmVuIGEgJnN1cGVyX2Jsb2NrIChAc2IpIGFuZCBhIHBvaW50ZXIgdG8gYSBmaWxlLXN5c3RlbSBzcGVjaWZpYyBpbm9kZQorICogICAgaWRlbnRpZmllciwgcG9zc2libHkgYW4gaW5vZGUgbnVtYmVyLCAoQGludW1wKSBnZXRfZGVudHJ5KCkgc2hvdWxkIGZpbmQKKyAqICAgIHRoZSBpZGVudGlmaWVkIGlub2RlIGFuZCByZXR1cm4gYSBkZW50cnkgZm9yIHRoYXQgaW5vZGUuICBBbnkgc3VpdGFibGUKKyAqICAgIGRlbnRyeSBjYW4gYmUgcmV0dXJuZWQgaW5jbHVkaW5nLCBpZiBuZWNlc3NhcnksIGEgbmV3IGRlbnRyeSBjcmVhdGVkIHdpdGgKKyAqICAgIGRfYWxsb2Nfcm9vdC4gIFRoZSBjYWxsZXIgY2FuIHRoZW4gZmluZCBhbnkgb3RoZXIgZXh0YW50IGRlbnRyeXMgYnkKKyAqICAgIGZvbGxvd2luZyB0aGUgZF9hbGlhcyBsaW5rcy4gIElmIGEgbmV3IGRlbnRyeSB3YXMgY3JlYXRlZCB1c2luZworICogICAgZF9hbGxvY19yb290LCBEQ0FDSEVfTkZTRF9ESVNDT05ORUNURUQgc2hvdWxkIGJlIHNldCwgYW5kIHRoZSBkZW50cnkKKyAqICAgIHNob3VsZCBiZSBkX3JlaGFzaCgpZWQuCisgKgorICogICAgSWYgdGhlIGlub2RlIGNhbm5vdCBiZSBmb3VuZCwgZWl0aGVyIGEgJU5VTEwgcG9pbnRlciBvciBhbiAlRVJSX1BUUiBjb2RlCisgKiAgICBjYW4gYmUgcmV0dXJuZWQuICBUaGUgQGludW1wIHdpbGwgYmUgd2hhdGV2ZXIgd2FzIHBhc3NlZCB0bworICogICAgbmZzZF9maW5kX2ZoX2RlbnRyeSgpIGluIGVpdGhlciB0aGUgQG9iaiBvciBAcGFyZW50IHBhcmFtZXRlcnMuCisgKgorICogTG9ja2luZyBydWxlczoKKyAqICAgIGdldF9wYXJlbnQgaXMgY2FsbGVkIHdpdGggY2hpbGQtPmRfaW5vZGUtPmlfbXV0ZXggZG93bgorICogICAgZ2V0X25hbWUgaXMgbm90ICh3aGljaCBpcyBwb3NzaWJseSBpbmNvbnNpc3RlbnQpCisgKi8KKworc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHsKKwlzdHJ1Y3QgZGVudHJ5ICooKmRlY29kZV9maCkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKmZoLAorCQkJaW50IGZoX2xlbiwgaW50IGZoX3R5cGUsCisJCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCQl2b2lkICpjb250ZXh0KTsKKwlpbnQgKCplbmNvZGVfZmgpKHN0cnVjdCBkZW50cnkgKmRlLCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKKwkJCWludCBjb25uZWN0YWJsZSk7CisJaW50ICgqZ2V0X25hbWUpKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgY2hhciAqbmFtZSwKKwkJCXN0cnVjdCBkZW50cnkgKmNoaWxkKTsKKwlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfcGFyZW50KShzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CisJc3RydWN0IGRlbnRyeSAqICgqZ2V0X2RlbnRyeSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqaW51bXApOworCisJLyogVGhpcyBpcyBzZXQgYnkgdGhlIGV4cG9ydGluZyBtb2R1bGUgdG8gYSBzdGFuZGFyZCBoZWxwZXIgKi8KKwlzdHJ1Y3QgZGVudHJ5ICogKCpmaW5kX2V4cG9ydGVkX2RlbnRyeSkoCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvYmosIHZvaWQgKnBhcmVudCwKKwkJCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJCXZvaWQgKmNvbnRleHQpOworfTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwKKwl2b2lkICpwYXJlbnQsIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwl2b2lkICpjb250ZXh0KTsKKworZXh0ZXJuIGludCBleHBvcnRmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKKwlpbnQgY29ubmVjdGFibGUpOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmV4cG9ydGZzX2RlY29kZV9maChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgX191MzIgKmZoLAorCWludCBmaF9sZW4sIGludCBmaWxlaWRfdHlwZSwgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqLCBzdHJ1Y3QgZGVudHJ5ICopLAorCXZvaWQgKmNvbnRleHQpOworCisjZW5kaWYgLyogTElOVVhfRVhQT1JURlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaAppbmRleCA0ZWRhMGVkLi5kMTQ5ZjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaApAQCAtMzMsNiArMzMsOCBAQAogCXVuc2lnbmVkIGxvbmcgc19nZGJfY291bnQ7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9yIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgc19kZXNjX3Blcl9ibG9jazsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3JzIHBlciBibG9jayAqLwogCXVuc2lnbmVkIGxvbmcgc19ncm91cHNfY291bnQ7CS8qIE51bWJlciBvZiBncm91cHMgaW4gdGhlIGZzICovCisJdW5zaWduZWQgbG9uZyBzX292ZXJoZWFkX2xhc3Q7ICAvKiBMYXN0IGNhbGN1bGF0ZWQgb3ZlcmhlYWQgKi8KKwl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KIAlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIHNfZXM7CS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogc19ncm91cF9kZXNjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaAppbmRleCBmNjEzMDljLi5kM2MwODM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaApAQCAtMzgsNiArMzgsOCBAQAogCXVuc2lnbmVkIGxvbmcgc19nZGJfY291bnQ7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9yIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgc19kZXNjX3Blcl9ibG9jazsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3JzIHBlciBibG9jayAqLwogCXVuc2lnbmVkIGxvbmcgc19ncm91cHNfY291bnQ7CS8qIE51bWJlciBvZiBncm91cHMgaW4gdGhlIGZzICovCisJdW5zaWduZWQgbG9uZyBzX292ZXJoZWFkX2xhc3Q7ICAvKiBMYXN0IGNhbGN1bGF0ZWQgb3ZlcmhlYWQgKi8KKwl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIHNfZXM7CS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogc19ncm91cF9kZXNjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaAppbmRleCA2OTFhNzEzLi4yMzQ3NTU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDRfZnNfc2IuaApAQCAtMzksNiArMzksOCBAQAogCXVuc2lnbmVkIGxvbmcgc19nZGJfY291bnQ7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9yIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgc19kZXNjX3Blcl9ibG9jazsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3JzIHBlciBibG9jayAqLwogCXVuc2lnbmVkIGxvbmcgc19ncm91cHNfY291bnQ7CS8qIE51bWJlciBvZiBncm91cHMgaW4gdGhlIGZzICovCisJdW5zaWduZWQgbG9uZyBzX292ZXJoZWFkX2xhc3Q7ICAvKiBMYXN0IGNhbGN1bGF0ZWQgb3ZlcmhlYWQgKi8KKwl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIHNfZXM7CS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogc19ncm91cF9kZXNjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IDY2MjI2ODIuLmNlYzU0MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTExOSw2ICsxMTksNyBAQAogI2RlZmluZSBGQl9BQ0NFTF9OVl80MCAgICAgICAgICA0NiAgICAgIC8qIG5WaWRpYSBBcmNoIDQwICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfWEdJX1ZPTEFSSV9WCTQ3CS8qIFhHSSBWb2xhcmkgVjNYVCwgVjUsIFY4ICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfWEdJX1ZPTEFSSV9aCTQ4CS8qIFhHSSBWb2xhcmkgWjcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfT01BUDE2MTAJNDkJLyogVEkgT01BUDE2eHggICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9ORU9NQUdJQ19OTTIwNzAgOTAJLyogTmVvTWFnaWMgTk0yMDcwICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9ORU9NQUdJQ19OTTIwOTAgOTEJLyogTmVvTWFnaWMgTk0yMDkwICAgICAgICAgICAgICAqLwogI2RlZmluZSBGQl9BQ0NFTF9ORU9NQUdJQ19OTTIwOTMgOTIJLyogTmVvTWFnaWMgTk0yMDkzICAgICAgICAgICAgICAqLwpAQCAtNTI5LDYgKzUzMCw4IEBACiAjZGVmaW5lIEZCX0VWRU5UX0NPTkJMQU5LICAgICAgICAgICAgICAgMHgwQwogLyogICAgICBHZXQgZHJhd2luZyByZXF1aXJlbWVudHMgICAgICAgICovCiAjZGVmaW5lIEZCX0VWRU5UX0dFVF9SRVEgICAgICAgICAgICAgICAgMHgwRAorLyogICAgICBVbmJpbmQgZnJvbSB0aGUgY29uc29sZSBpZiBwb3NzaWJsZSAqLworI2RlZmluZSBGQl9FVkVOVF9GQl9VTkJJTkQgICAgICAgICAgICAgIDB4MEUKIAogc3RydWN0IGZiX2V2ZW50IHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlsZS5oIGIvaW5jbHVkZS9saW51eC9maWxlLmgKaW5kZXggYTU5MDAxZS4uMDExNGZiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maWxlLmgKQEAgLTczLDYgKzczLDcgQEAKIGV4dGVybiB2b2lkIEZBU1RDQUxMKHNldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgaW50IGZsYWcpKTsKIGV4dGVybiB2b2lkIHB1dF9maWxwKHN0cnVjdCBmaWxlICopOwogZXh0ZXJuIGludCBnZXRfdW51c2VkX2ZkKHZvaWQpOworZXh0ZXJuIGludCBnZXRfdW51c2VkX2ZkX2ZsYWdzKGludCBmbGFncyk7CiBleHRlcm4gdm9pZCBGQVNUQ0FMTChwdXRfdW51c2VkX2ZkKHVuc2lnbmVkIGludCBmZCkpOwogc3RydWN0IGttZW1fY2FjaGU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnJlZXplci5oIGIvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKaW5kZXggNDYzMTA4Ni4uMmQzOGIxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKQEAgLTEsNSArMSw4IEBACiAvKiBGcmVlemVyIGRlY2xhcmF0aW9ucyAqLwogCisjaWZuZGVmIEZSRUVaRVJfSF9JTkNMVURFRAorI2RlZmluZSBGUkVFWkVSX0hfSU5DTFVERUQKKwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTExNSw2ICsxMTgsMTQgQEAKIAlyZXR1cm4gISEocC0+ZmxhZ3MgJiBQRl9GUkVFWkVSX1NLSVApOwogfQogCisvKgorICogVGVsbCB0aGUgZnJlZXplciB0aGF0IHRoZSBjdXJyZW50IHRhc2sgc2hvdWxkIGJlIGZyb3plbiBieSBpdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyZWV6YWJsZSh2b2lkKQoreworCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9OT0ZSRUVaRTsKK30KKwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGZyb3plbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGZyZWV6aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQpAQCAtMTMwLDQgKzE0MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplcl9kb19ub3RfY291bnQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemVyX2NvdW50KHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIGludCBmcmVlemVyX3Nob3VsZF9za2lwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9mcmVlemFibGUodm9pZCkge30KICNlbmRpZgorCisjZW5kaWYJLyogRlJFRVpFUl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggNGYwYjNiZi4uNThjZTMzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtNDQsNyArNDQsNyBAQAogc3RydWN0IGlub2Rlc19zdGF0X3QgewogCWludCBucl9pbm9kZXM7CiAJaW50IG5yX3VudXNlZDsKLQlpbnQgZHVtbXlbNV07CisJaW50IGR1bW15WzVdOwkJLyogcGFkZGluZyBmb3Igc3lzY3RsIEFCSSBjb21wYXRpYmlsaXR5ICovCiB9OwogZXh0ZXJuIHN0cnVjdCBpbm9kZXNfc3RhdF90IGlub2Rlc19zdGF0OwogCkBAIC0yODMsMTEgKzI4MywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9waWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9uczsKIHN0cnVjdCBoZF9nZW9tZXRyeTsKIHN0cnVjdCBpb3ZlYzsKIHN0cnVjdCBuYW1laWRhdGE7CkBAIC04MjAsNiArODIyLDEwIEBACiAJdW5pb24gewogCQlzdHJ1Y3QgbmZzX2xvY2tfaW5mbwluZnNfZmw7CiAJCXN0cnVjdCBuZnM0X2xvY2tfaW5mbwluZnM0X2ZsOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwkvKiBsaW5rIGluIEFGUyB2bm9kZSdzIHBlbmRpbmdfbG9ja3MgbGlzdCAqLworCQkJaW50IHN0YXRlOwkJLyogc3RhdGUgb2YgZ3JhbnQgb3IgZXJyb3IgaWYgLXZlICovCisJCX0gYWZzOwogCX0gZmxfdTsKIH07CiAKQEAgLTEyNzMsMTE5ICsxMjc5LDYgQEAKIAogaW50IHN5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwogCi0vKioKLSAqIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAtIGZvciBuZnNkIHRvIGNvbW11bmljYXRlIHdpdGggZmlsZSBzeXN0ZW1zCi0gKiBAZGVjb2RlX2ZoOiAgICAgIGRlY29kZSBhIGZpbGUgaGFuZGxlIGZyYWdtZW50IGFuZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeQotICogQGVuY29kZV9maDogICAgICBlbmNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBmcm9tIGEgZGVudHJ5Ci0gKiBAZ2V0X25hbWU6ICAgICAgIGZpbmQgdGhlIG5hbWUgZm9yIGEgZ2l2ZW4gaW5vZGUgaW4gYSBnaXZlbiBkaXJlY3RvcnkKLSAqIEBnZXRfcGFyZW50OiAgICAgZmluZCB0aGUgcGFyZW50IG9mIGEgZ2l2ZW4gZGlyZWN0b3J5Ci0gKiBAZ2V0X2RlbnRyeTogICAgIGZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbiBhIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudAotICogQGZpbmRfZXhwb3J0ZWRfZGVudHJ5OgotICoJc2V0IGJ5IHRoZSBleHBvcnRpbmcgbW9kdWxlIHRvIGEgc3RhbmRhcmQgaGVscGVyIGZ1bmN0aW9uLgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgVGhlIGV4cG9ydF9vcGVyYXRpb25zIHN0cnVjdHVyZSBwcm92aWRlcyBhIG1lYW5zIGZvciBuZnNkIHRvIGNvbW11bmljYXRlCi0gKiAgICB3aXRoIGEgcGFydGljdWxhciBleHBvcnRlZCBmaWxlIHN5c3RlbSAgLSBwYXJ0aWN1bGFybHkgZW5hYmxpbmcgbmZzZCBhbmQKLSAqICAgIHRoZSBmaWxlc3lzdGVtIHRvIGNvLW9wZXJhdGUgd2hlbiBkZWFsaW5nIHdpdGggZmlsZSBoYW5kbGVzLgotICoKLSAqICAgIGV4cG9ydF9vcGVyYXRpb25zIGNvbnRhaW5zIHR3byBiYXNpYyBvcGVyYXRpb24gZm9yIGRlYWxpbmcgd2l0aCBmaWxlCi0gKiAgICBoYW5kbGVzLCBkZWNvZGVfZmgoKSBhbmQgZW5jb2RlX2ZoKCksIGFuZCBhbGxvd3MgZm9yIHNvbWUgb3RoZXIKLSAqICAgIG9wZXJhdGlvbnMgdG8gYmUgZGVmaW5lZCB3aGljaCBzdGFuZGFyZCBoZWxwZXIgcm91dGluZXMgdXNlIHRvIGdldAotICogICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZXN5c3RlbS4KLSAqCi0gKiAgICBuZnNkIGVuY29kZXMgaW5mb3JtYXRpb24gdXNlIHRvIGRldGVybWluZSB3aGljaCBmaWxlc3lzdGVtIGEgZmlsZWhhbmRsZQotICogICAgYXBwbGllcyB0byBpbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBmaWxlIGhhbmRsZS4gIFRoZSByZW1haW5kZXIsIHRlcm1lZAotICogICAgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCwgaXMgY29udHJvbGxlZCBjb21wbGV0ZWx5IGJ5IHRoZSBmaWxlc3lzdGVtLiAgVGhlCi0gKiAgICBzdGFuZGFyZCBoZWxwZXIgcm91dGluZXMgYXNzdW1lIHRoYXQgdGhpcyBmcmFnbWVudCB3aWxsIGNvbnRhaW4gb25lIG9yCi0gKiAgICB0d28gc3ViLWZyYWdtZW50cywgb25lIHdoaWNoIGlkZW50aWZpZXMgdGhlIGZpbGUsIGFuZCBvbmUgd2hpY2ggbWF5IGJlCi0gKiAgICB1c2VkIHRvIGlkZW50aWZ5IHRoZSAoYSkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGUuCi0gKgotICogICAgSW4gc29tZSBzaXR1YXRpb25zLCBuZnNkIG5lZWRzIHRvIGdldCBhIGRlbnRyeSB3aGljaCBpcyBjb25uZWN0ZWQgaW50byBhCi0gKiAgICBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBmaWxlIHRyZWUuICBUbyBhbGxvdyBmb3IgdGhpcywgaXQgcGFzc2VzIHRoZQotICogICAgZnVuY3Rpb24gYWNjZXB0YWJsZSgpIHRvZ2V0aGVyIHdpdGggYSBAY29udGV4dCB3aGljaCBjYW4gYmUgdXNlZCB0byBzZWUKLSAqICAgIGlmIHRoZSBkZW50cnkgaXMgYWNjZXB0YWJsZS4gIEFzIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBkZW50cnlzIGZvciBhCi0gKiAgICBnaXZlbiBmaWxlLCB0aGUgZmlsZXN5c3RlbSBzaG91bGQgY2hlY2sgZWFjaCBvbmUgZm9yIGFjY2VwdGFiaWxpdHkgYmVmb3JlCi0gKiAgICBsb29raW5nIGZvciB0aGUgbmV4dC4gIEFzIHNvb24gYXMgYW4gYWNjZXB0YWJsZSBvbmUgaXMgZm91bmQsIGl0IHNob3VsZAotICogICAgYmUgcmV0dXJuZWQuCi0gKgotICogZGVjb2RlX2ZoOgotICogICAgQGRlY29kZV9maCBpcyBnaXZlbiBhICZzdHJ1Y3Qgc3VwZXJfYmxvY2sgKEBzYiksIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQKLSAqICAgIChAZmgsIEBmaF9sZW4pIGFuZCBhbiBhY2NlcHRhYmlsaXR5IHRlc3RpbmcgZnVuY3Rpb24gKEBhY2NlcHRhYmxlLAotICogICAgQGNvbnRleHQpLiAgSXQgc2hvdWxkIHJldHVybiBhICZzdHJ1Y3QgZGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc2FtZQotICogICAgZmlsZSB0aGF0IHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudCByZWZlcnMgdG8sICBhbmQgd2hpY2ggcGFzc2VzIHRoZQotICogICAgYWNjZXB0YWJpbGl0eSB0ZXN0LiAgSWYgaXQgY2Fubm90LCBpdCBzaG91bGQgcmV0dXJuIGEgJU5VTEwgcG9pbnRlciBpZgotICogICAgdGhlIGZpbGUgd2FzIGZvdW5kIGJ1dCBubyBhY2NlcHRhYmxlICZkZW50cmllcyB3ZXJlIGF2YWlsYWJsZSwgb3IgYQotICogICAgJUVSUl9QVFIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHdoeSBpdCBjb3VsZG4ndCBiZSBmb3VuZCAoZS5nLiAlRU5PRU5UIG9yCi0gKiAgICAlRU5PTUVNKS4KLSAqCi0gKiBlbmNvZGVfZmg6Ci0gKiAgICBAZW5jb2RlX2ZoIHNob3VsZCBzdG9yZSBpbiB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgQGZoICh1c2luZyBhdCBtb3N0Ci0gKiAgICBAbWF4X2xlbiBieXRlcykgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBAZGVjb2RlX2ZoIHRvIHJlY292ZXIgdGhlCi0gKiAgICBmaWxlIHJlZmVyZWQgdG8gYnkgdGhlICZzdHJ1Y3QgZGVudHJ5IEBkZS4gIElmIHRoZSBAY29ubmVjdGFibGUgZmxhZyBpcwotICogICAgc2V0LCB0aGUgZW5jb2RlX2ZoKCkgc2hvdWxkIHN0b3JlIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gc28gdGhhdCBhIGdvb2QKLSAqICAgIGF0dGVtcHQgY2FuIGJlIG1hZGUgdG8gZmluZCBub3Qgb25seSB0aGUgZmlsZSBidXQgYWxzbyBpdCdzIHBsYWNlIGluIHRoZQotICogICAgZmlsZXN5c3RlbS4gICBUaGlzIHR5cGljYWxseSBtZWFucyBzdG9yaW5nIGEgcmVmZXJlbmNlIHRvIGRlLT5kX3BhcmVudCBpbgotICogICAgdGhlIGZpbGVoYW5kbGUgZnJhZ21lbnQuICBlbmNvZGVfZmgoKSBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgIHN0b3JlZCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgc3VjaCBhcyAlLUVOT1NQQwotICoKLSAqIGdldF9uYW1lOgotICogICAgQGdldF9uYW1lIHNob3VsZCBmaW5kIGEgbmFtZSBmb3IgdGhlIGdpdmVuIEBjaGlsZCBpbiB0aGUgZ2l2ZW4gQHBhcmVudAotICogICAgZGlyZWN0b3J5LiAgVGhlIG5hbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgQG5hbWUgKHdpdGggdGhlCi0gKiAgICB1bmRlcnN0YW5kaW5nIHRoYXQgaXQgaXMgYWxyZWFkeSBwb2ludGluZyB0byBhIGEgJU5BTUVfTUFYKzEgc2l6ZWQKLSAqICAgIGJ1ZmZlci4gICBnZXRfbmFtZSgpIHNob3VsZCByZXR1cm4gJTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCi0gKiAgICBvciBlcnJvci4gIEBnZXRfbmFtZSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IEBwYXJlbnQtPmlfbXV0ZXggaGVsZC4KLSAqCi0gKiBnZXRfcGFyZW50OgotICogICAgQGdldF9wYXJlbnQgc2hvdWxkIGZpbmQgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBAY2hpbGQgd2hpY2gKLSAqICAgIGlzIGFsc28gYSBkaXJlY3RvcnkuICBJbiB0aGUgZXZlbnQgdGhhdCBpdCBjYW5ub3QgYmUgZm91bmQsIG9yIHN0b3JhZ2UKLSAqICAgIHNwYWNlIGNhbm5vdCBiZSBhbGxvY2F0ZWQsIGEgJUVSUl9QVFIgc2hvdWxkIGJlIHJldHVybmVkLgotICoKLSAqIGdldF9kZW50cnk6Ci0gKiAgICBHaXZlbiBhICZzdXBlcl9ibG9jayAoQHNiKSBhbmQgYSBwb2ludGVyIHRvIGEgZmlsZS1zeXN0ZW0gc3BlY2lmaWMgaW5vZGUKLSAqICAgIGlkZW50aWZpZXIsIHBvc3NpYmx5IGFuIGlub2RlIG51bWJlciwgKEBpbnVtcCkgZ2V0X2RlbnRyeSgpIHNob3VsZCBmaW5kCi0gKiAgICB0aGUgaWRlbnRpZmllZCBpbm9kZSBhbmQgcmV0dXJuIGEgZGVudHJ5IGZvciB0aGF0IGlub2RlLiAgQW55IHN1aXRhYmxlCi0gKiAgICBkZW50cnkgY2FuIGJlIHJldHVybmVkIGluY2x1ZGluZywgaWYgbmVjZXNzYXJ5LCBhIG5ldyBkZW50cnkgY3JlYXRlZCB3aXRoCi0gKiAgICBkX2FsbG9jX3Jvb3QuICBUaGUgY2FsbGVyIGNhbiB0aGVuIGZpbmQgYW55IG90aGVyIGV4dGFudCBkZW50cnlzIGJ5Ci0gKiAgICBmb2xsb3dpbmcgdGhlIGRfYWxpYXMgbGlua3MuICBJZiBhIG5ldyBkZW50cnkgd2FzIGNyZWF0ZWQgdXNpbmcKLSAqICAgIGRfYWxsb2Nfcm9vdCwgRENBQ0hFX05GU0RfRElTQ09OTkVDVEVEIHNob3VsZCBiZSBzZXQsIGFuZCB0aGUgZGVudHJ5Ci0gKiAgICBzaG91bGQgYmUgZF9yZWhhc2goKWVkLgotICoKLSAqICAgIElmIHRoZSBpbm9kZSBjYW5ub3QgYmUgZm91bmQsIGVpdGhlciBhICVOVUxMIHBvaW50ZXIgb3IgYW4gJUVSUl9QVFIgY29kZQotICogICAgY2FuIGJlIHJldHVybmVkLiAgVGhlIEBpbnVtcCB3aWxsIGJlIHdoYXRldmVyIHdhcyBwYXNzZWQgdG8KLSAqICAgIG5mc2RfZmluZF9maF9kZW50cnkoKSBpbiBlaXRoZXIgdGhlIEBvYmogb3IgQHBhcmVudCBwYXJhbWV0ZXJzLgotICoKLSAqIExvY2tpbmcgcnVsZXM6Ci0gKiAgICBnZXRfcGFyZW50IGlzIGNhbGxlZCB3aXRoIGNoaWxkLT5kX2lub2RlLT5pX211dGV4IGRvd24KLSAqICAgIGdldF9uYW1lIGlzIG5vdCAod2hpY2ggaXMgcG9zc2libHkgaW5jb25zaXN0ZW50KQotICovCi0KLXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyB7Ci0Jc3RydWN0IGRlbnRyeSAqKCpkZWNvZGVfZmgpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUsCi0JCQkgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAotCQkJIHZvaWQgKmNvbnRleHQpOwotCWludCAoKmVuY29kZV9maCkoc3RydWN0IGRlbnRyeSAqZGUsIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAotCQkJIGludCBjb25uZWN0YWJsZSk7Ci0KLQkvKiB0aGUgZm9sbG93aW5nIGFyZSBvbmx5IGNhbGxlZCBmcm9tIHRoZSBmaWxlc3lzdGVtIGl0c2VsZiAqLwotCWludCAoKmdldF9uYW1lKShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNoYXIgKm5hbWUsCi0JCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7Ci0Jc3RydWN0IGRlbnRyeSAqICgqZ2V0X3BhcmVudCkoc3RydWN0IGRlbnRyeSAqY2hpbGQpOwotCXN0cnVjdCBkZW50cnkgKiAoKmdldF9kZW50cnkpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmludW1wKTsKLQotCS8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBleHBvcnRpbmcgbW9kdWxlIHRvIGEgc3RhbmRhcmQgaGVscGVyICovCi0Jc3RydWN0IGRlbnRyeSAqICgqZmluZF9leHBvcnRlZF9kZW50cnkpKAotCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvYmosIHZvaWQgKnBhcmVudCwKLQkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAotCQl2b2lkICpjb250ZXh0KTsKLQotCi19OwotCi1leHRlcm4gc3RydWN0IGRlbnRyeSAqCi1maW5kX2V4cG9ydGVkX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvYmosIHZvaWQgKnBhcmVudCwKLQkJICAgICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCSAgICAgdm9pZCAqY29udGV4dCk7Ci0KIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHsKIAljb25zdCBjaGFyICpuYW1lOwogCWludCBmc19mbGFnczsKQEAgLTE1MjIsNyArMTQxNSw3IEBACiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKTsKLWV4dGVybiBpbnQgdW5yZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOwogZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZ2V0KGRldl90KTsKIGV4dGVybiB2b2lkIGJkX3NldF9zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgbG9mZl90IHNpemUpOwogZXh0ZXJuIHZvaWQgYmRfZm9yZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpAQCAtMTYxMCw2ICsxNTAzLDkgQEAKIGV4dGVybiBpbnQgaW52YWxpZGF0ZV9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKiwgaW50KTsKICNlbmRpZgogZXh0ZXJuIGludCBpbnZhbGlkYXRlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Cit1bnNpZ25lZCBsb25nIF9faW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCwKKwkJCQkJYm9vbCBiZV9hdG9taWMpOwogdW5zaWduZWQgbG9uZyBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKTsKIApAQCAtMjA0Myw1ICsxOTM5LDkgQEAKIHsgfQogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWSAqLwogCitpbnQgcHJvY19ucl9maWxlcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKKworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmggYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKaW5kZXggNzM3MTBkNi4uNjk1NzQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaApAQCAtMTEyLDcgKzExMiw3IEBACiBzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhIHsKIAl1MzIgCWluaXRpYWxfc3Btb2RlOwkvKiBpbml0aWFsIFNQTU9ERSB2YWx1ZSAqLwogCXUxNglidXNfbnVtOwotCisJYm9vbAlxZV9tb2RlOwogCS8qIGJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uICovCiAJdTE2CW1heF9jaGlwc2VsZWN0OwogCXZvaWQJKCphY3RpdmF0ZV9jcykodTggY3MsIHU4IHBvbGFyaXR5KTsKQEAgLTEyMCw1ICsxMjAsMTAgQEAKIAl1MzIJc3lzY2xrOwogfTsKIAorc3RydWN0IG1wYzh4eF9wY21jaWFfb3BzIHsKKwl2b2lkKCpod19jdHJsKShpbnQgc2xvdCwgaW50IGVuYWJsZSk7CisJaW50KCp2b2x0YWdlX3NldCkoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApOworfTsKKwogI2VuZGlmIC8qIF9GU0xfREVWSUNFX0hfICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXNlLmggYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaAppbmRleCA1MzQ3NDRlLi45ZmJlOWQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtMzM5LDcgKzMzOSw3IEBACiAJY2hhciBuYW1lWzBdOwogfTsKIAotI2RlZmluZSBGVVNFX05BTUVfT0ZGU0VUICgodW5zaWduZWQpICgoc3RydWN0IGZ1c2VfZGlyZW50ICopIDApLT5uYW1lKQorI2RlZmluZSBGVVNFX05BTUVfT0ZGU0VUIG9mZnNldG9mKHN0cnVjdCBmdXNlX2RpcmVudCwgbmFtZSkKICNkZWZpbmUgRlVTRV9ESVJFTlRfQUxJR04oeCkgKCgoeCkgKyBzaXplb2YoX191NjQpIC0gMSkgJiB+KHNpemVvZihfX3U2NCkgLSAxKSkKICNkZWZpbmUgRlVTRV9ESVJFTlRfU0laRShkKSBcCiAJRlVTRV9ESVJFTlRfQUxJR04oRlVTRV9OQU1FX09GRlNFVCArIChkKS0+bmFtZWxlbikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IDBkMmVmMGIuLmJjNjhkZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtMzAsNiArMzAsOSBAQAogICogY2Fubm90IGhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmVzLgogICoKICAqIF9fR0ZQX05PUkVUUlk6IFRoZSBWTSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCByZXRyeSBpbmRlZmluaXRlbHkuCisgKgorICogX19HRlBfTU9WQUJMRTogRmxhZyB0aGF0IHRoaXMgcGFnZSB3aWxsIGJlIG1vdmFibGUgYnkgdGhlIHBhZ2UgbWlncmF0aW9uCisgKiBtZWNoYW5pc20gb3IgcmVjbGFpbWVkCiAgKi8KICNkZWZpbmUgX19HRlBfV0FJVAkoKF9fZm9yY2UgZ2ZwX3QpMHgxMHUpCS8qIENhbiB3YWl0IGFuZCByZXNjaGVkdWxlPyAqLwogI2RlZmluZSBfX0dGUF9ISUdICSgoX19mb3JjZSBnZnBfdCkweDIwdSkJLyogU2hvdWxkIGFjY2VzcyBlbWVyZ2VuY3kgcG9vbHM/ICovCkBAIC00NSw2ICs0OCw3IEBACiAjZGVmaW5lIF9fR0ZQX05PTUVNQUxMT0MgKChfX2ZvcmNlIGdmcF90KTB4MTAwMDB1KSAvKiBEb24ndCB1c2UgZW1lcmdlbmN5IHJlc2VydmVzICovCiAjZGVmaW5lIF9fR0ZQX0hBUkRXQUxMICAgKChfX2ZvcmNlIGdmcF90KTB4MjAwMDB1KSAvKiBFbmZvcmNlIGhhcmR3YWxsIGNwdXNldCBtZW1vcnkgYWxsb2NzICovCiAjZGVmaW5lIF9fR0ZQX1RISVNOT0RFCSgoX19mb3JjZSBnZnBfdCkweDQwMDAwdSkvKiBObyBmYWxsYmFjaywgbm8gcG9saWNpZXMgKi8KKyNkZWZpbmUgX19HRlBfTU9WQUJMRQkoKF9fZm9yY2UgZ2ZwX3QpMHg4MDAwMHUpIC8qIFBhZ2UgaXMgbW92YWJsZSAqLwogCiAjZGVmaW5lIF9fR0ZQX0JJVFNfU0hJRlQgMjAJLyogUm9vbSBmb3IgMjAgX19HRlBfRk9PIGJpdHMgKi8KICNkZWZpbmUgX19HRlBfQklUU19NQVNLICgoX19mb3JjZSBnZnBfdCkoKDEgPDwgX19HRlBfQklUU19TSElGVCkgLSAxKSkKQEAgLTUzLDcgKzU3LDggQEAKICNkZWZpbmUgR0ZQX0xFVkVMX01BU0sgKF9fR0ZQX1dBSVR8X19HRlBfSElHSHxfX0dGUF9JT3xfX0dGUF9GU3wgXAogCQkJX19HRlBfQ09MRHxfX0dGUF9OT1dBUk58X19HRlBfUkVQRUFUfCBcCiAJCQlfX0dGUF9OT0ZBSUx8X19HRlBfTk9SRVRSWXxfX0dGUF9DT01QfCBcCi0JCQlfX0dGUF9OT01FTUFMTE9DfF9fR0ZQX0hBUkRXQUxMfF9fR0ZQX1RISVNOT0RFKQorCQkJX19HRlBfTk9NRU1BTExPQ3xfX0dGUF9IQVJEV0FMTHxfX0dGUF9USElTTk9ERXwgXAorCQkJX19HRlBfTU9WQUJMRSkKIAogLyogVGhpcyBlcXVhbHMgMCwgYnV0IHVzZSBjb25zdGFudHMgaW4gY2FzZSB0aGV5IGV2ZXIgY2hhbmdlICovCiAjZGVmaW5lIEdGUF9OT1dBSVQJKEdGUF9BVE9NSUMgJiB+X19HRlBfSElHSCkKQEAgLTY1LDYgKzcwLDE1IEBACiAjZGVmaW5lIEdGUF9VU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IF9fR0ZQX0hBUkRXQUxMKQogI2RlZmluZSBHRlBfSElHSFVTRVIJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgX19HRlBfSEFSRFdBTEwgfCBcCiAJCQkgX19HRlBfSElHSE1FTSkKKyNkZWZpbmUgR0ZQX0hJR0hVU0VSX01PVkFCTEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX0ZTIHwgXAorCQkJCSBfX0dGUF9IQVJEV0FMTCB8IF9fR0ZQX0hJR0hNRU0gfCBcCisJCQkJIF9fR0ZQX01PVkFCTEUpCisjZGVmaW5lIEdGUF9OT0ZTX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfTU9WQUJMRSkKKyNkZWZpbmUgR0ZQX1VTRVJfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKKwkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9NT1ZBQkxFKQorI2RlZmluZSBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKKwkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAorCQkJCSBfX0dGUF9NT1ZBQkxFKQogCiAjaWZkZWYgQ09ORklHX05VTUEKICNkZWZpbmUgR0ZQX1RISVNOT0RFCShfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCkBAIC05Miw2ICsxMDYsOSBAQAogCWlmIChmbGFncyAmIF9fR0ZQX0RNQTMyKQogCQlyZXR1cm4gWk9ORV9ETUEzMjsKICNlbmRpZgorCWlmICgoZmxhZ3MgJiAoX19HRlBfSElHSE1FTSB8IF9fR0ZQX01PVkFCTEUpKSA9PQorCQkJKF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9NT1ZBQkxFKSkKKwkJcmV0dXJuIFpPTkVfTU9WQUJMRTsKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCWlmIChmbGFncyAmIF9fR0ZQX0hJR0hNRU0pCiAJCXJldHVybiBaT05FX0hJR0hNRU07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaCBiL2luY2x1ZGUvbGludXgvaGlnaG1lbS5oCmluZGV4IDk4ZTJjY2UuLjEyYzVlNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlnaG1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGlnaG1lbS5oCkBAIC03MywxMCArNzMsMjcgQEAKIH0KIAogI2lmbmRlZiBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQorLyoqCisgKiBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlIC0gQWxsb2NhdGUgYSB6ZXJvZWQgSElHSE1FTSBwYWdlIGZvciBhIFZNQSB3aXRoIGNhbGxlci1zcGVjaWZpZWQgbW92YWJsZSBHRlAgZmxhZ3MKKyAqIEBtb3ZhYmxlZmxhZ3M6IFRoZSBHRlAgZmxhZ3MgcmVsYXRlZCB0byB0aGUgcGFnZXMgZnV0dXJlIGFiaWxpdHkgdG8gbW92ZSBsaWtlIF9fR0ZQX01PVkFCTEUKKyAqIEB2bWE6IFRoZSBWTUEgdGhlIHBhZ2UgaXMgdG8gYmUgYWxsb2NhdGVkIGZvcgorICogQHZhZGRyOiBUaGUgdmlydHVhbCBhZGRyZXNzIHRoZSBwYWdlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIHBhZ2UgZm9yIGEgVk1BIGJ1dCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkCisgKiB0byBzcGVjaWZ5IHZpYSBtb3ZhYmxlZmxhZ3Mgd2hldGhlciB0aGUgcGFnZSB3aWxsIGJlIG1vdmFibGUgaW4gdGhlCisgKiBmdXR1cmUgb3Igbm90CisgKgorICogQW4gYXJjaGl0ZWN0dXJlIG1heSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGJ5IGRlZmluaW5nCisgKiBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRSBhbmQgcHJvdmlkaW5nIHRoZWlyIG93bgorICogaW1wbGVtZW50YXRpb24uCisgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgotYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCitfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKGdmcF90IG1vdmFibGVmbGFncywKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJdW5zaWduZWQgbG9uZyB2YWRkcikKIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCB2YWRkcik7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBtb3ZhYmxlZmxhZ3MsCisJCQl2bWEsIHZhZGRyKTsKIAogCWlmIChwYWdlKQogCQljbGVhcl91c2VyX2hpZ2hwYWdlKHBhZ2UsIHZhZGRyKTsKQEAgLTg1LDYgKzEwMiwzNiBAQAogfQogI2VuZGlmCiAKKy8qKgorICogYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UgLSBBbGxvY2F0ZSBhIHplcm9lZCBISUdITUVNIHBhZ2UgZm9yIGEgVk1BCisgKiBAdm1hOiBUaGUgVk1BIHRoZSBwYWdlIGlzIHRvIGJlIGFsbG9jYXRlZCBmb3IKKyAqIEB2YWRkcjogVGhlIHZpcnR1YWwgYWRkcmVzcyB0aGUgcGFnZSB3aWxsIGJlIGluc2VydGVkIGludG8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYSBwYWdlIGZvciBhIFZNQSB0aGF0IHRoZSBjYWxsZXIga25vd3Mgd2lsbAorICogbm90IGJlIGFibGUgdG8gbW92ZSBpbiB0aGUgZnV0dXJlIHVzaW5nIG1vdmVfcGFnZXMoKSBvciByZWNsYWltLiBJZiBpdAorICogaXMga25vd24gdGhhdCB0aGUgcGFnZSBjYW4gbW92ZSwgdXNlIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCithbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwlyZXR1cm4gX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSgwLCB2bWEsIHZhZGRyKTsKK30KKworLyoqCisgKiBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlIC0gQWxsb2NhdGUgYSB6ZXJvZWQgSElHSE1FTSBwYWdlIGZvciBhIFZNQSB0aGF0IHRoZSBjYWxsZXIga25vd3MgY2FuIG1vdmUKKyAqIEB2bWE6IFRoZSBWTUEgdGhlIHBhZ2UgaXMgdG8gYmUgYWxsb2NhdGVkIGZvcgorICogQHZhZGRyOiBUaGUgdmlydHVhbCBhZGRyZXNzIHRoZSBwYWdlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIHBhZ2UgZm9yIGEgVk1BIHRoYXQgdGhlIGNhbGxlciBrbm93cyB3aWxsCisgKiBiZSBhYmxlIHRvIG1pZ3JhdGUgaW4gdGhlIGZ1dHVyZSB1c2luZyBtb3ZlX3BhZ2VzKCkgb3IgcmVjbGFpbWVkCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgorYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwlyZXR1cm4gX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShfX0dGUF9NT1ZBQkxFLCB2bWEsIHZhZGRyKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXZvaWQgKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAppbmRleCAxN2MyOWRjLi41NDA3OTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaApAQCAtMzI5LDEyICszMjksMTMgQEAKICNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKIAogZXh0ZXJuIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKLQkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pOworCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICpjb21tLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHRpbWVyX2ZsYWcpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKIAl0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModGltZXIsIHRpbWVyLT5zdGFydF9waWQsIHRpbWVyLT5zdGFydF9zaXRlLAotCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tKTsKKwkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSwgMCk7CiB9CiAKIGV4dGVybiB2b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCmluZGV4IDJjMTM3MTUuLjQ5YjcwNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCkBAIC0xNSw2ICsxNSw3IEBACiB9CiAKIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworaW50IGh1Z2V0bGJfdHJlYXRfbW92YWJsZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogaW50IGNvcHlfaHVnZXRsYl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiBpbnQgZm9sbG93X2h1Z2V0bGJfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCBzdHJ1Y3QgcGFnZSAqKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqLCB1bnNpZ25lZCBsb25nICosIGludCAqLCBpbnQpOwogdm9pZCB1bm1hcF9odWdlcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CkBAIC0yOSw2ICszMCw3IEBACiB2b2lkIGh1Z2V0bGJfdW5yZXNlcnZlX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgb2Zmc2V0LCBsb25nIGZyZWVkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X2h1Z2VfcGFnZXM7CitleHRlcm4gdW5zaWduZWQgbG9uZyBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGh1Z2V0bGJfemVybywgaHVnZXRsYl9pbmZpbml0eTsKIGV4dGVybiBpbnQgc3lzY3RsX2h1Z2V0bGJfc2htX2dyb3VwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyby5oIGIvaW5jbHVkZS9saW51eC9pMm8uaAppbmRleCA1MmY1M2UyLi4zMzNhMzcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyby5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJvLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CS8qIHdvcmtfc3RydWN0ICovCiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CS8qIE5lZWRlZCBmb3IgTVVURVggaW5pdCBtYWNyb3MgKi8KQEAgLTQyNSw3ICs0MjYsNyBAQAogCiAJc3RydWN0IGRldmljZSBkZXZpY2U7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CS8qIGRldmljZSBsb2NrICovCisJc3RydWN0IG11dGV4IGxvY2s7CS8qIGRldmljZSBsb2NrICovCiB9OwogCiAvKgpAQCAtNTQ0LDcgKzU0NSw3IEBACiAJc3RydWN0IGkyb19kbWEgaHJ0OwkvKiBIVyBSZXNvdXJjZSBUYWJsZSAqLwogCWkyb19sY3QgKmxjdDsJCS8qIExvZ2ljYWwgQ29uZmlnIFRhYmxlICovCiAJc3RydWN0IGkyb19kbWEgZGxjdDsJLyogVGVtcCBMQ1QgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIGxjdF9sb2NrOwkvKiBMb2NrIGZvciBMQ1QgdXBkYXRlcyAqLworCXN0cnVjdCBtdXRleCBsY3RfbG9jazsJLyogTG9jayBmb3IgTENUIHVwZGF0ZXMgKi8KIAlzdHJ1Y3QgaTJvX2RtYSBzdGF0dXNfYmxvY2s7CS8qIElPUCBzdGF0dXMgYmxvY2sgKi8KIAogCXN0cnVjdCBpMm9faW8gYmFzZTsJLyogY29udHJvbGxlciBtZXNzYWdpbmcgdW5pdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZHIuaCBiL2luY2x1ZGUvbGludXgvaWRyLmgKaW5kZXggOTE1NTcyZi4uMGVkZGE0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkci5oCkBAIC03OCw4ICs3OCwxMSBAQAogaW50IGlkcl9wcmVfZ2V0KHN0cnVjdCBpZHIgKmlkcCwgZ2ZwX3QgZ2ZwX21hc2spOwogaW50IGlkcl9nZXRfbmV3KHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgKmlkKTsKIGludCBpZHJfZ2V0X25ld19hYm92ZShzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50IHN0YXJ0aW5nX2lkLCBpbnQgKmlkKTsKK2ludCBpZHJfZm9yX2VhY2goc3RydWN0IGlkciAqaWRwLAorCQkgaW50ICgqZm4pKGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOwogdm9pZCAqaWRyX3JlcGxhY2Uoc3RydWN0IGlkciAqaWRwLCB2b2lkICpwdHIsIGludCBpZCk7CiB2b2lkIGlkcl9yZW1vdmUoc3RydWN0IGlkciAqaWRwLCBpbnQgaWQpOwordm9pZCBpZHJfcmVtb3ZlX2FsbChzdHJ1Y3QgaWRyICppZHApOwogdm9pZCBpZHJfZGVzdHJveShzdHJ1Y3QgaWRyICppZHApOwogdm9pZCBpZHJfaW5pdChzdHJ1Y3QgaWRyICppZHApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXQuaCBiL2luY2x1ZGUvbGludXgvaW5pdC5oCmluZGV4IDU2ZWM0YzYuLjViNTI4NTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdC5oCkBAIC0xNzEsOSArMTcxLDYgQEAKICNkZWZpbmUgX19zZXR1cChzdHIsIGZuKQkJCQkJXAogCV9fc2V0dXBfcGFyYW0oc3RyLCBmbiwgZm4sIDApCiAKLSNkZWZpbmUgX19vYnNvbGV0ZV9zZXR1cChzdHIpCQkJCQlcCi0JX19zZXR1cF9udWxsX3BhcmFtKHN0ciwgX19MSU5FX18pCi0KIC8qIE5PVEU6IGZuIGlzIGFzIHBlciBtb2R1bGVfcGFyYW0sIG5vdCBfX3NldHVwISAgRW1pdHMgd2FybmluZyBpZiBmbgogICogcmV0dXJucyBub24temVyby4gKi8KICNkZWZpbmUgZWFybHlfcGFyYW0oc3RyLCBmbikJCQkJCVwKQEAgLTIzOSw3ICsyMzYsNiBAQAogI2RlZmluZSBfX3NldHVwX3BhcmFtKHN0ciwgdW5pcXVlX2lkLCBmbikJLyogbm90aGluZyAqLwogI2RlZmluZSBfX3NldHVwX251bGxfcGFyYW0oc3RyLCB1bmlxdWVfaWQpIAkvKiBub3RoaW5nICovCiAjZGVmaW5lIF9fc2V0dXAoc3RyLCBmdW5jKSAJCQkvKiBub3RoaW5nICovCi0jZGVmaW5lIF9fb2Jzb2xldGVfc2V0dXAoc3RyKSAJCQkvKiBub3RoaW5nICovCiAjZW5kaWYKIAogLyogRGF0YSBtYXJrZWQgbm90IHRvIGJlIHNhdmVkIGJ5IHNvZnR3YXJlIHN1c3BlbmQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IDI3NmNjYWEuLmNhYjc0MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvaXBjLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CiAKICNkZWZpbmUgSU5JVF9GRFRBQkxFIFwKIHsJCQkJCQkJXApAQCAtNzgsNiArNzksNyBAQAogCS51dHNfbnMJCT0gJmluaXRfdXRzX25zLAkJCQkJXAogCS5tbnRfbnMJCT0gTlVMTCwJCQkJCQlcCiAJSU5JVF9JUENfTlMoaXBjX25zKQkJCQkJCVwKKwkudXNlcl9ucwk9ICZpbml0X3VzZXJfbnMsCQkJCVwKIH0KIAogI2RlZmluZSBJTklUX1NJR0hBTkQoc2lnaGFuZCkgewkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8uaCBiL2luY2x1ZGUvbGludXgvaW8uaAppbmRleCA4NDIzZGQzLi5lM2IyZGRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby5oCkBAIC02MywzMiArNjMsNyBAQAogdm9pZCBfX2lvbWVtICogZGV2bV9pb3JlbWFwX25vY2FjaGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKIHZvaWQgZGV2bV9pb3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICphZGRyKTsKLQotLyoqCi0gKgljaGVja19zaWduYXR1cmUJCS0JZmluZCBCSU9TIHNpZ25hdHVyZXMKLSAqCUBpb19hZGRyOiBtbWlvIGFkZHJlc3MgdG8gY2hlY2sKLSAqCUBzaWduYXR1cmU6ICBzaWduYXR1cmUgYmxvY2sKLSAqCUBsZW5ndGg6IGxlbmd0aCBvZiBzaWduYXR1cmUKLSAqCi0gKglQZXJmb3JtIGEgc2lnbmF0dXJlIGNvbXBhcmlzb24gd2l0aCB0aGUgbW1pbyBhZGRyZXNzIGlvX2FkZHIuIFRoaXMKLSAqCWFkZHJlc3Mgc2hvdWxkIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBpb3JlbWFwLgotICoJUmV0dXJucyAxIG9uIGEgbWF0Y2guCi0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2lnbmF0dXJlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkciwKLQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0JZG8gewotCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKLQkJCWdvdG8gb3V0OwotCQlpb19hZGRyKys7Ci0JCXNpZ25hdHVyZSsrOwotCQlsZW5ndGgtLTsKLQl9IHdoaWxlIChsZW5ndGgpOwotCXJldHZhbCA9IDE7Ci1vdXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KK2ludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKTsKIAogI2VuZGlmIC8qIF9MSU5VWF9JT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwYy5oIGIvaW5jbHVkZS9saW51eC9pcGMuaAppbmRleCAxOTgwODY3Li4zZmQzZGRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBjLmgKQEAgLTUyLDYgKzUyLDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2RlZmluZSBJUENNTkkgMzI3NjggIC8qIDw9IE1BWF9JTlQgbGltaXQgZm9yIGlwYyBhcnJheXMgKGluY2x1ZGluZyBzeXNjdGwgY2hhbmdlcykgKi8KIApAQCAtOTIsNiArOTMsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NZU1ZJUEMKICNkZWZpbmUgSU5JVF9JUENfTlMobnMpCQkubnMJCT0gJmluaXRfaXBjX25zLAorZXh0ZXJuIHZvaWQgZnJlZV9pcGNfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwogZXh0ZXJuIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQkJCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpucyk7CiAjZWxzZQpAQCAtMTAzLDEzICsxMDUsOSBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCi1leHRlcm4gdm9pZCBmcmVlX2lwY19ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqZ2V0X2lwY19ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7Ci0jaWZkZWYgQ09ORklHX0lQQ19OUworI2lmZGVmIENPTkZJR19TWVNWSVBDCiAJaWYgKG5zKQogCQlrcmVmX2dldCgmbnMtPmtyZWYpOwogI2VuZGlmCkBAIC0xMTgsNyArMTE2LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewotI2lmZGVmIENPTkZJR19JUENfTlMKKyNpZmRlZiBDT05GSUdfU1lTVklQQwogCWtyZWZfcHV0KCZucy0+a3JlZiwgZnJlZV9pcGNfbnMpOwogI2VuZGlmCiB9CkBAIC0xMjYsNSArMTI0LDMgQEAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfTElOVVhfSVBDX0ggKi8KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCAxNjk1MDU0Li40NDY1NzE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTE2MSw2ICsxNjEsNyBAQAogCXVuc2lnbmVkIGludAkJd2FrZV9kZXB0aDsJLyogbmVzdGVkIHdha2UgZW5hYmxlcyAqLwogCXVuc2lnbmVkIGludAkJaXJxX2NvdW50OwkvKiBGb3IgZGV0ZWN0aW5nIGJyb2tlbiBJUlFzICovCiAJdW5zaWduZWQgaW50CQlpcnFzX3VuaGFuZGxlZDsKKwl1bnNpZ25lZCBsb25nCQlsYXN0X3VuaGFuZGxlZDsJLyogQWdpbmcgdGltZXIgZm9yIHVuaGFuZGxlZCBjb3VudCAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CiAjaWZkZWYgQ09ORklHX1NNUAogCWNwdW1hc2tfdAkJYWZmaW5pdHk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmggYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKaW5kZXggNWYwNjUyNy4uZjczZGU2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCisrKyBiL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaApAQCAtNyw5ICs3LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKLSNkZWZpbmUgS1NZTV9OQU1FX0xFTiAxMjcKLSNkZWZpbmUgS1NZTV9TWU1CT0xfTEVOIChzaXplb2YoIiVzKyUjbHgvJSNseCBbJXNdIikgKyBLU1lNX05BTUVfTEVOICsJXAotCQkJIDIqKEJJVFNfUEVSX0xPTkcqMy8xMCkgKyBNT0RVTEVfTkFNRV9MRU4gKyAxKQorI2RlZmluZSBLU1lNX05BTUVfTEVOIDEyOAorI2RlZmluZSBLU1lNX1NZTUJPTF9MRU4gKHNpemVvZigiJXMrJSNseC8lI2x4IFslc10iKSArIChLU1lNX05BTUVfTEVOIC0gMSkgKyBcCisJCQkgMiooQklUU19QRVJfTE9ORyozLzEwKSArIChNT0RVTEVfTkFNRV9MRU4gLSAxKSArIDEpCiAKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIC8qIExvb2t1cCB0aGUgYWRkcmVzcyBmb3IgYSBzeW1ib2wuIFJldHVybnMgMCBpZiBub3QgZm91bmQuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCA3YTQ4NTI1Li4xZWI5Y2RlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTIxMCw2ICsyMTAsNyBAQAogI2RlZmluZSBUQUlOVF9NQUNISU5FX0NIRUNLCQkoMTw8NCkKICNkZWZpbmUgVEFJTlRfQkFEX1BBR0UJCQkoMTw8NSkKICNkZWZpbmUgVEFJTlRfVVNFUgkJCSgxPDw2KQorI2RlZmluZSBUQUlOVF9ESUUJCQkoMTw8NykKIAogZXh0ZXJuIHZvaWQgZHVtcF9zdGFjayh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaAppbmRleCBhZWEzNGU3NC4uOGM0MzUwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKQEAgLTY0LDcgKzY0LDcgQEAKIAl1bnNpZ25lZCBsb25nIG5yZWN2ZGF0YXBrdDsKIAl1bnNpZ25lZCBsb25nIG5zZW50Y3RscGt0OwogCXVuc2lnbmVkIGxvbmcgbnNlbnRkYXRhcGt0OwotCXN0cnVjdCBzZW1hcGhvcmUgcmVjdl9zZW07CisJc3RydWN0IG11dGV4IHJlY3ZfbXR4OwogCXN0cnVjdCBza19idWZmX2hlYWQgcmVjdl9xdWV1ZTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjdl93b3JrOwogCWludCByZWxlYXNlX2luX3Byb2dyZXNzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZWRzLmggYi9pbmNsdWRlL2xpbnV4L2xlZHMuaAppbmRleCA4OGFmY2VmLi40OTRiZWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xlZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xlZHMuaApAQCAtMTMsNyArMTMsNiBAQAogI2RlZmluZSBfX0xJTlVYX0xFRFNfSF9JTkNMVURFRAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0cnVjdCBkZXZpY2U7CiBzdHJ1Y3QgY2xhc3NfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saW1pdHMuaCBiL2luY2x1ZGUvbGludXgvbGltaXRzLmgKaW5kZXggZWFmMmUwOS4uMmQwZjk0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saW1pdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCkBAIC01LDggKzUsNiBAQAogCiAjZGVmaW5lIE5HUk9VUFNfTUFYICAgIDY1NTM2CS8qIHN1cHBsZW1lbnRhbCBncm91cCBJRHMgYXJlIGF2YWlsYWJsZSAqLwogI2RlZmluZSBBUkdfTUFYICAgICAgIDEzMTA3MgkvKiAjIGJ5dGVzIG9mIGFyZ3MgKyBlbnZpcm9uIGZvciBleGVjKCkgKi8KLSNkZWZpbmUgQ0hJTERfTUFYICAgICAgICA5OTkgICAgLyogbm8gbGltaXQgOi0pICovCi0jZGVmaW5lIE9QRU5fTUFYICAgICAgICAgMjU2CS8qICMgb3BlbiBmaWxlcyBhIHByb2Nlc3MgbWF5IGhhdmUgKi8KICNkZWZpbmUgTElOS19NQVggICAgICAgICAxMjcJLyogIyBsaW5rcyBhIGZpbGUgbWF5IGhhdmUgKi8KICNkZWZpbmUgTUFYX0NBTk9OICAgICAgICAyNTUJLyogc2l6ZSBvZiB0aGUgY2Fub25pY2FsIGlucHV0IHF1ZXVlICovCiAjZGVmaW5lIE1BWF9JTlBVVCAgICAgICAgMjU1CS8qIHNpemUgb2YgdGhlIHR5cGUtYWhlYWQgYnVmZmVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaCBiL2luY2x1ZGUvbGludXgvbGludXhfbG9nby5oCmluZGV4IDljMDFiZGUuLjA4YTkyOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGludXhfbG9nby5oCisrKyBiL2luY2x1ZGUvbGludXgvbGludXhfbG9nby5oCkBAIC0zMyw1ICszMywxMyBAQAogfTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpmYl9maW5kX2xvZ28oaW50IGRlcHRoKTsKKyNpZmRlZiBDT05GSUdfRkJfTE9HT19FWFRSQQorZXh0ZXJuIHZvaWQgZmJfYXBwZW5kX2V4dHJhX2xvZ28oY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmxvZ28sCisJCQkJIHVuc2lnbmVkIGludCBuKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfYXBwZW5kX2V4dHJhX2xvZ28oY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmxvZ28sCisJCQkJCXVuc2lnbmVkIGludCBuKQore30KKyNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX0xJTlVYX0xPR09fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAppbmRleCAyNDZkZTFkLi42ZjE2MzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaApAQCAtMjcsNiArMjcsNyBAQAogCQkJCQkJc3RydWN0IG5mc19maCAqLAogCQkJCQkJc3RydWN0IGZpbGUgKiopOwogCXZvaWQJCQkoKmZjbG9zZSkoc3RydWN0IGZpbGUgKik7CisJdW5zaWduZWQgbG9uZwkJKCpnZXRfZ3JhY2VfcGVyaW9kKSh2b2lkKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgbmxtc3ZjX2JpbmRpbmcgKglubG1zdmNfb3BzOwpAQCAtMzgsNCArMzksMTIgQEAKIGV4dGVybiBpbnQJbG9ja2RfdXAoaW50IHByb3RvKTsKIGV4dGVybiB2b2lkCWxvY2tkX2Rvd24odm9pZCk7CiAKK3Vuc2lnbmVkIGxvbmcgZ2V0X25mc19ncmFjZV9wZXJpb2Qodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfTkZTRF9WNAordW5zaWduZWQgbG9uZyBnZXRfbmZzNF9ncmFjZV9wZXJpb2Qodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9uZnM0X2dyYWNlX3BlcmlvZCh2b2lkKSB7cmV0dXJuIDA7fQorI2VuZGlmCisKICNlbmRpZiAvKiBMSU5VWF9MT0NLRF9CSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbHpvLmggYi9pbmNsdWRlL2xpbnV4L2x6by5oCmluZGV4IDU4MmQ4YjcuLmQ3OTM0OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbHpvLmgKKysrIGIvaW5jbHVkZS9saW51eC9sem8uaApAQCAtMTcsNyArMTcsNyBAQAogI2RlZmluZSBMWk8xWF9NRU1fQ09NUFJFU1MJKDE2Mzg0ICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIgKikpCiAjZGVmaW5lIExaTzFYXzFfTUVNX0NPTVBSRVNTCUxaTzFYX01FTV9DT01QUkVTUwogCi0jZGVmaW5lIGx6bzF4X3dvcnN0X2NvbXByZXNzKHgpICh4ICsgKHggLyA2NCkgKyAxNiArIDMpCisjZGVmaW5lIGx6bzF4X3dvcnN0X2NvbXByZXNzKHgpICgoeCkgKyAoKHgpIC8gMTYpICsgNjQgKyAzKQogCiAvKiBUaGlzIHJlcXVpcmVzICd3b3JrbWVtJyBvZiBzaXplIExaTzFYXzFfTUVNX0NPTVBSRVNTICovCiBpbnQgbHpvMXhfMV9jb21wcmVzcyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCBzcmNfbGVuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaCBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKaW5kZXggZGFhYmIzYS4uZTE0N2NmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCkBAIC0xNTksNyArMTU5LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBtZW1wb2xpY3kgZGVmYXVsdF9wb2xpY3k7CiBleHRlcm4gc3RydWN0IHpvbmVsaXN0ICpodWdlX3pvbmVsaXN0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQl1bnNpZ25lZCBsb25nIGFkZHIpOworCQl1bnNpZ25lZCBsb25nIGFkZHIsIGdmcF90IGdmcF9mbGFncyk7CiBleHRlcm4gdW5zaWduZWQgc2xhYl9ub2RlKHN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeSk7CiAKIGV4dGVybiBlbnVtIHpvbmVfdHlwZSBwb2xpY3lfem9uZTsKQEAgLTI1Niw5ICsyNTYsOSBAQAogI2RlZmluZSBzZXRfY3B1c2V0X2JlaW5nX3JlYm91bmQoeCkgZG8ge30gd2hpbGUgKDApCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHpvbmVsaXN0ICpodWdlX3pvbmVsaXN0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQl1bnNpZ25lZCBsb25nIGFkZHIpCisJCXVuc2lnbmVkIGxvbmcgYWRkciwgZ2ZwX3QgZ2ZwX2ZsYWdzKQogewotCXJldHVybiBOT0RFX0RBVEEoMCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoR0ZQX0hJR0hVU0VSKTsKKwlyZXR1cm4gTk9ERV9EQVRBKDApLT5ub2RlX3pvbmVsaXN0cyArIGdmcF96b25lKGdmcF9mbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRvX21pZ3JhdGVfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggMWMxMjA3NC4uYTVjNDUxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMiw3ICsyLDYgQEAKICNkZWZpbmUgX0xJTlVYX01NX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC0yNyw3ICsyNiw2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG51bV9waHlzcGFnZXM7CiBleHRlcm4gdm9pZCAqIGhpZ2hfbWVtb3J5OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1hbGxvY19lYXJseXJlc2VydmU7CiBleHRlcm4gaW50IHBhZ2VfY2x1c3RlcjsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKQEAgLTYwMSw2ICs1OTksNyBAQAogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKIAorCVZNX0JVR19PTihQYWdlU2xhYihwYWdlKSk7CiAJaWYgKHVubGlrZWx5KFBhZ2VTd2FwQ2FjaGUocGFnZSkpKQogCQltYXBwaW5nID0gJnN3YXBwZXJfc3BhY2U7CiAjaWZkZWYgQ09ORklHX1NMVUIKQEAgLTgxMiwyNyArODExLDMxIEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcik7CiAKIC8qCi0gKiBQcm90b3R5cGUgdG8gYWRkIGEgc2hyaW5rZXIgY2FsbGJhY2sgZm9yIGFnZWFibGUgY2FjaGVzLgotICogCi0gKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHBhc3NlZCBhIGNvdW50IGBucl90b19zY2FuJyBhbmQgYSBnZnBtYXNrLiAgVGhleSBzaG91bGQKLSAqIHNjYW4gYG5yX3RvX3NjYW4nIG9iamVjdHMsIGF0dGVtcHRpbmcgdG8gZnJlZSB0aGVtLgorICogQSBjYWxsYmFjayB5b3UgY2FuIHJlZ2lzdGVyIHRvIGFwcGx5IHByZXNzdXJlIHRvIGFnZWFibGUgY2FjaGVzLgogICoKLSAqIFRoZSBjYWxsYmFjayBtdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgd2hpY2ggcmVtYWluIGluIHRoZSBjYWNoZS4KKyAqICdzaHJpbmsnIGlzIHBhc3NlZCBhIGNvdW50ICducl90b19zY2FuJyBhbmQgYSAnZ2ZwbWFzaycuICBJdCBzaG91bGQKKyAqIGxvb2sgdGhyb3VnaCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCAnbnJfdG9fc2NhbicgZW50cmllcyBhbmQKKyAqIGF0dGVtcHQgdG8gZnJlZSB0aGVtIHVwLiAgSXQgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdHMKKyAqIHdoaWNoIHJlbWFpbiBpbiB0aGUgY2FjaGUuICBJZiBpdCByZXR1cm5zIC0xLCBpdCBtZWFucyBpdCBjYW5ub3QgZG8KKyAqIGFueSBzY2FubmluZyBhdCB0aGlzIHRpbWUgKGVnLiB0aGVyZSBpcyBhIHJpc2sgb2YgZGVhZGxvY2spLgogICoKLSAqIFRoZSBjYWxsYmFjayB3aWxsIGJlIHBhc3NlZCBucl90b19zY2FuID09IDAgd2hlbiB0aGUgVk0gaXMgcXVlcnlpbmcgdGhlCi0gKiBjYWNoZSBzaXplLCBzbyBhIGZhc3RwYXRoIGZvciB0aGF0IGNhc2UgaXMgYXBwcm9wcmlhdGUuCisgKiBUaGUgJ2dmcG1hc2snIHJlZmVycyB0byB0aGUgYWxsb2NhdGlvbiB3ZSBhcmUgY3VycmVudGx5IHRyeWluZyB0bworICogZnVsZmlsLgorICoKKyAqIE5vdGUgdGhhdCAnc2hyaW5rJyB3aWxsIGJlIHBhc3NlZCBucl90b19zY2FuID09IDAgd2hlbiB0aGUgVk0gaXMKKyAqIHF1ZXJ5aW5nIHRoZSBjYWNoZSBzaXplLCBzbyBhIGZhc3RwYXRoIGZvciB0aGF0IGNhc2UgaXMgYXBwcm9wcmlhdGUuCiAgKi8KLXR5cGVkZWYgaW50ICgqc2hyaW5rZXJfdCkoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKTsKK3N0cnVjdCBzaHJpbmtlciB7CisJaW50ICgqc2hyaW5rKShpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spOworCWludCBzZWVrczsJLyogc2Vla3MgdG8gcmVjcmVhdGUgYW4gb2JqICovCiAKLS8qCi0gKiBBZGQgYW4gYWdpbmcgY2FsbGJhY2suICBUaGUgaW50IGlzIHRoZSBudW1iZXIgb2YgJ3NlZWtzJyBpdCB0YWtlcwotICogdG8gcmVjcmVhdGUgb25lIG9mIHRoZSBvYmplY3RzIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGFnZS4KLSAqLwotCi0jZGVmaW5lIERFRkFVTFRfU0VFS1MgMgotc3RydWN0IHNocmlua2VyOwotZXh0ZXJuIHN0cnVjdCBzaHJpbmtlciAqc2V0X3Nocmlua2VyKGludCwgc2hyaW5rZXJfdCk7Ci1leHRlcm4gdm9pZCByZW1vdmVfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICpzaHJpbmtlcik7CisJLyogVGhlc2UgYXJlIGZvciBpbnRlcm5hbCB1c2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJbG9uZyBucjsJLyogb2JqcyBwZW5kaW5nIGRlbGV0ZSAqLworfTsKKyNkZWZpbmUgREVGQVVMVF9TRUVLUyAyIC8qIEEgZ29vZCBudW1iZXIgaWYgeW91IGRvbid0IGtub3cgYmV0dGVyLiAqLworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICopOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKik7CiAKIC8qCiAgKiBTb21lIHNoYXJlZCBtYXBwaWducyB3aWxsIHdhbnQgdGhlIHBhZ2VzIG1hcmtlZCByZWFkLW9ubHkKQEAgLTEwNzIsNiArMTA3NSwxMCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZG9fbW1hcF9wZ29mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCiAJdW5zaWduZWQgbG9uZyBmbGFnLCB1bnNpZ25lZCBsb25nIHBnb2ZmKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1tYXBfcmVnaW9uKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJdW5zaWduZWQgaW50IHZtX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCWludCBhY2NvdW50YWJsZSk7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IGQwOWIxMzQuLmRhOGViOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMjQsNiArMjQsMTQgQEAKICNlbmRpZgogI2RlZmluZSBNQVhfT1JERVJfTlJfUEFHRVMgKDEgPDwgKE1BWF9PUkRFUiAtIDEpKQogCisvKgorICogUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgaXMgdGhlIG9yZGVyIGF0IHdoaWNoIGFsbG9jYXRpb25zIGFyZSBkZWVtZWQKKyAqIGNvc3RseSB0byBzZXJ2aWNlLiAgVGhhdCBpcyBiZXR3ZWVuIGFsbG9jYXRpb24gb3JkZXJzIHdoaWNoIHNob3VsZAorICogY29lbGVzY2UgbmF0dXJhbGx5IHVuZGVyIHJlYXNvbmFibGUgcmVjbGFpbSBwcmVzc3VyZSBhbmQgdGhvc2Ugd2hpY2gKKyAqIHdpbGwgbm90LgorICovCisjZGVmaW5lIFBBR0VfQUxMT0NfQ09TVExZX09SREVSIDMKKwogc3RydWN0IGZyZWVfYXJlYSB7CiAJc3RydWN0IGxpc3RfaGVhZAlmcmVlX2xpc3Q7CiAJdW5zaWduZWQgbG9uZwkJbnJfZnJlZTsKQEAgLTE0Niw2ICsxNTQsNyBAQAogCSAqLwogCVpPTkVfSElHSE1FTSwKICNlbmRpZgorCVpPTkVfTU9WQUJMRSwKIAlNQVhfTlJfWk9ORVMKIH07CiAKQEAgLTE2Nyw2ICsxNzYsNyBAQAogCSsgZGVmaW5lZChDT05GSUdfWk9ORV9ETUEzMikJXAogCSsgMQkJCQlcCiAJKyBkZWZpbmVkKENPTkZJR19ISUdITUVNKQlcCisJKyAxCQkJCVwKICkKICNpZiBfX1pPTkVfQ09VTlQgPCAyCiAjZGVmaW5lIFpPTkVTX1NISUZUIDAKQEAgLTQ5OSwxMCArNTA5LDIyIEBACiAJcmV0dXJuICghIXpvbmUtPnByZXNlbnRfcGFnZXMpOwogfQogCitleHRlcm4gaW50IG1vdmFibGVfem9uZTsKKworc3RhdGljIGlubGluZSBpbnQgem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0odm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNKSAmJiBkZWZpbmVkKENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCkKKwlyZXR1cm4gbW92YWJsZV96b25lID09IFpPTkVfSElHSE1FTTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKwogc3RhdGljIGlubGluZSBpbnQgaXNfaGlnaG1lbV9pZHgoZW51bSB6b25lX3R5cGUgaWR4KQogewogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JcmV0dXJuIChpZHggPT0gWk9ORV9ISUdITUVNKTsKKwlyZXR1cm4gKGlkeCA9PSBaT05FX0hJR0hNRU0gfHwKKwkJKGlkeCA9PSBaT05FX01PVkFCTEUgJiYgem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0oKSkpOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgpAQCAtNTIyLDcgKzU0NCw5IEBACiBzdGF0aWMgaW5saW5lIGludCBpc19oaWdobWVtKHN0cnVjdCB6b25lICp6b25lKQogewogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JcmV0dXJuIHpvbmUgPT0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfSElHSE1FTTsKKwlpbnQgem9uZV9pZHggPSB6b25lIC0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV96b25lczsKKwlyZXR1cm4gem9uZV9pZHggPT0gWk9ORV9ISUdITUVNIHx8CisJCSh6b25lX2lkeCA9PSBaT05FX01PVkFCTEUgJiYgem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0oKSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC01NjYsNiArNTkwLDExIEBACiBpbnQgc3lzY3RsX21pbl9zbGFiX3JhdGlvX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAogCQkJc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAorZXh0ZXJuIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCisJCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworZXh0ZXJuIGNoYXIgbnVtYV96b25lbGlzdF9vcmRlcltdOworI2RlZmluZSBOVU1BX1pPTkVMSVNUX09SREVSX0xFTiAxNgkvKiBzdHJpbmcgYnVmZmVyIHNpemUgKi8KKwogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgTm9kZS4gKi8KICNpZm5kZWYgbnVtYV9ub2RlX2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCmluZGV4IDFmYTRkOTguLjhlZWQ0NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCkBAIC0xNCw3ICsxNCw3IEBACiAJaW50IGV2ZW50OwogfTsKIAotZXh0ZXJuIHN0cnVjdCBtbnRfbmFtZXNwYWNlICpjb3B5X21udF9ucyhpbnQsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICosCitleHRlcm4gc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICosCiAJCXN0cnVjdCBmc19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBfX3B1dF9tbnRfbnMoc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggZTZlMGY4Ni4uYjZhNjQ2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC02LDcgKzYsNiBAQAogICogUmV3cml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+IERlYyAxOTk2CiAgKiBSZXdyaXR0ZW4gYWdhaW4gYnkgUnVzdHkgUnVzc2VsbCwgMjAwMgogICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmggYi9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKaW5kZXggMGUwOWMwMC4uZjk1MDkyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaApAQCAtMTQ2LDcgKzE0Niw3IEBACiB9OwogCiBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5IHsKLQlfX3U4CW5hbWVbOF0sZXh0WzNdOwkvKiBuYW1lIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CW5hbWVbTVNET1NfTkFNRV07LyogbmFtZSBhbmQgZXh0ZW5zaW9uICovCiAJX191OAlhdHRyOwkJLyogYXR0cmlidXRlIGJpdHMgKi8KIAlfX3U4ICAgIGxjYXNlOwkJLyogQ2FzZSBmb3IgYmFzZSBhbmQgZXh0ZW5zaW9uICovCiAJX191OAljdGltZV9jczsJLyogQ3JlYXRpb24gdGltZSwgY2VudGlzZWNvbmRzICgwLTE5OSkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCmluZGV4IDgzZTM5ZWIuLjg4NzY2ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uY3BfZnMuaApAQCAtMTQ4LDggKzE0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvbmNwX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9uY3BfZnNfc2IuaD4KIAotLyogdW5kZWYgYmVjYXVzZSBwdWJsaWMgZGVmaW5lIGluIHVtc2Rvc19mcy5oIChuY3BfZnMuaCBpc24ndCBwdWJsaWMpICovCi0jdW5kZWYgUFJJTlRLCiAvKiBkZWZpbmUgYmVjYXVzZSBpdCBpcyBlYXN5IHRvIGNoYW5nZSBQUklOVEsgdG8geyp9UFJJTlRLICovCiAjZGVmaW5lIFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IDMyMmI1ZWEuLmRhN2ExM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMjYyLDggKzI2Miw2IEBACiAJX19MSU5LX1NUQVRFX0xJTktXQVRDSF9QRU5ESU5HLAogCV9fTElOS19TVEFURV9ET1JNQU5ULAogCV9fTElOS19TVEFURV9RRElTQ19SVU5OSU5HLAotCS8qIFNldCBieSB0aGUgbmV0cG9sbCBOQVBJIGNvZGUgKi8KLQlfX0xJTktfU1RBVEVfUE9MTF9MSVNUX0ZST1pFTiwKIH07CiAKIApAQCAtMTAyMiwxNCArMTAyMCw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotI2lmZGVmIENPTkZJR19ORVRQT0xMCi0JLyogUHJldmVudCByYWNlIHdpdGggbmV0cG9sbCAtIHllcywgdGhpcyBpcyBhIGtsdWRnZS4KLQkgKiBCdXQgYXQgbGVhc3QgaXQgZG9lc24ndCBwZW5hbGl6ZSB0aGUgbm9uLW5ldHBvbGwKLQkgKiBjb2RlIHBhdGguICovCi0JaWYgKHRlc3RfYml0KF9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLCAmZGV2LT5zdGF0ZSkpCi0JCXJldHVybjsKLSNlbmRpZgotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmggYi9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKaW5kZXggOWY2MmQ2MS4uNzhmZWI3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaApAQCAtNDIsNiArNDIsOSBAQAogI2RlZmluZQlORlNFWFBfTk9BQ0wJCTB4ODAwMAkvKiByZXNlcnZlZCBmb3IgcG9zc2libGUgQUNMIHJlbGF0ZWQgdXNlICovCiAjZGVmaW5lIE5GU0VYUF9BTExGTEFHUwkJMHhGRTNGCiAKKy8qIFRoZSBmbGFncyB0aGF0IG1heSB2YXJ5IGRlcGVuZGluZyBvbiBzZWN1cml0eSBmbGF2b3I6ICovCisjZGVmaW5lIE5GU0VYUF9TRUNJTkZPX0ZMQUdTCShORlNFWFBfUkVBRE9OTFkgfCBORlNFWFBfUk9PVFNRVUFTSCBcCisJCQkJCXwgTkZTRVhQX0FMTFNRVUFTSCkKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtNjQsNiArNjcsMTkgQEAKIAlpbnQgbWlncmF0ZWQ7CiB9OwogCisvKgorICogV2Uga2VlcCBhbiBhcnJheSBvZiBwc2V1ZG9mbGF2b3JzIHdpdGggdGhlIGV4cG9ydCwgaW4gb3JkZXIgZnJvbSBtb3N0CisgKiB0byBsZWFzdCBwcmVmZXJyZWQuICBGb3IgdGhlIGZvcnNlZWFibGUgZnV0dXJlLCB3ZSBkb24ndCBleHBlY3QgbW9yZQorICogdGhhbiB0aGUgZWlnaHQgcHNldWRvZmxhdm9ycyBudWxsLCB1bml4LCBrcmI1LCBrcmI1aSwga3JiNXAsIHNrcG0zLAorICogc3BrbTNpLCBhbmQgc3BrbTNwIChhbmQgdXNpbmcgYWxsIDggYXQgb25jZSBzaG91bGQgYmUgcmFyZSkuCisgKi8KKyNkZWZpbmUgTUFYX1NFQ0lORk9fTElTVAk4CisKK3N0cnVjdCBleHBfZmxhdm9yX2luZm8geworCXUzMglwc2V1ZG9mbGF2b3I7CisJdTMyCWZsYWdzOworfTsKKwogc3RydWN0IHN2Y19leHBvcnQgewogCXN0cnVjdCBjYWNoZV9oZWFkCWg7CiAJc3RydWN0IGF1dGhfZG9tYWluICoJZXhfY2xpZW50OwpAQCAtNzYsNiArOTIsOCBAQAogCWludAkJCWV4X2ZzaWQ7CiAJdW5zaWduZWQgY2hhciAqCQlleF91dWlkOyAvKiAxNiBieXRlIGZzaWQgKi8KIAlzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zIGV4X2ZzbG9jczsKKwlpbnQJCQlleF9uZmxhdm9yczsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvCWV4X2ZsYXZvcnNbTUFYX1NFQ0lORk9fTElTVF07CiB9OwogCiAvKiBhbiAiZXhwb3J0IGtleSIgKGV4cGtleSkgbWFwcyBhIGZpbGVoYW5kbGVmcmFnZW1lbnQgdG8gYW4KQEAgLTk1LDEwICsxMTMsMjIgQEAKIAogI2RlZmluZSBFWF9TRUNVUkUoZXhwKQkJKCEoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX0lOU0VDVVJFX1BPUlQpKQogI2RlZmluZSBFWF9JU1NZTkMoZXhwKQkJKCEoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX0FTWU5DKSkKLSNkZWZpbmUgRVhfUkRPTkxZKGV4cCkJCSgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfUkVBRE9OTFkpCiAjZGVmaW5lIEVYX05PSElERShleHApCQkoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX05PSElERSkKICNkZWZpbmUgRVhfV0dBVEhFUihleHApCQkoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX0dBVEhFUkVEX1dSSVRFUykKIAorc3RhdGljIGlubGluZSBpbnQgRVhfUkRPTkxZKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICplbmQgPSBleHAtPmV4X2ZsYXZvcnMgKyBleHAtPmV4X25mbGF2b3JzOworCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA9PSBycXN0cC0+cnFfZmxhdm9yKQorCQkJcmV0dXJuIGYtPmZsYWdzICYgTkZTRVhQX1JFQURPTkxZOworCX0KKwlyZXR1cm4gZXhwLT5leF9mbGFncyAmIE5GU0VYUF9SRUFET05MWTsKK30KKworX19iZTMyIGNoZWNrX25mc2RfYWNjZXNzKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApOwogCiAvKgogICogRnVuY3Rpb24gZGVjbGFyYXRpb25zCkBAIC0xMTIsMTMgKzE0MiwxOSBAQAogCQkJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCwKIAkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQlzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKTsKK3N0cnVjdCBzdmNfZXhwb3J0ICoJcnFzdF9leHBfZ2V0X2J5X25hbWUoc3RydWN0IHN2Y19ycXN0ICosCisJCQkJCSAgICAgc3RydWN0IHZmc21vdW50ICosCisJCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqKTsKIHN0cnVjdCBzdmNfZXhwb3J0ICoJZXhwX3BhcmVudChzdHJ1Y3QgYXV0aF9kb21haW4gKmNscCwKIAkJCQkgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKIAkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJICAgc3RydWN0IGNhY2hlX3JlcSAqcmVxcCk7CitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCXJxc3RfZXhwX3BhcmVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKKwkJCQkJc3RydWN0IHZmc21vdW50ICptbnQsCisJCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBpbnQJCQlleHBfcm9vdGZoKHN0cnVjdCBhdXRoX2RvbWFpbiAqLCAKIAkJCQkJY2hhciAqcGF0aCwgc3RydWN0IGtuZnNkX2ZoICosIGludCBtYXhzaXplKTsKLV9fYmUzMgkJCWV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpOworX19iZTMyCQkJZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKik7CiBfX2JlMzIJCQluZnNlcnJubyhpbnQgZXJybm8pOwogCiBleHRlcm4gc3RydWN0IGNhY2hlX2RldGFpbCBzdmNfZXhwb3J0X2NhY2hlOwpAQCAtMTM1LDYgKzE3MSw3IEBACiBleHRlcm4gc3RydWN0IHN2Y19leHBvcnQgKgogZXhwX2ZpbmQoc3RydWN0IGF1dGhfZG9tYWluICpjbHAsIGludCBmc2lkX3R5cGUsIHUzMiAqZnNpZHYsCiAJIHN0cnVjdCBjYWNoZV9yZXEgKnJlcXApOworc3RydWN0IHN2Y19leHBvcnQgKiBycXN0X2V4cF9maW5kKHN0cnVjdCBzdmNfcnFzdCAqLCBpbnQsIHUzMiAqKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oIGIvaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjA5Nzk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmgKLSAqCi0gKiBkZWZpbmVzIGludGVyZmFjZSBiZXR3ZWVuIG5mc2QgYW5kIG90aGVyIGJpdHMgb2YKLSAqIHRoZSBrZXJuZWwuICBQYXJ0aWN1bGFybHkgZmlsZXN5c3RlbXMgKGV2ZW50dWFsbHkpLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+Ci0gKi8KLQotI2lmbmRlZiBMSU5VWF9ORlNEX0lOVEVSRkFDRV9ICi0jZGVmaW5lIExJTlVYX05GU0RfSU5URVJGQUNFX0gKLQotI2VuZGlmIC8qIExJTlVYX05GU0RfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCmluZGV4IDcyZmVhYzUuLmU0NTIyNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2QvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9hdXRoLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0cy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc2QvaW50ZXJmYWNlLmg+CiAvKgogICogbmZzZCB2ZXJzaW9uCiAgKi8KQEAgLTcyLDYgKzcxLDkgQEAKIAkJICAgICAgICAgICAgICAgIHN0cnVjdCBzdmNfZXhwb3J0ICoqZXhwcCk7CiBfX2JlMzIJCW5mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBzdmNfZmggKik7CitfX2JlMzIJCSBuZnNkX2xvb2t1cF9kZW50cnkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKKwkJCQljb25zdCBjaGFyICosIGludCwKKwkJCQlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqKiwgc3RydWN0IGRlbnRyeSAqKik7CiBfX2JlMzIJCW5mc2Rfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCXN0cnVjdCBpYXR0ciAqLCBpbnQsIHRpbWVfdCk7CiAjaWZkZWYgQ09ORklHX05GU0RfVjQKQEAgLTEyMCw3ICsxMjIsOCBAQAogCQkJCXN0cnVjdCBrc3RhdGZzICopOwogCiBpbnQJCW5mc2Rfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwotX19iZTMyCQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19leHBvcnQgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworX19iZTMyCQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZXhwb3J0ICosCisJCQkJc3RydWN0IGRlbnRyeSAqLCBpbnQpOwogaW50CQluZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX1YzX0FDTCkKQEAgLTE0OSw2ICsxNTIsNyBAQAogICogTkZTdjQgU3RhdGUKICAqLwogI2lmZGVmIENPTkZJR19ORlNEX1Y0CitleHRlcm4gdW5zaWduZWQgaW50IG1heF9kZWxlZ2F0aW9uczsKIHZvaWQgbmZzNF9zdGF0ZV9pbml0KHZvaWQpOwogaW50IG5mczRfc3RhdGVfc3RhcnQodm9pZCk7CiB2b2lkIG5mczRfc3RhdGVfc2h1dGRvd24odm9pZCk7CkBAIC0yMzYsNiArMjQwLDcgQEAKICNkZWZpbmUJbmZzZXJyX2JhZG5hbWUJCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0JBRE5BTUUpCiAjZGVmaW5lCW5mc2Vycl9jYl9wYXRoX2Rvd24JX19jb25zdGFudF9odG9ubChORlNFUlJfQ0JfUEFUSF9ET1dOKQogI2RlZmluZQluZnNlcnJfbG9ja2VkCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9MT0NLRUQpCisjZGVmaW5lCW5mc2Vycl93cm9uZ3NlYwkJX19jb25zdGFudF9odG9ubChORlNFUlJfV1JPTkdTRUMpCiAjZGVmaW5lCW5mc2Vycl9yZXBsYXlfbWUJX19jb25zdGFudF9odG9ubChORlNFUlJfUkVQTEFZX01FKQogCiAvKiBlcnJvciBjb2RlcyBmb3IgaW50ZXJuYWwgdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCmluZGV4IGFiNWMyMzYuLmRiMzQ4ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCkBAIC02Nyw3ICs2Nyw3IEBACiAJaW50CQkJY2JyX3RydW5jOwogCXN0YXRlaWRfdAkJY2JyX3N0YXRlaWQ7CiAJdTMyCQkJY2JyX2ZobGVuOwotCXUzMgkJCWNicl9maHZhbFtORlM0X0ZIU0laRV07CisJY2hhcgkJCWNicl9maHZhbFtORlM0X0ZIU0laRV07CiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbgkqY2JyX2RwOwogfTsKIApAQCAtMjI0LDYgKzIyNCw3IEBACiAJc3RydWN0IGlub2RlCQkqZmlfaW5vZGU7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgZmlfaWQ7ICAgICAgLyogdXNlZCB3aXRoIHN0YXRlb3duZXItPnNvX2lkIAogCQkJCQkgICAgICogZm9yIHN0YXRlaWRfaGFzaHRibCBoYXNoICovCisJYm9vbAkJCWZpX2hhZF9jb25mbGljdDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAppbmRleCAwOTc5OWJjLi4xYjY1MzI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKQEAgLTI5Myw2ICsyOTMsMTIgQEAKIAlzdHJ1Y3QgbmZzZDRfY2hhbmdlX2luZm8gIHJuX3RpbmZvOyAvKiByZXNwb25zZSAqLwogfTsKIAorc3RydWN0IG5mc2Q0X3NlY2luZm8geworCXUzMiBzaV9uYW1lbGVuOwkJCQkJLyogcmVxdWVzdCAqLworCWNoYXIgKnNpX25hbWU7CQkJCQkvKiByZXF1ZXN0ICovCisJc3RydWN0IHN2Y19leHBvcnQgKnNpX2V4cDsJCQkvKiByZXNwb25zZSAqLworfTsKKwogc3RydWN0IG5mc2Q0X3NldGF0dHIgewogCXN0YXRlaWRfdAlzYV9zdGF0ZWlkOyAgICAgICAgIC8qIHJlcXVlc3QgKi8KIAl1MzIJCXNhX2JtdmFsWzJdOyAgICAgICAgLyogcmVxdWVzdCAqLwpAQCAtMzY1LDYgKzM3MSw3IEBACiAJCXN0cnVjdCBuZnNkNF9yZW1vdmUJCXJlbW92ZTsKIAkJc3RydWN0IG5mc2Q0X3JlbmFtZQkJcmVuYW1lOwogCQljbGllbnRpZF90CQkJcmVuZXc7CisJCXN0cnVjdCBuZnNkNF9zZWNpbmZvCQlzZWNpbmZvOwogCQlzdHJ1Y3QgbmZzZDRfc2V0YXR0cgkJc2V0YXR0cjsKIAkJc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkCXNldGNsaWVudGlkOwogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSBzZXRjbGllbnRpZF9jb25maXJtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uc3Byb3h5LmggYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAppbmRleCAxODllMGRjLi5jZTA2MTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaApAQCAtMjgsMTAgKzI4LDExIEBACiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKmlwY19uczsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbW50X25zOwogCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnM7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOwogfTsKIGV4dGVybiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHk7CiAKLWludCBjb3B5X25hbWVzcGFjZXMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CitpbnQgY29weV9uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIHZvaWQgZ2V0X3Rhc2tfbmFtZXNwYWNlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiB2b2lkIGZyZWVfbnNwcm94eShzdHJ1Y3QgbnNwcm94eSAqbnMpOwogaW50IHVuc2hhcmVfbnNwcm94eV9uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBuc3Byb3h5ICoqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggMzdhNzE1OC4uNWU4NGYyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00MzIsNiArNDMyLDggQEAKICAqIGNvZGUsIG9yIHBjaSBjb3JlIGNvZGUuICovCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBwY2lfcm9vdF9idXNlczsJLyogbGlzdCBvZiBhbGwga25vd24gUENJIGJ1c2VzICovCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBwY2lfZGV2aWNlczsJLyogbGlzdCBvZiBhbGwgZGV2aWNlcyAqLworLyogU29tZSBkZXZpY2UgZHJpdmVycyBuZWVkIGtub3cgaWYgcGNpIGlzIGluaXRpYXRlZCAqLworZXh0ZXJuIGludCBub19wY2lfZGV2aWNlcyh2b2lkKTsKIAogdm9pZCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqKTsKIGludCBfX211c3RfY2hlY2sgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICosIGludCBtYXNrKTsKQEAgLTcyNCw2ICs3MjYsNyBAQAogeyByZXR1cm4gTlVMTDsgfQogCiAjZGVmaW5lIHBjaV9kZXZfcHJlc2VudChpZHMpCSgwKQorI2RlZmluZSBub19wY2lfZGV2aWNlcygpCSgxKQogI2RlZmluZSBwY2lfZmluZF9wcmVzZW50KGlkcykJKE5VTEwpCiAjZGVmaW5lIHBjaV9kZXZfcHV0KGRldikJZG8geyB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaAppbmRleCBiNzJiZTJmLi45MjZhZGFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9fTElOVVhfUEVSQ1BVX0gKICNkZWZpbmUgX19MSU5VWF9QRVJDUFVfSAogCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4gLyogRm9yIHByZWVtcHRfZGlzYWJsZSgpICovCisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gLyogRm9yIGttYWxsb2MoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBGb3IgbWVtc2V0KCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAppbmRleCBmNWFhNTkzLi4zZDlmNzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xNyw2ICsxOCw5IEBACiBzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgewogCXNwaW5sb2NrX3QgbG9jazsKIAlzNjQgY291bnQ7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBBbGwgcGVyY3B1X2NvdW50ZXJzIGFyZSBvbiBhIGxpc3QgKi8KKyNlbmRpZgogCXMzMiAqY291bnRlcnM7CiB9OwogCkBAIC0yNiwxOCArMzAsOCBAQAogI2RlZmluZSBGQkNfQkFUQ0gJKE5SX0NQVVMqNCkKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKLXsKLQlzcGluX2xvY2tfaW5pdCgmZmJjLT5sb2NrKTsKLQlmYmMtPmNvdW50ID0gYW1vdW50OwotCWZiYy0+Y291bnRlcnMgPSBhbGxvY19wZXJjcHUoczMyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCi17Ci0JZnJlZV9wZXJjcHUoZmJjLT5jb3VudGVycyk7Ci19Ci0KK3ZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCk7Cit2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpOwogdm9pZCBwZXJjcHVfY291bnRlcl9tb2Qoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHMzMiBhbW91bnQpOwogczY0IHBlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKaW5kZXggMTY5YzZjMi4uYjlhMTdlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAlrcmVmX2dldCgmbnMtPmtyZWYpOwogfQogCi1leHRlcm4gc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKGludCBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKK2V4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKIGV4dGVybiB2b2lkIGZyZWVfcGlkX25zKHN0cnVjdCBrcmVmICprcmVmKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9waWRfbnMoc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmN0bC5oIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCmluZGV4IDUyYTliZTQuLmUyZWZmOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKQEAgLTU5LDQgKzU5LDggQEAKICMgZGVmaW5lIFBSX0VORElBTl9MSVRUTEUJMQkvKiBUcnVlIGxpdHRsZSBlbmRpYW4gbW9kZSAqLwogIyBkZWZpbmUgUFJfRU5ESUFOX1BQQ19MSVRUTEUJMgkvKiAiUG93ZXJQQyIgcHNldWRvIGxpdHRsZSBlbmRpYW4gKi8KIAorLyogR2V0L3NldCBwcm9jZXNzIHNlY2NvbXAgbW9kZSAqLworI2RlZmluZSBQUl9HRVRfU0VDQ09NUAkyMQorI2RlZmluZSBQUl9TRVRfU0VDQ09NUAkyMgorCiAjZW5kaWYgLyogX0xJTlVYX1BSQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaCBiL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaAppbmRleCBmYzg2ZjI3Li4xYWRmZTY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCkBAIC0yNyw3ICsyNyw3IEBACiAJCiAJcHJlZmV0Y2goeCkgIAktIHByZWZldGNoZXMgdGhlIGNhY2hlbGluZSBhdCAieCIgZm9yIHJlYWQKIAlwcmVmZXRjaHcoeCkJLSBwcmVmZXRjaGVzIHRoZSBjYWNoZWxpbmUgYXQgIngiIGZvciB3cml0ZQotCXNwaW5fbG9ja19wcmVmZXRjaCh4KSAtIHByZWZlY3RjaGVzIHRoZSBzcGlubG9jayAqeCBmb3IgdGFraW5nCisJc3Bpbl9sb2NrX3ByZWZldGNoKHgpIC0gcHJlZmV0Y2hlcyB0aGUgc3BpbmxvY2sgKnggZm9yIHRha2luZwogCQogCXRoZXJlIGlzIGFsc28gUFJFRkVUQ0hfU1RSSURFIHdoaWNoIGlzIHRoZSBhcmNoaXRlY3VyZS1wcmVmZXJlZCAKIAkibG9va2FoZWFkIiBzaXplIGZvciBwcmVmZXRjaGluZyBzdHJlYW1lZCBvcGVyYXRpb25zLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAppbmRleCAzNDY5Zjk2Li4yOGUzNjY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaApAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAorc3RydWN0IGNvbXBsZXRpb247CisKIC8qCiAgKiBUaGUgcHJvYyBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCiAgKi8KQEAgLTU2LDYgKzU4LDE0IEBACiAJZ2lkX3QgZ2lkOwogCWxvZmZfdCBzaXplOwogCWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICpwcm9jX2lvcHM7CisJLyoKKwkgKiBOVUxMIC0+cHJvY19mb3BzIG1lYW5zICJQREUgaXMgZ29pbmcgYXdheSBSU04iIG9yCisJICogIlBERSBpcyBqdXN0IGNyZWF0ZWQiLiBJbiBlaXRoZXIgY2FzZSwgZS5nLiAtPnJlYWRfcHJvYyB3b24ndCBiZQorCSAqIGNhbGxlZCBiZWNhdXNlIGl0J3MgdG9vIGxhdGUgb3IgdG9vIGVhcmx5LCByZXNwZWN0aXZlbHkuCisJICoKKwkgKiBJZiB5b3UncmUgYWxsb2NhdGluZyAtPnByb2NfZm9wcyBkeW5hbWljYWxseSwgc2F2ZSBhIHBvaW50ZXIKKwkgKiBzb21ld2hlcmUuCisJICovCiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJvY19mb3BzOwogCWdldF9pbmZvX3QgKmdldF9pbmZvOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwpAQCAtNjYsNiArNzYsOSBAQAogCWF0b21pY190IGNvdW50OwkJLyogdXNlIGNvdW50ICovCiAJaW50IGRlbGV0ZWQ7CQkvKiBkZWxldGUgZmxhZyAqLwogCXZvaWQgKnNldDsKKwlpbnQgcGRlX3VzZXJzOwkvKiBudW1iZXIgb2YgY2FsbGVycyBpbnRvIG1vZHVsZSBpbiBwcm9ncmVzcyAqLworCXNwaW5sb2NrX3QgcGRlX3VubG9hZF9sb2NrOyAvKiBwcm9jX2ZvcHMgY2hlY2tzIGFuZCBwZGVfdXNlcnMgYnVtcHMgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiAqcGRlX3VubG9hZF9jb21wbGV0aW9uOwogfTsKIAogc3RydWN0IGtjb3JlX2xpc3QgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKaW5kZXggZWViMTk3Ni4uYWU4MTQ2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC0xMTAsNiArMTEwLDggQEAKIAkJX19wdHJhY2VfdW5saW5rKGNoaWxkKTsKIH0KIAoraW50IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSk7CitpbnQgZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKTsKIAogI2lmbmRlZiBmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IGRkNWEwNWQuLjc1ZTE3YTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiBjaGFyICpmaWxlX3BhdGgoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIHZvaWQgYml0bWFwX3ByaW50X3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Ci1pbnQgYml0bWFwX3VwZGF0ZV9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwordm9pZCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAKIGludCAgYml0bWFwX3NldGFsbGJpdHMoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIHZvaWQgYml0bWFwX3dyaXRlX2FsbChzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwpAQCAtMjc4LDggKzI3OCw4IEBACiB2b2lkIGJpdG1hcF9lbmRfc3luYyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50ICpibG9ja3MsIGludCBhYm9ydGVkKTsKIHZvaWQgYml0bWFwX2Nsb3NlX3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIAotaW50IGJpdG1hcF91bnBsdWcoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKLWludCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKK3ZvaWQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwordm9pZCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCmluZGV4IGRlNzJjNDkuLjI4YWM2MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaApAQCAtNTEsNyArNTEsNyBAQAogCiAJc2VjdG9yX3Qgc2l6ZTsJCQkvKiBEZXZpY2Ugc2l6ZSAoaW4gYmxvY2tzKSAqLwogCW1kZGV2X3QgKm1kZGV2OwkJCS8qIFJBSUQgYXJyYXkgaWYgcnVubmluZyAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF9ldmVudHM7CS8qIElPIGV2ZW50IHRpbWVzdGFtcCAqLworCWxvbmcgbGFzdF9ldmVudHM7CQkvKiBJTyBldmVudCB0aW1lc3RhbXAgKi8KIAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CS8qIGJsb2NrIGRldmljZSBoYW5kbGUgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmggYi9pbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM3YzIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBwbGF0Zm9ybSBkYXRhIG9mIG00OHQ1OSBSVEMgY2hpcCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIE1hcmsgWmhhbiA8cm9uZ2thaS56aGFuQHdpbmRyaXZlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9SVENfTTQ4VDU5X0hfCisjZGVmaW5lIF9MSU5VWF9SVENfTTQ4VDU5X0hfCisKKy8qCisgKiBNNDhUNTkgUmVnaXN0ZXIgT2Zmc2V0CisgKi8KKyNkZWZpbmUgTTQ4VDU5X1lFQVIJCTB4MWZmZgorI2RlZmluZSBNNDhUNTlfTU9OVEgJCTB4MWZmZQorI2RlZmluZSBNNDhUNTlfTURBWQkJMHgxZmZkCS8qIERheSBvZiBNb250aCAqLworI2RlZmluZSBNNDhUNTlfV0RBWQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCisjZGVmaW5lIE00OFQ1OV9XREFZX0NCCQkJMHgyMAkvKiBDZW50dXJ5IEJpdCAqLworI2RlZmluZSBNNDhUNTlfV0RBWV9DRUIJCQkweDEwCS8qIENlbnR1cnkgRW5hYmxlIEJpdCAqLworI2RlZmluZSBNNDhUNTlfSE9VUgkJMHgxZmZiCisjZGVmaW5lIE00OFQ1OV9NSU4JCTB4MWZmYQorI2RlZmluZSBNNDhUNTlfU0VDCQkweDFmZjkKKyNkZWZpbmUgTTQ4VDU5X0NOVEwJCTB4MWZmOAorI2RlZmluZSBNNDhUNTlfQ05UTF9SRUFECQkweDQwCisjZGVmaW5lIE00OFQ1OV9DTlRMX1dSSVRFCQkweDgwCisjZGVmaW5lIE00OFQ1OV9XQVRDSERPRwkJMHgxZmY3CisjZGVmaW5lIE00OFQ1OV9JTlRSCQkweDFmZjYKKyNkZWZpbmUgTTQ4VDU5X0lOVFJfQUZFCQkJMHg4MAkvKiBBbGFybSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIE00OFQ1OV9JTlRSX0FCRQkJCTB4MjAKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX0RBVEUJMHgxZmY1CisjZGVmaW5lIE00OFQ1OV9BTEFSTV9IT1VSCTB4MWZmNAorI2RlZmluZSBNNDhUNTlfQUxBUk1fTUlOCTB4MWZmMworI2RlZmluZSBNNDhUNTlfQUxBUk1fU0VDCTB4MWZmMgorI2RlZmluZSBNNDhUNTlfVU5VU0VECQkweDFmZjEKKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTCQkweDFmZjAKKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTX1dEVAkJMHg4MAkvKiB3YXRjaGRvZyB0aW1lciBleHBpcmVkICovCisjZGVmaW5lIE00OFQ1OV9GTEFHU19BRgkJCTB4NDAJLyogYWxhcm0gKi8KKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTX0JGCQkJMHgxMAkvKiBsb3cgYmF0dGVyeSAqLworCisjZGVmaW5lIE00OFQ1OV9OVlJBTV9TSVpFCTB4MWZmMAorCitzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSB7CisJLyogVGhlIG1ldGhvZCB0byBhY2Nlc3MgTTQ4VDU5IHJlZ2lzdGVycywKKwkgKiBOT1RFOiBUaGUgJ29mcycgc2hvdWxkIGJlIDB4MDB+MHgxZmZmCisJICovCisJdm9pZCAoKndyaXRlX2J5dGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG9mcywgdTggdmFsKTsKKwl1bnNpZ25lZCBjaGFyICgqcmVhZF9ieXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMpOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9SVENfTTQ4VDU5X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggY2ZiNjgwNS4uNzMxZWRhY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNkZWZpbmUgQ0xPTkVfU1RPUFBFRAkJMHgwMjAwMDAwMAkvKiBTdGFydCBpbiBzdG9wcGVkIHN0YXRlICovCiAjZGVmaW5lIENMT05FX05FV1VUUwkJMHgwNDAwMDAwMAkvKiBOZXcgdXRzbmFtZSBncm91cD8gKi8KICNkZWZpbmUgQ0xPTkVfTkVXSVBDCQkweDA4MDAwMDAwCS8qIE5ldyBpcGNzICovCisjZGVmaW5lIENMT05FX05FV1VTRVIJCTB4MTAwMDAwMDAJLyogTmV3IHVzZXIgbmFtZXNwYWNlICovCiAKIC8qCiAgKiBTY2hlZHVsaW5nIHBvbGljaWVzCkBAIC0yODcsNiArMjg4LDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZSh2b2lkKTsKIAogc3RydWN0IG5zcHJveHk7CitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2U7CiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBtYXAgYXJlYXMuLiBUaGlzIGlzIGEgcmFuZG9tIChsYXJnZSkgbnVtYmVyICovCiAjZGVmaW5lIERFRkFVTFRfTUFYX01BUF9DT1VOVAk2NTUzNgpAQCAtNTI5LDYgKzUzMSwxMCBAQAogI2lmZGVmIENPTkZJR19UQVNLU1RBVFMKIAlzdHJ1Y3QgdGFza3N0YXRzICpzdGF0czsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BVURJVAorCXVuc2lnbmVkIGF1ZGl0X3R0eTsKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqdHR5X2F1ZGl0X2J1ZjsKKyNlbmRpZgogfTsKIAogLyogQ29udGV4dCBzd2l0Y2ggbXVzdCBiZSB1bmxvY2tlZCBpZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBlbmFibGVkICovCkBAIC05NzIsNyArOTc4LDggQEAKIAl1bnNpZ25lZCBpbnQgcnRfcHJpb3JpdHk7CiAJY3B1dGltZV90IHV0aW1lLCBzdGltZTsKIAl1bnNpZ25lZCBsb25nIG52Y3N3LCBuaXZjc3c7IC8qIGNvbnRleHQgc3dpdGNoIGNvdW50cyAqLwotCXN0cnVjdCB0aW1lc3BlYyBzdGFydF90aW1lOworCXN0cnVjdCB0aW1lc3BlYyBzdGFydF90aW1lOyAJCS8qIG1vbm90b25pYyB0aW1lICovCisJc3RydWN0IHRpbWVzcGVjIHJlYWxfc3RhcnRfdGltZTsJLyogYm9vdCBiYXNlZCB0aW1lICovCiAvKiBtbSBmYXVsdCBhbmQgc3dhcCBpbmZvOiB0aGlzIGNhbiBhcmd1YWJseSBiZSBzZWVuIGFzIGVpdGhlciBtbS1zcGVjaWZpYyBvciB0aHJlYWQtc3BlY2lmaWMgKi8KIAl1bnNpZ25lZCBsb25nIG1pbl9mbHQsIG1hal9mbHQ7CiAKQEAgLTE0MDMsNyArMTQxMCw3IEBACiBleHRlcm4gdm9pZCBfX3NldF9zcGVjaWFsX3BpZHMocGlkX3Qgc2Vzc2lvbiwgcGlkX3QgcGdycCk7CiAKIC8qIHBlci1VSUQgcHJvY2VzcyBjaGFyZ2luZy4gKi8KLWV4dGVybiBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKiBhbGxvY191aWQodWlkX3QpOworZXh0ZXJuIHN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKiwgdWlkX3QpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKmdldF91aWQoc3RydWN0IHVzZXJfc3RydWN0ICp1KQogewogCWF0b21pY19pbmMoJnUtPl9fY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oCmluZGV4IDFhODJkMzAuLmQyYjA1ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2N4MjAwX2dwaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmgKQEAgLTEsNSArMSwzIEBACi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQogdTMyIHNjeDIwMF9ncGlvX2NvbmZpZ3VyZSh1bnNpZ25lZCBpbmRleCwgdTMyIHNldCwgdTMyIGNsZWFyKTsKIAogZXh0ZXJuIHVuc2lnbmVkIHNjeDIwMF9ncGlvX2Jhc2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaCBiL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCmluZGV4IDNlOGIxY2YuLjI2MmE4ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCkBAIC00LDggKzQsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NFQ0NPTVAKIAotI2RlZmluZSBOUl9TRUNDT01QX01PREVTIDEKLQogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3NlY2NvbXAuaD4KIApAQCAtMTgsMjAgKzE2LDIzIEBACiAJCV9fc2VjdXJlX2NvbXB1dGluZyh0aGlzX3N5c2NhbGwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoYXNfc2VjdXJlX2NvbXB1dGluZyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQotewotCXJldHVybiB1bmxpa2VseSh0ZXN0X3RpX3RocmVhZF9mbGFnKHRpLCBUSUZfU0VDQ09NUCkpOwotfQorZXh0ZXJuIGxvbmcgcHJjdGxfZ2V0X3NlY2NvbXAodm9pZCk7CitleHRlcm4gbG9uZyBwcmN0bF9zZXRfc2VjY29tcCh1bnNpZ25lZCBsb25nKTsKIAogI2Vsc2UgLyogQ09ORklHX1NFQ0NPTVAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgeyB9IHNlY2NvbXBfdDsKIAogI2RlZmluZSBzZWN1cmVfY29tcHV0aW5nKHgpIGRvIHsgfSB3aGlsZSAoMCkKLS8qIHN0YXRpYyBpbmxpbmUgdG8gcHJlc2VydmUgdHlwZWNoZWNraW5nICovCi1zdGF0aWMgaW5saW5lIGludCBoYXNfc2VjdXJlX2NvbXB1dGluZyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQorCitzdGF0aWMgaW5saW5lIGxvbmcgcHJjdGxfZ2V0X3NlY2NvbXAodm9pZCkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHByY3RsX3NldF9zZWNjb21wKHVuc2lnbmVkIGxvbmcgYXJnMikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWwuaAppbmRleCAzM2ZjOGNiLi5kZWI3MTQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKQEAgLTE3NywxMSArMTc3LDUgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAotLyogQWxsb3cgYXJjaGl0ZWN0dXJlcyB0byBvdmVycmlkZSBlbnRyaWVzIGluIHNlcmlhbDgyNTBfcG9ydHNbXSBhdCBydW4gdGltZTogKi8KLXN0cnVjdCB1YXJ0X3BvcnQ7CS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLWV4dGVybiBpbnQgZWFybHlfc2VyaWFsX3NldHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwotZXh0ZXJuIGludCBlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KGNoYXIgKm9wdGlvbnMpOwotZXh0ZXJuIGludCBzZXJpYWw4MjUwX3N0YXJ0X2NvbnNvbGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciAqb3B0aW9ucyk7Ci0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKaW5kZXggNzEzMTBkOC4uNzA2ZWU5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaApAQCAtNjAsNCArNjAsOCBAQAogdm9pZCBzZXJpYWw4MjUwX3N1c3BlbmRfcG9ydChpbnQgbGluZSk7CiB2b2lkIHNlcmlhbDgyNTBfcmVzdW1lX3BvcnQoaW50IGxpbmUpOwogCitleHRlcm4gaW50IHNlcmlhbDgyNTBfZmluZF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnApOworZXh0ZXJuIGludCBzZXJpYWw4MjUwX2ZpbmRfcG9ydF9mb3JfZWFybHljb24odm9pZCk7CitleHRlcm4gaW50IHNldHVwX2Vhcmx5X3NlcmlhbDgyNTBfY29uc29sZShjaGFyICpjbWRsaW5lKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKaW5kZXggN2YyYzk5ZC4uOWM3MjFjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMTQyLDYgKzE0Miw5IEBACiAvKiBNaWNyZWwgS1M4Njk1ICovCiAjZGVmaW5lIFBPUlRfS1M4Njk1CTc2CiAKKy8qIEJyb2FkY29tIFNCMTI1MCwgZXRjLiBTT0MgKi8KKyNkZWZpbmUgUE9SVF9TQjEyNTBfRFVBUlQJNzcKKwogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaAppbmRleCA5YTVlYWM1Li5lYTkxYWJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKQEAgLTYsNyArNiw2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIC8qCiAgKiBSZWFsIFRpbWUgc2lnbmFscyBtYXkgYmUgcXVldWVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCBjZWJjZDM4Li4wZTFkMGRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWIuaApAQCAtMTQsOCArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLXR5cGVkZWYgc3RydWN0IGttZW1fY2FjaGUga21lbV9jYWNoZV90IF9fZGVwcmVjYXRlZDsKLQogLyoKICAqIEZsYWdzIHRvIHBhc3MgdG8ga21lbV9jYWNoZV9jcmVhdGUoKS4KICAqIFRoZSBvbmVzIG1hcmtlZCBERUJVRyBhcmUgb25seSB2YWxpZCBpZiBDT05GSUdfU0xBQl9ERUJVRyBpcyBzZXQuCkBAIC0zMyw2ICszMSwxOSBAQAogI2RlZmluZSBTTEFCX1RSQUNFCQkweDAwMjAwMDAwVUwJLyogVHJhY2UgYWxsb2NhdGlvbnMgYW5kIGZyZWVzICovCiAKIC8qCisgKiBaRVJPX1NJWkVfUFRSIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHplcm8gc2l6ZWQga21hbGxvYyByZXF1ZXN0cy4KKyAqCisgKiBEZXJlZmVyZW5jaW5nIFpFUk9fU0laRV9QVFIgd2lsbCBsZWFkIHRvIGEgZGlzdGluY3QgYWNjZXNzIGZhdWx0LgorICoKKyAqIFpFUk9fU0laRV9QVFIgY2FuIGJlIHBhc3NlZCB0byBrZnJlZSB0aG91Z2ggaW4gdGhlIHNhbWUgd2F5IHRoYXQgTlVMTCBjYW4uCisgKiBCb3RoIG1ha2Uga2ZyZWUgYSBuby1vcC4KKyAqLworI2RlZmluZSBaRVJPX1NJWkVfUFRSICgodm9pZCAqKTE2KQorCisjZGVmaW5lIFpFUk9fT1JfTlVMTF9QVFIoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSA8IFwKKwkJCQkodW5zaWduZWQgbG9uZylaRVJPX1NJWkVfUFRSKQorCisvKgogICogc3RydWN0IGttZW1fY2FjaGUgcmVsYXRlZCBwcm90b3R5cGVzCiAgKi8KIHZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdCh2b2lkKTsKQEAgLTQ0LDggKzU1LDYgQEAKIAkJCXZvaWQgKCopKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwgdW5zaWduZWQgbG9uZykpOwogdm9pZCBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RydWN0IGttZW1fY2FjaGUgKik7CiBpbnQga21lbV9jYWNoZV9zaHJpbmsoc3RydWN0IGttZW1fY2FjaGUgKik7Ci12b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKLXZvaWQgKmttZW1fY2FjaGVfemFsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKIHZvaWQga21lbV9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICosIHZvaWQgKik7CiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICopOwogY29uc3QgY2hhciAqa21lbV9jYWNoZV9uYW1lKHN0cnVjdCBrbWVtX2NhY2hlICopOwpAQCAtNjMsMTYgKzcyLDYgQEAKIAkJc2l6ZW9mKHN0cnVjdCBfX3N0cnVjdCksIF9fYWxpZ25vZl9fKHN0cnVjdCBfX3N0cnVjdCksXAogCQkoX19mbGFncyksIE5VTEwsIE5VTEwpCiAKLSNpZmRlZiBDT05GSUdfTlVNQQotZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCi0JCQkJCWdmcF90IGZsYWdzLCBpbnQgbm9kZSkKLXsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKLX0KLSNlbmRpZgotCiAvKgogICogVGhlIGxhcmdlc3Qga21hbGxvYyBzaXplIHN1cHBvcnRlZCBieSB0aGUgc2xhYiBhbGxvY2F0b3JzIGlzCiAgKiAzMiBtZWdhYnl0ZSAoMl4yNSkgb3IgdGhlIG1heGltdW0gYWxsb2NhdGFibGUgcGFnZSBvcmRlciBpZiB0aGF0IGlzCkBAIC05MSw1MSArOTAsNDIgQEAKIC8qCiAgKiBDb21tb24ga21hbGxvYyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgYWxsIGFsbG9jYXRvcnMKICAqLwotdm9pZCAqX19rbWFsbG9jKHNpemVfdCwgZ2ZwX3QpOwotdm9pZCAqX19remFsbG9jKHNpemVfdCwgZ2ZwX3QpOwogdm9pZCAqIF9fbXVzdF9jaGVjayBrcmVhbGxvYyhjb25zdCB2b2lkICosIHNpemVfdCwgZ2ZwX3QpOwogdm9pZCBrZnJlZShjb25zdCB2b2lkICopOwogc2l6ZV90IGtzaXplKGNvbnN0IHZvaWQgKik7CiAKKy8qCisgKiBBbGxvY2F0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXNlIGFyZSBtYWlubHkgdXNlZCB0byBlc3RhYmxpc2ggb3B0aW1pemVkCisgKiB3YXlzIHRvIGNvbnZlcnQga21hbGxvYygpIGNhbGxzIHRvIGttZW1fY2FjaGVfYWxsb2MoKSBpbnZvY2F0aW9ucyBieQorICogc2VsZWN0aW5nIHRoZSBhcHByb3ByaWF0ZSBnZW5lcmFsIGNhY2hlIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBBbGxvY2F0b3JzIG11c3QgZGVmaW5lIGF0IGxlYXN0OgorICoKKyAqCWttZW1fY2FjaGVfYWxsb2MoKQorICoJX19rbWFsbG9jKCkKKyAqCWttYWxsb2MoKQorICoKKyAqIFRob3NlIHdpc2hpbmcgdG8gc3VwcG9ydCBOVU1BIG11c3QgYWxzbyBkZWZpbmU6CisgKgorICoJa21lbV9jYWNoZV9hbGxvY19ub2RlKCkKKyAqCWttYWxsb2Nfbm9kZSgpCisgKgorICogU2VlIGVhY2ggYWxsb2NhdG9yIGRlZmluaXRpb24gZmlsZSBmb3IgYWRkaXRpb25hbCBjb21tZW50cyBhbmQKKyAqIGltcGxlbWVudGF0aW9uIG5vdGVzLgorICovCisjaWZkZWYgQ09ORklHX1NMVUIKKyNpbmNsdWRlIDxsaW51eC9zbHViX2RlZi5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfU0xPQikKKyNpbmNsdWRlIDxsaW51eC9zbG9iX2RlZi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9zbGFiX2RlZi5oPgorI2VuZGlmCisKIC8qKgogICoga2NhbGxvYyAtIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCiAgKiBAbjogbnVtYmVyIG9mIGVsZW1lbnRzLgogICogQHNpemU6IGVsZW1lbnQgc2l6ZS4KICAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmtjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpZiAobiAhPSAwICYmIHNpemUgPiBVTE9OR19NQVggLyBuKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gX19remFsbG9jKG4gKiBzaXplLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBBbGxvY2F0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXNlIGFyZSBtYWlubHkgdXNlZCB0byBlc3RhYmxpc2ggb3B0aW1pemVkCi0gKiB3YXlzIHRvIGNvbnZlcnQga21hbGxvYygpIGNhbGxzIHRvIGttZW1fY2FjaGVfYWxsb2MoKSBpbnZvY2F0aW9ucyBieSBzZWxlY3RpbmcKLSAqIHRoZSBhcHByb3ByaWF0ZSBnZW5lcmFsIGNhY2hlIGF0IGNvbXBpbGUgdGltZS4KLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0xBQikgfHwgZGVmaW5lZChDT05GSUdfU0xVQikKLSNpZmRlZiBDT05GSUdfU0xVQgotI2luY2x1ZGUgPGxpbnV4L3NsdWJfZGVmLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGxpbnV4L3NsYWJfZGVmLmg+Ci0jZW5kaWYgLyogIUNPTkZJR19TTFVCICovCi0jZWxzZQotCi0vKgotICogRmFsbGJhY2sgZGVmaW5pdGlvbnMgZm9yIGFuIGFsbG9jYXRvciBub3Qgd2FudGluZyB0byBwcm92aWRlCi0gKiBpdHMgb3duIG9wdGltaXplZCBrbWFsbG9jIGRlZmluaXRpb25zIChsaWtlIFNMT0IpLgotICovCi0KLS8qKgotICoga21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeQotICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqCi0gKiBrbWFsbG9jIGlzIHRoZSBub3JtYWwgbWV0aG9kIG9mIGFsbG9jYXRpbmcgbWVtb3J5Ci0gKiBpbiB0aGUga2VybmVsLgogICoKICAqIFRoZSBAZmxhZ3MgYXJndW1lbnQgbWF5IGJlIG9uZSBvZjoKICAqCkBAIC0xNDMsNyArMTMzLDcgQEAKICAqCiAgKiAlR0ZQX0tFUk5FTCAtIEFsbG9jYXRlIG5vcm1hbCBrZXJuZWwgcmFtLiAgTWF5IHNsZWVwLgogICoKLSAqICVHRlBfQVRPTUlDIC0gQWxsb2NhdGlvbiB3aWxsIG5vdCBzbGVlcC4KKyAqICVHRlBfQVRPTUlDIC0gQWxsb2NhdGlvbiB3aWxsIG5vdCBzbGVlcC4gIE1heSB1c2UgZW1lcmdlbmN5IHBvb2xzLgogICogICBGb3IgZXhhbXBsZSwgdXNlIHRoaXMgaW5zaWRlIGludGVycnVwdCBoYW5kbGVycy4KICAqCiAgKiAlR0ZQX0hJR0hVU0VSIC0gQWxsb2NhdGUgcGFnZXMgZnJvbSBoaWdoIG1lbW9yeS4KQEAgLTE1MiwxOCArMTQyLDIyIEBACiAgKgogICogJUdGUF9OT0ZTIC0gRG8gbm90IG1ha2UgYW55IGZzIGNhbGxzIHdoaWxlIHRyeWluZyB0byBnZXQgbWVtb3J5LgogICoKKyAqICVHRlBfTk9XQUlUIC0gQWxsb2NhdGlvbiB3aWxsIG5vdCBzbGVlcC4KKyAqCisgKiAlR0ZQX1RISVNOT0RFIC0gQWxsb2NhdGUgbm9kZS1sb2NhbCBtZW1vcnkgb25seS4KKyAqCisgKiAlR0ZQX0RNQSAtIEFsbG9jYXRpb24gc3VpdGFibGUgZm9yIERNQS4KKyAqICAgU2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Iga21hbGxvYygpIGNhY2hlcy4gT3RoZXJ3aXNlLCB1c2UgYQorICogICBzbGFiIGNyZWF0ZWQgd2l0aCBTTEFCX0RNQS4KKyAqCiAgKiBBbHNvIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBkaWZmZXJlbnQgZmxhZ3MgYnkgT1InaW5nCiAgKiBpbiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgQGZsYWdzOgogICoKICAqICVfX0dGUF9DT0xEIC0gUmVxdWVzdCBjYWNoZS1jb2xkIHBhZ2VzIGluc3RlYWQgb2YKICAqICAgdHJ5aW5nIHRvIHJldHVybiBjYWNoZS13YXJtIHBhZ2VzLgogICoKLSAqICVfX0dGUF9ETUEgLSBSZXF1ZXN0IG1lbW9yeSBmcm9tIHRoZSBETUEtY2FwYWJsZSB6b25lLgotICoKICAqICVfX0dGUF9ISUdIIC0gVGhpcyBhbGxvY2F0aW9uIGhhcyBoaWdoIHByaW9yaXR5IGFuZCBtYXkgdXNlIGVtZXJnZW5jeSBwb29scy4KICAqCi0gKiAlX19HRlBfSElHSE1FTSAtIEFsbG9jYXRlZCBtZW1vcnkgbWF5IGJlIGZyb20gaGlnaG1lbS4KLSAqCiAgKiAlX19HRlBfTk9GQUlMIC0gSW5kaWNhdGUgdGhhdCB0aGlzIGFsbG9jYXRpb24gaXMgaW4gbm8gd2F5IGFsbG93ZWQgdG8gZmFpbAogICogICAodGhpbmsgdHdpY2UgYmVmb3JlIHVzaW5nKS4KICAqCkBAIC0xNzMsMjQgKzE2NywyOSBAQAogICogJV9fR0ZQX05PV0FSTiAtIElmIGFsbG9jYXRpb24gZmFpbHMsIGRvbid0IGlzc3VlIGFueSB3YXJuaW5ncy4KICAqCiAgKiAlX19HRlBfUkVQRUFUIC0gSWYgYWxsb2NhdGlvbiBmYWlscyBpbml0aWFsbHksIHRyeSBvbmNlIG1vcmUgYmVmb3JlIGZhaWxpbmcuCisgKgorICogVGhlcmUgYXJlIG90aGVyIGZsYWdzIGF2YWlsYWJsZSBhcyB3ZWxsLCBidXQgdGhlc2UgYXJlIG5vdCBpbnRlbmRlZAorICogZm9yIGdlbmVyYWwgdXNlLCBhbmQgc28gYXJlIG5vdCBkb2N1bWVudGVkIGhlcmUuIEZvciBhIGZ1bGwgbGlzdCBvZgorICogcG90ZW50aWFsIGZsYWdzLCBhbHdheXMgcmVmZXIgdG8gbGludXgvZ2ZwLmguCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKmtjYWxsb2Moc2l6ZV90IG4sIHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKLQlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAobiAhPSAwICYmIHNpemUgPiBVTE9OR19NQVggLyBuKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gX19rbWFsbG9jKG4gKiBzaXplLCBmbGFncyB8IF9fR0ZQX1pFUk8pOwogfQogCisjaWYgIWRlZmluZWQoQ09ORklHX05VTUEpICYmICFkZWZpbmVkKENPTkZJR19TTE9CKQogLyoqCi0gKiBremFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgorICoga21hbGxvY19ub2RlIC0gYWxsb2NhdGUgbWVtb3J5IGZyb20gYSBzcGVjaWZpYyBub2RlCiAgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga21hbGxvYykuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGtjYWxsb2MpLgorICogQG5vZGU6IG5vZGUgdG8gYWxsb2NhdGUgZnJvbS4KKyAqCisgKiBrbWFsbG9jKCkgZm9yIG5vbi1sb2NhbCBub2RlcywgdXNlZCB0byBhbGxvY2F0ZSBmcm9tIGEgc3BlY2lmaWMgbm9kZQorICogaWYgYXZhaWxhYmxlLiBFcXVpdmFsZW50IHRvIGttYWxsb2MoKSBpbiB0aGUgbm9uLU5VTUEgc2luZ2xlLW5vZGUKKyAqIGNhc2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfTlVNQQogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7CkBAIC0yMDAsNyArMTk5LDE1IEBACiB7CiAJcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CiB9Ci0jZW5kaWYgLyogIUNPTkZJR19OVU1BICovCisKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAorCQkJCQlnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7Cit9CisjZW5kaWYgLyogIUNPTkZJR19OVU1BICYmICFDT05GSUdfU0xPQiAqLwogCiAvKgogICoga21hbGxvY190cmFja19jYWxsZXIgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2Yga21hbGxvYyB0aGF0IHJlY29yZHMgdGhlCkBAIC0yNDUsNiArMjUyLDIzIEBACiAKICNlbmRpZiAvKiBERUJVR19TTEFCICovCiAKKy8qCisgKiBTaG9ydGN1dHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqaywgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoaywgZmxhZ3MgfCBfX0dGUF9aRVJPKTsKK30KKworLyoqCisgKiBremFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGttYWxsb2MpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzIHwgX19HRlBfWkVSTyk7Cit9CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0xJTlVYX1NMQUJfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKaW5kZXggOGQ4MWE2MC4uMzJiZGMyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaApAQCAtMjUsMTAgKzI1LDE3IEBACiB9OwogZXh0ZXJuIHN0cnVjdCBjYWNoZV9zaXplcyBtYWxsb2Nfc2l6ZXNbXTsKIAordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Cit2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKKwogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKIAkJaW50IGkgPSAwOworCisJCWlmICghc2l6ZSkKKwkJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCiAjZGVmaW5lIENBQ0hFKHgpIFwKIAkJaWYgKHNpemUgPD0geCkgXAogCQkJZ290byBmb3VuZDsgXApAQCAtNTEsMzkgKzU4LDE4IEBACiAJcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7Ci0JCWludCBpID0gMDsKLSNkZWZpbmUgQ0FDSEUoeCkgXAotCQlpZiAoc2l6ZSA8PSB4KSBcCi0JCQlnb3RvIGZvdW5kOyBcCi0JCWVsc2UgXAotCQkJaSsrOwotI2luY2x1ZGUgImttYWxsb2Nfc2l6ZXMuaCIKLSN1bmRlZiBDQUNIRQotCQl7Ci0JCQlleHRlcm4gdm9pZCBfX3lvdV9jYW5ub3Rfa3phbGxvY190aGF0X211Y2godm9pZCk7Ci0JCQlfX3lvdV9jYW5ub3Rfa3phbGxvY190aGF0X211Y2goKTsKLQkJfQotZm91bmQ6Ci0jaWZkZWYgQ09ORklHX1pPTkVfRE1BCi0JCWlmIChmbGFncyAmIEdGUF9ETUEpCi0JCQlyZXR1cm4ga21lbV9jYWNoZV96YWxsb2MobWFsbG9jX3NpemVzW2ldLmNzX2RtYWNhY2hlcCwKLQkJCQkJCWZsYWdzKTsKLSNlbmRpZgotCQlyZXR1cm4ga21lbV9jYWNoZV96YWxsb2MobWFsbG9jX3NpemVzW2ldLmNzX2NhY2hlcCwgZmxhZ3MpOwotCX0KLQlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKLX0KLQogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gdm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CitleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CiAJCWludCBpID0gMDsKKworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwogI2RlZmluZSBDQUNIRSh4KSBcCiAJCWlmIChzaXplIDw9IHgpIFwKIAkJCWdvdG8gZm91bmQ7IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xvYl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2xvYl9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmRhZjJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zbG9iX2RlZi5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX19MSU5VWF9TTE9CX0RFRl9ICisjZGVmaW5lIF9fTElOVVhfU0xPQl9ERUZfSAorCit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKKworc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgLTEpOworfQorCit2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKKworc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4gX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIG5vZGUpOworfQorCisvKioKKyAqIGttYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkKKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrY2FsbG9jKS4KKyAqCisgKiBrbWFsbG9jIGlzIHRoZSBub3JtYWwgbWV0aG9kIG9mIGFsbG9jYXRpbmcgbWVtb3J5CisgKiBpbiB0aGUga2VybmVsLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBfX2ttYWxsb2Nfbm9kZShzaXplLCBmbGFncywgLTEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCisvKioKKyAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga2NhbGxvYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NMT0JfREVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCA2MjA3YTNkLi4wN2Y3ZTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xNiw3ICsxNiw5IEBACiAJdW5zaWduZWQgbG9uZyBucl9wYXJ0aWFsOwogCWF0b21pY19sb25nX3QgbnJfc2xhYnM7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXJ0aWFsOworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCiAJc3RydWN0IGxpc3RfaGVhZCBmdWxsOworI2VuZGlmCiB9OwogCiAvKgpAQCAtNDQsNyArNDYsOSBAQAogCWludCBhbGlnbjsJCS8qIEFsaWdubWVudCAqLwogCWNvbnN0IGNoYXIgKm5hbWU7CS8qIE5hbWUgKG9ubHkgZm9yIGRpc3BsYXkhKSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogTGlzdCBvZiBzbGFiIGNhY2hlcyAqLworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCiAJc3RydWN0IGtvYmplY3Qga29iajsJLyogRm9yIHN5c2ZzICovCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJaW50IGRlZnJhZ19yYXRpbzsKQEAgLTE1OSwxNyArMTYzLDggQEAKICNkZWZpbmUgU0xVQl9ETUEgMAogI2VuZGlmCiAKLQotLyoKLSAqIFpFUk9fU0laRV9QVFIgd2lsbCBiZSByZXR1cm5lZCBmb3IgemVybyBzaXplZCBrbWFsbG9jIHJlcXVlc3RzLgotICoKLSAqIERlcmVmZXJlbmNpbmcgWkVST19TSVpFX1BUUiB3aWxsIGxlYWQgdG8gYSBkaXN0aW5jdCBhY2Nlc3MgZmF1bHQuCi0gKgotICogWkVST19TSVpFX1BUUiBjYW4gYmUgcGFzc2VkIHRvIGtmcmVlIHRob3VnaCBpbiB0aGUgc2FtZSB3YXkgdGhhdCBOVUxMIGNhbi4KLSAqIEJvdGggbWFrZSBrZnJlZSBhIG5vLW9wLgotICovCi0jZGVmaW5lIFpFUk9fU0laRV9QVFIgKCh2b2lkICopMTYpCi0KK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwordm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7CkBAIC0xODQsMjEgKzE3OSw5IEBACiAJCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSAmJiAhKGZsYWdzICYgU0xVQl9ETUEpKSB7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICpzID0ga21hbGxvY19zbGFiKHNpemUpOwotCi0JCWlmICghcykKLQkJCXJldHVybiBaRVJPX1NJWkVfUFRSOwotCi0JCXJldHVybiBrbWVtX2NhY2hlX3phbGxvYyhzLCBmbGFncyk7Ci0JfSBlbHNlCi0JCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiB2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKK3ZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NtcF9sb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NtcF9sb2NrLmgKaW5kZXggY2Y3MTVhNC4uNTg5NjJjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oCisrKyBiL2luY2x1ZGUvbGludXgvc21wX2xvY2suaApAQCAtMyw3ICszLDYgQEAKIAogI2lmZGVmIENPTkZJR19MT0NLX0tFUk5FTAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2RlZmluZSBrZXJuZWxfbG9ja2VkKCkJCShjdXJyZW50LT5sb2NrX2RlcHRoID49IDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ja2V0LmggYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCmluZGV4IGZlMTk1YzkuLmY4NTJlMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMjUzLDYgKzI1Myw5IEBACiAKICNkZWZpbmUgTVNHX0VPRiAgICAgICAgIE1TR19GSU4KIAorI2RlZmluZSBNU0dfQ01TR19DTE9FWEVDIDB4NDAwMDAwMDAJLyogU2V0IGNsb3NlX29uX2V4aXQgZm9yIGZpbGUKKwkJCQkJICAgZGVzY3JpcHRvciByZWNlaXZlZCB0aHJvdWdoCisJCQkJCSAgIFNDTV9SSUdIVFMgKi8KICNpZiBkZWZpbmVkKENPTkZJR19DT01QQVQpCiAjZGVmaW5lIE1TR19DTVNHX0NPTVBBVAkweDgwMDAwMDAwCS8qIFRoaXMgbWVzc2FnZSBuZWVkcyAzMiBiaXQgZml4dXBzICovCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb255cGkuaCBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKaW5kZXggMzRkNGIwNy4uNDBjN2I1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb255cGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCkBAIC0xNTMsOCArMTUzLDYgQEAKICNkZWZpbmUgU09OWVBJX0NPTU1BTkRfR0VUQ0FNRVJBUk9NVkVSU0lPTgkxOAkvKiBvYnNvbGV0ZSAqLwogI2RlZmluZSBTT05ZUElfQ09NTUFORF9HRVRDQU1FUkFSRVZJU0lPTgkxOQkvKiBvYnNvbGV0ZSAqLwogCi1pbnQgc29ueXBpX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSk7Ci0KICNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkJCQkvKiBfU09OWVBJX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCmluZGV4IDFiZTVlYTAuLjMwMmI4MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCkBAIC03Niw2ICs3Niw3IEBACiAjZGVmaW5lCVNQSV9NT0RFXzMJKFNQSV9DUE9MfFNQSV9DUEhBKQogI2RlZmluZQlTUElfQ1NfSElHSAkweDA0CQkJLyogY2hpcHNlbGVjdCBhY3RpdmUgaGlnaD8gKi8KICNkZWZpbmUJU1BJX0xTQl9GSVJTVAkweDA4CQkJLyogcGVyLXdvcmQgYml0cy1vbi13aXJlICovCisjZGVmaW5lCVNQSV8zV0lSRQkweDEwCQkJLyogU0kvU08gc2lnbmFscyBzaGFyZWQgKi8KIAl1OAkJCWJpdHNfcGVyX3dvcmQ7CiAJaW50CQkJaXJxOwogCXZvaWQJCQkqY29udHJvbGxlcl9zdGF0ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCmluZGV4IDlkYmNhNjIuLmI4ZGIzMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaApAQCAtMjYsNiArMjYsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CiAJdTgJCQlidXN5OwogCXU4CQkJdXNlX2RtYTsKKwl1OAkJCWZsYWdzOwkJLyogZXh0cmEgc3BpLT5tb2RlIHN1cHBvcnQgKi8KIAogCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3RsZTYyeDAuaCBiL2luY2x1ZGUvbGludXgvc3BpL3RsZTYyeDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI1OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvdGxlNjJ4MC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiB0bGU2MngwLmggLSBwbGF0Zm9ybSBnbHVlIHRvIEluZmluZW9uIFRMRTYyeDAgZHJpdmVyIGNoaXBzCisgKgorICogQ29weXJpZ2h0IDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworc3RydWN0IHRsZTYyeDBfcGRhdGEgeworCXVuc2lnbmVkIGludAkJaW5pdF9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCWdwaW9fY291bnQ7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCmluZGV4IGE5NDYxNzYuLmMzNzZmM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKQEAgLTI4Miw2ICsyODIsMTMgQEAKIAkxIDogKHsgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAwOyB9KTsgXAogfSkKIAorI2RlZmluZSB3cml0ZV90cnlsb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpIFwKKyh7IFwKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKKwl3cml0ZV90cnlsb2NrKGxvY2spID8gXAorCTEgOiAoeyBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IDA7IH0pOyBcCit9KQorCiAvKgogICogTG9ja3MgdHdvIHNwaW5sb2NrcyBsMSBhbmQgbDIuCiAgKiBsMV9maXJzdCBpbmRpY2F0ZXMgaWYgc3BpbmxvY2sgbDEgc2hvdWxkIGJlIHRha2VuIGZpcnN0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oCmluZGV4IGJiYWMxMDEuLjQ1OWM1ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmgKQEAgLTU4LDYgKzU4LDcgQEAKIHUzMiBnc3NfZGVsZXRlX3NlY19jb250ZXh0KAogCQlzdHJ1Y3QgZ3NzX2N0eAkJKipjdHhfaWQpOwogCit1MzIgZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3Ioc3RydWN0IGdzc19hcGlfbWVjaCAqLCB1MzIgc2VydmljZSk7CiB1MzIgZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKHN0cnVjdCBnc3NfYXBpX21lY2ggKiwgdTMyIHBzZXVkb2ZsYXZvcik7CiBjaGFyICpnc3Nfc2VydmljZV90b19hdXRoX2RvbWFpbl9uYW1lKHN0cnVjdCBnc3NfYXBpX21lY2ggKiwgdTMyIHNlcnZpY2UpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IDEyOWQ1MGYuLjg1MzFhNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC0yMTIsNiArMjEyLDcgQEAKIAlzdHJ1Y3Qgc3ZjX3Bvb2wgKglycV9wb29sOwkvKiB0aHJlYWQgcG9vbCAqLwogCXN0cnVjdCBzdmNfcHJvY2VkdXJlICoJcnFfcHJvY2luZm87CS8qIHByb2NlZHVyZSBpbmZvICovCiAJc3RydWN0IGF1dGhfb3BzICoJcnFfYXV0aG9wOwkvKiBhdXRoZW50aWNhdGlvbiBmbGF2b3VyICovCisJdTMyCQkJcnFfZmxhdm9yOwkvKiBwc2V1ZG9mbGF2b3IgKi8KIAlzdHJ1Y3Qgc3ZjX2NyZWQJCXJxX2NyZWQ7CS8qIGF1dGggaW5mbyAqLwogCXN0cnVjdCBza19idWZmICoJcnFfc2tidWZmOwkvKiBmYXN0IHJlY3YgaW5ldCBidWZmZXIgKi8KIAlzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSpycV9kZWZlcnJlZDsJLyogZGVmZXJyZWQgcmVxdWVzdCB3ZSBhcmUgcmVwbGF5aW5nICovCkBAIC0yNDgsNiArMjQ5LDcgQEAKIAkJCQkJCSAqLwogCS8qIENhdGVyaW5nIHRvIG5mc2QgKi8KIAlzdHJ1Y3QgYXV0aF9kb21haW4gKglycV9jbGllbnQ7CS8qIFJQQyBwZWVyIGluZm8gKi8KKwlzdHJ1Y3QgYXV0aF9kb21haW4gKglycV9nc3NjbGllbnQ7CS8qICJnc3MvIi1zdHlsZSBwZWVyIGluZm8gKi8KIAlzdHJ1Y3Qgc3ZjX2NhY2hlcmVwICoJcnFfY2FjaGVyZXA7CS8qIGNhY2hlIGluZm8gKi8KIAlzdHJ1Y3Qga25mc2RfZmggKglycV9yZWZmaDsJLyogUmVmZXJyZW5jZSBmaWxlaGFuZGxlLCB1c2VkIHRvCiAJCQkJCQkgKiBkZXRlcm1pbmUgd2hhdCBkZXZpY2UgbnVtYmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoLmgKaW5kZXggZGU5MjYxOS4uMjJlMWVmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaApAQCAtMTI3LDYgKzEyNyw3IEBACiBleHRlcm4gaW50IGF1dGhfdW5peF9mb3JnZXRfb2xkKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKTsKIGV4dGVybiB2b2lkIHN2Y2F1dGhfdW5peF9wdXJnZSh2b2lkKTsKIGV4dGVybiB2b2lkIHN2Y2F1dGhfdW5peF9pbmZvX3JlbGVhc2Uodm9pZCAqKTsKK2V4dGVybiBpbnQgc3ZjYXV0aF91bml4X3NldF9jbGllbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCk7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoX3N0cihjaGFyICpuYW1lLCBpbnQgYml0cykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oCmluZGV4IDVhNWRiMTYuLjQxN2ExZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaApAQCAtMjIsNiArMjIsNyBAQAogaW50IGdzc19zdmNfaW5pdCh2b2lkKTsKIHZvaWQgZ3NzX3N2Y19zaHV0ZG93bih2b2lkKTsKIGludCBzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IodTMyIHBzZXVkb2ZsYXZvciwgY2hhciAqIG5hbWUpOwordTMyIHN2Y2F1dGhfZ3NzX2ZsYXZvcihzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX1NVTlJQQ19TVkNBVVRIX0dTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDAwNjg2ODguLjY2NWY4NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0xODgsNyArMTg4LDggQEAKIGV4dGVybiB2b2lkIHN3YXBfc2V0dXAodm9pZCk7CiAKIC8qIGxpbnV4L21tL3Ztc2Nhbi5jICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKiwgZ2ZwX3QpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKip6b25lcywgaW50IG9yZGVyLAorCQkJCQlnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBzaHJpbmtfYWxsX21lbW9yeSh1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTsKIGV4dGVybiBpbnQgdm1fc3dhcHBpbmVzczsKIGV4dGVybiBpbnQgcmVtb3ZlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmggYi9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oCmluZGV4IGE0NjEwNGEuLmRjZTFlZDIwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oCkBAIC0zMSw3ICszMSw3IEBACiAgKi8KIAogCi0jZGVmaW5lIFRBU0tTVEFUU19WRVJTSU9OCTQKKyNkZWZpbmUgVEFTS1NUQVRTX1ZFUlNJT04JNQogI2RlZmluZSBUU19DT01NX0xFTgkJMzIJLyogc2hvdWxkIGJlID49IFRBU0tfQ09NTV9MRU4KIAkJCQkJICogaW4gbGludXgvc2NoZWQuaCAqLwogCkBAIC0xNDksNiArMTQ5LDkgQEAKIAlfX3U2NAlyZWFkX2J5dGVzOwkJLyogYnl0ZXMgb2YgcmVhZCBJL08gKi8KIAlfX3U2NAl3cml0ZV9ieXRlczsJCS8qIGJ5dGVzIG9mIHdyaXRlIEkvTyAqLwogCV9fdTY0CWNhbmNlbGxlZF93cml0ZV9ieXRlczsJLyogYnl0ZXMgb2YgY2FuY2VsbGVkIHdyaXRlIEkvTyAqLworCisJX191NjQgIG52Y3N3OwkJCS8qIHZvbHVudGFyeV9jdHh0X3N3aXRjaGVzICovCisJX191NjQgIG5pdmNzdzsJCQkvKiBub252b2x1bnRhcnlfY3R4dF9zd2l0Y2hlcyAqLwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGRkYTliZTYuLmVjM2IwY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0zNiw3ICszNiw4IEBACiAjZGVmaW5lIE5TRUNfUEVSX1NFQwkxMDAwMDAwMDAwTAogI2RlZmluZSBGU0VDX1BFUl9TRUMJMTAwMDAwMDAwMDAwMDAwMEwKIAotc3RhdGljIGlubGluZSBpbnQgdGltZXNwZWNfZXF1YWwoc3RydWN0IHRpbWVzcGVjICphLCBzdHJ1Y3QgdGltZXNwZWMgKmIpCitzdGF0aWMgaW5saW5lIGludCB0aW1lc3BlY19lcXVhbChjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmIpCiB7CiAJcmV0dXJuIChhLT50dl9zZWMgPT0gYi0+dHZfc2VjKSAmJiAoYS0+dHZfbnNlYyA9PSBiLT50dl9uc2VjKTsKIH0KQEAgLTExNiw2ICsxMTcsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBhbGFybV9zZXRpdGltZXIodW5zaWduZWQgaW50IHNlY29uZHMpOwogZXh0ZXJuIGludCBkb19nZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSk7CiBleHRlcm4gdm9pZCBnZXRuc3RpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KTsKK2V4dGVybiB2b2lkIGdldGJvb3R0aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHMpOworZXh0ZXJuIHZvaWQgbW9ub3RvbmljX3RvX2Jvb3RiYXNlZChzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKIAogZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyB0aW1lc3BlY190cnVuYyhzdHJ1Y3QgdGltZXNwZWMgdCwgdW5zaWduZWQgZ3Jhbik7CiBleHRlcm4gaW50IHRpbWVrZWVwaW5nX2lzX2NvbnRpbnVvdXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKaW5kZXggYzY2MTcxMC4uNzhjZjg5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXIuaApAQCAtMyw3ICszLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAKIHN0cnVjdCB0dmVjX3RfYmFzZV9zOwpAQCAtOTEsMTYgKzkwLDEzIEBACiAgKi8KICNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKIAorI2RlZmluZSBUSU1FUl9TVEFUU19GTEFHX0RFRkVSUkFCTEUJMHgxCisKIGV4dGVybiB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCk7CiAKIGV4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCi0JCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQotewotCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCi0JCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0pOwotfQorCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICpjb21tLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHRpbWVyX2ZsYWcpOwogCiBleHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKIAkJCQkJICAgICAgIHZvaWQgKmFkZHIpOwpAQCAtMTE5LDEwICsxMTUsNiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c190aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eS5oIGIvaW5jbHVkZS9saW51eC90dHkuaAppbmRleCBiYjQ1NzYwLi42OTFhMTc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTE3OCw2ICsxNzgsNyBAQAogI2RlZmluZSBMX0lFWFRFTih0dHkpCV9MX0ZMQUcoKHR0eSksSUVYVEVOKQogCiBzdHJ1Y3QgZGV2aWNlOworc3RydWN0IHNpZ25hbF9zdHJ1Y3Q7CiAvKgogICogV2hlcmUgYWxsIG9mIHRoZSBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggYSB0dHkgaXMga2VwdCB3aGlsZSB0aGUgdHR5CiAgKiBpcyBvcGVuLiAgU2luY2UgdGhlIHRlcm1pb3Mgc3RhdGUgc2hvdWxkIGJlIGtlcHQgZXZlbiBpZiB0aGUgdHR5CkBAIC0zMTAsNiArMzExLDcgQEAKIGV4dGVybiB2b2lkIHR0eV92aGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKIGV4dGVybiB2b2lkIHR0eV91bmhhbmd1cChzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gaW50IHR0eV9odW5nX3VwX3Aoc3RydWN0IGZpbGUgKiBmaWxwKTsKK2V4dGVybiBpbnQgaXNfdHR5KHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiB2b2lkIGRvX1NBSyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIF9fZG9fU0FLKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIHZvaWQgZGlzYXNzb2NpYXRlX2N0dHkoaW50IHByaXYpOwpAQCAtMzM4LDkgKzM0MCw0NiBAQAogCiBleHRlcm4gc3RydWN0IG11dGV4IHR0eV9tdXRleDsKIAorZXh0ZXJuIHZvaWQgdHR5X3dyaXRlX3VubG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBpbnQgdHR5X3dyaXRlX2xvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IG5kZWxheSk7CisjZGVmaW5lIHR0eV9pc193cml0ZWxvY2tlZCh0dHkpICAobXV0ZXhfaXNfbG9ja2VkKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkKKworCisKIC8qIG5fdHR5LmMgKi8KIGV4dGVybiBzdHJ1Y3QgdHR5X2xkaXNjIHR0eV9sZGlzY19OX1RUWTsKIAorLyogdHR5X2F1ZGl0LmMgKi8KKyNpZmRlZiBDT05GSUdfQVVESVQKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9hZGRfZGF0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9leGl0KHZvaWQpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X2Zvcmsoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfcHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9wdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVpZF90IGxvZ2ludWlkKTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9vcGVuaW5nKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfYWRkX2RhdGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfZXhpdCh2b2lkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9mb3JrKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X3B1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfcHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1aWRfdCBsb2dpbnVpZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfb3BlbmluZyh2b2lkKQoreworfQorI2VuZGlmCisKIC8qIHR0eV9pb2N0bC5jICovCiBleHRlcm4gaW50IG5fdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vpby5oIGIvaW5jbHVkZS9saW51eC91aW8uaAppbmRleCA5YWY4YmJjLi5iN2ZlMTM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlvLmgKQEAgLTEzLDEwICsxMyw2IEBACiAgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0KLS8qIEEgd29yZCBvZiB3YXJuaW5nOiBPdXIgdWlvIHN0cnVjdHVyZSB3aWxsIGNsYXNoIHdpdGggdGhlIEMgbGlicmFyeSBvbmUgKHdoaWNoIGlzIG5vdyBvYnNvbGV0ZSkuIFJlbW92ZSB0aGUgQwotICAgbGlicmFyeSBvbmUgZnJvbSBzeXMvdWlvLmggaWYgeW91IGhhdmUgYSB2ZXJ5IG9sZCBsaWJyYXJ5IHNldCAqLwotCiBzdHJ1Y3QgaW92ZWMKIHsKIAl2b2lkIF9fdXNlciAqaW92X2Jhc2U7CS8qIEJTRCB1c2VzIGNhZGRyX3QgKDEwMDMuMWcgcmVxdWlyZXMgdm9pZCAqKSAqLwpAQCAtMzgsMTEgKzM0LDYgQEAKICAKICNkZWZpbmUgVUlPX0ZBU1RJT1YJOAogI2RlZmluZSBVSU9fTUFYSU9WCTEwMjQKLSNpZiAwCi0jZGVmaW5lIFVJT19NQVhJT1YJMTYJLyogTWF4aW11bSBpb3ZlYydzIGluIG9uZSBvcGVyYXRpb24gCi0JCQkJICAgMTYgbWF0Y2hlcyBCU0QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmVnIHBhcmRvbjogQlNEIGhhcyAxMDI0IC0tQU5LICovCi0jZW5kaWYKIAogLyoKICAqIFRvdGFsIG51bWJlciBvZiBieXRlcyBjb3ZlcmVkIGJ5IGFuIGlvdmVjLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzIwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfTElOVVhfVVNFUl9OQU1FU1BBQ0VfSAorI2RlZmluZSBfTElOVVhfVVNFUl9OQU1FU1BBQ0VfSAorCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjZGVmaW5lIFVJREhBU0hfQklUUwkoQ09ORklHX0JBU0VfU01BTEwgPyAzIDogOCkKKyNkZWZpbmUgVUlESEFTSF9TWgkoMSA8PCBVSURIQVNIX0JJVFMpCisKK3N0cnVjdCB1c2VyX25hbWVzcGFjZSB7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJc3RydWN0IGxpc3RfaGVhZAl1aWRoYXNoX3RhYmxlW1VJREhBU0hfU1pdOworCXN0cnVjdCB1c2VyX3N0cnVjdAkqcm9vdF91c2VyOworfTsKKworZXh0ZXJuIHN0cnVjdCB1c2VyX25hbWVzcGFjZSBpbml0X3VzZXJfbnM7CisKKyNpZmRlZiBDT05GSUdfVVNFUl9OUworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqZ2V0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlpZiAobnMpCisJCWtyZWZfZ2V0KCZucy0+a3JlZik7CisJcmV0dXJuIG5zOworfQorCitleHRlcm4gc3RydWN0IHVzZXJfbmFtZXNwYWNlICpjb3B5X3VzZXJfbnMoaW50IGZsYWdzLAorCQkJCQkgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm9sZF9ucyk7CitleHRlcm4gdm9pZCBmcmVlX3VzZXJfbnMoc3RydWN0IGtyZWYgKmtyZWYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlpZiAobnMpCisJCWtyZWZfcHV0KCZucy0+a3JlZiwgZnJlZV91c2VyX25zKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmdldF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJcmV0dXJuICZpbml0X3VzZXJfbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpjb3B5X3VzZXJfbnMoaW50IGZsYWdzLAorCQkJCQkJICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm9sZF9ucykKK3sKKwlpZiAoZmxhZ3MgJiBDTE9ORV9ORVdVU0VSKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfVVNFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaCBiL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCmluZGV4IGY4ZDNiMzIuLjkyM2RiOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCkBAIC00OCwyNiArNDgsMTQgQEAKIAlrcmVmX2dldCgmbnMtPmtyZWYpOwogfQogCi0jaWZkZWYgQ09ORklHX1VUU19OUwotZXh0ZXJuIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUoaW50IGZsYWdzLCBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpOworZXh0ZXJuIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUodW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkJc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKTsKIGV4dGVybiB2b2lkIGZyZWVfdXRzX25zKHN0cnVjdCBrcmVmICprcmVmKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF91dHNfbnMoc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKQogewogCWtyZWZfcHV0KCZucy0+a3JlZiwgZnJlZV91dHNfbnMpOwogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZShpbnQgZmxhZ3MsCi0JCQkJCQlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCi17Ci0JcmV0dXJuIG5zOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X3V0c19ucyhzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCi17Ci19Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV3X3V0c25hbWUgKnV0c25hbWUodm9pZCkKIHsKIAlyZXR1cm4gJmN1cnJlbnQtPm5zcHJveHktPnV0c19ucy0+bmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKaW5kZXggNGI3ZWU4My4uMTMyYjI2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKQEAgLTY1LDkgKzY1LDEwIEBACiAJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IG5vZGUsCiAJCQkJCSAgZ2ZwX3QgZ2ZwX21hc2spOwogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKnJlbW92ZV92bV9hcmVhKHZvaWQgKmFkZHIpOworCiBleHRlcm4gaW50IG1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIHBncHJvdF90IHByb3QsCiAJCQlzdHJ1Y3QgcGFnZSAqKipwYWdlcyk7Ci1leHRlcm4gdm9pZCB1bm1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEpOworZXh0ZXJuIHZvaWQgdW5tYXBfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogLyoKICAqCUludGVybmFscy4gIERvbnQndCB1c2UuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bXN0YXQuaCBiL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKaW5kZXggZDkzMjVjZi4uNzUzNzBlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bXN0YXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIEhJR0hNRU1fWk9ORSh4eCkKICNlbmRpZgogCi0jZGVmaW5lIEZPUl9BTExfWk9ORVMoeHgpIERNQV9aT05FKHh4KSBETUEzMl9aT05FKHh4KSB4eCMjX05PUk1BTCBISUdITUVNX1pPTkUoeHgpCisjZGVmaW5lIEZPUl9BTExfWk9ORVMoeHgpIERNQV9aT05FKHh4KSBETUEzMl9aT05FKHh4KSB4eCMjX05PUk1BTCBISUdITUVNX1pPTkUoeHgpICwgeHgjI19NT1ZBQkxFCiAKIGVudW0gdm1fZXZlbnRfaXRlbSB7IFBHUEdJTiwgUEdQR09VVCwgUFNXUElOLCBQU1dQT1VULAogCQlGT1JfQUxMX1pPTkVTKFBHQUxMT0MpLApAQCAtMTcwLDcgKzE3MCw4IEBACiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAkJem9uZV9wYWdlX3N0YXRlKCZ6b25lc1taT05FX0hJR0hNRU1dLCBpdGVtKSArCiAjZW5kaWYKLQkJem9uZV9wYWdlX3N0YXRlKCZ6b25lc1taT05FX05PUk1BTF0sIGl0ZW0pOworCQl6b25lX3BhZ2Vfc3RhdGUoJnpvbmVzW1pPTkVfTk9STUFMXSwgaXRlbSkgKworCQl6b25lX3BhZ2Vfc3RhdGUoJnpvbmVzW1pPTkVfTU9WQUJMRV0sIGl0ZW0pOwogfQogCiBleHRlcm4gdm9pZCB6b25lX3N0YXRpc3RpY3Moc3RydWN0IHpvbmVsaXN0ICosIHN0cnVjdCB6b25lICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92dF9rZXJuLmggYi9pbmNsdWRlL2xpbnV4L3Z0X2tlcm4uaAppbmRleCBkOTYxNjM1Li42OTliN2U5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Z0X2tlcm4uaAorKysgYi9pbmNsdWRlL2xpbnV4L3Z0X2tlcm4uaApAQCAtNzUsNiArNzUsOCBAQAogaW50IHZ0X3dhaXRhY3RpdmUoaW50IHZ0KTsKIHZvaWQgY2hhbmdlX2NvbnNvbGUoc3RydWN0IHZjX2RhdGEgKm5ld192Yyk7CiB2b2lkIHJlc2V0X3ZjKHN0cnVjdCB2Y19kYXRhICp2Yyk7CitleHRlcm4gaW50IHVuYmluZF9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LAorCQkJICAgICBpbnQgZGVmbHQpOwogCiAvKgogICogdmNfc2NyZWVuLmMgc2hhcmVzIHRoaXMgdGVtcG9yYXJ5IGJ1ZmZlciB3aXRoIHRoZSBjb25zb2xlIHdyaXRlIGNvZGUgc28gdGhhdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaCBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKaW5kZXggY2UwNzE5YS4uY2U2YmFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCkBAIC0xNDgsNyArMTQ4LDcgQEAKIGV4dGVybiB2b2lkIGluaXRfd29ya3F1ZXVlcyh2b2lkKTsKIGludCBleGVjdXRlX2luX3Byb2Nlc3NfY29udGV4dCh3b3JrX2Z1bmNfdCBmbiwgc3RydWN0IGV4ZWN1dGVfd29yayAqKTsKIAotZXh0ZXJuIHZvaWQgY2FuY2VsX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuIGludCBjYW5jZWxfd29ya19zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qCiAgKiBLaWxsIG9mZiBhIHBlbmRpbmcgc2NoZWR1bGVfZGVsYXllZF93b3JrKCkuICBOb3RlIHRoYXQgdGhlIHdvcmsgY2FsbGJhY2sKQEAgLTE2NiwxNCArMTY2LDIxIEBACiAJcmV0dXJuIHJldDsKIH0KIAotZXh0ZXJuIHZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKTsKK2V4dGVybiBpbnQgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspOwogCi0vKiBPYnNvbGV0ZS4gdXNlIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoKSAqLworLyogT2Jzb2xldGUuIHVzZSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoKSAqLwogc3RhdGljIGlubGluZQogdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAogCQkJCQlzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKQogewotCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsod29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHdvcmspOworfQorCisvKiBPYnNvbGV0ZS4gdXNlIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygpICovCitzdGF0aWMgaW5saW5lCit2b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod29yayk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NtLmggYi9pbmNsdWRlL25ldC9zY20uaAppbmRleCA1NjM3ZDVlLi40MjNjYjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY20uaAorKysgYi9pbmNsdWRlL25ldC9zY20uaApAQCAtOCw3ICs4LDcgQEAKIC8qIFdlbGwsIHdlIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBkZXNjcmlwdG9yIG9wZW4KICAqIHRvIGFjY2VwdCBwYXNzZWQgRkRzIDgpCiAgKi8KLSNkZWZpbmUgU0NNX01BWF9GRAkoT1BFTl9NQVgtMSkKKyNkZWZpbmUgU0NNX01BWF9GRAkyNTUKIAogc3RydWN0IHNjbV9mcF9saXN0CiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3RnYWZiLmggYi9pbmNsdWRlL3ZpZGVvL3RnYWZiLmgKaW5kZXggMDNkMGRiZS4uN2JjNWUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby90Z2FmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vdGdhZmIuaApAQCAtMjE2LDYgKzIxNiw3IEBACiAJdTMyIHBsbF9mcmVxOwkJCS8qIHBpeGNsb2NrIGluIG1oeiAqLwogCXUzMiBiaXRzX3Blcl9waXhlbDsJCS8qIGJpdHMgcGVyIHBpeGVsICovCiAJdTMyIHN5bmNfb25fZ3JlZW47CQkvKiBzZXQgaWYgc3luYyBpcyBvbiBncmVlbiAqLworCXUzMiBwYWxldHRlWzE2XTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGQ5ZDg3OGEuLmUyMDU2ODIgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTEyMCwxNSArMTIwLDYgQEAKIAkgIHNlY3Rpb24gNi40IG9mIHRoZSBMaW51eCBQcm9ncmFtbWVyJ3MgR3VpZGUsIGF2YWlsYWJsZSBmcm9tCiAJICA8aHR0cDovL3d3dy50bGRwLm9yZy9ndWlkZXMuaHRtbD4uCiAKLWNvbmZpZyBJUENfTlMKLQlib29sICJJUEMgTmFtZXNwYWNlcyIKLQlkZXBlbmRzIG9uIFNZU1ZJUEMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBTdXBwb3J0IGlwYyBuYW1lc3BhY2VzLiAgVGhpcyBhbGxvd3MgY29udGFpbmVycywgaS5lLiB2aXJ0dWFsCi0JICBlbnZpcm9ubWVudHMsIHRvIHVzZSBpcGMgbmFtZXNwYWNlcyB0byBwcm92aWRlIGRpZmZlcmVudCBpcGMKLQkgIG9iamVjdHMgZm9yIGRpZmZlcmVudCBzZXJ2ZXJzLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIFNZU1ZJUENfU1lTQ1RMCiAJYm9vbAogCWRlcGVuZHMgb24gU1lTVklQQwpAQCAtMjE4LDEzICsyMDksMTQgQEAKIAogCSAgU2F5IE4gaWYgdW5zdXJlLgogCi1jb25maWcgVVRTX05TCi0JYm9vbCAiVVRTIE5hbWVzcGFjZXMiCitjb25maWcgVVNFUl9OUworCWJvb2wgIlVzZXIgTmFtZXNwYWNlcyAoRVhQRVJJTUVOVEFMKSIKIAlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWhlbHAKLQkgIFN1cHBvcnQgdXRzIG5hbWVzcGFjZXMuICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuCi0JICB2c2VydmVycywgdG8gdXNlIHV0cyBuYW1lc3BhY2VzIHRvIHByb3ZpZGUgZGlmZmVyZW50Ci0JICB1dHMgaW5mbyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuICBJZiB1bnN1cmUsIHNheSBOLgorCSAgU3VwcG9ydCB1c2VyIG5hbWVzcGFjZXMuICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuCisJICB2c2VydmVycywgdG8gdXNlIHVzZXIgbmFtZXNwYWNlcyB0byBwcm92aWRlIGRpZmZlcmVudAorCSAgdXNlciBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBBVURJVAogCWJvb2wgIkF1ZGl0aW5nIHN1cHBvcnQiCkBAIC01NTQsNyArNTQ2LDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJDaG9vc2UgU0xBQiBhbGxvY2F0b3IiCi0JZGVmYXVsdCBTTEFCCisJZGVmYXVsdCBTTFVCCiAJaGVscAogCSAgIFRoaXMgb3B0aW9uIGFsbG93cyB0byBzZWxlY3QgYSBzbGFiIGFsbG9jYXRvci4KIApAQCAtNTc2LDcgKzU2OCw3IEBACiAJICAgYW5kIGhhcyBlbmhhbmNlZCBkaWFnbm9zdGljcy4KIAogY29uZmlnIFNMT0IKLQlkZXBlbmRzIG9uIEVNQkVEREVEICYmICFTUEFSU0VNRU0KKwlkZXBlbmRzIG9uIEVNQkVEREVECiAJYm9vbCAiU0xPQiAoU2ltcGxlIEFsbG9jYXRvcikiCiAJaGVscAogCSAgIFNMT0IgcmVwbGFjZXMgdGhlIFNMQUIgYWxsb2NhdG9yIHdpdGggYSBkcmFzdGljYWxseSBzaW1wbGVyCkBAIC02MDIsOSArNTk0LDcgQEAKIAlkZWZhdWx0IDAgaWYgQkFTRV9GVUxMCiAJZGVmYXVsdCAxIGlmICFCQVNFX0ZVTEwKIAotbWVudSAiTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQiCi0KLWNvbmZpZyBNT0RVTEVTCittZW51Y29uZmlnIE1PRFVMRVMKIAlib29sICJFbmFibGUgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQiCiAJaGVscAogCSAgS2VybmVsIG1vZHVsZXMgYXJlIHNtYWxsIHBpZWNlcyBvZiBjb21waWxlZCBjb2RlIHdoaWNoIGNhbgpAQCAtNjg0LDYgKzY3NCw1IEBACiAJZGVwZW5kcyBvbiAoU01QICYmIE1PRFVMRV9VTkxPQUQpIHx8IEhPVFBMVUdfQ1BVCiAJaGVscAogCSAgTmVlZCBzdG9wX21hY2hpbmUoKSBwcmltaXRpdmUuCi1lbmRtZW51CiAKIHNvdXJjZSAiYmxvY2svS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmMgYi9pbml0L2RvX21vdW50cy5jCmluZGV4IDQ2ZmU0MDcuLjRlZmExZTUgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzLmMKKysrIGIvaW5pdC9kb19tb3VudHMuYwpAQCAtMjUsNiArMjUsNyBAQAogaW50IHJvb3RfbW91bnRmbGFncyA9IE1TX1JET05MWSB8IE1TX1NJTEVOVDsKIGNoYXIgKiBfX2luaXRkYXRhIHJvb3RfZGV2aWNlX25hbWU7CiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIHNhdmVkX3Jvb3RfbmFtZVs2NF07CitzdGF0aWMgaW50IF9faW5pdGRhdGEgcm9vdF93YWl0OwogCiBkZXZfdCBST09UX0RFVjsKIApAQCAtMjE2LDYgKzIxNywxNiBAQAogCiBfX3NldHVwKCJyb290PSIsIHJvb3RfZGV2X3NldHVwKTsKIAorc3RhdGljIGludCBfX2luaXQgcm9vdHdhaXRfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICgqc3RyKQorCQlyZXR1cm4gMDsKKwlyb290X3dhaXQgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJyb290d2FpdCIsIHJvb3R3YWl0X3NldHVwKTsKKwogc3RhdGljIGNoYXIgKiBfX2luaXRkYXRhIHJvb3RfbW91bnRfZGF0YTsKIHN0YXRpYyBpbnQgX19pbml0IHJvb3RfZGF0YV9zZXR1cChjaGFyICpzdHIpCiB7CkBAIC00MzgsMTEgKzQ0OSwyMCBAQAogCQkJcm9vdF9kZXZpY2VfbmFtZSArPSA1OwogCX0KIAotCWlzX2Zsb3BweSA9IE1BSk9SKFJPT1RfREVWKSA9PSBGTE9QUFlfTUFKT1I7Ci0KIAlpZiAoaW5pdHJkX2xvYWQoKSkKIAkJZ290byBvdXQ7CiAKKwkvKiB3YWl0IGZvciBhbnkgYXN5bmNocm9ub3VzIHNjYW5uaW5nIHRvIGNvbXBsZXRlICovCisJaWYgKChST09UX0RFViA9PSAwKSAmJiByb290X3dhaXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGluZyBmb3Igcm9vdCBkZXZpY2UgJXMuLi5cbiIsCisJCQlzYXZlZF9yb290X25hbWUpOworCQl3aGlsZSAoZHJpdmVyX3Byb2JlX2RvbmUoKSAhPSAwIHx8CisJCQkoUk9PVF9ERVYgPSBuYW1lX3RvX2Rldl90KHNhdmVkX3Jvb3RfbmFtZSkpID09IDApCisJCQltc2xlZXAoMTAwKTsKKwl9CisKKwlpc19mbG9wcHkgPSBNQUpPUihST09UX0RFVikgPT0gRkxPUFBZX01BSk9SOworCiAJaWYgKGlzX2Zsb3BweSAmJiByZF9kb2xvYWQgJiYgcmRfbG9hZF9kaXNrKDApKQogCQlST09UX0RFViA9IFJvb3RfUkFNMDsKIApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMgYi9pbml0L2RvX21vdW50c19pbml0cmQuYwppbmRleCBiMjIyY2U5Li5hNmI0YzBjIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50c19pbml0cmQuYworKysgYi9pbml0L2RvX21vdW50c19pbml0cmQuYwpAQCAtNTYsMTIgKzU2LDkgQEAKIAlzeXNfY2hyb290KCIuIik7CiAKIAlwaWQgPSBrZXJuZWxfdGhyZWFkKGRvX2xpbnV4cmMsICIvbGludXhyYyIsIFNJR0NITEQpOwotCWlmIChwaWQgPiAwKSB7Ci0JCXdoaWxlIChwaWQgIT0gc3lzX3dhaXQ0KC0xLCBOVUxMLCAwLCBOVUxMKSkgewotCQkJdHJ5X3RvX2ZyZWV6ZSgpOworCWlmIChwaWQgPiAwKQorCQl3aGlsZSAocGlkICE9IHN5c193YWl0NCgtMSwgTlVMTCwgMCwgTlVMTCkpCiAJCQl5aWVsZCgpOwotCQl9Ci0JfQogCiAJLyogbW92ZSBpbml0cmQgdG8gcm9vdGZzJyAvb2xkICovCiAJc3lzX2ZjaGRpcihvbGRfZmQpOwpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCAwZWIxYzc0Li5kM2JjYjNiIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtMTMyLDIwICsxMzIsOSBAQAogc3RhdGljIGNoYXIgKmV4ZWN1dGVfY29tbWFuZDsKIHN0YXRpYyBjaGFyICpyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZDsKIAorI2lmZGVmIENPTkZJR19TTVAKIC8qIFNldHVwIGNvbmZpZ3VyZWQgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB0byBhY3RpdmF0ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBtYXhfY3B1cyA9IE5SX0NQVVM7Ci0KLS8qCi0gKiBJZiBzZXQsIHRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUgZHJpdmVycyB0aGF0IHJlc2V0IHRoZSB1bmRlcmx5aW5nCi0gKiBkZXZpY2UgYmVmb3JlIGdvaW5nIGFoZWFkIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIG90aGVyd2lzZSBkcml2ZXIgbWlnaHQKLSAqIHJlbHkgb24gdGhlIEJJT1MgYW5kIHNraXAgdGhlIHJlc2V0IG9wZXJhdGlvbi4KLSAqCi0gKiBUaGlzIGlzIHVzZWZ1bCBpZiBrZXJuZWwgaXMgYm9vdGluZyBpbiBhbiB1bnJlbGlhYmxlIGVudmlyb25tZW50LgotICogRm9yIGV4LiBrZHVtcCBzaXR1YWl0b24gd2hlcmUgcHJldmlvdXMga2VybmVsIGhhcyBjcmFzaGVkLCBCSU9TIGhhcyBiZWVuCi0gKiBza2lwcGVkIGFuZCBkZXZpY2VzIHdpbGwgYmUgaW4gdW5rbm93biBzdGF0ZS4KLSAqLwotdW5zaWduZWQgaW50IHJlc2V0X2RldmljZXM7Ci1FWFBPUlRfU1lNQk9MKHJlc2V0X2RldmljZXMpOworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIG1heF9jcHVzID0gTlJfQ1BVUzsKIAogLyoKICAqIFNldHVwIHJvdXRpbmUgZm9yIGNvbnRyb2xsaW5nIFNNUCBhY3RpdmF0aW9uCkBAIC0xNjAsMTAgKzE0OSwxMCBAQAogc3RhdGljIGludCBfX2luaXQgbm9zbXAoY2hhciAqc3RyKQogewogCW1heF9jcHVzID0gMDsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAotX19zZXR1cCgibm9zbXAiLCBub3NtcCk7CitlYXJseV9wYXJhbSgibm9zbXAiLCBub3NtcCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IG1heGNwdXMoY2hhciAqc3RyKQogewpAQCAtMTcyLDYgKzE2MSwyMSBAQAogfQogCiBfX3NldHVwKCJtYXhjcHVzPSIsIG1heGNwdXMpOworI2Vsc2UKKyNkZWZpbmUgbWF4X2NwdXMgTlJfQ1BVUworI2VuZGlmCisKKy8qCisgKiBJZiBzZXQsIHRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUgZHJpdmVycyB0aGF0IHJlc2V0IHRoZSB1bmRlcmx5aW5nCisgKiBkZXZpY2UgYmVmb3JlIGdvaW5nIGFoZWFkIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIG90aGVyd2lzZSBkcml2ZXIgbWlnaHQKKyAqIHJlbHkgb24gdGhlIEJJT1MgYW5kIHNraXAgdGhlIHJlc2V0IG9wZXJhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBpZiBrZXJuZWwgaXMgYm9vdGluZyBpbiBhbiB1bnJlbGlhYmxlIGVudmlyb25tZW50LgorICogRm9yIGV4LiBrZHVtcCBzaXR1YWl0b24gd2hlcmUgcHJldmlvdXMga2VybmVsIGhhcyBjcmFzaGVkLCBCSU9TIGhhcyBiZWVuCisgKiBza2lwcGVkIGFuZCBkZXZpY2VzIHdpbGwgYmUgaW4gdW5rbm93biBzdGF0ZS4KKyAqLwordW5zaWduZWQgaW50IHJlc2V0X2RldmljZXM7CitFWFBPUlRfU1lNQk9MKHJlc2V0X2RldmljZXMpOwogCiBzdGF0aWMgaW50IF9faW5pdCBzZXRfcmVzZXRfZGV2aWNlcyhjaGFyICpzdHIpCiB7CkBAIC0zODUsNiArMzg5LDEwIEBACiB7CiAJdW5zaWduZWQgaW50IGNwdTsKIAorI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwljcHVfcG9zc2libGVfbWFwID0gY3B1X3ByZXNlbnRfbWFwOworI2VuZGlmCisKIAkvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSBpbiB1c2Vyc3BhY2UgLS1SUiAqLwogCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewogCQlpZiAobnVtX29ubGluZV9jcHVzKCkgPj0gbWF4X2NwdXMpCkBAIC00NTMsNyArNDYxLDEwIEBACiAJc3RydWN0IG9ic19rZXJuZWxfcGFyYW0gKnA7CiAKIAlmb3IgKHAgPSBfX3NldHVwX3N0YXJ0OyBwIDwgX19zZXR1cF9lbmQ7IHArKykgewotCQlpZiAocC0+ZWFybHkgJiYgc3RyY21wKHBhcmFtLCBwLT5zdHIpID09IDApIHsKKwkJaWYgKChwLT5lYXJseSAmJiBzdHJjbXAocGFyYW0sIHAtPnN0cikgPT0gMCkgfHwKKwkJICAgIChzdHJjbXAocGFyYW0sICJjb25zb2xlIikgPT0gMCAmJgorCQkgICAgIHN0cmNtcChwLT5zdHIsICJlYXJseWNvbiIpID09IDApCisJCSkgewogCQkJaWYgKHAtPnNldHVwX2Z1bmModmFsKSAhPSAwKQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkgICAgICAgIk1hbGZvcm1lZCBlYXJseSBvcHRpb24gJyVzJ1xuIiwgcGFyYW0pOwpAQCAtNTI2LDYgKzUzNywxMCBAQAogCXNldHVwX2FyY2goJmNvbW1hbmRfbGluZSk7CiAJc2V0dXBfY29tbWFuZF9saW5lKGNvbW1hbmRfbGluZSk7CiAJdW53aW5kX3NldHVwKCk7CisjaWZuZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCWlmIChtYXhfY3B1cyA8IDIpCisJCWNwdV9wb3NzaWJsZV9tYXAgPSBjcHVfb25saW5lX21hcDsKKyNlbmRpZgogCXNldHVwX3Blcl9jcHVfYXJlYXMoKTsKIAlzbXBfcHJlcGFyZV9ib290X2NwdSgpOwkvKiBhcmNoLXNwZWNpZmljIGJvb3QtY3B1IGhvb2tzICovCiAKQEAgLTcyNSw2ICs3NDAsMTUgQEAKIAlkb19pbml0Y2FsbHMoKTsKIH0KIAorc3RhdGljIGludCBfX2luaXRkYXRhIG5vc29mdGxvY2t1cDsKKworc3RhdGljIGludCBfX2luaXQgbm9zb2Z0bG9ja3VwX3NldHVwKGNoYXIgKnN0cikKK3sKKwlub3NvZnRsb2NrdXAgPSAxOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9zb2Z0bG9ja3VwIiwgbm9zb2Z0bG9ja3VwX3NldHVwKTsKKwogc3RhdGljIHZvaWQgX19pbml0IGRvX3ByZV9zbXBfaW5pdGNhbGxzKHZvaWQpCiB7CiAJZXh0ZXJuIGludCBzcGF3bl9rc29mdGlycWQodm9pZCk7CkBAIC03MzQsNyArNzU4LDggQEAKIAltaWdyYXRpb25faW5pdCgpOwogI2VuZGlmCiAJc3Bhd25fa3NvZnRpcnFkKCk7Ci0Jc3Bhd25fc29mdGxvY2t1cF90YXNrKCk7CisJaWYgKCFub3NvZnRsb2NrdXApCisJCXNwYXduX3NvZnRsb2NrdXBfdGFzaygpOwogfQogCiBzdGF0aWMgdm9pZCBydW5faW5pdF9wcm9jZXNzKGNoYXIgKmluaXRfZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9pcGMvbXNnLmMgYi9pcGMvbXNnLmMKaW5kZXggYTM4ODgyNC4uY2JkMjdlNSAxMDA2NDQKLS0tIGEvaXBjL21zZy5jCisrKyBiL2lwYy9tc2cuYwpAQCAtODcsNyArODcsNyBAQAogc3RhdGljIGludCBzeXN2aXBjX21zZ19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCk7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pcGNfaW5pdCBfX21zZ19pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKK3N0YXRpYyB2b2lkIF9fbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQogewogCW5zLT5pZHNbSVBDX01TR19JRFNdID0gaWRzOwogCW5zLT5tc2dfY3RsbWF4ID0gTVNHTUFYOwpAQCAtOTYsNyArOTYsNiBAQAogCWlwY19pbml0X2lkcyhpZHMsIG5zLT5tc2dfY3RsbW5pKTsKIH0KIAotI2lmZGVmIENPTkZJR19JUENfTlMKIGludCBtc2dfaW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7CiAJc3RydWN0IGlwY19pZHMgKmlkczsKQEAgLTEyOCw3ICsxMjcsNiBAQAogCWtmcmVlKG5zLT5pZHNbSVBDX01TR19JRFNdKTsKIAlucy0+aWRzW0lQQ19NU0dfSURTXSA9IE5VTEw7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgbXNnX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2lwYy9zZW0uYyBiL2lwYy9zZW0uYwppbmRleCA5OTY0YjIyLi44OWJmZGZmIDEwMDY0NAotLS0gYS9pcGMvc2VtLmMKKysrIGIvaXBjL3NlbS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKICNkZWZpbmUgc2Nfc2Vtb3BtCXNlbV9jdGxzWzJdCiAjZGVmaW5lIHNjX3NlbW1uaQlzZW1fY3Rsc1szXQogCi1zdGF0aWMgdm9pZCBfX2lwY19pbml0IF9fc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQorc3RhdGljIHZvaWQgX19zZW1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCiB7CiAJbnMtPmlkc1tJUENfU0VNX0lEU10gPSBpZHM7CiAJbnMtPnNjX3NlbW1zbCA9IFNFTU1TTDsKQEAgLTEzMiw3ICsxMzIsNiBAQAogCWlwY19pbml0X2lkcyhpZHMsIG5zLT5zY19zZW1tbmkpOwogfQogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwogaW50IHNlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKIAlzdHJ1Y3QgaXBjX2lkcyAqaWRzOwpAQCAtMTY0LDcgKzE2Myw2IEBACiAJa2ZyZWUobnMtPmlkc1tJUENfU0VNX0lEU10pOwogCW5zLT5pZHNbSVBDX1NFTV9JRFNdID0gTlVMTDsKIH0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCBzZW1faW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCAwODUyZjIwLi4yNDJjM2Y2IDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC03Nyw3ICs3Nyw3IEBACiBzdGF0aWMgaW50IHN5c3ZpcGNfc2htX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0KTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2lwY19pbml0IF9fc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQorc3RhdGljIHZvaWQgX19zaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCiB7CiAJbnMtPmlkc1tJUENfU0hNX0lEU10gPSBpZHM7CiAJbnMtPnNobV9jdGxtYXggPSBTSE1NQVg7CkBAIC05OCw3ICs5OCw2IEBACiAJCXNobV9kZXN0cm95KG5zLCBzaHApOwogfQogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwogaW50IHNobV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKIAlzdHJ1Y3QgaXBjX2lkcyAqaWRzOwpAQCAtMTMwLDcgKzEyOSw2IEBACiAJa2ZyZWUobnMtPmlkc1tJUENfU0hNX0lEU10pOwogCW5zLT5pZHNbSVBDX1NITV9JRFNdID0gTlVMTDsKIH0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCBzaG1faW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2lwYy91dGlsLmMgYi9pcGMvdXRpbC5jCmluZGV4IDc1MzZhNzIuLjQ0ZTUxMzUgMTAwNjQ0Ci0tLSBhL2lwYy91dGlsLmMKKysrIGIvaXBjL3V0aWwuYwpAQCAtNTAsNyArNTAsNiBAQAogCX0sCiB9OwogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwogc3RhdGljIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjbG9uZV9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm9sZF9ucykKIHsKIAlpbnQgZXJyOwpAQCAtMTEwLDE0ICsxMDksNiBAQAogCXNobV9leGl0X25zKG5zKTsKIAlrZnJlZShucyk7CiB9Ci0jZWxzZQotc3RydWN0IGlwY19uYW1lc3BhY2UgKmNvcHlfaXBjcyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCi17Ci0JaWYgKGZsYWdzICYgQ0xPTkVfTkVXSVBDKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlyZXR1cm4gbnM7Ci19Ci0jZW5kaWYKIAogLyoqCiAgKglpcGNfaW5pdAktCWluaXRpYWxpc2UgSVBDIHN1YnN5c3RlbQpAQCAtMTQ1LDcgKzEzNiw3IEBACiAgKglhcnJheSBpdHNlbGYuIAogICovCiAgCi12b2lkIF9faXBjX2luaXQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzKiBpZHMsIGludCBzaXplKQordm9pZCBpcGNfaW5pdF9pZHMoc3RydWN0IGlwY19pZHMqIGlkcywgaW50IHNpemUpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2lwYy91dGlsLmggYi9pcGMvdXRpbC5oCmluZGV4IGUzYWEyYzUuLjMzM2U4OTEgMTAwNjQ0Ci0tLSBhL2lwYy91dGlsLmgKKysrIGIvaXBjL3V0aWwuaApAQCAtNDEsMTIgKzQxLDggQEAKIH07CiAKIHN0cnVjdCBzZXFfZmlsZTsKLSNpZmRlZiBDT05GSUdfSVBDX05TCi0jZGVmaW5lIF9faXBjX2luaXQKLSNlbHNlCi0jZGVmaW5lIF9faXBjX2luaXQJX19pbml0Ci0jZW5kaWYKLXZvaWQgX19pcGNfaW5pdCBpcGNfaW5pdF9pZHMoc3RydWN0IGlwY19pZHMgKmlkcywgaW50IHNpemUpOworCit2b2lkIGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyAqaWRzLCBpbnQgc2l6ZSk7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHZvaWQgX19pbml0IGlwY19pbml0X3Byb2NfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmhlYWRlciwKIAkJaW50IGlkcywgaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKikpOwpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDY0MmQ0MjcuLjJhOTk5ODMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTQsMTEgKzQsMTIgQEAKIAogb2JqLXkgICAgID0gc2NoZWQubyBmb3JrLm8gZXhlY19kb21haW4ubyBwYW5pYy5vIHByaW50ay5vIHByb2ZpbGUubyBcCiAJICAgIGV4aXQubyBpdGltZXIubyB0aW1lLm8gc29mdGlycS5vIHJlc291cmNlLm8gXAotCSAgICBzeXNjdGwubyBjYXBhYmlsaXR5Lm8gcHRyYWNlLm8gdGltZXIubyB1c2VyLm8gXAorCSAgICBzeXNjdGwubyBjYXBhYmlsaXR5Lm8gcHRyYWNlLm8gdGltZXIubyB1c2VyLm8gdXNlcl9uYW1lc3BhY2UubyBcCiAJICAgIHNpZ25hbC5vIHN5cy5vIGttb2QubyB3b3JrcXVldWUubyBwaWQubyBcCiAJICAgIHJjdXBkYXRlLm8gZXh0YWJsZS5vIHBhcmFtcy5vIHBvc2l4LXRpbWVycy5vIFwKIAkgICAga3RocmVhZC5vIHdhaXQubyBrZmlmby5vIHN5c19uaS5vIHBvc2l4LWNwdS10aW1lcnMubyBtdXRleC5vIFwKLQkgICAgaHJ0aW1lci5vIHJ3c2VtLm8gbGF0ZW5jeS5vIG5zcHJveHkubyBzcmN1Lm8gZGllX25vdGlmaWVyLm8KKwkgICAgaHJ0aW1lci5vIHJ3c2VtLm8gbGF0ZW5jeS5vIG5zcHJveHkubyBzcmN1Lm8gZGllX25vdGlmaWVyLm8gXAorCSAgICB1dHNuYW1lLm8KIAogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpICs9IHN0YWNrdHJhY2Uubwogb2JqLXkgKz0gdGltZS8KQEAgLTQ4LDcgKzQ5LDYgQEAKIG9iai0kKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUKSArPSByY3V0b3J0dXJlLm8KIG9iai0kKENPTkZJR19SRUxBWSkgKz0gcmVsYXkubwogb2JqLSQoQ09ORklHX1NZU0NUTCkgKz0gdXRzbmFtZV9zeXNjdGwubwotb2JqLSQoQ09ORklHX1VUU19OUykgKz0gdXRzbmFtZS5vCiBvYmotJChDT05GSUdfVEFTS19ERUxBWV9BQ0NUKSArPSBkZWxheWFjY3Qubwogb2JqLSQoQ09ORklHX1RBU0tTVEFUUykgKz0gdGFza3N0YXRzLm8gdHNhY2N0Lm8KIApkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmMgYi9rZXJuZWwvYXVkaXQuYwppbmRleCBkMTMyNzZkLi5lYjBmOTE2IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuYworKysgYi9rZXJuZWwvYXVkaXQuYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbGludXguaD4KICNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogCiAjaW5jbHVkZSAiYXVkaXQuaCIKIApAQCAtMzkxLDYgKzM5Miw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlza2IgPSBza2JfZGVxdWV1ZSgmYXVkaXRfc2tiX3F1ZXVlKTsKIAkJd2FrZV91cCgmYXVkaXRfYmFja2xvZ193YWl0KTsKQEAgLTQyMyw2ICs0MjUsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdWRpdF9wcmVwYXJlX3VzZXJfdHR5KHBpZF90IHBpZCwgdWlkX3QgbG9naW51aWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJaW50IGVycjsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJdHNrID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCWVyciA9IC1FU1JDSDsKKwlpZiAoIXRzaykKKwkJZ290byBvdXQ7CisJZXJyID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKCF0c2stPnNpZ25hbC0+YXVkaXRfdHR5KQorCQllcnIgPSAtRVBFUk07CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJdHR5X2F1ZGl0X3B1c2hfdGFzayh0c2ssIGxvZ2ludWlkKTsKK291dDoKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKwogaW50IGF1ZGl0X3NlbmRfbGlzdCh2b2lkICpfZGVzdCkKIHsKIAlzdHJ1Y3QgYXVkaXRfbmV0bGlua19saXN0ICpkZXN0ID0gX2Rlc3Q7CkBAIC01MTEsNiArNTM4LDggQEAKIAljYXNlIEFVRElUX0RFTDoKIAljYXNlIEFVRElUX0RFTF9SVUxFOgogCWNhc2UgQVVESVRfU0lHTkFMX0lORk86CisJY2FzZSBBVURJVF9UVFlfR0VUOgorCWNhc2UgQVVESVRfVFRZX1NFVDoKIAkJaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9BVURJVF9DT05UUk9MKSkKIAkJCWVyciA9IC1FUEVSTTsKIAkJYnJlYWs7CkBAIC02MjIsNiArNjUxLDExIEBACiAJCWVyciA9IGF1ZGl0X2ZpbHRlcl91c2VyKCZORVRMSU5LX0NCKHNrYiksIG1zZ190eXBlKTsKIAkJaWYgKGVyciA9PSAxKSB7CiAJCQllcnIgPSAwOworCQkJaWYgKG1zZ190eXBlID09IEFVRElUX1VTRVJfVFRZKSB7CisJCQkJZXJyID0gYXVkaXRfcHJlcGFyZV91c2VyX3R0eShwaWQsIGxvZ2ludWlkKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCX0KIAkJCWFiID0gYXVkaXRfbG9nX3N0YXJ0KE5VTEwsIEdGUF9LRVJORUwsIG1zZ190eXBlKTsKIAkJCWlmIChhYikgewogCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsCkBAIC02MzgsOCArNjcyLDE3IEBACiAJCQkJCQkJIiBzdWJqPSVzIiwgY3R4KTsKIAkJCQkJa2ZyZWUoY3R4KTsKIAkJCQl9Ci0JCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBtc2c9JyUuMTAyNHMnIiwKLQkJCQkJIChjaGFyICopZGF0YSk7CisJCQkJaWYgKG1zZ190eXBlICE9IEFVRElUX1VTRVJfVFRZKQorCQkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG1zZz0nJS4xMDI0cyciLAorCQkJCQkJCSAoY2hhciAqKWRhdGEpOworCQkJCWVsc2UgeworCQkJCQlpbnQgc2l6ZTsKKworCQkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG1zZz0iKTsKKwkJCQkJc2l6ZSA9IG5sbXNnX2xlbihubGgpOworCQkJCQlhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoYWIsIHNpemUsCisJCQkJCQkJCSAgICBkYXRhKTsKKwkJCQl9CiAJCQkJYXVkaXRfc2V0X3BpZChhYiwgcGlkKTsKIAkJCQlhdWRpdF9sb2dfZW5kKGFiKTsKIAkJCX0KQEAgLTczMCw2ICs3NzMsNDUgQEAKIAkJCQkwLCAwLCBzaWdfZGF0YSwgc2l6ZW9mKCpzaWdfZGF0YSkgKyBsZW4pOwogCQlrZnJlZShzaWdfZGF0YSk7CiAJCWJyZWFrOworCWNhc2UgQVVESVRfVFRZX0dFVDogeworCQlzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cyBzOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQl0c2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJCWlmICghdHNrKQorCQkJZXJyID0gLUVTUkNIOworCQllbHNlIHsKKwkJCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQlzLmVuYWJsZWQgPSB0c2stPnNpZ25hbC0+YXVkaXRfdHR5ICE9IDA7CisJCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCX0KKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlhdWRpdF9zZW5kX3JlcGx5KE5FVExJTktfQ0Ioc2tiKS5waWQsIHNlcSwgQVVESVRfVFRZX0dFVCwgMCwgMCwKKwkJCQkgJnMsIHNpemVvZihzKSk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElUX1RUWV9TRVQ6IHsKKwkJc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMgKnM7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCisJCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZihzdHJ1Y3QgYXVkaXRfdHR5X3N0YXR1cykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcyA9IGRhdGE7CisJCWlmIChzLT5lbmFibGVkICE9IDAgJiYgcy0+ZW5hYmxlZCAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKCF0c2spCisJCQllcnIgPSAtRVNSQ0g7CisJCWVsc2UgeworCQkJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJCXRzay0+c2lnbmFsLT5hdWRpdF90dHkgPSBzLT5lbmFibGVkICE9IDA7CisJCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCX0KKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0xMTg1LDcgKzEyNjcsNyBAQAogfQogCiAvKioKLSAqIGF1ZGl0X2xvZ19uX3Vuc3RydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycworICogYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nIC0gbG9nIGEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gcmFuZG9tIGNoYXJhY3RlcnMKICAqIEBhYjogYXVkaXRfYnVmZmVyCiAgKiBAbGVuOiBsZW50aCBvZiBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdHJhaWxpbmcgbnVsbCkKICAqIEBzdHJpbmc6IHN0cmluZyB0byBiZSBsb2dnZWQKQEAgLTEyMDEsMjUgKzEyODMsMjQgQEAKIGNvbnN0IGNoYXIgKmF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyhzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgc2l6ZV90IGxlbiwKIAkJCQkJY29uc3QgY2hhciAqc3RyaW5nKQogewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBzdHJpbmc7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKIAotCXdoaWxlICgqcCkgeworCWZvciAocCA9IHN0cmluZzsgcCA8IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3RyaW5nICsgbGVuICYmICpwOyBwKyspIHsKIAkJaWYgKCpwID09ICciJyB8fCAqcCA8IDB4MjEgfHwgKnAgPiAweDdmKSB7CiAJCQlhdWRpdF9sb2dfaGV4KGFiLCBzdHJpbmcsIGxlbik7CiAJCQlyZXR1cm4gc3RyaW5nICsgbGVuICsgMTsKIAkJfQotCQlwKys7CiAJfQogCWF1ZGl0X2xvZ19uX3N0cmluZyhhYiwgbGVuLCBzdHJpbmcpOwogCXJldHVybiBwICsgMTsKIH0KIAogLyoqCi0gKiBhdWRpdF9sb2dfdW5zdHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCisgKiBhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nIC0gbG9nIGEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gcmFuZG9tIGNoYXJhY3RlcnMKICAqIEBhYjogYXVkaXRfYnVmZmVyCiAgKiBAc3RyaW5nOiBzdHJpbmcgdG8gYmUgbG9nZ2VkCiAgKgotICogU2FtZSBhcyBhdWRpdF9sb2dfbl91bnN0cnVzdGVkc3RyaW5nKCksIGV4Y2VwdCB0aGF0IHN0cmxlbiBpcyB1c2VkIHRvCisgKiBTYW1lIGFzIGF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZygpLCBleGNlcHQgdGhhdCBzdHJsZW4gaXMgdXNlZCB0bwogICogZGV0ZXJtaW5lIHN0cmluZyBsZW5ndGguCiAgKi8KIGNvbnN0IGNoYXIgKmF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIGNvbnN0IGNoYXIgKnN0cmluZykKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5oIGIva2VybmVsL2F1ZGl0LmgKaW5kZXggODE1ZDZmNS4uOTU4Nzc0MyAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmgKKysrIGIva2VybmVsL2F1ZGl0LmgKQEAgLTExNSw3ICsxMTUsNiBAQAogZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9zZW5kX3JlcGx5KGludCBwaWQsIGludCBzZXEsIGludCB0eXBlLAogCQkJCQkgICAgIGludCBkb25lLCBpbnQgbXVsdGksCiAJCQkJCSAgICAgdm9pZCAqcGF5bG9hZCwgaW50IHNpemUpOwotZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9sb2dfbG9zdChjb25zdCBjaGFyICptZXNzYWdlKTsKIGV4dGVybiB2b2lkCQkgICAgYXVkaXRfcGFuaWMoY29uc3QgY2hhciAqbWVzc2FnZSk7CiAKIHN0cnVjdCBhdWRpdF9uZXRsaW5rX2xpc3QgewpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggZTM2NDgxZS4uYjc2NDBhNSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC03MSw5ICs3MSw2IEBACiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGF1ZGl0X2ZpbHRlcl9saXN0W107CiAKLS8qIE5vIHN5c2NhbGwgYXVkaXRpbmcgd2lsbCB0YWtlIHBsYWNlIHVubGVzcyBhdWRpdF9lbmFibGVkICE9IDAuICovCi1leHRlcm4gaW50IGF1ZGl0X2VuYWJsZWQ7Ci0KIC8qIEFVRElUX05BTUVTIGlzIHRoZSBudW1iZXIgb2Ygc2xvdHMgd2UgcmVzZXJ2ZSBpbiB0aGUgYXVkaXRfY29udGV4dAogICogZm9yIHNhdmluZyBuYW1lcyBmcm9tIGdldG5hbWUoKS4gKi8KICNkZWZpbmUgQVVESVRfTkFNRVMgICAgMjAKQEAgLTIwNDAsNyArMjAzNyw3IEBACiAKIC8qKgogICogYXVkaXRfY29yZV9kdW1wcyAtIHJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCBwcm9jZXNzZXMgdGhhdCBlbmQgYWJub3JtYWxseQotICogQHNpZzogc2lnbmFsIHZhbHVlCisgKiBAc2lnbnI6IHNpZ25hbCB2YWx1ZQogICoKICAqIElmIGEgcHJvY2VzcyBlbmRzIHdpdGggYSBjb3JlIGR1bXAsIHNvbWV0aGluZyBmaXNoeSBpcyBnb2luZyBvbiBhbmQgd2UKICAqIHNob3VsZCByZWNvcmQgdGhlIGV2ZW50IGZvciBpbnZlc3RpZ2F0aW9uLgpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IGM0ZDEyM2YuLmI0Nzk2ZDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTk4MSwxMCArOTgxLDEwIEBACiAJCW1tYXJyYXkgPSBrbWFsbG9jKG50YXNrcyAqIHNpemVvZigqbW1hcnJheSksIEdGUF9LRVJORUwpOwogCQlpZiAoIW1tYXJyYXkpCiAJCQlnb3RvIGRvbmU7Ci0JCXdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsJCS8qIGJsb2NrIGZvcmsgKi8KKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsJCS8qIGJsb2NrIGZvcmsgKi8KIAkJaWYgKGF0b21pY19yZWFkKCZjcy0+Y291bnQpIDw9IG50YXNrcykKIAkJCWJyZWFrOwkJCQkvKiBnb3QgZW5vdWdoICovCi0JCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwkvKiB0cnkgYWdhaW4gKi8KKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwkJLyogdHJ5IGFnYWluICovCiAJCWtmcmVlKG1tYXJyYXkpOwogCX0KIApAQCAtMTAwNiw3ICsxMDA2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQltbWFycmF5W24rK10gPSBtbTsKIAl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwotCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAogCS8qCiAJICogTm93IHRoYXQgd2UndmUgZHJvcHBlZCB0aGUgdGFza2xpc3Qgc3BpbmxvY2ssIHdlIGNhbgpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggY2E2YTExYi4uZThhZjhkMCAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGFza3N0YXRzX2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KQEAgLTM4Nyw2ICszODgsMTEgQEAKIAkgKiB0aGV5IHdvdWxkIGJlIGxvY2tlZCBpbnRvIG1lbW9yeS4KIAkgKi8KIAlleGl0X21tKGN1cnJlbnQpOworCS8qCisJICogV2UgZG9uJ3Qgd2FudCB0byBoYXZlIFRJRl9GUkVFWkUgc2V0IGlmIHRoZSBzeXN0ZW0td2lkZSBoaWJlcm5hdGlvbgorCSAqIG9yIHN1c3BlbmQgdHJhbnNpdGlvbiBiZWdpbnMgcmlnaHQgbm93LgorCSAqLworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJc2V0X3NwZWNpYWxfcGlkcygxLCAxKTsKIAlwcm9jX2NsZWFyX3R0eShjdXJyZW50KTsKQEAgLTg1OCw2ICs4NjQsMzQgQEAKIAkJcmVsZWFzZV90YXNrKHRzayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKK3N0YXRpYyB2b2lkIGNoZWNrX3N0YWNrX3VzYWdlKHZvaWQpCit7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhsb3dfd2F0ZXJfbG9jayk7CisJc3RhdGljIGludCBsb3dlc3RfdG9fZGF0ZSA9IFRIUkVBRF9TSVpFOworCXVuc2lnbmVkIGxvbmcgKm4gPSBlbmRfb2Zfc3RhY2soY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmcmVlOworCisJd2hpbGUgKCpuID09IDApCisJCW4rKzsKKwlmcmVlID0gKHVuc2lnbmVkIGxvbmcpbiAtICh1bnNpZ25lZCBsb25nKWVuZF9vZl9zdGFjayhjdXJyZW50KTsKKworCWlmIChmcmVlID49IGxvd2VzdF90b19kYXRlKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmxvd193YXRlcl9sb2NrKTsKKwlpZiAoZnJlZSA8IGxvd2VzdF90b19kYXRlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIHVzZWQgZ3JlYXRlc3Qgc3RhY2sgZGVwdGg6ICVsdSBieXRlcyAiCisJCQkJImxlZnRcbiIsCisJCQkJY3VycmVudC0+Y29tbSwgZnJlZSk7CisJCWxvd2VzdF90b19kYXRlID0gZnJlZTsKKwl9CisJc3Bpbl91bmxvY2soJmxvd193YXRlcl9sb2NrKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc3RhY2tfdXNhZ2Uodm9pZCkge30KKyNlbmRpZgorCiBmYXN0Y2FsbCBOT1JFVF9UWVBFIHZvaWQgZG9fZXhpdChsb25nIGNvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwpAQCAtOTM3LDYgKzk3MSw4IEBACiAJaWYgKHVubGlrZWx5KHRzay0+Y29tcGF0X3JvYnVzdF9saXN0KSkKIAkJY29tcGF0X2V4aXRfcm9idXN0X2xpc3QodHNrKTsKICNlbmRpZgorCWlmIChncm91cF9kZWFkKQorCQl0dHlfYXVkaXRfZXhpdCgpOwogCWlmICh1bmxpa2VseSh0c2stPmF1ZGl0X2NvbnRleHQpKQogCQlhdWRpdF9mcmVlKHRzayk7CiAKQEAgLTk0OSw2ICs5ODUsNyBAQAogCWV4aXRfc2VtKHRzayk7CiAJX19leGl0X2ZpbGVzKHRzayk7CiAJX19leGl0X2ZzKHRzayk7CisJY2hlY2tfc3RhY2tfdXNhZ2UoKTsKIAlleGl0X3RocmVhZCgpOwogCWNwdXNldF9leGl0KHRzayk7CiAJZXhpdF9rZXlzKHRzayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCBkYTNhMTU1Li5iYTM5YmRiIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrc3RhdHNfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpAQCAtODk3LDYgKzg5OCw4IEBACiAJfQogCWFjY3RfaW5pdF9wYWNjdCgmc2lnLT5wYWNjdCk7CiAKKwl0dHlfYXVkaXRfZm9yayhzaWcpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyMCw3ICs5MjMsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbmV3X2ZsYWdzID0gcC0+ZmxhZ3M7CiAKLQluZXdfZmxhZ3MgJj0gfihQRl9TVVBFUlBSSVYgfCBQRl9OT0ZSRUVaRSk7CisJbmV3X2ZsYWdzICY9IH5QRl9TVVBFUlBSSVY7CiAJbmV3X2ZsYWdzIHw9IFBGX0ZPUktOT0VYRUM7CiAJaWYgKCEoY2xvbmVfZmxhZ3MgJiBDTE9ORV9QVFJBQ0UpKQogCQlwLT5wdHJhY2UgPSAwOwpAQCAtOTk5LDcgKzEwMDIsNyBAQAogCWlmIChhdG9taWNfcmVhZCgmcC0+dXNlci0+cHJvY2Vzc2VzKSA+PQogCQkJcC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OUFJPQ10ucmxpbV9jdXIpIHsKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCi0JCQkJcC0+dXNlciAhPSAmcm9vdF91c2VyKQorCQkgICAgcC0+dXNlciAhPSBjdXJyZW50LT5uc3Byb3h5LT51c2VyX25zLT5yb290X3VzZXIpCiAJCQlnb3RvIGJhZF9mb3JrX2ZyZWU7CiAJfQogCkBAIC0xMDU5LDYgKzEwNjIsOCBAQAogCiAJcC0+bG9ja19kZXB0aCA9IC0xOwkJLyogLTEgPSBubyBsb2NrICovCiAJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnAtPnN0YXJ0X3RpbWUpOworCXAtPnJlYWxfc3RhcnRfdGltZSA9IHAtPnN0YXJ0X3RpbWU7CisJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmcC0+cmVhbF9zdGFydF90aW1lKTsKIAlwLT5zZWN1cml0eSA9IE5VTEw7CiAJcC0+aW9fY29udGV4dCA9IE5VTEw7CiAJcC0+aW9fd2FpdCA9IE5VTEw7CkBAIC0xNjAxLDcgKzE2MDYsNyBAQAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHVuc2hhcmVfZmxhZ3MgJiB+KENMT05FX1RIUkVBRHxDTE9ORV9GU3xDTE9ORV9ORVdOU3xDTE9ORV9TSUdIQU5EfAogCQkJCUNMT05FX1ZNfENMT05FX0ZJTEVTfENMT05FX1NZU1ZTRU18Ci0JCQkJQ0xPTkVfTkVXVVRTfENMT05FX05FV0lQQykpCisJCQkJQ0xPTkVfTkVXVVRTfENMT05FX05FV0lQQ3xDTE9ORV9ORVdVU0VSKSkKIAkJZ290byBiYWRfdW5zaGFyZV9vdXQ7CiAKIAlpZiAoKGVyciA9IHVuc2hhcmVfdGhyZWFkKHVuc2hhcmVfZmxhZ3MpKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggNDU0OTBiZS4uNWMzZjQ1ZCAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTEyMSw2ICsxMjEsMjQgQEAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmZ1dGV4X21udDsKIAogLyoKKyAqIFRha2UgbW0tPm1tYXBfc2VtLCB3aGVuIGZ1dGV4IGlzIHNoYXJlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnV0ZXhfbG9ja19tbShzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkKQoreworCWlmIChmc2hhcmVkKQorCQlkb3duX3JlYWQoZnNoYXJlZCk7Cit9CisKKy8qCisgKiBSZWxlYXNlIG1tLT5tbWFwX3NlbSwgd2hlbiB0aGUgZnV0ZXggaXMgc2hhcmVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmdXRleF91bmxvY2tfbW0oc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCkKK3sKKwlpZiAoZnNoYXJlZCkKKwkJdXBfcmVhZChmc2hhcmVkKTsKK30KKworLyoKICAqIFdlIGhhc2ggb24gdGhlIGtleXMgcmV0dXJuZWQgZnJvbSBnZXRfZnV0ZXhfa2V5IChzZWUgYmVsb3cpLgogICovCiBzdGF0aWMgc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYXNoX2Z1dGV4KHVuaW9uIGZ1dGV4X2tleSAqa2V5KQpAQCAtMjg3LDcgKzMwNSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZHJvcF9mdXRleF9rZXlfcmVmcyk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9mdXRleF92YWx1ZV9sb2NrZWQodTMyICpkZXN0LCB1MzIgX191c2VyICpmcm9tKQorc3RhdGljIHUzMiBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1MzIgX191c2VyICp1YWRkciwgdTMyIHV2YWwsIHUzMiBuZXd2YWwpCit7CisJdTMyIGN1cnZhbDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisJY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIHV2YWwsIG5ld3ZhbCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOworCisJcmV0dXJuIGN1cnZhbDsKK30KKworc3RhdGljIGludCBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiAqZGVzdCwgdTMyIF9fdXNlciAqZnJvbSkKIHsKIAlpbnQgcmV0OwogCkBAIC02MjAsOSArNjQ5LDcgQEAKIAogCQluZXd2YWwgPSBGVVRFWF9XQUlURVJTIHwgbmV3X293bmVyLT5waWQ7CiAKLQkJcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQkJY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIHV2YWwsIG5ld3ZhbCk7Ci0JCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwkJY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIHV2YWwsIG5ld3ZhbCk7CiAKIAkJaWYgKGN1cnZhbCA9PSAtRUZBVUxUKQogCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTY1OSw5ICs2ODYsNyBAQAogCSAqIFRoZXJlIGlzIG5vIHdhaXRlciwgc28gd2UgdW5sb2NrIHRoZSBmdXRleC4gVGhlIG93bmVyIGRpZWQKIAkgKiBiaXQgaGFzIG5vdCB0byBiZSBwcmVzZXJ2ZWQgaGVyZS4gV2UgYXJlIHRoZSBvd25lcjoKIAkgKi8KLQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCW9sZHZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCAwKTsKLQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJb2xkdmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIHV2YWwsIDApOwogCiAJaWYgKG9sZHZhbCA9PSAtRUZBVUxUKQogCQlyZXR1cm4gb2xkdmFsOwpAQCAtNzAwLDggKzcyNSw3IEBACiAJdW5pb24gZnV0ZXhfa2V5IGtleTsKIAlpbnQgcmV0OwogCi0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTcyNSw4ICs3NDksNyBAQAogCiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKIG91dDoKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzQ2LDggKzc2OSw3IEBACiAJaW50IHJldCwgb3BfcmV0LCBhdHRlbXB0ID0gMDsKIAogcmV0cnlmdWxsOgotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmc2hhcmVkLCAma2V5MSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTc5Myw3ICs4MTUsNyBAQAogCQkgKi8KIAkJaWYgKGF0dGVtcHQrKykgewogCQkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyMiwKLQkJCQkJCWZzaGFyZWQsIGF0dGVtcHQpOworCQkJCQkJIGZzaGFyZWQsIGF0dGVtcHQpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDsKIAkJCWdvdG8gcmV0cnk7CkBAIC04MDMsOCArODI1LDcgQEAKIAkJICogSWYgd2Ugd291bGQgaGF2ZSBmYXVsdGVkLCByZWxlYXNlIG1tYXBfc2VtLAogCQkgKiBmYXVsdCBpdCBpbiBhbmQgc3RhcnQgYWxsIG92ZXIgYWdhaW4uCiAJCSAqLwotCQlpZiAoZnNoYXJlZCkKLQkJCXVwX3JlYWQoZnNoYXJlZCk7CisJCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCQlyZXQgPSBnZXRfdXNlcihkdW1teSwgdWFkZHIyKTsKIAkJaWYgKHJldCkKQEAgLTg0MSw4ICs4NjIsOCBAQAogCWlmIChoYjEgIT0gaGIyKQogCQlzcGluX3VubG9jaygmaGIyLT5sb2NrKTsKIG91dDoKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04NjEsOCArODgyLDcgQEAKIAlpbnQgcmV0LCBkcm9wX2NvdW50ID0gMDsKIAogIHJldHJ5OgotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmc2hhcmVkLCAma2V5MSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTg5MCw4ICs5MTAsNyBAQAogCQkJICogSWYgd2Ugd291bGQgaGF2ZSBmYXVsdGVkLCByZWxlYXNlIG1tYXBfc2VtLCBmYXVsdAogCQkJICogaXQgaW4gYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgogCQkJICovCi0JCQlpZiAoZnNoYXJlZCkKLQkJCQl1cF9yZWFkKGZzaGFyZWQpOworCQkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJCQlyZXQgPSBnZXRfdXNlcihjdXJ2YWwsIHVhZGRyMSk7CiAKQEAgLTk0NCw4ICs5NjMsNyBAQAogCQlkcm9wX2Z1dGV4X2tleV9yZWZzKCZrZXkxKTsKIAogb3V0OgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTEzLDEwICsxMTMxLDcgQEAKIAl3aGlsZSAoIXJldCkgewogCQluZXd2YWwgPSAodXZhbCAmIEZVVEVYX09XTkVSX0RJRUQpIHwgbmV3dGlkOwogCi0JCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLAotCQkJCQkJICAgICAgIHV2YWwsIG5ld3ZhbCk7Ci0JCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwkJY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIHV2YWwsIG5ld3ZhbCk7CiAKIAkJaWYgKGN1cnZhbCA9PSAtRUZBVUxUKQogCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTExMzQsNiArMTE0OSw3IEBACiAjZGVmaW5lIEFSRzNfU0hBUkVEICAxCiAKIHN0YXRpYyBsb25nIGZ1dGV4X3dhaXRfcmVzdGFydChzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydCk7CisKIHN0YXRpYyBpbnQgZnV0ZXhfd2FpdCh1MzIgX191c2VyICp1YWRkciwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCwKIAkJICAgICAgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUpCiB7CkBAIC0xMTQ4LDggKzExNjQsNyBAQAogCiAJcS5waV9zdGF0ZSA9IE5VTEw7CiAgcmV0cnk6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJnEua2V5KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtMTE4Niw4ICsxMjAxLDcgQEAKIAkJICogSWYgd2Ugd291bGQgaGF2ZSBmYXVsdGVkLCByZWxlYXNlIG1tYXBfc2VtLCBmYXVsdCBpdCBpbiBhbmQKIAkJICogc3RhcnQgYWxsIG92ZXIgYWdhaW4uCiAJCSAqLwotCQlpZiAoZnNoYXJlZCkKLQkJCXVwX3JlYWQoZnNoYXJlZCk7CisJCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCQlyZXQgPSBnZXRfdXNlcih1dmFsLCB1YWRkcik7CiAKQEAgLTEyMDYsOCArMTIyMCw3IEBACiAJICogTm93IHRoZSBmdXRleCBpcyBxdWV1ZWQgYW5kIHdlIGhhdmUgY2hlY2tlZCB0aGUgZGF0YSwgd2UKIAkgKiBkb24ndCB3YW50IHRvIGhvbGQgbW1hcF9zZW0gd2hpbGUgd2Ugc2xlZXAuCiAJICovCi0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJLyoKIAkgKiBUaGVyZSBtaWdodCBoYXZlIGJlZW4gc2NoZWR1bGluZyBzaW5jZSB0aGUgcXVldWVfbWUoKSwgYXMgd2UKQEAgLTEyODUsOCArMTI5OCw3IEBACiAJcXVldWVfdW5sb2NrKCZxLCBoYik7CiAKICBvdXRfcmVsZWFzZV9zZW06Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzMzMsOCArMTM0NSw3IEBACiAKIAlxLnBpX3N0YXRlID0gTlVMTDsKICByZXRyeToKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0xMzUzLDkgKzEzNjQsNyBAQAogCSAqLwogCW5ld3ZhbCA9IGN1cnJlbnQtPnBpZDsKIAotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIDAsIG5ld3ZhbCk7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCAwLCBuZXd2YWwpOwogCiAJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byB1YWRkcl9mYXVsdGVkOwpAQCAtMTM5OCw5ICsxNDA3LDcgQEAKIAkJbG9ja190YWtlbiA9IDE7CiAJfQogCi0JcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgbmV3dmFsKTsKLQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIHV2YWwsIG5ld3ZhbCk7CiAKIAlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQogCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7CkBAIC0xNDI4LDggKzE0MzUsNyBAQAogCQkJICogZXhpdCB0byBjb21wbGV0ZS4KIAkJCSAqLwogCQkJcXVldWVfdW5sb2NrKCZxLCBoYik7Ci0JCQlpZiAoZnNoYXJlZCkKLQkJCQl1cF9yZWFkKGZzaGFyZWQpOworCQkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCQkJY29uZF9yZXNjaGVkKCk7CiAJCQlnb3RvIHJldHJ5OwogCkBAIC0xNDY1LDggKzE0NzEsNyBAQAogCSAqIE5vdyB0aGUgZnV0ZXggaXMgcXVldWVkIGFuZCB3ZSBoYXZlIGNoZWNrZWQgdGhlIGRhdGEsIHdlCiAJICogZG9uJ3Qgd2FudCB0byBob2xkIG1tYXBfc2VtIHdoaWxlIHdlIHNsZWVwLgogCSAqLwotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCVdBUk5fT04oIXEucGlfc3RhdGUpOwogCS8qCkBAIC0xNDgwLDggKzE0ODUsNyBAQAogCQlyZXQgPSByZXQgPyAwIDogLUVXT1VMREJMT0NLOwogCX0KIAotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAlzcGluX2xvY2socS5sb2NrX3B0cik7CiAKIAlpZiAoIXJldCkgewpAQCAtMTUxOCw4ICsxNTIyLDcgQEAKIAogCS8qIFVucXVldWUgYW5kIGRyb3AgdGhlIGxvY2sgKi8KIAl1bnF1ZXVlX21lX3BpKCZxKTsKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXR1cm4gcmV0ICE9IC1FSU5UUiA/IHJldCA6IC1FUkVTVEFSVE5PSU5UUjsKIApAQCAtMTUyNyw4ICsxNTMwLDcgQEAKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAogIG91dF9yZWxlYXNlX3NlbToKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJcmV0dXJuIHJldDsKIAogIHVhZGRyX2ZhdWx0ZWQ6CkBAIC0xNTUwLDggKzE1NTIsNyBAQAogCQlnb3RvIHJldHJ5X3VubG9ja2VkOwogCX0KIAotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIAlpZiAoIXJldCAmJiAodXZhbCAhPSAtRUZBVUxUKSkKQEAgLTE1ODUsOCArMTU4Niw3IEBACiAJLyoKIAkgKiBGaXJzdCB0YWtlIGFsbCB0aGUgZnV0ZXggcmVsYXRlZCBsb2NrczoKIAkgKi8KLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAma2V5KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtMTYwMSwxMSArMTYwMSw5IEBACiAJICogYWdhaW4uIElmIGl0IHN1Y2NlZWRzIHRoZW4gd2UgY2FuIHJldHVybiB3aXRob3V0IHdha2luZwogCSAqIGFueW9uZSBlbHNlIHVwOgogCSAqLwotCWlmICghKHV2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSkgewotCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCQl1dmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIGN1cnJlbnQtPnBpZCwgMCk7Ci0JCXBhZ2VmYXVsdF9lbmFibGUoKTsKLQl9CisJaWYgKCEodXZhbCAmIEZVVEVYX09XTkVSX0RJRUQpKQorCQl1dmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIGN1cnJlbnQtPnBpZCwgMCk7CisKIAogCWlmICh1bmxpa2VseSh1dmFsID09IC1FRkFVTFQpKQogCQlnb3RvIHBpX2ZhdWx0ZWQ7CkBAIC0xNjQ3LDggKzE2NDUsNyBAQAogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwogb3V0OgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCXJldHVybiByZXQ7CiAKQEAgLTE2NzEsOCArMTY2OCw3IEBACiAJCWdvdG8gcmV0cnlfdW5sb2NrZWQ7CiAJfQogCi0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCWlmICghcmV0ICYmICh1dmFsICE9IC1FRkFVTFQpKQpAQCAtMTcyOSw4ICsxNzI1LDggQEAKIAogCWlmIChwcmludGtfdGltZWRfcmF0ZWxpbWl0KCZwcmludGtfaW50ZXJ2YWwsIDYwICogNjAgKiAxMDAwKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJQcm9jZXNzIGAlcycgdXNlZCBGVVRFWF9GRCwgd2hpY2ggIgotCQkgICAgCSJ3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsIGluIEp1bmUgMjAwN1xuIiwKLQkJCWN1cnJlbnQtPmNvbW0pOworCQkgICAgICAgIndpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgaW4gSnVuZSAyMDA3XG4iLAorCQkgICAgICAgY3VycmVudC0+Y29tbSk7CiAJfQogCiAJcmV0ID0gLUVJTlZBTDsKQEAgLTE5MDgsMTAgKzE5MDQsOCBAQAogCQkgKiBXYWtlIHJvYnVzdCBub24tUEkgZnV0ZXhlcyBoZXJlLiBUaGUgd2FrZXVwIG9mCiAJCSAqIFBJIGZ1dGV4ZXMgaGFwcGVucyBpbiBleGl0X3BpX3N0YXRlKCk6CiAJCSAqLwotCQlpZiAoIXBpKSB7Ci0JCQlpZiAodXZhbCAmIEZVVEVYX1dBSVRFUlMpCisJCWlmICghcGkgJiYgKHV2YWwgJiBGVVRFWF9XQUlURVJTKSkKIAkJCQlmdXRleF93YWtlKHVhZGRyLCAmY3Vyci0+bW0tPm1tYXBfc2VtLCAxKTsKLQkJfQogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IDIzYzAzZjQuLjcyZDAzNDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtMTQwNiw3ICsxNDA2LDcgQEAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGhydGltZXJfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewotCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gKGxvbmcpaGNwdTsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwppbmRleCBiZDllMjcyLi4zMmIxNjE5IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKKysrIGIva2VybmVsL2lycS9zcHVyaW91cy5jCkBAIC0xNzIsNyArMTcyLDE3IEBACiAJCSAgICBpcnFyZXR1cm5fdCBhY3Rpb25fcmV0KQogewogCWlmICh1bmxpa2VseShhY3Rpb25fcmV0ICE9IElSUV9IQU5ETEVEKSkgewotCQlkZXNjLT5pcnFzX3VuaGFuZGxlZCsrOworCQkvKgorCQkgKiBJZiB3ZSBhcmUgc2VlaW5nIG9ubHkgdGhlIG9kZCBzcHVyaW91cyBJUlEgY2F1c2VkIGJ5CisJCSAqIGJ1cyBhc3luY2hyb25pY2l0eSB0aGVuIGRvbid0IGV2ZW50dWFsbHkgdHJpZ2dlciBhbiBlcnJvciwKKwkJICogb3RoZXJ3aXNlIHRoZSBjb3V0ZXIgYmVjb21lcyBhIGRvb21zZGF5IHRpbWVyIGZvciBvdGhlcndpc2UKKwkJICogd29ya2luZyBzeXN0ZW1zCisJCSAqLworCQlpZiAoamlmZmllcyAtIGRlc2MtPmxhc3RfdW5oYW5kbGVkID4gSFovMTApCisJCQlkZXNjLT5pcnFzX3VuaGFuZGxlZCA9IDE7CisJCWVsc2UKKwkJCWRlc2MtPmlycXNfdW5oYW5kbGVkKys7CisJCWRlc2MtPmxhc3RfdW5oYW5kbGVkID0gamlmZmllczsKIAkJaWYgKHVubGlrZWx5KGFjdGlvbl9yZXQgIT0gSVJRX05PTkUpKQogCQkJcmVwb3J0X2JhZF9pcnEoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwva2FsbHN5bXMuYyBiL2tlcm5lbC9rYWxsc3ltcy5jCmluZGV4IGZlZDU0NDEuLjQ3NDIxOWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rYWxsc3ltcy5jCisrKyBiL2tlcm5lbC9rYWxsc3ltcy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIC8qIExvb2t1cCB0aGUgYWRkcmVzcyBmb3IgdGhpcyBzeW1ib2wuIFJldHVybnMgMCBpZiBub3QgZm91bmQuICovCiB1bnNpZ25lZCBsb25nIGthbGxzeW1zX2xvb2t1cF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU5dOwogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBpbnQgb2ZmOwogCkBAIC0yNDgsNyArMjQ4LDcgQEAKIHsKIAljb25zdCBjaGFyICptc3ltOwogCi0JbmFtZWJ1ZltLU1lNX05BTUVfTEVOXSA9IDA7CisJbmFtZWJ1ZltLU1lNX05BTUVfTEVOIC0gMV0gPSAwOwogCW5hbWVidWZbMF0gPSAwOwogCiAJaWYgKGlzX2tzeW1fYWRkcihhZGRyKSkgewpAQCAtMjY1LDcgKzI2NSw3IEBACiAJLyogc2VlIGlmIGl0J3MgaW4gYSBtb2R1bGUgKi8KIAltc3ltID0gbW9kdWxlX2FkZHJlc3NfbG9va3VwKGFkZHIsIHN5bWJvbHNpemUsIG9mZnNldCwgbW9kbmFtZSk7CiAJaWYgKG1zeW0pCi0JCXJldHVybiBzdHJuY3B5KG5hbWVidWYsIG1zeW0sIEtTWU1fTkFNRV9MRU4pOworCQlyZXR1cm4gc3RybmNweShuYW1lYnVmLCBtc3ltLCBLU1lNX05BTUVfTEVOIC0gMSk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTI3Myw3ICsyNzMsNyBAQAogaW50IGxvb2t1cF9zeW1ib2xfbmFtZSh1bnNpZ25lZCBsb25nIGFkZHIsIGNoYXIgKnN5bW5hbWUpCiB7CiAJc3ltbmFtZVswXSA9ICdcMCc7Ci0Jc3ltbmFtZVtLU1lNX05BTUVfTEVOXSA9ICdcMCc7CisJc3ltbmFtZVtLU1lNX05BTUVfTEVOIC0gMV0gPSAnXDAnOwogCiAJaWYgKGlzX2tzeW1fYWRkcihhZGRyKSkgewogCQl1bnNpZ25lZCBsb25nIHBvczsKQEAgLTI5MSw3ICsyOTEsNyBAQAogCQkJdW5zaWduZWQgbG9uZyAqb2Zmc2V0LCBjaGFyICptb2RuYW1lLCBjaGFyICpuYW1lKQogewogCW5hbWVbMF0gPSAnXDAnOwotCW5hbWVbS1NZTV9OQU1FX0xFTl0gPSAnXDAnOworCW5hbWVbS1NZTV9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKIAogCWlmIChpc19rc3ltX2FkZHIoYWRkcikpIHsKIAkJdW5zaWduZWQgbG9uZyBwb3M7CkBAIC0zMTIsMTggKzMxMiwxNyBAQAogCWNoYXIgKm1vZG5hbWU7CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKLQljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTl07CiAKIAluYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHJlc3MsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CiAJaWYgKCFuYW1lKQogCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIweCVseCIsIGFkZHJlc3MpOwotCWVsc2UgewotCQlpZiAobW9kbmFtZSkKLQkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCBbJXNdIiwgbmFtZSwgb2Zmc2V0LAorCisJaWYgKG1vZG5hbWUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCBbJXNdIiwgbmFtZSwgb2Zmc2V0LAogCQkJCXNpemUsIG1vZG5hbWUpOwotCQllbHNlCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHgiLCBuYW1lLCBvZmZzZXQsIHNpemUpOwotCX0KKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCIsIG5hbWUsIG9mZnNldCwgc2l6ZSk7CiB9CiAKIC8qIExvb2sgdXAgYSBrZXJuZWwgc3ltYm9sIGFuZCBwcmludCBpdCB0byB0aGUga2VybmVsIG1lc3NhZ2VzLiAqLwpAQCAtMzQzLDggKzM0Miw4IEBACiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAl1bnNpZ25lZCBpbnQgbmFtZW9mZjsgLyogSWYgaXRlcmF0aW5nIGluIGNvcmUga2VybmVsIHN5bWJvbHMgKi8KIAljaGFyIHR5cGU7Ci0JY2hhciBuYW1lW0tTWU1fTkFNRV9MRU4rMV07Ci0JY2hhciBtb2R1bGVfbmFtZVtNT0RVTEVfTkFNRV9MRU4gKyAxXTsKKwljaGFyIG5hbWVbS1NZTV9OQU1FX0xFTl07CisJY2hhciBtb2R1bGVfbmFtZVtNT0RVTEVfTkFNRV9MRU5dOwogCWludCBleHBvcnRlZDsKIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZmlmby5jIGIva2VybmVsL2tmaWZvLmMKaW5kZXggY2VlNDE5MS4uYmM0MWFkMCAxMDA2NDQKLS0tIGEva2VybmVsL2tmaWZvLmMKKysrIGIva2VybmVsL2tmaWZvLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKIC8qKgogICoga2ZpZm9faW5pdCAtIGFsbG9jYXRlcyBhIG5ldyBGSUZPIHVzaW5nIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlcgpAQCAtNDEsNyArNDIsNyBAQAogCXN0cnVjdCBrZmlmbyAqZmlmbzsKIAogCS8qIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KLQlCVUdfT04oc2l6ZSAmIChzaXplIC0gMSkpOworCUJVR19PTighaXNfcG93ZXJfb2ZfMihzaXplKSk7CiAKIAlmaWZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtmaWZvKSwgZ2ZwX21hc2spOwogCWlmICghZmlmbykKZGlmZiAtLWdpdCBhL2tlcm5lbC9rdGhyZWFkLmMgYi9rZXJuZWwva3RocmVhZC5jCmluZGV4IGJiZDUxYjguLmE0MDRmN2UgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rdGhyZWFkLmMKKysrIGIva2VybmVsL2t0aHJlYWQuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiBFWFBPUlRfU1lNQk9MKGt0aHJlYWRfc3RvcCk7CiAKIAotc3RhdGljIF9faW5pdCB2b2lkIGt0aHJlYWRkX3NldHVwKHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgX19pbml0X3JlZm9rIHZvaWQga3RocmVhZGRfc2V0dXAodm9pZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2RlcC5jCmluZGV4IDFhNWZmMjIuLmVkYmEyZmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NrZGVwLmMKKysrIGIva2VybmVsL2xvY2tkZXAuYwpAQCAtMzc5LDcgKzM3OSw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X2xvY2tfbmFtZShzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MpCiB7Ci0JY2hhciBzdHJbS1NZTV9OQU1FX0xFTiArIDFdLCBjMSwgYzIsIGMzLCBjNDsKKwljaGFyIHN0cltLU1lNX05BTUVfTEVOXSwgYzEsIGMyLCBjMywgYzQ7CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCWdldF91c2FnZV9jaGFycyhjbGFzcywgJmMxLCAmYzIsICZjMywgJmM0KTsKQEAgLTQwMSw3ICs0MDEsNyBAQAogc3RhdGljIHZvaWQgcHJpbnRfbG9ja2RlcF9jYWNoZShzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2spCiB7CiAJY29uc3QgY2hhciAqbmFtZTsKLQljaGFyIHN0cltLU1lNX05BTUVfTEVOICsgMV07CisJY2hhciBzdHJbS1NZTV9OQU1FX0xFTl07CiAKIAluYW1lID0gbG9jay0+bmFtZTsKIAlpZiAoIW5hbWUpCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMDE1ZDYwYy4uMzNjMDRhZCAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtNjEsMTAgKzYxLDggQEAKIC8qIElmIHRoaXMgaXMgc2V0LCB0aGUgc2VjdGlvbiBiZWxvbmdzIGluIHRoZSBpbml0IHBhcnQgb2YgdGhlIG1vZHVsZSAqLwogI2RlZmluZSBJTklUX09GRlNFVF9NQVNLICgxVUwgPDwgKEJJVFNfUEVSX0xPTkctMSkpCiAKLS8qIFByb3RlY3RzIG1vZHVsZSBsaXN0ICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1vZGxpc3RfbG9jayk7Ci0KLS8qIExpc3Qgb2YgbW9kdWxlcywgcHJvdGVjdGVkIGJ5IG1vZHVsZV9tdXRleCBBTkQgbW9kbGlzdF9sb2NrICovCisvKiBMaXN0IG9mIG1vZHVsZXMsIHByb3RlY3RlZCBieSBtb2R1bGVfbXV0ZXggb3IgcHJlZW1wdF9kaXNhYmxlCisgKiAoYWRkL2RlbGV0ZSB1c2VzIHN0b3BfbWFjaGluZSkuICovCiBzdGF0aWMgREVGSU5FX01VVEVYKG1vZHVsZV9tdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKG1vZHVsZXMpOwogCkBAIC03NjAsMTQgKzc1OCwxMyBAQAogdm9pZCBfX3N5bWJvbF9wdXQoY29uc3QgY2hhciAqc3ltYm9sKQogewogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY29uc3QgdW5zaWduZWQgbG9uZyAqY3JjOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCWlmICghX19maW5kX3N5bWJvbChzeW1ib2wsICZvd25lciwgJmNyYywgMSkpCiAJCUJVRygpOwogCW1vZHVsZV9wdXQob3duZXIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fc3ltYm9sX3B1dCk7CiAKQEAgLTEyMjgsMTQgKzEyMjUsMTQgQEAKIHZvaWQgKl9fc3ltYm9sX2dldChjb25zdCBjaGFyICpzeW1ib2wpCiB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZSwgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJdmFsdWUgPSBfX2ZpbmRfc3ltYm9sKHN5bWJvbCwgJm93bmVyLCAmY3JjLCAxKTsKIAlpZiAodmFsdWUgJiYgIXN0cm9uZ190cnlfbW9kdWxlX2dldChvd25lcikpCiAJCXZhbHVlID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuICh2b2lkICopdmFsdWU7CiB9CkBAIC0yMTM2LDcgKzIxMzMsNyBAQAogCQkJc3ltID0gZ2V0X2tzeW1ib2wobW9kLCBhZGRyLCBOVUxMLCBOVUxMKTsKIAkJCWlmICghc3ltKQogCQkJCWdvdG8gb3V0OwotCQkJc3RybGNweShzeW1uYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4gKyAxKTsKKwkJCXN0cmxjcHkoc3ltbmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOKTsKIAkJCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMTYxLDkgKzIxNTgsOSBAQAogCQkJaWYgKCFzeW0pCiAJCQkJZ290byBvdXQ7CiAJCQlpZiAobW9kbmFtZSkKLQkJCQlzdHJsY3B5KG1vZG5hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOICsgMSk7CisJCQkJc3RybGNweShtb2RuYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7CiAJCQlpZiAobmFtZSkKLQkJCQlzdHJsY3B5KG5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTiArIDEpOworCQkJCXN0cmxjcHkobmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOKTsKIAkJCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMTg0LDggKzIxODEsOCBAQAogCQkJKnZhbHVlID0gbW9kLT5zeW10YWJbc3ltbnVtXS5zdF92YWx1ZTsKIAkJCSp0eXBlID0gbW9kLT5zeW10YWJbc3ltbnVtXS5zdF9pbmZvOwogCQkJc3RybGNweShuYW1lLCBtb2QtPnN0cnRhYiArIG1vZC0+c3ltdGFiW3N5bW51bV0uc3RfbmFtZSwKLQkJCQlLU1lNX05BTUVfTEVOICsgMSk7Ci0JCQlzdHJsY3B5KG1vZHVsZV9uYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTiArIDEpOworCQkJCUtTWU1fTkFNRV9MRU4pOworCQkJc3RybGNweShtb2R1bGVfbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4pOwogCQkJKmV4cG9ydGVkID0gaXNfZXhwb3J0ZWQobmFtZSwgbW9kKTsKIAkJCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKIAkJCXJldHVybiAwOwpAQCAtMjIzMiwyNiArMjIyOSwxMyBAQAogLyogQ2FsbGVkIGJ5IHRoZSAvcHJvYyBmaWxlIHN5c3RlbSB0byByZXR1cm4gYSBsaXN0IG9mIG1vZHVsZXMuICovCiBzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmk7Ci0JbG9mZl90IG4gPSAwOwotCiAJbXV0ZXhfbG9jaygmbW9kdWxlX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKGksICZtb2R1bGVzKSB7Ci0JCWlmIChuKysgPT0gKnBvcykKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA9PSAmbW9kdWxlcykKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGk7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZtb2R1bGVzLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKm1fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmkgPSBwOwotCSgqcG9zKSsrOwotCWlmIChpLT5uZXh0ID09ICZtb2R1bGVzKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaS0+bmV4dDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dChwLCAmbW9kdWxlcywgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgbV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKQEAgLTIzMjEsMTEgKzIzMDUsMTAgQEAKIC8qIEdpdmVuIGFuIGFkZHJlc3MsIGxvb2sgZm9yIGl0IGluIHRoZSBtb2R1bGUgZXhjZXB0aW9uIHRhYmxlcy4gKi8KIGNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnNlYXJjaF9tb2R1bGVfZXh0YWJsZXModW5zaWduZWQgbG9uZyBhZGRyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZSA9IE5VTEw7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kLCAmbW9kdWxlcywgbGlzdCkgewogCQlpZiAobW9kLT5udW1fZXhlbnRyaWVzID09IDApCiAJCQljb250aW51ZTsKQEAgLTIzMzYsNyArMjMxOSw3IEBACiAJCWlmIChlKQogCQkJYnJlYWs7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAkvKiBOb3csIGlmIHdlIGZvdW5kIG9uZSwgd2UgYXJlIHJ1bm5pbmcgaW5zaWRlIGl0IG5vdywgaGVuY2UKICAgICAgICAgICAgd2UgY2Fubm90IHVubG9hZCB0aGUgbW9kdWxlLCBoZW5jZSBubyByZWZjbnQgbmVlZGVkLiAqLwpAQCAtMjM0OCwyNSArMjMzMSwyNCBAQAogICovCiBpbnQgaXNfbW9kdWxlX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2QsICZtb2R1bGVzLCBsaXN0KSB7CiAJCWlmICh3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfY29yZSwgbW9kLT5jb3JlX3NpemUpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwkJCXByZWVtcHRfZW5hYmxlKCk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogCi0vKiBJcyB0aGlzIGEgdmFsaWQga2VybmVsIGFkZHJlc3M/ICBXZSBkb24ndCBncmFiIHRoZSBsb2NrOiB3ZSBhcmUgb29wc2luZy4gKi8KKy8qIElzIHRoaXMgYSB2YWxpZCBrZXJuZWwgYWRkcmVzcz8gKi8KIHN0cnVjdCBtb2R1bGUgKl9fbW9kdWxlX3RleHRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwpAQCAtMjM4MSwxMSArMjM2MywxMCBAQAogc3RydWN0IG1vZHVsZSAqbW9kdWxlX3RleHRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbW9kID0gX19tb2R1bGVfdGV4dF9hZGRyZXNzKGFkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gbW9kOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL25zcHJveHkuYyBiL2tlcm5lbC9uc3Byb3h5LmMKaW5kZXggOWU4M2I1OC4uMTBmMGJiYiAxMDA2NDQKLS0tIGEva2VybmVsL25zcHJveHkuYworKysgYi9rZXJuZWwvbnNwcm94eS5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KIAorc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuc3Byb3h5X2NhY2hlcDsKKwogc3RydWN0IG5zcHJveHkgaW5pdF9uc3Byb3h5ID0gSU5JVF9OU1BST1hZKGluaXRfbnNwcm94eSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbnNwcm94eShzdHJ1Y3QgbnNwcm94eSAqbnMpCkBAIC00Myw5ICs0NSwxMSBAQAogewogCXN0cnVjdCBuc3Byb3h5ICpuczsKIAotCW5zID0ga21lbWR1cChvcmlnLCBzaXplb2Yoc3RydWN0IG5zcHJveHkpLCBHRlBfS0VSTkVMKTsKLQlpZiAobnMpCisJbnMgPSBrbWVtX2NhY2hlX2FsbG9jKG5zcHJveHlfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAobnMpIHsKKwkJbWVtY3B5KG5zLCBvcmlnLCBzaXplb2Yoc3RydWN0IG5zcHJveHkpKTsKIAkJYXRvbWljX3NldCgmbnMtPmNvdW50LCAxKTsKKwl9CiAJcmV0dXJuIG5zOwogfQogCkBAIC01NCwzMyArNTgsNTEgQEAKICAqIFJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBuc3Byb3h5LiAgRG8gbm90IGF0dGFjaCB0aGlzIHRvIHRoZSB0YXNrLAogICogbGVhdmUgaXQgdG8gdGhlIGNhbGxlciB0byBkbyBwcm9wZXIgbG9ja2luZyBhbmQgYXR0YWNoIGl0IHRvIHRhc2suCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbnNwcm94eSAqY3JlYXRlX25ld19uYW1lc3BhY2VzKGludCBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQlzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpCitzdGF0aWMgc3RydWN0IG5zcHJveHkgKmNyZWF0ZV9uZXdfbmFtZXNwYWNlcyh1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBmc19zdHJ1Y3QgKm5ld19mcykKIHsKIAlzdHJ1Y3QgbnNwcm94eSAqbmV3X25zcDsKKwlpbnQgZXJyOwogCiAJbmV3X25zcCA9IGNsb25lX25zcHJveHkodHNrLT5uc3Byb3h5KTsKIAlpZiAoIW5ld19uc3ApCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJbmV3X25zcC0+bW50X25zID0gY29weV9tbnRfbnMoZmxhZ3MsIHRzay0+bnNwcm94eS0+bW50X25zLCBuZXdfZnMpOwotCWlmIChJU19FUlIobmV3X25zcC0+bW50X25zKSkKKwlpZiAoSVNfRVJSKG5ld19uc3AtPm1udF9ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT5tbnRfbnMpOwogCQlnb3RvIG91dF9uczsKKwl9CiAKIAluZXdfbnNwLT51dHNfbnMgPSBjb3B5X3V0c25hbWUoZmxhZ3MsIHRzay0+bnNwcm94eS0+dXRzX25zKTsKLQlpZiAoSVNfRVJSKG5ld19uc3AtPnV0c19ucykpCisJaWYgKElTX0VSUihuZXdfbnNwLT51dHNfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+dXRzX25zKTsKIAkJZ290byBvdXRfdXRzOworCX0KIAogCW5ld19uc3AtPmlwY19ucyA9IGNvcHlfaXBjcyhmbGFncywgdHNrLT5uc3Byb3h5LT5pcGNfbnMpOwotCWlmIChJU19FUlIobmV3X25zcC0+aXBjX25zKSkKKwlpZiAoSVNfRVJSKG5ld19uc3AtPmlwY19ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT5pcGNfbnMpOwogCQlnb3RvIG91dF9pcGM7CisJfQogCiAJbmV3X25zcC0+cGlkX25zID0gY29weV9waWRfbnMoZmxhZ3MsIHRzay0+bnNwcm94eS0+cGlkX25zKTsKLQlpZiAoSVNfRVJSKG5ld19uc3AtPnBpZF9ucykpCisJaWYgKElTX0VSUihuZXdfbnNwLT5waWRfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+cGlkX25zKTsKIAkJZ290byBvdXRfcGlkOworCX0KKworCW5ld19uc3AtPnVzZXJfbnMgPSBjb3B5X3VzZXJfbnMoZmxhZ3MsIHRzay0+bnNwcm94eS0+dXNlcl9ucyk7CisJaWYgKElTX0VSUihuZXdfbnNwLT51c2VyX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPnVzZXJfbnMpOworCQlnb3RvIG91dF91c2VyOworCX0KIAogCXJldHVybiBuZXdfbnNwOwogCitvdXRfdXNlcjoKKwlpZiAobmV3X25zcC0+cGlkX25zKQorCQlwdXRfcGlkX25zKG5ld19uc3AtPnBpZF9ucyk7CiBvdXRfcGlkOgogCWlmIChuZXdfbnNwLT5pcGNfbnMpCiAJCXB1dF9pcGNfbnMobmV3X25zcC0+aXBjX25zKTsKQEAgLTkxLDE1ICsxMTMsMTUgQEAKIAlpZiAobmV3X25zcC0+bW50X25zKQogCQlwdXRfbW50X25zKG5ld19uc3AtPm1udF9ucyk7CiBvdXRfbnM6Ci0Ja2ZyZWUobmV3X25zcCk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJa21lbV9jYWNoZV9mcmVlKG5zcHJveHlfY2FjaGVwLCBuZXdfbnNwKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiAvKgogICogY2FsbGVkIGZyb20gY2xvbmUuICBUaGlzIG5vdyBoYW5kbGVzIGNvcHkgZm9yIG5zcHJveHkgYW5kIGFsbAogICogbmFtZXNwYWNlcyB0aGVyZWluLgogICovCi1pbnQgY29weV9uYW1lc3BhY2VzKGludCBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitpbnQgY29weV9uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCBuc3Byb3h5ICpvbGRfbnMgPSB0c2stPm5zcHJveHk7CiAJc3RydWN0IG5zcHJveHkgKm5ld19uczsKQEAgLTExMCw3ICsxMzIsNyBAQAogCiAJZ2V0X25zcHJveHkob2xkX25zKTsKIAotCWlmICghKGZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDKSkpCisJaWYgKCEoZmxhZ3MgJiAoQ0xPTkVfTkVXTlMgfCBDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdJUEMgfCBDTE9ORV9ORVdVU0VSKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CkBAIC0xNDAsNyArMTYyLDkgQEAKIAkJcHV0X2lwY19ucyhucy0+aXBjX25zKTsKIAlpZiAobnMtPnBpZF9ucykKIAkJcHV0X3BpZF9ucyhucy0+cGlkX25zKTsKLQlrZnJlZShucyk7CisJaWYgKG5zLT51c2VyX25zKQorCQlwdXRfdXNlcl9ucyhucy0+dXNlcl9ucyk7CisJa21lbV9jYWNoZV9mcmVlKG5zcHJveHlfY2FjaGVwLCBucyk7CiB9CiAKIC8qCkBAIC0xNTIsMTkgKzE3NiwxMCBAQAogewogCWludCBlcnIgPSAwOwogCi0JaWYgKCEodW5zaGFyZV9mbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQykpKQorCWlmICghKHVuc2hhcmVfZmxhZ3MgJiAoQ0xPTkVfTkVXTlMgfCBDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdJUEMgfAorCQkJICAgICAgIENMT05FX05FV1VTRVIpKSkKIAkJcmV0dXJuIDA7CiAKLSNpZm5kZWYgQ09ORklHX0lQQ19OUwotCWlmICh1bnNoYXJlX2ZsYWdzICYgQ0xPTkVfTkVXSVBDKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19VVFNfTlMKLQlpZiAodW5zaGFyZV9mbGFncyAmIENMT05FX05FV1VUUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKLQogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtMTc0LDMgKzE4OSwxMiBAQAogCQllcnIgPSBQVFJfRVJSKCpuZXdfbnNwKTsKIAlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgaW50IF9faW5pdCBuc3Byb3h5X2NhY2hlX2luaXQodm9pZCkKK3sKKwluc3Byb3h5X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuc3Byb3h5Iiwgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSwKKwkJCQkJICAgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG5zcHJveHlfY2FjaGVfaW5pdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IDYyM2QxODIuLmY2NGY0YzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYW5pYy5jCisrKyBiL2tlcm5lbC9wYW5pYy5jCkBAIC0xNTksMTQgKzE1OSwxNSBAQAogewogCXN0YXRpYyBjaGFyIGJ1ZlsyMF07CiAJaWYgKHRhaW50ZWQpIHsKLQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlRhaW50ZWQ6ICVjJWMlYyVjJWMlYyVjIiwKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlRhaW50ZWQ6ICVjJWMlYyVjJWMlYyVjJWMiLAogCQkJdGFpbnRlZCAmIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSA/ICdQJyA6ICdHJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9GT1JDRURfTU9EVUxFID8gJ0YnIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX1VOU0FGRV9TTVAgPyAnUycgOiAnICcsCiAJCQl0YWludGVkICYgVEFJTlRfRk9SQ0VEX1JNTU9EID8gJ1InIDogJyAnLAogIAkJCXRhaW50ZWQgJiBUQUlOVF9NQUNISU5FX0NIRUNLID8gJ00nIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX0JBRF9QQUdFID8gJ0InIDogJyAnLAotCQkJdGFpbnRlZCAmIFRBSU5UX1VTRVIgPyAnVScgOiAnICcpOworCQkJdGFpbnRlZCAmIFRBSU5UX1VTRVIgPyAnVScgOiAnICcsCisJCQl0YWludGVkICYgVEFJTlRfRElFID8gJ0QnIDogJyAnKTsKIAl9CiAJZWxzZQogCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTm90IHRhaW50ZWQiKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9waWQuYyBiL2tlcm5lbC9waWQuYwppbmRleCBlYjY2YmQyLi5jNmUzZjlmIDEwMDY0NAotLS0gYS9rZXJuZWwvcGlkLmMKKysrIGIva2VybmVsL3BpZC5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZpbmRfZ2V0X3BpZCk7CiAKLXN0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyhpbnQgZmxhZ3MsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpvbGRfbnMpCitzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm9sZF9ucykKIHsKIAlCVUdfT04oIW9sZF9ucyk7CiAJZ2V0X3BpZF9ucyhvbGRfbnMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IDBiYmRlYWMuLjA1MWQyN2UgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTQ0OSwxMyArNDQ5LDE2IEBACiAjZWxzZQogc3RhdGljIGludCBwcmludGtfdGltZSA9IDA7CiAjZW5kaWYKLW1vZHVsZV9wYXJhbShwcmludGtfdGltZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fbmFtZWQodGltZSwgcHJpbnRrX3RpbWUsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAogc3RhdGljIGludCBfX2luaXQgcHJpbnRrX3RpbWVfc2V0dXAoY2hhciAqc3RyKQogewogCWlmICgqc3RyKQogCQlyZXR1cm4gMDsKIAlwcmludGtfdGltZSA9IDE7CisJcHJpbnRrKEtFUk5fTk9USUNFICJUaGUgJ3RpbWUnIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCAiCisJCSJpcyBzY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4gZWFybHkgMjAwOFxuIik7CisJcHJpbnRrKEtFUk5fTk9USUNFICJVc2UgJ3ByaW50ay50aW1lPTx2YWx1ZT4nIGluc3RlYWRcbiIpOwogCXJldHVybiAxOwogfQogCkBAIC00ODMsNiArNDg2LDkgQEAKICAqIEBmbXQ6IGZvcm1hdCBzdHJpbmcKICAqCiAgKiBUaGlzIGlzIHByaW50aygpLiAgSXQgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0LiAgV2Ugd2FudCBpdCB0byB3b3JrLgorICogQmUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdCBpZiBvb3BzX2luX3Byb2dyZXNzIGlzIG5vdCBzZXQsIHdlIG1pZ2h0IHRyeSB0bworICogd2FrZSBrbG9nZCB1cCB3aGljaCBjb3VsZCBkZWFkbG9jayBvbiBydW5xdWV1ZSBsb2NrIGlmIHByaW50aygpIGlzIGNhbGxlZAorICogZnJvbSBzY2hlZHVsZXIgY29kZS4KICAqCiAgKiBXZSB0cnkgdG8gZ3JhYiB0aGUgY29uc29sZV9zZW0uICBJZiB3ZSBzdWNjZWVkLCBpdCdzIGVhc3kgLSB3ZSBsb2cgdGhlIG91dHB1dCBhbmQKICAqIGNhbGwgdGhlIGNvbnNvbGUgZHJpdmVycy4gIElmIHdlIGZhaWwgdG8gZ2V0IHRoZSBzZW1hcGhvcmUgd2UgcGxhY2UgdGhlIG91dHB1dApAQCAtNjU0LDcgKzY2MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGNvbnNvbGVfc2V0dXAoY2hhciAqc3RyKQogewotCWNoYXIgbmFtZVtzaXplb2YoY29uc29sZV9jbWRsaW5lWzBdLm5hbWUpXTsKKwljaGFyIGJ1ZltzaXplb2YoY29uc29sZV9jbWRsaW5lWzBdLm5hbWUpICsgNF07IC8qIDQgZm9yIGluZGV4ICovCiAJY2hhciAqcywgKm9wdGlvbnM7CiAJaW50IGlkeDsKIApAQCAtNjYyLDI3ICs2NjgsMjcgQEAKIAkgKiBEZWNvZGUgc3RyIGludG8gbmFtZSwgaW5kZXgsIG9wdGlvbnMuCiAJICovCiAJaWYgKHN0clswXSA+PSAnMCcgJiYgc3RyWzBdIDw9ICc5JykgewotCQlzdHJjcHkobmFtZSwgInR0eVMiKTsKLQkJc3RybmNweShuYW1lICsgNCwgc3RyLCBzaXplb2YobmFtZSkgLSA1KTsKKwkJc3RyY3B5KGJ1ZiwgInR0eVMiKTsKKwkJc3RybmNweShidWYgKyA0LCBzdHIsIHNpemVvZihidWYpIC0gNSk7CiAJfSBlbHNlIHsKLQkJc3RybmNweShuYW1lLCBzdHIsIHNpemVvZihuYW1lKSAtIDEpOworCQlzdHJuY3B5KGJ1Ziwgc3RyLCBzaXplb2YoYnVmKSAtIDEpOwogCX0KLQluYW1lW3NpemVvZihuYW1lKSAtIDFdID0gMDsKKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CiAJaWYgKChvcHRpb25zID0gc3RyY2hyKHN0ciwgJywnKSkgIT0gTlVMTCkKIAkJKihvcHRpb25zKyspID0gMDsKICNpZmRlZiBfX3NwYXJjX18KIAlpZiAoIXN0cmNtcChzdHIsICJ0dHlhIikpCi0JCXN0cmNweShuYW1lLCAidHR5UzAiKTsKKwkJc3RyY3B5KGJ1ZiwgInR0eVMwIik7CiAJaWYgKCFzdHJjbXAoc3RyLCAidHR5YiIpKQotCQlzdHJjcHkobmFtZSwgInR0eVMxIik7CisJCXN0cmNweShidWYsICJ0dHlTMSIpOwogI2VuZGlmCi0JZm9yIChzID0gbmFtZTsgKnM7IHMrKykKKwlmb3IgKHMgPSBidWY7ICpzOyBzKyspCiAJCWlmICgoKnMgPj0gJzAnICYmICpzIDw9ICc5JykgfHwgKnMgPT0gJywnKQogCQkJYnJlYWs7CiAJaWR4ID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTApOwogCSpzID0gMDsKIAotCWFkZF9wcmVmZXJyZWRfY29uc29sZShuYW1lLCBpZHgsIG9wdGlvbnMpOworCWFkZF9wcmVmZXJyZWRfY29uc29sZShidWYsIGlkeCwgb3B0aW9ucyk7CiAJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJjb25zb2xlPSIsIGNvbnNvbGVfc2V0dXApOwpAQCAtNzA5LDcgKzcxNSw3IEBACiAJICoJU2VlIGlmIHRoaXMgdHR5IGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZCwgYW5kCiAJICoJaWYgd2UgaGF2ZSBhIHNsb3QgZnJlZS4KIAkgKi8KLQlmb3IoaSA9IDA7IGkgPCBNQVhfQ01ETElORUNPTlNPTEVTICYmIGNvbnNvbGVfY21kbGluZVtpXS5uYW1lWzBdOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTURMSU5FQ09OU09MRVMgJiYgY29uc29sZV9jbWRsaW5lW2ldLm5hbWVbMF07IGkrKykKIAkJaWYgKHN0cmNtcChjb25zb2xlX2NtZGxpbmVbaV0ubmFtZSwgbmFtZSkgPT0gMCAmJgogCQkJICBjb25zb2xlX2NtZGxpbmVbaV0uaW5kZXggPT0gaWR4KSB7CiAJCQkJc2VsZWN0ZWRfY29uc29sZSA9IGk7CkBAIC03MjYsNiArNzMyLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBfX2luaXQgdXBkYXRlX2NvbnNvbGVfY21kbGluZShjaGFyICpuYW1lLCBpbnQgaWR4LCBjaGFyICpuYW1lX25ldywgaW50IGlkeF9uZXcsIGNoYXIgKm9wdGlvbnMpCit7CisJc3RydWN0IGNvbnNvbGVfY21kbGluZSAqYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ01ETElORUNPTlNPTEVTICYmIGNvbnNvbGVfY21kbGluZVtpXS5uYW1lWzBdOyBpKyspCisJCWlmIChzdHJjbXAoY29uc29sZV9jbWRsaW5lW2ldLm5hbWUsIG5hbWUpID09IDAgJiYKKwkJCSAgY29uc29sZV9jbWRsaW5lW2ldLmluZGV4ID09IGlkeCkgeworCQkJCWMgPSAmY29uc29sZV9jbWRsaW5lW2ldOworCQkJCW1lbWNweShjLT5uYW1lLCBuYW1lX25ldywgc2l6ZW9mKGMtPm5hbWUpKTsKKwkJCQljLT5uYW1lW3NpemVvZihjLT5uYW1lKSAtIDFdID0gMDsKKwkJCQljLT5vcHRpb25zID0gb3B0aW9uczsKKwkJCQljLT5pbmRleCA9IGlkeF9uZXc7CisJCQkJcmV0dXJuIGk7CisJCX0KKwkvKiBub3QgZm91bmQgKi8KKwlyZXR1cm4gLTE7Cit9CisKICNpZm5kZWYgQ09ORklHX0RJU0FCTEVfQ09OU09MRV9TVVNQRU5ECiAvKioKICAqIHN1c3BlbmRfY29uc29sZSAtIHN1c3BlbmQgdGhlIGNvbnNvbGUgc3Vic3lzdGVtCkBAIC05NDIsNiArOTY3LDkgQEAKIAlpZiAocHJlZmVycmVkX2NvbnNvbGUgPCAwIHx8IGJvb3Rjb25zb2xlIHx8ICFjb25zb2xlX2RyaXZlcnMpCiAJCXByZWZlcnJlZF9jb25zb2xlID0gc2VsZWN0ZWRfY29uc29sZTsKIAorCWlmIChjb25zb2xlLT5lYXJseV9zZXR1cCkKKwkJY29uc29sZS0+ZWFybHlfc2V0dXAoKTsKKwogCS8qCiAJICoJU2VlIGlmIHdlIHdhbnQgdG8gdXNlIHRoaXMgY29uc29sZSBkcml2ZXIuIElmIHdlCiAJICoJZGlkbid0IHNlbGVjdCBhIGNvbnNvbGUgd2UgdGFrZSB0aGUgZmlyc3Qgb25lCkBAIC05ODUsMTIgKzEwMTMsMTUgQEAKIAlpZiAoIShjb25zb2xlLT5mbGFncyAmIENPTl9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCi0JaWYgKGJvb3Rjb25zb2xlKSB7CisJaWYgKGJvb3Rjb25zb2xlICYmIChjb25zb2xlLT5mbGFncyAmIENPTl9DT05TREVWKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJjb25zb2xlIGhhbmRvdmVyOiBib290IFslcyVkXSAtPiByZWFsIFslcyVkXVxuIiwKIAkJICAgICAgIGJvb3Rjb25zb2xlLT5uYW1lLCBib290Y29uc29sZS0+aW5kZXgsCiAJCSAgICAgICBjb25zb2xlLT5uYW1lLCBjb25zb2xlLT5pbmRleCk7CiAJCXVucmVnaXN0ZXJfY29uc29sZShib290Y29uc29sZSk7CiAJCWNvbnNvbGUtPmZsYWdzICY9IH5DT05fUFJJTlRCVUZGRVI7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29uc29sZSBbJXMlZF0gZW5hYmxlZFxuIiwKKwkJICAgICAgIGNvbnNvbGUtPm5hbWUsIGNvbnNvbGUtPmluZGV4KTsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IGFkNzk0OWEuLjRhMTc0NWYxIDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC0xNjEsNiArMTYxLDcgQEAKIGludCBwdHJhY2VfYXR0YWNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlhdWRpdF9wdHJhY2UodGFzayk7CiAKQEAgLTE4MSw5ICsxODIsNyBAQAogCSAqIGNwdSdzIHRoYXQgbWF5IGhhdmUgdGFza19sb2NrKS4KIAkgKi8KIAl0YXNrX2xvY2sodGFzayk7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAoIXdyaXRlX3RyeWxvY2soJnRhc2tsaXN0X2xvY2spKSB7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwlpZiAoIXdyaXRlX3RyeWxvY2tfaXJxc2F2ZSgmdGFza2xpc3RfbG9jaywgZmxhZ3MpKSB7CiAJCXRhc2tfdW5sb2NrKHRhc2spOwogCQlkbyB7CiAJCQljcHVfcmVsYXgoKTsKQEAgLTIxMSw3ICsyMTAsNyBAQAogCWZvcmNlX3NpZ19zcGVjaWZpYyhTSUdTVE9QLCB0YXNrKTsKIAogYmFkOgotCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrbGlzdF9sb2NrLCBmbGFncyk7CiAJdGFza191bmxvY2sodGFzayk7CiBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKQEAgLTQ5MSwzICs0OTAsMjIgQEAKIAlyZXR1cm4gcmV0OwogfQogI2VuZGlmIC8qIF9fQVJDSF9TWVNfUFRSQUNFICovCisKK2ludCBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGNvcGllZDsKKworCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRzaywgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOworCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOworfQorCitpbnQgZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCWludCBjb3BpZWQ7CisKKwljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bSh0c2ssIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOworCXJldHVybiAoY29waWVkID09IHNpemVvZihkYXRhKSkgPyAwIDogLUVJTzsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCmluZGV4IDU1YmE4MmEuLmRkZmYzMzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdXRvcnR1cmUuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTUxOCw3ICs1MTksNiBAQAogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV93cml0ZXIgdGFzayBzdGFydGVkIik7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlkbyB7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwpAQCAtNTU4LDcgKzU1OCw2IEBACiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Zha2V3cml0ZXIgdGFzayBzdGFydGVkIik7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlkbyB7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEgKyByY3VfcmFuZG9tKCZyYW5kKSUxMCk7CkBAIC01ODksNyArNTg4LDYgQEAKIAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfcmVhZGVyIHRhc2sgc3RhcnRlZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJZG8gewogCQlpZHggPSBjdXJfb3BzLT5yZWFkbG9jaygpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKaW5kZXggZGE4ZDZiZi4uNWFlZGJlZSAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXgtZGVidWcuYworKysgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCkBAIC0yOSwxMiArMjksNiBAQAogCiAjaW5jbHVkZSAicnRtdXRleF9jb21tb24uaCIKIAotI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCi0jIGluY2x1ZGUgInJ0bXV0ZXgtZGVidWcuaCIKLSNlbHNlCi0jIGluY2x1ZGUgInJ0bXV0ZXguaCIKLSNlbmRpZgotCiAjIGRlZmluZSBUUkFDRV9XQVJOX09OKHgpCQkJV0FSTl9PTih4KQogIyBkZWZpbmUgVFJBQ0VfQlVHX09OKHgpCQkJQlVHX09OKHgpCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jIGIva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMKaW5kZXggMDE1ZmM2My4uZTMwNTViYSAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMKQEAgLTI2MCw2ICsyNjAsNyBAQAogCWludCByZXQ7CiAKIAljdXJyZW50LT5mbGFncyB8PSBQRl9NVVRFWF9URVNURVI7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWFsbG93X3NpZ25hbChTSUdIVVApOwogCiAJZm9yKDs7KSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC5jIGIva2VybmVsL3J0bXV0ZXguYwppbmRleCAxN2QyOGNlLi44Y2Q5YmQyIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC5jCisrKyBiL2tlcm5lbC9ydG11dGV4LmMKQEAgLTE3LDEyICsxNyw2IEBACiAKICNpbmNsdWRlICJydG11dGV4X2NvbW1vbi5oIgogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKLSMgaW5jbHVkZSAicnRtdXRleC1kZWJ1Zy5oIgotI2Vsc2UKLSMgaW5jbHVkZSAicnRtdXRleC5oIgotI2VuZGlmCi0KIC8qCiAgKiBsb2NrLT5vd25lciBzdGF0ZSB0cmFja2luZzoKICAqCmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleF9jb21tb24uaCBiL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oCmluZGV4IDljNzU4NTYuLjJkM2I4MzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oCisrKyBiL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ0X211dGV4X3JlYWxfb3duZXIoc3RydWN0IHJ0X211dGV4ICpsb2NrKQogewotIAlyZXR1cm4gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKQorCXJldHVybiAoc3RydWN0IHRhc2tfc3RydWN0ICopCiAJCSgodW5zaWduZWQgbG9uZylsb2NrLT5vd25lciAmIH5SVF9NVVRFWF9IQVNfV0FJVEVSUyk7CiB9CiAKQEAgLTEyMCw0ICsxMjAsMTEgQEAKIAkJCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpwcm94eV9vd25lcik7CiBleHRlcm4gdm9pZCBydF9tdXRleF9wcm94eV91bmxvY2soc3RydWN0IHJ0X211dGV4ICpsb2NrLAogCQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpwcm94eV9vd25lcik7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfUlRfTVVURVhFUworIyBpbmNsdWRlICJydG11dGV4LWRlYnVnLmgiCisjZWxzZQorIyBpbmNsdWRlICJydG11dGV4LmgiCisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IDMzMzJiYmIuLmNiMzFmYjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC03MzYsNyArNzM2LDkgQEAKICAqCiAgKiBUaGUgIjEwJSBlZmZlY3QiIGlzIHJlbGF0aXZlIGFuZCBjdW11bGF0aXZlOiBmcm9tIF9hbnlfIG5pY2UgbGV2ZWwsCiAgKiBpZiB5b3UgZ28gdXAgMSBsZXZlbCwgaXQncyAtMTAlIENQVSB1c2FnZSwgaWYgeW91IGdvIGRvd24gMSBsZXZlbAotICogaXQncyArMTAlIENQVSB1c2FnZS4KKyAqIGl0J3MgKzEwJSBDUFUgdXNhZ2UuICh0byBhY2hpZXZlIHRoYXQgd2UgdXNlIGEgbXVsdGlwbGllciBvZiAxLjI1LgorICogSWYgYSB0YXNrIGdvZXMgdXAgYnkgfjEwJSBhbmQgYW5vdGhlciB0YXNrIGdvZXMgZG93biBieSB+MTAlIHRoZW4KKyAqIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gaXMgfjI1JS4pCiAgKi8KIHN0YXRpYyBjb25zdCBpbnQgcHJpb190b193ZWlnaHRbNDBdID0gewogLyogLTIwICovIDg4ODE4LCA3MTA1NCwgNTY4NDMsIDQ1NDc1LCAzNjM4MCwgMjkxMDQsIDIzMjgzLCAxODYyNiwgMTQ5MDEsIDExOTIxLApAQCAtNzQ2LDE1ICs3NDgsMjIgQEAKIC8qICAxMCAqLyAgIDExMCwgICAgODcsICAgIDcwLCAgICA1NiwgICAgNDUsICAgIDM2LCAgICAyOSwgICAgMjMsICAgIDE4LCAgICAxNSwKIH07CiAKKy8qCisgKiBJbnZlcnNlICgyXjMyL3gpIHZhbHVlcyBvZiB0aGUgcHJpb190b193ZWlnaHRbXSBhcnJheSwgcHJlY2FsY3VsYXRlZC4KKyAqCisgKiBJbiBjYXNlcyB3aGVyZSB0aGUgd2VpZ2h0IGRvZXMgbm90IGNoYW5nZSBvZnRlbiwgd2UgY2FuIHVzZSB0aGUKKyAqIHByZWNhbGN1bGF0ZWQgaW52ZXJzZSB0byBzcGVlZCB1cCBhcml0aG1ldGljcyBieSB0dXJuaW5nIGRpdmlzaW9ucworICogaW50byBtdWx0aXBsaWNhdGlvbnM6CisgKi8KIHN0YXRpYyBjb25zdCB1MzIgcHJpb190b193bXVsdFs0MF0gPSB7Ci0JNDgzNTYsICAgNjA0NDYsICAgNzU1NTgsICAgOTQ0NDYsICAxMTgwNTgsICAxNDc1NzMsCi0JMTg0NDY3LCAgMjMwNTg5LCAgMjg4MjMzLCAgMzYwMjg1LCAgNDUwMzQ3LAotCTU2Mjk3OSwgIDcwMzc0NiwgIDg3OTU3NSwgMTA5OTU4MiwgMTM3NDM4OSwKLQkxNzE3OTg2LCAyMTQ3NDgzLCAyNjg0MzU0LCAzMzU1NDQzLCA0MTk0MzA0LAotCTUyNDQxNjAsIDY1NTcyMDEsIDgxOTY1MDIsIDEwMjUwNTE4LCAxMjc4MjY0MCwKLQkxNjAyNTk5NywgMTk5NzY1OTIsIDI0OTcwNzQwLCAzMTM1MDEyNiwgMzkwNDUxNTcsCi0JNDkzNjc0NDAsIDYxMzU2Njc1LCA3NjY5NTg0NCwgOTU0NDM3MTcsIDExOTMwNDY0NywKLQkxNDgxMDIzMjAsIDE4NjczNzcwOCwgMjM4NjA5Mjk0LCAyODYzMzExNTMsCisvKiAtMjAgKi8gICAgIDQ4MzU2LCAgICAgNjA0NDYsICAgICA3NTU1OCwgICAgIDk0NDQ2LCAgICAxMTgwNTgsCisvKiAtMTUgKi8gICAgMTQ3NTczLCAgICAxODQ0NjcsICAgIDIzMDU4OSwgICAgMjg4MjMzLCAgICAzNjAyODUsCisvKiAtMTAgKi8gICAgNDUwMzQ3LCAgICA1NjI5NzksICAgIDcwMzc0NiwgICAgODc5NTc1LCAgIDEwOTk1ODIsCisvKiAgLTUgKi8gICAxMzc0Mzg5LCAgIDE3MTc5ODYsICAgMjE0NzQ4MywgICAyNjg0MzU0LCAgIDMzNTU0NDMsCisvKiAgIDAgKi8gICA0MTk0MzA0LCAgIDUyNDQxNjAsICAgNjU1NzIwMSwgICA4MTk2NTAyLCAgMTAyNTA1MTgsCisvKiAgIDUgKi8gIDEyNzgyNjQwLCAgMTYwMjU5OTcsICAxOTk3NjU5MiwgIDI0OTcwNzQwLCAgMzEzNTAxMjYsCisvKiAgMTAgKi8gIDM5MDQ1MTU3LCAgNDkzNjc0NDAsICA2MTM1NjY3NSwgIDc2Njk1ODQ0LCAgOTU0NDM3MTcsCisvKiAgMTUgKi8gMTE5MzA0NjQ3LCAxNDgxMDIzMjAsIDE4NjczNzcwOCwgMjM4NjA5Mjk0LCAyODYzMzExNTMsCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTQ5MDMsOCArNDkxMiw2IEBACiAJCXN0cnVjdCBtaWdyYXRpb25fcmVxICpyZXE7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCiAJCXNwaW5fbG9ja19pcnEoJnJxLT5sb2NrKTsKIAogCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkgewpAQCAtNTEzOCw3ICs1MTQ1LDYgQEAKIAkJcCA9IGt0aHJlYWRfY3JlYXRlKG1pZ3JhdGlvbl90aHJlYWQsIGhjcHUsICJtaWdyYXRpb24vJWQiLCBjcHUpOwogCQlpZiAoSVNfRVJSKHApKQogCQkJcmV0dXJuIE5PVElGWV9CQUQ7Ci0JCXAtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCQlrdGhyZWFkX2JpbmQocCwgY3B1KTsKIAkJLyogTXVzdCBiZSBoaWdoIHByaW86IHN0b3BfbWFjaGluZSBleHBlY3RzIHRvIHlpZWxkIHRvIGl0LiAqLwogCQlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NlY2NvbXAuYyBiL2tlcm5lbC9zZWNjb21wLmMKaW5kZXggYzMzOTFiNi4uYWQ2NGZjYiAxMDA2NDQKLS0tIGEva2VybmVsL3NlY2NvbXAuYworKysgYi9rZXJuZWwvc2VjY29tcC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogLyogI2RlZmluZSBTRUNDT01QX0RFQlVHIDEgKi8KKyNkZWZpbmUgTlJfU0VDQ09NUF9NT0RFUyAxCiAKIC8qCiAgKiBTZWN1cmUgY29tcHV0aW5nIG1vZGUgMSBhbGxvd3Mgb25seSByZWFkL3dyaXRlL2V4aXQvc2lncmV0dXJuLgpAQCAtNTQsMyArNTUsMzEgQEAKICNlbmRpZgogCWRvX2V4aXQoU0lHS0lMTCk7CiB9CisKK2xvbmcgcHJjdGxfZ2V0X3NlY2NvbXAodm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudC0+c2VjY29tcC5tb2RlOworfQorCitsb25nIHByY3RsX3NldF9zZWNjb21wKHVuc2lnbmVkIGxvbmcgc2VjY29tcF9tb2RlKQoreworCWxvbmcgcmV0OworCisJLyogY2FuIHNldCBpdCBvbmx5IG9uY2UgdG8gYmUgZXZlbiBtb3JlIHNlY3VyZSAqLworCXJldCA9IC1FUEVSTTsKKwlpZiAodW5saWtlbHkoY3VycmVudC0+c2VjY29tcC5tb2RlKSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmIChzZWNjb21wX21vZGUgJiYgc2VjY29tcF9tb2RlIDw9IE5SX1NFQ0NPTVBfTU9ERVMpIHsKKwkJY3VycmVudC0+c2VjY29tcC5tb2RlID0gc2VjY29tcF9tb2RlOworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1NFQ0NPTVApOworI2lmZGVmIFRJRl9OT1RTQworCQlkaXNhYmxlX1RTQygpOworI2VuZGlmCisJCXJldCA9IDA7CisJfQorCisgb3V0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZjk0MDU2MC4uMzlkMTIyNyAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtNzE4LDYgKzcxOCwzNyBAQAogI2RlZmluZSBMRUdBQ1lfUVVFVUUoc2lncHRyLCBzaWcpIFwKIAkoKChzaWcpIDwgU0lHUlRNSU4pICYmIHNpZ2lzbWVtYmVyKCYoc2lncHRyKS0+c2lnbmFsLCAoc2lnKSkpCiAKK2ludCBwcmludF9mYXRhbF9zaWduYWxzOworCitzdGF0aWMgdm9pZCBwcmludF9mYXRhbF9zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzaWducikKK3sKKwlwcmludGsoIiVzLyVkOiBwb3RlbnRpYWxseSB1bmV4cGVjdGVkIGZhdGFsIHNpZ25hbCAlZC5cbiIsCisJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc2lnbnIpOworCisjaWZkZWYgX19pMzg2X18KKwlwcmludGsoImNvZGUgYXQgJTA4bHg6ICIsIHJlZ3MtPmVpcCk7CisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgaW5zbjsKKworCQkJX19nZXRfdXNlcihpbnNuLCAodW5zaWduZWQgY2hhciAqKShyZWdzLT5laXAgKyBpKSk7CisJCQlwcmludGsoIiUwMnggIiwgaW5zbik7CisJCX0KKwl9CisjZW5kaWYKKwlwcmludGsoIlxuIik7CisJc2hvd19yZWdzKHJlZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9wcmludF9mYXRhbF9zaWduYWxzKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uICgmc3RyLCAmcHJpbnRfZmF0YWxfc2lnbmFscyk7CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicHJpbnQtZmF0YWwtc2lnbmFscz0iLCBzZXR1cF9wcmludF9mYXRhbF9zaWduYWxzKTsKIAogc3RhdGljIGludAogc3BlY2lmaWNfc2VuZF9zaWdfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0KQpAQCAtMTg1NSw2ICsxODg2LDggQEAKIAkJICogQW55dGhpbmcgZWxzZSBpcyBmYXRhbCwgbWF5YmUgd2l0aCBhIGNvcmUgZHVtcC4KIAkJICovCiAJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NJR05BTEVEOworCQlpZiAoKHNpZ25yICE9IFNJR0tJTEwpICYmIHByaW50X2ZhdGFsX3NpZ25hbHMpCisJCQlwcmludF9mYXRhbF9zaWduYWwocmVncywgc2lnbnIpOwogCQlpZiAoc2lnX2tlcm5lbF9jb3JlZHVtcChzaWducikpIHsKIAkJCS8qCiAJCQkgKiBJZiBpdCB3YXMgYWJsZSB0byBkdW1wIGNvcmUsIHRoaXMga2lsbHMgYWxsCmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCA3MzIxN2E5Li4wZjU0NmRkIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KQEAgLTQ4OCw4ICs0ODksNiBAQAogCiBzdGF0aWMgaW50IGtzb2Z0aXJxZCh2b2lkICogX19iaW5kX2NwdSkKIHsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewpAQCAtNjE0LDEyICs2MTMsMTYgQEAKIAkJa3RocmVhZF9iaW5kKHBlcl9jcHUoa3NvZnRpcnFkLCBob3RjcHUpLAogCQkJICAgICBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCkpOwogCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46CisJY2FzZSBDUFVfREVBRF9GUk9aRU46IHsKKwkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CisKIAkJcCA9IHBlcl9jcHUoa3NvZnRpcnFkLCBob3RjcHUpOwogCQlwZXJfY3B1KGtzb2Z0aXJxZCwgaG90Y3B1KSA9IE5VTEw7CisJCXNjaGVkX3NldHNjaGVkdWxlcihwLCBTQ0hFRF9GSUZPLCAmcGFyYW0pOwogCQlrdGhyZWFkX3N0b3AocCk7CiAJCXRha2VvdmVyX3Rhc2tsZXRzKGhvdGNwdSk7CiAJCWJyZWFrOworCX0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KICAJfQogCXJldHVybiBOT1RJRllfT0s7CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGxvY2t1cC5jIGIva2VybmVsL3NvZnRsb2NrdXAuYwppbmRleCAwMTMxZTI5Li43MDhkNDg4IDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGxvY2t1cC5jCisrKyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMTYsNyArMTE3LDYgQEAKIAlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKIAogCXNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmcGFyYW0pOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJLyogaW5pdGlhbGl6ZSB0aW1lc3RhbXAgKi8KIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKaW5kZXggZmNlZTJhOC4uMzE5ODIxZSAxMDA2NDQKLS0tIGEva2VybmVsL3N0b3BfbWFjaGluZS5jCisrKyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwpAQCAtOTMsMTAgKzkzLDYgQEAKIHN0YXRpYyBpbnQgc3RvcF9tYWNoaW5lKHZvaWQpCiB7CiAJaW50IGksIHJldCA9IDA7Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07Ci0KLQkvKiBPbmUgaGlnaC1wcmlvIHRocmVhZCBwZXIgY3B1LiAgV2UnbGwgZG8gdGhpcyBvbmUuICovCi0Jc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAKIAlhdG9taWNfc2V0KCZzdG9wbWFjaGluZV90aHJlYWRfYWNrLCAwKTsKIAlzdG9wbWFjaGluZV9udW1fdGhyZWFkcyA9IDA7CkBAIC0xODksNiArMTg1LDEwIEBACiAKIAlwID0ga3RocmVhZF9jcmVhdGUoZG9fc3RvcCwgJnNtZGF0YSwgImtzdG9wbWFjaGluZSIpOwogCWlmICghSVNfRVJSKHApKSB7CisJCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OworCisJCS8qIE9uZSBoaWdoLXByaW8gdGhyZWFkIHBlciBjcHUuICBXZSdsbCBkbyB0aGlzIG9uZS4gKi8KKwkJc2NoZWRfc2V0c2NoZWR1bGVyKHAsIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAJCWt0aHJlYWRfYmluZChwLCBjcHUpOwogCQl3YWtlX3VwX3Byb2Nlc3MocCk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNtZGF0YS5kb25lKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCA4NzIyNzFjLi40ZDE0MWFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0zMSwxMCArMzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9jbl9wcm9jLmg+CiAjaW5jbHVkZSA8bGludXgvZ2V0Y3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTA3OCwxMyArMTA4MCwxMyBAQAogewogCXN0cnVjdCB1c2VyX3N0cnVjdCAqbmV3X3VzZXI7CiAKLQluZXdfdXNlciA9IGFsbG9jX3VpZChuZXdfcnVpZCk7CisJbmV3X3VzZXIgPSBhbGxvY191aWQoY3VycmVudC0+bnNwcm94eS0+dXNlcl9ucywgbmV3X3J1aWQpOwogCWlmICghbmV3X3VzZXIpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKGF0b21pY19yZWFkKCZuZXdfdXNlci0+cHJvY2Vzc2VzKSA+PQogCQkJCWN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTlBST0NdLnJsaW1fY3VyICYmCi0JCQluZXdfdXNlciAhPSAmcm9vdF91c2VyKSB7CisJCQluZXdfdXNlciAhPSBjdXJyZW50LT5uc3Byb3h5LT51c2VyX25zLT5yb290X3VzZXIpIHsKIAkJZnJlZV91aWQobmV3X3VzZXIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC0yMjQxLDYgKzIyNDMsMTMgQEAKIAkJCWVycm9yID0gU0VUX0VORElBTihjdXJyZW50LCBhcmcyKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgUFJfR0VUX1NFQ0NPTVA6CisJCQllcnJvciA9IHByY3RsX2dldF9zZWNjb21wKCk7CisJCQlicmVhazsKKwkJY2FzZSBQUl9TRVRfU0VDQ09NUDoKKwkJCWVycm9yID0gcHJjdGxfc2V0X3NlY2NvbXAoYXJnMik7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggN2UxMWUyYy4uYjBlYzQ5OCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtMTQsNiArMTQsNyBAQAogCiBjb25kX3N5c2NhbGwoc3lzX25mc3NlcnZjdGwpOwogY29uZF9zeXNjYWxsKHN5c19xdW90YWN0bCk7Citjb25kX3N5c2NhbGwoc3lzMzJfcXVvdGFjdGwpOwogY29uZF9zeXNjYWxsKHN5c19hY2N0KTsKIGNvbmRfc3lzY2FsbChzeXNfbG9va3VwX2Rjb29raWUpOwogY29uZF9zeXNjYWxsKHN5c19zd2Fwb24pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGQ5M2UxM2QuLjcwNjNlYmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgpAQCAtNDksOSArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi1leHRlcm4gaW50IHByb2NfbnJfZmlsZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKLQogI2lmZGVmIENPTkZJR19YODYKICNpbmNsdWRlIDxhc20vbm1pLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KQEAgLTYxLDYgKzU5LDcgQEAKIAogLyogRXh0ZXJuYWwgdmFyaWFibGVzIG5vdCBpbiBhIGhlYWRlciBmaWxlLiAqLwogZXh0ZXJuIGludCBDX0FfRDsKK2V4dGVybiBpbnQgcHJpbnRfZmF0YWxfc2lnbmFsczsKIGV4dGVybiBpbnQgc3lzY3RsX292ZXJjb21taXRfbWVtb3J5OwogZXh0ZXJuIGludCBzeXNjdGxfb3ZlcmNvbW1pdF9yYXRpbzsKIGV4dGVybiBpbnQgc3lzY3RsX3BhbmljX29uX29vbTsKQEAgLTIwMiw3ICsyMDEsMTAgQEAKIAkJLm1vZGUJCT0gMDU1NSwKIAkJLmNoaWxkCQk9IGRldl90YWJsZSwKIAl9LAotCisvKgorICogTk9URTogZG8gbm90IGFkZCBuZXcgZW50cmllcyB0byB0aGlzIHRhYmxlIHVubGVzcyB5b3UgaGF2ZSByZWFkCisgKiBEb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKKyAqLwogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCkBAIC0zNDAsNiArMzQyLDE0IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gInByaW50LWZhdGFsLXNpZ25hbHMiLAorCQkuZGF0YQkJPSAmcHJpbnRfZmF0YWxfc2lnbmFscywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCiAjaWZkZWYgX19zcGFyY19fCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1NQQVJDX1JFQk9PVCwKQEAgLTgxNCw2ICs4MjQsMTQgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCSB9LAorCSB7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAiaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUiLAorCQkuZGF0YQkJPSAmaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmaHVnZXRsYl90cmVhdF9tb3ZhYmxlX2hhbmRsZXIsCisJfSwKICNlbmRpZgogCXsKIAkJLmN0bF9uYW1lCT0gVk1fTE9XTUVNX1JFU0VSVkVfUkFUSU8sCkBAIC05NTgsNiArOTc2LDE3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKIAl9LAorI2lmZGVmIENPTkZJR19OVU1BCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm51bWFfem9uZWxpc3Rfb3JkZXIiLAorCQkuZGF0YQkJPSAmbnVtYV96b25lbGlzdF9vcmRlciwKKwkJLm1heGxlbgkJPSBOVU1BX1pPTkVMSVNUX09SREVSX0xFTiwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfc3RyaW5nLAorCX0sCisjZW5kaWYKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikgfHwgXAogICAgKGRlZmluZWQoQ09ORklHX1NVUEVSSCkgJiYgZGVmaW5lZChDT05GSUdfVlNZU0NBTEwpKQpAQCAtOTcyLDYgKzEwMDEsMTAgQEAKIAkJLmV4dHJhMQkJPSAmemVybywKIAl9LAogI2VuZGlmCisvKgorICogTk9URTogZG8gbm90IGFkZCBuZXcgZW50cmllcyB0byB0aGlzIHRhYmxlIHVubGVzcyB5b3UgaGF2ZSByZWFkCisgKiBEb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKKyAqLwogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCkBAIC0xMTEyLDYgKzExNDUsMTAgQEAKIAkJLmNoaWxkCQk9IGJpbmZtdF9taXNjX3RhYmxlLAogCX0sCiAjZW5kaWYKKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90YXNrc3RhdHMuYyBiL2tlcm5lbC90YXNrc3RhdHMuYwppbmRleCA5MDZjYWU3Li4wNTk0MzFlIDEwMDY0NAotLS0gYS9rZXJuZWwvdGFza3N0YXRzLmMKKysrIGIva2VybmVsL3Rhc2tzdGF0cy5jCkBAIC0xOTYsNiArMTk2LDggQEAKIAogCS8qIGZpbGwgaW4gYmFzaWMgYWNjdCBmaWVsZHMgKi8KIAlzdGF0cy0+dmVyc2lvbiA9IFRBU0tTVEFUU19WRVJTSU9OOworCXN0YXRzLT5udmNzdyA9IHRzay0+bnZjc3c7CisJc3RhdHMtPm5pdmNzdyA9IHRzay0+bml2Y3N3OwogCWJhY2N0X2FkZF90c2soc3RhdHMsIHRzayk7CiAKIAkvKiBmaWxsIGluIGV4dGVuZGVkIGFjY3QgZmllbGRzICovCkBAIC0yNDIsNiArMjQ0LDggQEAKIAkJICovCiAJCWRlbGF5YWNjdF9hZGRfdHNrKHN0YXRzLCB0c2spOwogCisJCXN0YXRzLT5udmNzdyArPSB0c2stPm52Y3N3OworCQlzdGF0cy0+bml2Y3N3ICs9IHRzay0+bml2Y3N3OwogCX0gd2hpbGVfZWFjaF90aHJlYWQoZmlyc3QsIHRzayk7CiAKIAl1bmxvY2tfdGFza19zaWdoYW5kKGZpcnN0LCAmZmxhZ3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUuYyBiL2tlcm5lbC90aW1lLmMKaW5kZXggZjA0NzkxZi4uZmZlMTkxNCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUuYworKysgYi9rZXJuZWwvdGltZS5jCkBAIC01NywxNCArNTcsMTcgQEAKICAqLwogYXNtbGlua2FnZSBsb25nIHN5c190aW1lKHRpbWVfdCBfX3VzZXIgKiB0bG9jKQogewotCXRpbWVfdCBpOwotCXN0cnVjdCB0aW1ldmFsIHR2OworCS8qCisJICogV2UgcmVhZCB4dGltZS50dl9zZWMgYXRvbWljYWxseSAtIGl0J3MgdXBkYXRlZAorCSAqIGF0b21pY2FsbHkgYnkgdXBkYXRlX3dhbGxfdGltZSgpLCBzbyBubyBuZWVkIHRvCisJICogZXZlbiByZWFkLWxvY2sgdGhlIHh0aW1lIHNlcWxvY2s6CisJICovCisJdGltZV90IGkgPSB4dGltZS50dl9zZWM7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlpID0gdHYudHZfc2VjOworCXNtcF9ybWIoKTsgLyogc3lzX3RpbWUoKSByZXN1bHRzIGFyZSBjb2hlcmVudCAqLwogCiAJaWYgKHRsb2MpIHsKLQkJaWYgKHB1dF91c2VyKGksdGxvYykpCisJCWlmIChwdXRfdXNlcihpLCB0bG9jKSkKIAkJCWkgPSAtRUZBVUxUOwogCX0KIAlyZXR1cm4gaTsKQEAgLTM3MywxMiArMzc2LDI1IEBACiAKIAl0di0+dHZfc2VjID0gc2VjOwogCXR2LT50dl91c2VjID0gdXNlYzsKLX0KIAorCS8qCisJICogTWFrZSBzdXJlIHh0aW1lLnR2X3NlYyBbcmV0dXJuZWQgYnkgc3lzX3RpbWUoKV0gYWx3YXlzCisJICogZm9sbG93cyB0aGUgZ2V0dGltZW9mZGF5KCkgcmVzdWx0IHByZWNpc2VseS4gVGhpcworCSAqIGNvbmRpdGlvbiBpcyBleHRyZW1lbHkgdW5saWtlbHksIGl0IGNhbiBoaXQgYXQgbW9zdAorCSAqIG9uY2UgcGVyIHNlY29uZDoKKwkgKi8KKwlpZiAodW5saWtlbHkoeHRpbWUudHZfc2VjICE9IHR2LT50dl9zZWMpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCXVwZGF0ZV93YWxsX3RpbWUoKTsKKwkJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwl9Cit9CiBFWFBPUlRfU1lNQk9MKGRvX2dldHRpbWVvZmRheSk7CiAKKyNlbHNlCS8qIENPTkZJR19USU1FX0lOVEVSUE9MQVRJT04gKi8KIAotI2Vsc2UKICNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQogLyoKICAqIFNpbXVsYXRlIGdldHRpbWVvZmRheSB1c2luZyBkb19nZXR0aW1lb2ZkYXkgd2hpY2ggb25seSBhbGxvd3MgYSB0aW1ldmFsCkBAIC0zOTQsNyArNDEwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdldG5zdGltZW9mZGF5KTsKICNlbmRpZgotI2VuZGlmCisjZW5kaWYJLyogQ09ORklHX1RJTUVfSU5URVJQT0xBVElPTiAqLwogCiAvKiBDb252ZXJ0cyBHcmVnb3JpYW4gZGF0ZSB0byBzZWNvbmRzIHNpbmNlIDE5NzAtMDEtMDEgMDA6MDA6MDAuCiAgKiBBc3N1bWVzIGlucHV0IGluIG5vcm1hbCBkYXRlIGZvcm1hdCwgaS5lLiAxOTgwLTEyLTMxIDIzOjU5OjU5CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwppbmRleCA3NjIxMmIyLi4yYWQxYzM3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTIwNSw0NyArMjA1LDYgQEAKIH0KIAogLyoqCi0gKiBjbG9ja2V2ZW50c19yZXF1ZXN0X2RldmljZQotICovCi1zdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbG9ja2V2ZW50c19yZXF1ZXN0X2RldmljZSh1bnNpZ25lZCBpbnQgZmVhdHVyZXMsCi0JCQkJCQkgICAgICBjcHVtYXNrX3QgY3B1bWFzaykKLXsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjdXIsICpkZXYgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQotCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2NrZXZlbnRfZGV2aWNlcykgewotCQljdXIgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbGlzdCk7Ci0KLQkJaWYgKChjdXItPmZlYXR1cmVzICYgZmVhdHVyZXMpID09IGZlYXR1cmVzICYmCi0JCSAgICBjcHVzX2VxdWFsKGNwdW1hc2ssIGN1ci0+Y3B1bWFzaykpIHsKLQkJCWlmICghZGV2IHx8IGRldi0+cmF0aW5nIDwgY3VyLT5yYXRpbmcpCi0JCQkJZGV2ID0gY3VyOwotCQl9Ci0JfQotCi0JY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKE5VTEwsIGRldik7Ci0KLQlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Ci0KLQlyZXR1cm4gZGV2OwotfQotCi0vKioKLSAqIGNsb2NrZXZlbnRzX3JlbGVhc2VfZGV2aWNlCi0gKi8KLXZvaWQgY2xvY2tldmVudHNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQotewotCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7Ci0KLQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoZGV2LCBOVUxMKTsKLQljbG9ja2V2ZW50c19ub3RpZnlfcmVsZWFzZWQoKTsKLQotCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLX0KLQotLyoqCiAgKiBjbG9ja2V2ZW50c19ub3RpZnkgLSBub3RpZmljYXRpb24gYWJvdXQgcmVsZXZhbnQgZXZlbnRzCiAgKi8KIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9udHAuYyBiL2tlcm5lbC90aW1lL250cC5jCmluZGV4IGNmNTNiYjUuLjQzOGM2YjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL250cC5jCisrKyBiL2tlcm5lbC90aW1lL250cC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgotCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS90aW1leC5oPgogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCAzZDEwNDJmLi43MjhjZWRmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTM2LDkgKzM2LDE3IEBACiAgKiBhdCB6ZXJvIGF0IHN5c3RlbSBib290IHRpbWUsIHNvIHdhbGxfdG9fbW9ub3RvbmljIHdpbGwgYmUgbmVnYXRpdmUsCiAgKiBob3dldmVyLCB3ZSB3aWxsIEFMV0FZUyBrZWVwIHRoZSB0dl9uc2VjIHBhcnQgcG9zaXRpdmUgc28gd2UgY2FuIHVzZQogICogdGhlIHVzdWFsIG5vcm1hbGl6YXRpb24uCisgKgorICogd2FsbF90b19tb25vdG9uaWMgaXMgbW92ZWQgYWZ0ZXIgcmVzdW1lIGZyb20gc3VzcGVuZCBmb3IgdGhlIG1vbm90b25pYworICogdGltZSBub3QgdG8ganVtcC4gV2UgbmVlZCB0byBhZGQgdG90YWxfc2xlZXBfdGltZSB0byB3YWxsX3RvX21vbm90b25pYworICogdG8gZ2V0IHRoZSByZWFsIGJvb3QgYmFzZWQgdGltZSBvZmZzZXQuCisgKgorICogLSB3YWxsX3RvX21vbm90b25pYyBpcyBubyBsb25nZXIgdGhlIGJvb3QgdGltZSwgZ2V0Ym9vdHRpbWUgbXVzdCBiZQorICogdXNlZCBpbnN0ZWFkLgogICovCiBzdHJ1Y3QgdGltZXNwZWMgeHRpbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOwogc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3NsZWVwX3RpbWU7CQkvKiBzZWNvbmRzICovCiAKIEVYUE9SVF9TWU1CT0woeHRpbWUpOwogCkBAIC0yNTEsNiArMjU5LDcgQEAKIAl4dGltZS50dl9uc2VjID0gMDsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCiAJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKwl0b3RhbF9zbGVlcF90aW1lID0gMDsKIAogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CkBAIC0yODIsNiArMjkxLDcgQEAKIAogCQl4dGltZS50dl9zZWMgKz0gc2xlZXBfbGVuZ3RoOwogCQl3YWxsX3RvX21vbm90b25pYy50dl9zZWMgLT0gc2xlZXBfbGVuZ3RoOworCQl0b3RhbF9zbGVlcF90aW1lICs9IHNsZWVwX2xlbmd0aDsKIAl9CiAJLyogcmUtYmFzZSB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLwogCWNsb2NrLT5jeWNsZV9sYXN0ID0gY2xvY2tzb3VyY2VfcmVhZChjbG9jayk7CkBAIC00NzYsMyArNDg2LDMwIEBACiAJY2hhbmdlX2Nsb2Nrc291cmNlKCk7CiAJdXBkYXRlX3ZzeXNjYWxsKCZ4dGltZSwgY2xvY2spOwogfQorCisvKioKKyAqIGdldGJvb3R0aW1lIC0gUmV0dXJuIHRoZSByZWFsIHRpbWUgb2Ygc3lzdGVtIGJvb3QuCisgKiBAdHM6CQlwb2ludGVyIHRvIHRoZSB0aW1lc3BlYyB0byBiZSBzZXQKKyAqCisgKiBSZXR1cm5zIHRoZSB0aW1lIG9mIGRheSBpbiBhIHRpbWVzcGVjLgorICoKKyAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIHdhbGxfdG9fbW9ub3RvbmljIG9mZnNldCBhbmQgdGhlIHRvdGFsIHN1c3BlbmQKKyAqIHRpbWUuIENhbGxzIHRvIHNldHRpbWVvZmRheSB3aWxsIGFmZmVjdCB0aGUgdmFsdWUgcmV0dXJuZWQgKHdoaWNoCisgKiBiYXNpY2FsbHkgbWVhbnMgdGhhdCBob3dldmVyIHdyb25nIHlvdXIgcmVhbCB0aW1lIGNsb2NrIGlzIGF0IGJvb3QgdGltZSwKKyAqIHlvdSBnZXQgdGhlIHJpZ2h0IHRpbWUgaGVyZSkuCisgKi8KK3ZvaWQgZ2V0Ym9vdHRpbWUoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYyh0cywKKwkJLSAod2FsbF90b19tb25vdG9uaWMudHZfc2VjICsgdG90YWxfc2xlZXBfdGltZSksCisJCS0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyk7Cit9CisKKy8qKgorICogbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCAtIENvbnZlcnQgdGhlIG1vbm90b25pYyB0aW1lIHRvIGJvb3QgYmFzZWQuCisgKiBAdHM6CQlwb2ludGVyIHRvIHRoZSB0aW1lc3BlYyB0byBiZSBjb252ZXJ0ZWQKKyAqLwordm9pZCBtb25vdG9uaWNfdG9fYm9vdGJhc2VkKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJdHMtPnR2X3NlYyArPSB0b3RhbF9zbGVlcF90aW1lOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jIGIva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCmluZGV4IDhiYmNmYjcuLmU1ZWRjM2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYworKysgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpzeW0pCiB7Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJaWYgKGxvb2t1cF9zeW1ib2xfbmFtZSgodW5zaWduZWQgbG9uZylzeW0sIHN5bW5hbWUpIDwgMCkKIAkJU0VRX3ByaW50ZihtLCAiPCVwPiIsIHN5bSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jIGIva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYwppbmRleCAzMjE2OTM3Li44ZWQ2MmZkIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAkgKiBOdW1iZXIgb2YgdGltZW91dCBldmVudHM6CiAJICovCiAJdW5zaWduZWQgbG9uZwkJY291bnQ7CisJdW5zaWduZWQgaW50CQl0aW1lcl9mbGFnOwogCiAJLyoKIAkgKiBXZSBzYXZlIHRoZSBjb21tYW5kLWxpbmUgc3RyaW5nIHRvIHByZXNlcnZlCkBAIC0yMzEsNyArMjMyLDggQEAKICAqIGluY3JlbWVudGVkLiBPdGhlcndpc2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgaW4gYSBmcmVlIHNsb3QuCiAgKi8KIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKLQkJCSAgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pCisJCQkgICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKmNvbW0sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdGltZXJfZmxhZykKIHsKIAkvKgogCSAqIEl0IGRvZXNudCBtYXR0ZXIgd2hpY2ggbG9jayB3ZSB0YWtlOgpAQCAtMjQ5LDYgKzI1MSw3IEBACiAJaW5wdXQuc3RhcnRfZnVuYyA9IHN0YXJ0ZjsKIAlpbnB1dC5leHBpcmVfZnVuYyA9IHRpbWVyZjsKIAlpbnB1dC5waWQgPSBwaWQ7CisJaW5wdXQudGltZXJfZmxhZyA9IHRpbWVyX2ZsYWc7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CiAJaWYgKCFhY3RpdmUpCkBAIC0yNjYsNyArMjY5LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJaWYgKGxvb2t1cF9zeW1ib2xfbmFtZShhZGRyLCBzeW1uYW1lKSA8IDApCiAJCXNlcV9wcmludGYobSwgIjwlcD4iLCAodm9pZCAqKWFkZHIpOwpAQCAtMjk1LDcgKzI5OCw3IEBACiAJcGVyaW9kID0ga3RpbWVfdG9fdGltZXNwZWModGltZSk7CiAJbXMgPSBwZXJpb2QudHZfbnNlYyAvIDEwMDAwMDA7CiAKLQlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMVxuIik7CisJc2VxX3B1dHMobSwgIlRpbWVyIFN0YXRzIFZlcnNpb246IHYwLjJcbiIpOwogCXNlcV9wcmludGYobSwgIlNhbXBsZSBwZXJpb2Q6ICVsZC4lMDNsZCBzXG4iLCBwZXJpb2QudHZfc2VjLCBtcyk7CiAJaWYgKGF0b21pY19yZWFkKCZvdmVyZmxvd19jb3VudCkpCiAJCXNlcV9wcmludGYobSwgIk92ZXJmbG93OiAlZCBlbnRyaWVzXG4iLApAQCAtMzAzLDggKzMwNiwxMyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXM7IGkrKykgewogCQllbnRyeSA9IGVudHJpZXMgKyBpOwotCQlzZXFfcHJpbnRmKG0sICIlNGx1LCAlNWQgJS0xNnMgIiwKKyAJCWlmIChlbnRyeS0+dGltZXJfZmxhZyAmIFRJTUVSX1NUQVRTX0ZMQUdfREVGRVJSQUJMRSkgeworCQkJc2VxX3ByaW50ZihtLCAiJTRsdUQsICU1ZCAlLTE2cyAiLAogCQkJCWVudHJ5LT5jb3VudCwgZW50cnktPnBpZCwgZW50cnktPmNvbW0pOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihtLCAiICU0bHUsICU1ZCAlLTE2cyAiLAorCQkJCWVudHJ5LT5jb3VudCwgZW50cnktPnBpZCwgZW50cnktPmNvbW0pOworCQl9CiAKIAkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPnN0YXJ0X2Z1bmMpOwogCQlzZXFfcHV0cyhtLCAiICgiKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggMWE2OTcwNS4uYjc3OTJmYiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTMwNSw2ICszMDUsMjAgQEAKIAltZW1jcHkodGltZXItPnN0YXJ0X2NvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCXRpbWVyLT5zdGFydF9waWQgPSBjdXJyZW50LT5waWQ7CiB9CisKK3N0YXRpYyB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXVuc2lnbmVkIGludCBmbGFnID0gMDsKKworCWlmICh1bmxpa2VseSh0YmFzZV9nZXRfZGVmZXJyYWJsZSh0aW1lci0+YmFzZSkpKQorCQlmbGFnIHw9IFRJTUVSX1NUQVRTX0ZMQUdfREVGRVJSQUJMRTsKKworCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0sIGZsYWcpOworfQorCisjZWxzZQorc3RhdGljIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpIHt9CiAjZW5kaWYKIAogLyoqCkBAIC0xMTE0LDYgKzExMjgsNyBAQAogCQlnZXRuc3RpbWVvZmRheSgmdHApOwogCQl0cC50dl9zZWMgKz0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjOwogCQl0cC50dl9uc2VjICs9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWM7CisJCW1vbm90b25pY190b19ib290YmFzZWQoJnRwKTsKIAkJaWYgKHRwLnR2X25zZWMgLSBOU0VDX1BFUl9TRUMgPj0gMCkgewogCQkJdHAudHZfbnNlYyA9IHRwLnR2X25zZWMgLSBOU0VDX1BFUl9TRUM7CiAJCQl0cC50dl9zZWMrKzsKQEAgLTEyMDYsNyArMTIyMSw4IEBACiAJCQkvKgogCQkJICogVGhlIEFQcyB1c2UgdGhpcyBwYXRoIGxhdGVyIGluIGJvb3QKIAkJCSAqLwotCQkJYmFzZSA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmJhc2UpLCBHRlBfS0VSTkVMLAorCQkJYmFzZSA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmJhc2UpLAorCQkJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCiAJCQkJCQljcHVfdG9fbm9kZShjcHUpKTsKIAkJCWlmICghYmFzZSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEyMTcsNyArMTIzMyw2IEBACiAJCQkJa2ZyZWUoYmFzZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9Ci0JCQltZW1zZXQoYmFzZSwgMCwgc2l6ZW9mKCpiYXNlKSk7CiAJCQlwZXJfY3B1KHR2ZWNfYmFzZXMsIGNwdSkgPSBiYXNlOwogCQl9IGVsc2UgewogCQkJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDQ4Njk1NjMuLjk4YjgyNTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLmMKKysrIGIva2VybmVsL3VzZXIuYwpAQCAtMTQsMjAgKzE0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogLyoKICAqIFVJRCB0YXNrIGNvdW50IGNhY2hlLCB0byBnZXQgZmFzdCB1c2VyIGxvb2t1cCBpbiAiYWxsb2NfdWlkIgogICogd2hlbiBjaGFuZ2luZyB1c2VyIElEJ3MgKGllIHNldHVpZCgpIGFuZCBmcmllbmRzKS4KICAqLwogCi0jZGVmaW5lIFVJREhBU0hfQklUUyAoQ09ORklHX0JBU0VfU01BTEwgPyAzIDogOCkKLSNkZWZpbmUgVUlESEFTSF9TWgkJKDEgPDwgVUlESEFTSF9CSVRTKQogI2RlZmluZSBVSURIQVNIX01BU0sJCShVSURIQVNIX1NaIC0gMSkKICNkZWZpbmUgX191aWRoYXNoZm4odWlkKQkoKCh1aWQgPj4gVUlESEFTSF9CSVRTKSArIHVpZCkgJiBVSURIQVNIX01BU0spCi0jZGVmaW5lIHVpZGhhc2hlbnRyeSh1aWQpCSh1aWRoYXNoX3RhYmxlICsgX191aWRoYXNoZm4oKHVpZCkpKQorI2RlZmluZSB1aWRoYXNoZW50cnkobnMsIHVpZCkJKChucyktPnVpZGhhc2hfdGFibGUgKyBfX3VpZGhhc2hmbigodWlkKSkpCiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdWlkX2NhY2hlcDsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVpZGhhc2hfdGFibGVbVUlESEFTSF9TWl07CiAKIC8qCiAgKiBUaGUgdWlkaGFzaF9sb2NrIGlzIG1vc3RseSB0YWtlbiBmcm9tIHByb2Nlc3MgY29udGV4dCwgYnV0IGl0IGlzCkBAIC05NCw5ICs5MywxMCBAQAogewogCXN0cnVjdCB1c2VyX3N0cnVjdCAqcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyA9IGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnM7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWlkaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0ID0gdWlkX2hhc2hfZmluZCh1aWQsIHVpZGhhc2hlbnRyeSh1aWQpKTsKKwlyZXQgPSB1aWRfaGFzaF9maW5kKHVpZCwgdWlkaGFzaGVudHJ5KG5zLCB1aWQpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1aWRoYXNoX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIwLDkgKzEyMCw5IEBACiAJfQogfQogCi1zdHJ1Y3QgdXNlcl9zdHJ1Y3QgKiBhbGxvY191aWQodWlkX3QgdWlkKQorc3RydWN0IHVzZXJfc3RydWN0ICogYWxsb2NfdWlkKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMsIHVpZF90IHVpZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoZW50ID0gdWlkaGFzaGVudHJ5KHVpZCk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGFzaGVudCA9IHVpZGhhc2hlbnRyeShucywgdWlkKTsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVwOwogCiAJc3Bpbl9sb2NrX2lycSgmdWlkaGFzaF9sb2NrKTsKQEAgLTIxMSwxMSArMjExLDExIEBACiAJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CiAKIAlmb3IobiA9IDA7IG4gPCBVSURIQVNIX1NaOyArK24pCi0JCUlOSVRfTElTVF9IRUFEKHVpZGhhc2hfdGFibGUgKyBuKTsKKwkJSU5JVF9MSVNUX0hFQUQoaW5pdF91c2VyX25zLnVpZGhhc2hfdGFibGUgKyBuKTsKIAogCS8qIEluc2VydCB0aGUgcm9vdCB1c2VyIGltbWVkaWF0ZWx5IChpbml0IGFscmVhZHkgcnVucyBhcyByb290KSAqLwogCXNwaW5fbG9ja19pcnEoJnVpZGhhc2hfbG9jayk7Ci0JdWlkX2hhc2hfaW5zZXJ0KCZyb290X3VzZXIsIHVpZGhhc2hlbnRyeSgwKSk7CisJdWlkX2hhc2hfaW5zZXJ0KCZyb290X3VzZXIsIHVpZGhhc2hlbnRyeSgmaW5pdF91c2VyX25zLCAwKSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ1aWRoYXNoX2xvY2spOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTVkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgorCitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgaW5pdF91c2VyX25zID0geworCS5rcmVmID0geworCQkucmVmY291bnQJPSBBVE9NSUNfSU5JVCgyKSwKKwl9LAorCS5yb290X3VzZXIgPSAmcm9vdF91c2VyLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF91c2VyX25zKTsKKworI2lmZGVmIENPTkZJR19VU0VSX05TCisKKy8qCisgKiBDbG9uZSBhIG5ldyBucyBjb3B5aW5nIGFuIG9yaWdpbmFsIHVzZXIgbnMsIHNldHRpbmcgcmVmY291bnQgdG8gMQorICogQG9sZF9uczogbmFtZXNwYWNlIHRvIGNsb25lCisgKiBSZXR1cm4gTlVMTCBvbiBlcnJvciAoZmFpbHVyZSB0byBrbWFsbG9jKSwgbmV3IG5zIG90aGVyd2lzZQorICovCitzdGF0aWMgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpjbG9uZV91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKQoreworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnM7CisJc3RydWN0IHVzZXJfc3RydWN0ICpuZXdfdXNlcjsKKwlpbnQgbjsKKworCW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzZXJfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFucykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlrcmVmX2luaXQoJm5zLT5rcmVmKTsKKworCWZvciAobiA9IDA7IG4gPCBVSURIQVNIX1NaOyArK24pCisJCUlOSVRfTElTVF9IRUFEKG5zLT51aWRoYXNoX3RhYmxlICsgbik7CisKKwkvKiBJbnNlcnQgbmV3IHJvb3QgdXNlci4gICovCisJbnMtPnJvb3RfdXNlciA9IGFsbG9jX3VpZChucywgMCk7CisJaWYgKCFucy0+cm9vdF91c2VyKSB7CisJCWtmcmVlKG5zKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJLyogUmVzZXQgY3VycmVudC0+dXNlciB3aXRoIGEgbmV3IG9uZSAqLworCW5ld191c2VyID0gYWxsb2NfdWlkKG5zLCBjdXJyZW50LT51aWQpOworCWlmICghbmV3X3VzZXIpIHsKKwkJZnJlZV91aWQobnMtPnJvb3RfdXNlcik7CisJCWtmcmVlKG5zKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJc3dpdGNoX3VpZChuZXdfdXNlcik7CisJcmV0dXJuIG5zOworfQorCitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKiBjb3B5X3VzZXJfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm9sZF9ucykKK3sKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5ld19uczsKKworCUJVR19PTighb2xkX25zKTsKKwlnZXRfdXNlcl9ucyhvbGRfbnMpOworCisJaWYgKCEoZmxhZ3MgJiBDTE9ORV9ORVdVU0VSKSkKKwkJcmV0dXJuIG9sZF9uczsKKworCW5ld19ucyA9IGNsb25lX3VzZXJfbnMob2xkX25zKTsKKworCXB1dF91c2VyX25zKG9sZF9ucyk7CisJcmV0dXJuIG5ld19uczsKK30KKwordm9pZCBmcmVlX3VzZXJfbnMoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpuczsKKworCW5zID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB1c2VyX25hbWVzcGFjZSwga3JlZik7CisJa2ZyZWUobnMpOworfQorCisjZW5kaWYgLyogQ09ORklHX1VTRVJfTlMgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lLmMgYi9rZXJuZWwvdXRzbmFtZS5jCmluZGV4IDE2MGM4YzUuLjlkODE4MGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lLmMKKysrIGIva2VybmVsL3V0c25hbWUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0cy5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qCiAgKiBDbG9uZSBhIG5ldyBucyBjb3B5aW5nIGFuIG9yaWdpbmFsIHV0c25hbWUsIHNldHRpbmcgcmVmY291bnQgdG8gMQpAQCAtMjQsMTAgKzI1LDExIEBACiAJc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zOwogCiAJbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXRzX25hbWVzcGFjZSksIEdGUF9LRVJORUwpOwotCWlmIChucykgewotCQltZW1jcHkoJm5zLT5uYW1lLCAmb2xkX25zLT5uYW1lLCBzaXplb2YobnMtPm5hbWUpKTsKLQkJa3JlZl9pbml0KCZucy0+a3JlZik7Ci0JfQorCWlmICghbnMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbWVtY3B5KCZucy0+bmFtZSwgJm9sZF9ucy0+bmFtZSwgc2l6ZW9mKG5zLT5uYW1lKSk7CisJa3JlZl9pbml0KCZucy0+a3JlZik7CiAJcmV0dXJuIG5zOwogfQogCkBAIC0zNyw3ICszOSw3IEBACiAgKiB1dHNuYW1lIG9mIHRoaXMgcHJvY2VzcyB3b24ndCBiZSBzZWVuIGJ5IHBhcmVudCwgYW5kIHZpY2UKICAqIHZlcnNhLgogICovCi1zdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKGludCBmbGFncywgc3RydWN0IHV0c19uYW1lc3BhY2UgKm9sZF9ucykKK3N0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUodW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHV0c19uYW1lc3BhY2UgKm9sZF9ucykKIHsKIAlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbmV3X25zOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYyBiL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCmluZGV4IGYyMmI5ZGIuLmM3NmMwNjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCisrKyBiL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCkBAIC0xOCwxMCArMTgsNyBAQAogc3RhdGljIHZvaWQgKmdldF91dHMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlKQogewogCWNoYXIgKndoaWNoID0gdGFibGUtPmRhdGE7Ci0jaWZkZWYgQ09ORklHX1VUU19OUwotCXN0cnVjdCB1dHNfbmFtZXNwYWNlICp1dHNfbnMgPSBjdXJyZW50LT5uc3Byb3h5LT51dHNfbnM7Ci0Jd2hpY2ggPSAod2hpY2ggLSAoY2hhciAqKSZpbml0X3V0c19ucykgKyAoY2hhciAqKXV0c19uczsKLSNlbmRpZgorCiAJaWYgKCF3cml0ZSkKIAkJZG93bl9yZWFkKCZ1dHNfc2VtKTsKIAllbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggM2JlYmY3My4uNThlNWMxNSAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtMjgyLDggKzI4Miw4IEBACiAJc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EgPSBfX2N3cTsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAotCWlmICghY3dxLT53cS0+ZnJlZXplYWJsZSkKLQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisJaWYgKGN3cS0+d3EtPmZyZWV6ZWFibGUpCisJCXNldF9mcmVlemFibGUoKTsKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTUpOwogCkBAIC0zODIsMTYgKzM4MiwxNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZmx1c2hfd29ya3F1ZXVlKTsKIAogLyoKLSAqIFVwb24gYSBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGNhbGxlciAib3ducyIgV09SS19TVFJVQ1RfUEVORElORyBiaXQsCisgKiBVcG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4gKD49IDApLCB0aGUgY2FsbGVyICJvd25zIiBXT1JLX1NUUlVDVF9QRU5ESU5HIGJpdCwKICAqIHNvIHRoaXMgd29yayBjYW4ndCBiZSByZS1hcm1lZCBpbiBhbnkgd2F5LgogICovCiBzdGF0aWMgaW50IHRyeV90b19ncmFiX3BlbmRpbmcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxOwotCWludCByZXQgPSAwOworCWludCByZXQgPSAtMTsKIAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChXT1JLX1NUUlVDVF9QRU5ESU5HLCB3b3JrX2RhdGFfYml0cyh3b3JrKSkpCi0JCXJldHVybiAxOworCQlyZXR1cm4gMDsKIAogCS8qCiAJICogVGhlIHF1ZXVlaW5nIGlzIGluIHByb2dyZXNzLCBvciBpdCBpcyBhbHJlYWR5IHF1ZXVlZC4gVHJ5IHRvCkBAIC00NTcsMTAgKzQ1NywyOCBAQAogCQl3YWl0X29uX2NwdV93b3JrKHBlcl9jcHVfcHRyKHdxLT5jcHVfd3EsIGNwdSksIHdvcmspOwogfQogCitzdGF0aWMgaW50IF9fY2FuY2VsX3dvcmtfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLAorCQkJCXN0cnVjdCB0aW1lcl9saXN0KiB0aW1lcikKK3sKKwlpbnQgcmV0OworCisJZG8geworCQlyZXQgPSAodGltZXIgJiYgbGlrZWx5KGRlbF90aW1lcih0aW1lcikpKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSB0cnlfdG9fZ3JhYl9wZW5kaW5nKHdvcmspOworCQl3YWl0X29uX3dvcmsod29yayk7CisJfSB3aGlsZSAodW5saWtlbHkocmV0IDwgMCkpOworCisJd29ya19jbGVhcl9wZW5kaW5nKHdvcmspOworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogY2FuY2VsX3dvcmtfc3luYyAtIGJsb2NrIHVudGlsIGEgd29ya19zdHJ1Y3QncyBjYWxsYmFjayBoYXMgdGVybWluYXRlZAogICogQHdvcms6IHRoZSB3b3JrIHdoaWNoIGlzIHRvIGJlIGZsdXNoZWQKICAqCisgKiBSZXR1cm5zIHRydWUgaWYgQHdvcmsgd2FzIHBlbmRpbmcuCisgKgogICogY2FuY2VsX3dvcmtfc3luYygpIHdpbGwgY2FuY2VsIHRoZSB3b3JrIGlmIGl0IGlzIHF1ZXVlZC4gSWYgdGhlIHdvcmsncwogICogY2FsbGJhY2sgYXBwZWFycyB0byBiZSBydW5uaW5nLCBjYW5jZWxfd29ya19zeW5jKCkgd2lsbCBibG9jayB1bnRpbCBpdAogICogaGFzIGNvbXBsZXRlZC4KQEAgLTQ3NiwzMSArNDk0LDI2IEBACiAgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgd29ya3F1ZXVlX3N0cnVjdCBvbiB3aGljaCB0aGlzIHdvcmsgd2FzIGxhc3QKICAqIHF1ZXVlZCBjYW4ndCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotdm9pZCBjYW5jZWxfd29ya19zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK2ludCBjYW5jZWxfd29ya19zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQl3aGlsZSAoIXRyeV90b19ncmFiX3BlbmRpbmcod29yaykpCi0JCWNwdV9yZWxheCgpOwotCXdhaXRfb25fd29yayh3b3JrKTsKLQl3b3JrX2NsZWFyX3BlbmRpbmcod29yayk7CisJcmV0dXJuIF9fY2FuY2VsX3dvcmtfdGltZXIod29yaywgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjYW5jZWxfd29ya19zeW5jKTsKIAogLyoqCi0gKiBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrIC0gcmVsaWFibHkga2lsbCBvZmYgYSBkZWxheWVkIHdvcmsuCisgKiBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMgLSByZWxpYWJseSBraWxsIG9mZiBhIGRlbGF5ZWQgd29yay4KICAqIEBkd29yazogdGhlIGRlbGF5ZWQgd29yayBzdHJ1Y3QKICAqCisgKiBSZXR1cm5zIHRydWUgaWYgQGR3b3JrIHdhcyBwZW5kaW5nLgorICoKICAqIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGlmIEBkd29yayByZWFybXMgaXRzZWxmIHZpYSBxdWV1ZV93b3JrKCkKICAqIG9yIHF1ZXVlX2RlbGF5ZWRfd29yaygpLiBTZWUgYWxzbyB0aGUgY29tbWVudCBmb3IgY2FuY2VsX3dvcmtfc3luYygpLgogICovCi12b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspCitpbnQgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrKQogewotCXdoaWxlICghZGVsX3RpbWVyKCZkd29yay0+dGltZXIpICYmCi0JICAgICAgICF0cnlfdG9fZ3JhYl9wZW5kaW5nKCZkd29yay0+d29yaykpCi0JCWNwdV9yZWxheCgpOwotCXdhaXRfb25fd29yaygmZHdvcmstPndvcmspOwotCXdvcmtfY2xlYXJfcGVuZGluZygmZHdvcmstPndvcmspOworCXJldHVybiBfX2NhbmNlbF93b3JrX3RpbWVyKCZkd29yay0+d29yaywgJmR3b3JrLT50aW1lcik7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmspOworRVhQT1JUX1NZTUJPTChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMpOwogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtldmVudGRfd3EgX19yZWFkX21vc3RseTsKIApAQCAtNzM5LDE4ICs3NTIsMTcgQEAKIAlpZiAoY3dxLT50aHJlYWQgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJZmx1c2hfY3B1X3dvcmtxdWV1ZShjd3EpOwogCS8qCi0JICogSWYgdGhlIGNhbGxlciBpcyBDUFVfREVBRCB0aGUgc2luZ2xlIGZsdXNoX2NwdV93b3JrcXVldWUoKQotCSAqIGlzIG5vdCBlbm91Z2gsIGEgY29uY3VycmVudCBmbHVzaF93b3JrcXVldWUoKSBjYW4gaW5zZXJ0IGEKLQkgKiBiYXJyaWVyIGFmdGVyIHVzLgorCSAqIElmIHRoZSBjYWxsZXIgaXMgQ1BVX0RFQUQgYW5kIGN3cS0+d29ya2xpc3Qgd2FzIG5vdCBlbXB0eSwKKwkgKiBhIGNvbmN1cnJlbnQgZmx1c2hfd29ya3F1ZXVlKCkgY2FuIGluc2VydCBhIGJhcnJpZXIgYWZ0ZXIgdXMuCisJICogSG93ZXZlciwgaW4gdGhhdCBjYXNlIHJ1bl93b3JrcXVldWUoKSB3b24ndCByZXR1cm4gYW5kIGNoZWNrCisJICoga3RocmVhZF9zaG91bGRfc3RvcCgpIHVudGlsIGl0IGZsdXNoZXMgYWxsIHdvcmtfc3RydWN0J3MuCiAJICogV2hlbiAtPndvcmtsaXN0IGJlY29tZXMgZW1wdHkgaXQgaXMgc2FmZSB0byBleGl0IGJlY2F1c2Ugbm8KIAkgKiBtb3JlIHdvcmtfc3RydWN0cyBjYW4gYmUgcXVldWVkIG9uIHRoaXMgY3dxOiBmbHVzaF93b3JrcXVldWUKIAkgKiBjaGVja3MgbGlzdF9lbXB0eSgpLCBhbmQgYSAibm9ybWFsIiBxdWV1ZV93b3JrKCkgY2FuJ3QgdXNlCiAJICogYSBkZWFkIENQVS4KIAkgKi8KLQl3aGlsZSAoZmx1c2hfY3B1X3dvcmtxdWV1ZShjd3EpKQotCQk7Ci0KIAlrdGhyZWFkX3N0b3AoY3dxLT50aHJlYWQpOwogCWN3cS0+dGhyZWFkID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggM2ViMjlkNS4uZTVjMmM1MSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTQxLDYgKzQxLDE0IEBACiAJICBrZXJuZWwgdHJlZSBkb2VzLiBTdWNoIG1vZHVsZXMgdGhhdCB1c2UgbGlicmFyeSBDUkMzMiBmdW5jdGlvbnMKIAkgIHJlcXVpcmUgTSBoZXJlLgogCitjb25maWcgQ1JDNworCXRyaXN0YXRlICJDUkM3IGZ1bmN0aW9ucyIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gaW4ta2VybmVsLXRyZWUKKwkgIG1vZHVsZXMgcmVxdWlyZSBDUkM3IGZ1bmN0aW9ucywgYnV0IGEgbW9kdWxlIGJ1aWx0IG91dHNpZGUKKwkgIHRoZSBrZXJuZWwgdHJlZSBkb2VzLiBTdWNoIG1vZHVsZXMgdGhhdCB1c2UgbGlicmFyeSBDUkM3CisJICBmdW5jdGlvbnMgcmVxdWlyZSBNIGhlcmUuCisKIGNvbmZpZyBMSUJDUkMzMkMKIAl0cmlzdGF0ZSAiQ1JDMzJjIChDYXN0YWdub2xpLCBldCBhbCkgQ3ljbGljIFJlZHVuZGFuY3ktQ2hlY2siCiAJaGVscApkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBmYWIzMmEyLi42NDA4NDQwIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMTUyLDYgKzE1MiwxOSBAQAogCWJvb2wgIk1lbW9yeSBsZWFrIGRlYnVnZ2luZyIKIAlkZXBlbmRzIG9uIERFQlVHX1NMQUIKIAorY29uZmlnIFNMVUJfREVCVUdfT04KKwlib29sICJTTFVCIGRlYnVnZ2luZyBvbiBieSBkZWZhdWx0IgorCWRlcGVuZHMgb24gU0xVQiAmJiBTTFVCX0RFQlVHCisJZGVmYXVsdCBuCisJaGVscAorCSAgQm9vdCB3aXRoIGRlYnVnZ2luZyBvbiBieSBkZWZhdWx0LiBTTFVCIGJvb3RzIGJ5IGRlZmF1bHQgd2l0aAorCSAgdGhlIHJ1bnRpbWUgZGVidWcgY2FwYWJpbGl0aWVzIHN3aXRjaGVkIG9mZi4gRW5hYmxpbmcgdGhpcyBpcworCSAgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSAic2x1Yl9kZWJ1ZyIgcGFyYW1ldGVyIG9uIGJvb3QuCisJICBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBtb3JlIGZpbmUgZ3JhaW5lZCBkZWJ1ZyBjb250cm9sIGxpa2UKKwkgIHBvc3NpYmxlIHdpdGggc2x1Yl9kZWJ1Zz14eHguIFNMVUIgZGVidWdnaW5nIG1heSBiZSBzd2l0Y2hlZAorCSAgb2ZmIGluIGEga2VybmVsIGJ1aWx0IHdpdGggQ09ORklHX1NMVUJfREVCVUdfT04gYnkgc3BlY2lmeWluZworCSAgInNsdWJfZGVidWc9LSIuCisKIGNvbmZpZyBERUJVR19QUkVFTVBUCiAJYm9vbCAiRGVidWcgcHJlZW1wdGlibGUga2VybmVsIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFBSRUVNUFQgJiYgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVApkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGQxYjM2NmIuLmRhNjhiMmMgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTIxLDcgKzIxLDcgQEAKIGVuZGlmCiAKIG9iai0kKENPTkZJR19HRU5FUklDX0lPTUFQKSArPSBpb21hcC5vCi1vYmotJChDT05GSUdfSEFTX0lPTUVNKSArPSBpb21hcF9jb3B5Lm8gZGV2cmVzLm8KK29iai0kKENPTkZJR19IQVNfSU9NRU0pICs9IGlvbWFwX2NvcHkubyBkZXZyZXMubyBjaGVja19zaWduYXR1cmUubwogb2JqLSQoQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUykgKz0gbG9ja2luZy1zZWxmdGVzdC5vCiBvYmotJChDT05GSUdfREVCVUdfU1BJTkxPQ0spICs9IHNwaW5sb2NrX2RlYnVnLm8KIGxpYi0kKENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLKSArPSByd3NlbS1zcGlubG9jay5vCkBAIC00Myw2ICs0Myw3IEBACiBvYmotJChDT05GSUdfQ1JDMTYpCSs9IGNyYzE2Lm8KIG9iai0kKENPTkZJR19DUkNfSVRVX1QpCSs9IGNyYy1pdHUtdC5vCiBvYmotJChDT05GSUdfQ1JDMzIpCSs9IGNyYzMyLm8KK29iai0kKENPTkZJR19DUkM3KQkrPSBjcmM3Lm8KIG9iai0kKENPTkZJR19MSUJDUkMzMkMpCSs9IGxpYmNyYzMyYy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19BTExPQ0FUT1IpICs9IGdlbmFsbG9jLm8KIApkaWZmIC0tZ2l0IGEvbGliL2J1Zy5jIGIvbGliL2J1Zy5jCmluZGV4IDAxNGI1ODIuLjUzMGYzOGYgMTAwNjQ0Ci0tLSBhL2xpYi9idWcuYworKysgYi9saWIvYnVnLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBidWdfZW50cnkgX19zdGFydF9fX2J1Z190YWJsZVtdLCBfX3N0b3BfX19idWdfdGFibGVbXTsKIApAQCAtMTEyLDcgKzExMyw3IEBACiAJcmV0dXJuIG1vZHVsZV9maW5kX2J1ZyhidWdhZGRyKTsKIH0KIAotZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyKQorZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAljb25zdCBzdHJ1Y3QgYnVnX2VudHJ5ICpidWc7CiAJY29uc3QgY2hhciAqZmlsZTsKQEAgLTE0Nyw3ICsxNDgsNyBAQAogCQkJICAgICAgICJbdmVyYm9zZSBkZWJ1ZyBpbmZvIHVuYXZhaWxhYmxlXVxuIiwKIAkJCSAgICAgICAodm9pZCAqKWJ1Z2FkZHIpOwogCi0JCWR1bXBfc3RhY2soKTsKKwkJc2hvd19yZWdzKHJlZ3MpOwogCQlyZXR1cm4gQlVHX1RSQVBfVFlQRV9XQVJOOwogCX0KIApkaWZmIC0tZ2l0IGEvbGliL2NoZWNrX3NpZ25hdHVyZS5jIGIvbGliL2NoZWNrX3NpZ25hdHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmFmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2hlY2tfc2lnbmF0dXJlLmMKQEAgLTAsMCArMSwyNiBAQAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qKgorICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCisgKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrCisgKglAc2lnbmF0dXJlOiAgc2lnbmF0dXJlIGJsb2NrCisgKglAbGVuZ3RoOiBsZW5ndGggb2Ygc2lnbmF0dXJlCisgKgorICoJUGVyZm9ybSBhIHNpZ25hdHVyZSBjb21wYXJpc29uIHdpdGggdGhlIG1taW8gYWRkcmVzcyBpb19hZGRyLiBUaGlzCisgKglhZGRyZXNzIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgaW9yZW1hcC4KKyAqCVJldHVybnMgMSBvbiBhIG1hdGNoLgorICovCisKK2ludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQoreworCXdoaWxlIChsZW5ndGgtLSkgeworCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKKwkJCXJldHVybiAwOworCQlpb19hZGRyKys7CisJCXNpZ25hdHVyZSsrOworCX0KKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woY2hlY2tfc2lnbmF0dXJlKTsKZGlmZiAtLWdpdCBhL2xpYi9jcmM3LmMgYi9saWIvY3JjNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzNhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3JjNy5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgICAgIGNyYzcuYworICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzcuaD4KKworCisvKiBUYWJsZSBmb3IgQ1JDLTcgKHBvbHlub21pYWwgeF43ICsgeF4zICsgMSkgKi8KK2NvbnN0IHU4IGNyYzdfc3luZHJvbWVfdGFibGVbMjU2XSA9IHsKKwkweDAwLCAweDA5LCAweDEyLCAweDFiLCAweDI0LCAweDJkLCAweDM2LCAweDNmLAorCTB4NDgsIDB4NDEsIDB4NWEsIDB4NTMsIDB4NmMsIDB4NjUsIDB4N2UsIDB4NzcsCisJMHgxOSwgMHgxMCwgMHgwYiwgMHgwMiwgMHgzZCwgMHgzNCwgMHgyZiwgMHgyNiwKKwkweDUxLCAweDU4LCAweDQzLCAweDRhLCAweDc1LCAweDdjLCAweDY3LCAweDZlLAorCTB4MzIsIDB4M2IsIDB4MjAsIDB4MjksIDB4MTYsIDB4MWYsIDB4MDQsIDB4MGQsCisJMHg3YSwgMHg3MywgMHg2OCwgMHg2MSwgMHg1ZSwgMHg1NywgMHg0YywgMHg0NSwKKwkweDJiLCAweDIyLCAweDM5LCAweDMwLCAweDBmLCAweDA2LCAweDFkLCAweDE0LAorCTB4NjMsIDB4NmEsIDB4NzEsIDB4NzgsIDB4NDcsIDB4NGUsIDB4NTUsIDB4NWMsCisJMHg2NCwgMHg2ZCwgMHg3NiwgMHg3ZiwgMHg0MCwgMHg0OSwgMHg1MiwgMHg1YiwKKwkweDJjLCAweDI1LCAweDNlLCAweDM3LCAweDA4LCAweDAxLCAweDFhLCAweDEzLAorCTB4N2QsIDB4NzQsIDB4NmYsIDB4NjYsIDB4NTksIDB4NTAsIDB4NGIsIDB4NDIsCisJMHgzNSwgMHgzYywgMHgyNywgMHgyZSwgMHgxMSwgMHgxOCwgMHgwMywgMHgwYSwKKwkweDU2LCAweDVmLCAweDQ0LCAweDRkLCAweDcyLCAweDdiLCAweDYwLCAweDY5LAorCTB4MWUsIDB4MTcsIDB4MGMsIDB4MDUsIDB4M2EsIDB4MzMsIDB4MjgsIDB4MjEsCisJMHg0ZiwgMHg0NiwgMHg1ZCwgMHg1NCwgMHg2YiwgMHg2MiwgMHg3OSwgMHg3MCwKKwkweDA3LCAweDBlLCAweDE1LCAweDFjLCAweDIzLCAweDJhLCAweDMxLCAweDM4LAorCTB4NDEsIDB4NDgsIDB4NTMsIDB4NWEsIDB4NjUsIDB4NmMsIDB4NzcsIDB4N2UsCisJMHgwOSwgMHgwMCwgMHgxYiwgMHgxMiwgMHgyZCwgMHgyNCwgMHgzZiwgMHgzNiwKKwkweDU4LCAweDUxLCAweDRhLCAweDQzLCAweDdjLCAweDc1LCAweDZlLCAweDY3LAorCTB4MTAsIDB4MTksIDB4MDIsIDB4MGIsIDB4MzQsIDB4M2QsIDB4MjYsIDB4MmYsCisJMHg3MywgMHg3YSwgMHg2MSwgMHg2OCwgMHg1NywgMHg1ZSwgMHg0NSwgMHg0YywKKwkweDNiLCAweDMyLCAweDI5LCAweDIwLCAweDFmLCAweDE2LCAweDBkLCAweDA0LAorCTB4NmEsIDB4NjMsIDB4NzgsIDB4NzEsIDB4NGUsIDB4NDcsIDB4NWMsIDB4NTUsCisJMHgyMiwgMHgyYiwgMHgzMCwgMHgzOSwgMHgwNiwgMHgwZiwgMHgxNCwgMHgxZCwKKwkweDI1LCAweDJjLCAweDM3LCAweDNlLCAweDAxLCAweDA4LCAweDEzLCAweDFhLAorCTB4NmQsIDB4NjQsIDB4N2YsIDB4NzYsIDB4NDksIDB4NDAsIDB4NWIsIDB4NTIsCisJMHgzYywgMHgzNSwgMHgyZSwgMHgyNywgMHgxOCwgMHgxMSwgMHgwYSwgMHgwMywKKwkweDc0LCAweDdkLCAweDY2LCAweDZmLCAweDUwLCAweDU5LCAweDQyLCAweDRiLAorCTB4MTcsIDB4MWUsIDB4MDUsIDB4MGMsIDB4MzMsIDB4M2EsIDB4MjEsIDB4MjgsCisJMHg1ZiwgMHg1NiwgMHg0ZCwgMHg0NCwgMHg3YiwgMHg3MiwgMHg2OSwgMHg2MCwKKwkweDBlLCAweDA3LCAweDFjLCAweDE1LCAweDJhLCAweDIzLCAweDM4LCAweDMxLAorCTB4NDYsIDB4NGYsIDB4NTQsIDB4NWQsIDB4NjIsIDB4NmIsIDB4NzAsIDB4NzkKK307CitFWFBPUlRfU1lNQk9MKGNyYzdfc3luZHJvbWVfdGFibGUpOworCisvKioKKyAqIGNyYzcgLSB1cGRhdGUgdGhlIENSQzcgZm9yIHRoZSBkYXRhIGJ1ZmZlcgorICogQGNyYzogICAgIHByZXZpb3VzIENSQzcgdmFsdWUKKyAqIEBidWZmZXI6ICBkYXRhIHBvaW50ZXIKKyAqIEBsZW46ICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICogQ29udGV4dDogYW55CisgKgorICogUmV0dXJucyB0aGUgdXBkYXRlZCBDUkM3IHZhbHVlLgorICovCit1OCBjcmM3KHU4IGNyYywgY29uc3QgdTggKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pCisJCWNyYyA9IGNyYzdfYnl0ZShjcmMsICpidWZmZXIrKyk7CisJcmV0dXJuIGNyYzsKK30KK0VYUE9SVF9TWU1CT0woY3JjNyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1JDNyBjYWxjdWxhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2xpYi9nZW5hbGxvYy5jIGIvbGliL2dlbmFsbG9jLmMKaW5kZXggZWI3YzJiYS4uZjZkMjc2ZCAxMDA2NDQKLS0tIGEvbGliL2dlbmFsbG9jLmMKKysrIGIvbGliL2dlbmFsbG9jLmMKQEAgLTU0LDExICs1NCwxMCBAQAogCWludCBuYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGdlbl9wb29sX2NodW5rKSArCiAJCQkJKG5iaXRzICsgQklUU19QRVJfQllURSAtIDEpIC8gQklUU19QRVJfQllURTsKIAotCWNodW5rID0ga21hbGxvY19ub2RlKG5ieXRlcywgR0ZQX0tFUk5FTCwgbmlkKTsKKwljaHVuayA9IGttYWxsb2Nfbm9kZShuYnl0ZXMsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBuaWQpOwogCWlmICh1bmxpa2VseShjaHVuayA9PSBOVUxMKSkKIAkJcmV0dXJuIC0xOwogCi0JbWVtc2V0KGNodW5rLCAwLCBuYnl0ZXMpOwogCXNwaW5fbG9ja19pbml0KCZjaHVuay0+bG9jayk7CiAJY2h1bmstPnN0YXJ0X2FkZHIgPSBhZGRyOwogCWNodW5rLT5lbmRfYWRkciA9IGFkZHIgKyBzaXplOwpkaWZmIC0tZ2l0IGEvbGliL2lkci5jIGIvbGliL2lkci5jCmluZGV4IGI5OGYwMWEuLjVjYTY3YjMgMTAwNjQ0Ci0tLSBhL2xpYi9pZHIuYworKysgYi9saWIvaWRyLmMKQEAgLTM5MSw2ICszOTEsNTMgQEAKIEVYUE9SVF9TWU1CT0woaWRyX3JlbW92ZSk7CiAKIC8qKgorICogaWRyX3JlbW92ZV9hbGwgLSByZW1vdmUgYWxsIGlkcyBmcm9tIHRoZSBnaXZlbiBpZHIgdHJlZQorICogQGlkcDogaWRyIGhhbmRsZQorICoKKyAqIGlkcl9kZXN0cm95KCkgb25seSBmcmVlcyB1cCB1bnVzZWQsIGNhY2hlZCBpZHBfbGF5ZXJzLCBidXQgdGhpcworICogZnVuY3Rpb24gd2lsbCByZW1vdmUgYWxsIGlkIG1hcHBpbmdzIGFuZCBsZWF2ZSBhbGwgaWRwX2xheWVycworICogdW51c2VkLgorICoKKyAqIEEgdHlwaWNhbCBjbGVhbi11cCBzZXF1ZW5jZSBmb3Igb2JqZWN0cyBzdG9yZWQgaW4gYW4gaWRyIHRyZWUsIHdpbGwKKyAqIHVzZSBpZHJfZm9yX2VhY2goKSB0byBmcmVlIGFsbCBvYmplY3RzLCBpZiBuZWNlc3NheSwgdGhlbgorICogaWRyX3JlbW92ZV9hbGwoKSB0byByZW1vdmUgYWxsIGlkcywgYW5kIGlkcl9kZXN0cm95KCkgdG8gZnJlZQorICogdXAgdGhlIGNhY2hlZCBpZHJfbGF5ZXJzLgorICovCit2b2lkIGlkcl9yZW1vdmVfYWxsKHN0cnVjdCBpZHIgKmlkcCkKK3sKKwlpbnQgbiwgaWQsIG1heCwgZXJyb3IgPSAwOworCXN0cnVjdCBpZHJfbGF5ZXIgKnA7CisJc3RydWN0IGlkcl9sYXllciAqcGFbTUFYX0xFVkVMXTsKKwlzdHJ1Y3QgaWRyX2xheWVyICoqcGFhID0gJnBhWzBdOworCisJbiA9IGlkcC0+bGF5ZXJzICogSURSX0JJVFM7CisJcCA9IGlkcC0+dG9wOworCW1heCA9IDEgPDwgbjsKKworCWlkID0gMDsKKwl3aGlsZSAoaWQgPCBtYXggJiYgIWVycm9yKSB7CisJCXdoaWxlIChuID4gSURSX0JJVFMgJiYgcCkgeworCQkJbiAtPSBJRFJfQklUUzsKKwkJCSpwYWErKyA9IHA7CisJCQlwID0gcC0+YXJ5WyhpZCA+PiBuKSAmIElEUl9NQVNLXTsKKwkJfQorCisJCWlkICs9IDEgPDwgbjsKKwkJd2hpbGUgKG4gPCBmbHMoaWQpKSB7CisJCQlpZiAocCkgeworCQkJCW1lbXNldChwLCAwLCBzaXplb2YgKnApOworCQkJCWZyZWVfbGF5ZXIoaWRwLCBwKTsKKwkJCX0KKwkJCW4gKz0gSURSX0JJVFM7CisJCQlwID0gKi0tcGFhOworCQl9CisJfQorCWlkcC0+dG9wID0gTlVMTDsKKwlpZHAtPmxheWVycyA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9yZW1vdmVfYWxsKTsKKworLyoqCiAgKiBpZHJfZGVzdHJveSAtIHJlbGVhc2UgYWxsIGNhY2hlZCBsYXllcnMgd2l0aGluIGFuIGlkciB0cmVlCiAgKiBpZHA6IGlkciBoYW5kbGUKICAqLwpAQCAtNDM3LDYgKzQ4NCw2MSBAQAogRVhQT1JUX1NZTUJPTChpZHJfZmluZCk7CiAKIC8qKgorICogaWRyX2Zvcl9lYWNoIC0gaXRlcmF0ZSB0aHJvdWdoIGFsbCBzdG9yZWQgcG9pbnRlcnMKKyAqIEBpZHA6IGlkciBoYW5kbGUKKyAqIEBmbjogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIHBvaW50ZXIKKyAqIEBkYXRhOiBkYXRhIHBhc3NlZCBiYWNrIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogSXRlcmF0ZSBvdmVyIHRoZSBwb2ludGVycyByZWdpc3RlcmVkIHdpdGggdGhlIGdpdmVuIGlkci4gIFRoZQorICogY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcG9pbnRlciBjdXJyZW50bHkKKyAqIHJlZ2lzdGVyZWQsIHBhc3NpbmcgdGhlIGlkLCB0aGUgcG9pbnRlciBhbmQgdGhlIGRhdGEgcG9pbnRlciBwYXNzZWQKKyAqIHRvIHRoaXMgZnVuY3Rpb24uICBJdCBpcyBub3Qgc2FmZSB0byBtb2RpZnkgdGhlIGlkciB0cmVlIHdoaWxlIGluCisgKiB0aGUgY2FsbGJhY2ssIHNvIGZ1bmN0aW9ucyBzdWNoIGFzIGlkcl9nZXRfbmV3IGFuZCBpZHJfcmVtb3ZlIGFyZQorICogbm90IGFsbG93ZWQuCisgKgorICogV2UgY2hlY2sgdGhlIHJldHVybiBvZiBAZm4gZWFjaCB0aW1lLiBJZiBpdCByZXR1cm5zIGFueXRoaW5nIG90aGVyCisgKiB0aGFuIDAsIHdlIGJyZWFrIG91dCBhbmQgcmV0dXJuIHRoYXQgdmFsdWUuCisgKgorICogVGhlIGNhbGxlciBtdXN0IHNlcmlhbGl6ZSBpZHJfZm9yX2VhY2goKSB2cyBpZHJfZ2V0X25ldygpIGFuZCBpZHJfcmVtb3ZlKCkuCisgKi8KK2ludCBpZHJfZm9yX2VhY2goc3RydWN0IGlkciAqaWRwLAorCQkgaW50ICgqZm4pKGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCit7CisJaW50IG4sIGlkLCBtYXgsIGVycm9yID0gMDsKKwlzdHJ1Y3QgaWRyX2xheWVyICpwOworCXN0cnVjdCBpZHJfbGF5ZXIgKnBhW01BWF9MRVZFTF07CisJc3RydWN0IGlkcl9sYXllciAqKnBhYSA9ICZwYVswXTsKKworCW4gPSBpZHAtPmxheWVycyAqIElEUl9CSVRTOworCXAgPSBpZHAtPnRvcDsKKwltYXggPSAxIDw8IG47CisKKwlpZCA9IDA7CisJd2hpbGUgKGlkIDwgbWF4KSB7CisJCXdoaWxlIChuID4gMCAmJiBwKSB7CisJCQluIC09IElEUl9CSVRTOworCQkJKnBhYSsrID0gcDsKKwkJCXAgPSBwLT5hcnlbKGlkID4+IG4pICYgSURSX01BU0tdOworCQl9CisKKwkJaWYgKHApIHsKKwkJCWVycm9yID0gZm4oaWQsICh2b2lkICopcCwgZGF0YSk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZCArPSAxIDw8IG47CisJCXdoaWxlIChuIDwgZmxzKGlkKSkgeworCQkJbiArPSBJRFJfQklUUzsKKwkJCXAgPSAqLS1wYWE7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9mb3JfZWFjaCk7CisKKy8qKgogICogaWRyX3JlcGxhY2UgLSByZXBsYWNlIHBvaW50ZXIgZm9yIGdpdmVuIGlkCiAgKiBAaWRwOiBpZHIgaGFuZGxlCiAgKiBAcHRyOiBwb2ludGVyIHlvdSB3YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaWQKZGlmZiAtLWdpdCBhL2xpYi9wZXJjcHVfY291bnRlci5jIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKaW5kZXggODUwNDQ5MC4uY2YyMmM2MSAxMDA2NDQKLS0tIGEvbGliL3BlcmNwdV9jb3VudGVyLmMKKysrIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKQEAgLTMsOCArMywxNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHVfY291bnRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBMSVNUX0hFQUQocGVyY3B1X2NvdW50ZXJzKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCisKIHZvaWQgcGVyY3B1X2NvdW50ZXJfbW9kKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzMzIgYW1vdW50KQogewogCWxvbmcgY291bnQ7CkBAIC0zNiw3ICs0NSw3IEBACiAKIAlzcGluX2xvY2soJmZiYy0+bG9jayk7CiAJcmV0ID0gZmJjLT5jb3VudDsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJczMyICpwY291bnQgPSBwZXJfY3B1X3B0cihmYmMtPmNvdW50ZXJzLCBjcHUpOwogCQlyZXQgKz0gKnBjb3VudDsKIAl9CkBAIC00NCwzICs1Myw2MCBAQAogCXJldHVybiByZXQgPCAwID8gMCA6IHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfc3VtKTsKKwordm9pZCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQoreworCXNwaW5fbG9ja19pbml0KCZmYmMtPmxvY2spOworCWZiYy0+Y291bnQgPSBhbW91bnQ7CisJZmJjLT5jb3VudGVycyA9IGFsbG9jX3BlcmNwdShzMzIpOworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCW11dGV4X2xvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKwlsaXN0X2FkZCgmZmJjLT5saXN0LCAmcGVyY3B1X2NvdW50ZXJzKTsKKwltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9pbml0KTsKKwordm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQoreworCWZyZWVfcGVyY3B1KGZiYy0+Y291bnRlcnMpOworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCW11dGV4X2xvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKwlsaXN0X2RlbCgmZmJjLT5saXN0KTsKKwltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9kZXN0cm95KTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIGludCBfX2NwdWluaXQgcGVyY3B1X2NvdW50ZXJfaG90Y3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXVuc2lnbmVkIGludCBjcHU7CisJc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmM7CisKKwlpZiAoYWN0aW9uICE9IENQVV9ERUFEKQorCQlyZXR1cm4gTk9USUZZX09LOworCisJY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwltdXRleF9sb2NrKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYmMsICZwZXJjcHVfY291bnRlcnMsIGxpc3QpIHsKKwkJczMyICpwY291bnQ7CisKKwkJc3Bpbl9sb2NrKCZmYmMtPmxvY2spOworCQlwY291bnQgPSBwZXJfY3B1X3B0cihmYmMtPmNvdW50ZXJzLCBjcHUpOworCQlmYmMtPmNvdW50ICs9ICpwY291bnQ7CisJCSpwY291bnQgPSAwOworCQlzcGluX3VubG9jaygmZmJjLT5sb2NrKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIGludCBfX2luaXQgcGVyY3B1X2NvdW50ZXJfc3RhcnR1cCh2b2lkKQoreworCWhvdGNwdV9ub3RpZmllcihwZXJjcHVfY291bnRlcl9ob3RjcHVfY2FsbGJhY2ssIDApOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQocGVyY3B1X2NvdW50ZXJfc3RhcnR1cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi92c3ByaW50Zi5jIGIvbGliL3ZzcHJpbnRmLmMKaW5kZXggMDE3MjkwMi4uNmI2NzM0ZCAxMDA2NDQKLS0tIGEvbGliL3ZzcHJpbnRmLmMKKysrIGIvbGliL3ZzcHJpbnRmLmMKQEAgLTEzNSw2ICsxMzUsMTAzIEBACiAJcmV0dXJuIGk7CiB9CiAKKy8qIERlY2ltYWwgY29udmVyc2lvbiBpcyBieSBmYXIgdGhlIG1vc3QgdHlwaWNhbCwgYW5kIGlzIHVzZWQKKyAqIGZvciAvcHJvYyBhbmQgL3N5cyBkYXRhLiBUaGlzIGRpcmVjdGx5IGltcGFjdHMgZS5nLiB0b3AgcGVyZm9ybWFuY2UKKyAqIHdpdGggbWFueSBwcm9jZXNzZXMgcnVubmluZy4gV2Ugb3B0aW1pemUgaXQgZm9yIHNwZWVkCisgKiB1c2luZyBjb2RlIGZyb20KKyAqIGh0dHA6Ly93d3cuY3MudWlvd2EuZWR1L35qb25lcy9iY2QvZGVjaW1hbC5odG1sCisgKiAod2l0aCBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgRG91Z2xhcyBXLiBKb25lcykuICovCisKKy8qIEZvcm1hdHMgY29ycmVjdGx5IGFueSBpbnRlZ2VyIGluIFswLDk5OTk5XS4KKyAqIE91dHB1dHMgZnJvbSBvbmUgdG8gZml2ZSBkaWdpdHMgZGVwZW5kaW5nIG9uIGlucHV0LgorICogT24gaTM4NiBnY2MgNC4xLjIgLU8yOiB+MjUwIGJ5dGVzIG9mIGNvZGUuICovCitzdGF0aWMgY2hhciogcHV0X2RlY190cnVuYyhjaGFyICpidWYsIHVuc2lnbmVkIHEpCit7CisJdW5zaWduZWQgZDMsIGQyLCBkMSwgZDA7CisJZDEgPSAocT4+NCkgJiAweGY7CisJZDIgPSAocT4+OCkgJiAweGY7CisJZDMgPSAocT4+MTIpOworCisJZDAgPSA2KihkMyArIGQyICsgZDEpICsgKHEgJiAweGYpOworCXEgPSAoZDAgKiAweGNkKSA+PiAxMTsKKwlkMCA9IGQwIC0gMTAqcTsKKwkqYnVmKysgPSBkMCArICcwJzsgLyogbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQgKi8KKwlkMSA9IHEgKyA5KmQzICsgNSpkMiArIGQxOworCWlmIChkMSAhPSAwKSB7CisJCXEgPSAoZDEgKiAweGNkKSA+PiAxMTsKKwkJZDEgPSBkMSAtIDEwKnE7CisJCSpidWYrKyA9IGQxICsgJzAnOyAvKiBuZXh0IGRpZ2l0ICovCisKKwkJZDIgPSBxICsgMipkMjsKKwkJaWYgKChkMiAhPSAwKSB8fCAoZDMgIT0gMCkpIHsKKwkJCXEgPSAoZDIgKiAweGQpID4+IDc7CisJCQlkMiA9IGQyIC0gMTAqcTsKKwkJCSpidWYrKyA9IGQyICsgJzAnOyAvKiBuZXh0IGRpZ2l0ICovCisKKwkJCWQzID0gcSArIDQqZDM7CisJCQlpZiAoZDMgIT0gMCkgeworCQkJCXEgPSAoZDMgKiAweGNkKSA+PiAxMTsKKwkJCQlkMyA9IGQzIC0gMTAqcTsKKwkJCQkqYnVmKysgPSBkMyArICcwJzsgIC8qIG5leHQgZGlnaXQgKi8KKwkJCQlpZiAocSAhPSAwKQorCQkJCQkqYnVmKysgPSBxICsgJzAnOyAgLyogbW9zdCBzaWduLiBkaWdpdCAqLworCQkJfQorCQl9CisJfQorCXJldHVybiBidWY7Cit9CisvKiBTYW1lIHdpdGggaWYncyByZW1vdmVkLiBBbHdheXMgZW1pdHMgZml2ZSBkaWdpdHMgKi8KK3N0YXRpYyBjaGFyKiBwdXRfZGVjX2Z1bGwoY2hhciAqYnVmLCB1bnNpZ25lZCBxKQoreworCS8qIEJUVywgaWYgcSBpcyBpbiBbMCw5OTk5XSwgOC1iaXQgaW50cyB3aWxsIGJlIGVub3VnaCwgKi8KKwkvKiBidXQgYW55d2F5LCBnY2MgcHJvZHVjZXMgYmV0dGVyIGNvZGUgd2l0aCBmdWxsLXNpemVkIGludHMgKi8KKwl1bnNpZ25lZCBkMywgZDIsIGQxLCBkMDsKKwlkMSA9IChxPj40KSAmIDB4ZjsKKwlkMiA9IChxPj44KSAmIDB4ZjsKKwlkMyA9IChxPj4xMik7CisKKwkvKiBQb3NzaWJsZSB3YXlzIHRvIGFwcHJveC4gZGl2aWRlIGJ5IDEwICovCisJLyogZ2NjIC1PMiByZXBsYWNlcyBtdWx0aXBseSB3aXRoIHNoaWZ0cyBhbmQgYWRkcyAqLworCS8vICh4ICogMHhjZCkgPj4gMTE6IDExMDAxMTAxIC0gc2hvcnRlciBjb2RlIHRoYW4gKiAweDY3IChvbiBpMzg2KQorCS8vICh4ICogMHg2NykgPj4gMTA6ICAxMTAwMTExCisJLy8gKHggKiAweDM0KSA+PiA5OiAgICAxMTAxMDAgLSBzYW1lCisJLy8gKHggKiAweDFhKSA+PiA4OiAgICAgMTEwMTAgLSBzYW1lCisJLy8gKHggKiAweDBkKSA+PiA3OiAgICAgIDExMDEgLSBzYW1lLCBzaG9ydGVzdCBjb2RlIChvbiBpMzg2KQorCisJZDAgPSA2KihkMyArIGQyICsgZDEpICsgKHEgJiAweGYpOworCXEgPSAoZDAgKiAweGNkKSA+PiAxMTsKKwlkMCA9IGQwIC0gMTAqcTsKKwkqYnVmKysgPSBkMCArICcwJzsKKwlkMSA9IHEgKyA5KmQzICsgNSpkMiArIGQxOworCQlxID0gKGQxICogMHhjZCkgPj4gMTE7CisJCWQxID0gZDEgLSAxMCpxOworCQkqYnVmKysgPSBkMSArICcwJzsKKworCQlkMiA9IHEgKyAyKmQyOworCQkJcSA9IChkMiAqIDB4ZCkgPj4gNzsKKwkJCWQyID0gZDIgLSAxMCpxOworCQkJKmJ1ZisrID0gZDIgKyAnMCc7CisKKwkJCWQzID0gcSArIDQqZDM7CisJCQkJcSA9IChkMyAqIDB4Y2QpID4+IDExOyAvKiAtIHNob3J0ZXIgY29kZSAqLworCQkJCS8qIHEgPSAoZDMgKiAweDY3KSA+PiAxMDsgLSB3b3VsZCBhbHNvIHdvcmsgKi8KKwkJCQlkMyA9IGQzIC0gMTAqcTsKKwkJCQkqYnVmKysgPSBkMyArICcwJzsKKwkJCQkJKmJ1ZisrID0gcSArICcwJzsKKwlyZXR1cm4gYnVmOworfQorLyogTm8gaW5saW5pbmcgaGVscHMgZ2NjIHRvIHVzZSByZWdpc3RlcnMgYmV0dGVyICovCitzdGF0aWMgbm9pbmxpbmUgY2hhciogcHV0X2RlYyhjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0pCit7CisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtOworCQlpZiAobnVtIDwgMTAwMDAwKQorCQkJcmV0dXJuIHB1dF9kZWNfdHJ1bmMoYnVmLCBudW0pOworCQlyZW0gPSBkb19kaXYobnVtLCAxMDAwMDApOworCQlidWYgPSBwdXRfZGVjX2Z1bGwoYnVmLCByZW0pOworCX0KK30KKwogI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KICNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLwogI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLwpAQCAtMTQzLDEyICsyNDAsMTQgQEAKICNkZWZpbmUgU1BFQ0lBTAkzMgkJLyogMHggKi8KICNkZWZpbmUgTEFSR0UJNjQJCS8qIHVzZSAnQUJDREVGJyBpbnN0ZWFkIG9mICdhYmNkZWYnICovCiAKLXN0YXRpYyBjaGFyICogbnVtYmVyKGNoYXIgKiBidWYsIGNoYXIgKiBlbmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBiYXNlLCBpbnQgc2l6ZSwgaW50IHByZWNpc2lvbiwgaW50IHR5cGUpCitzdGF0aWMgY2hhciAqbnVtYmVyKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24sIGludCB0eXBlKQogewotCWNoYXIgYyxzaWduLHRtcFs2Nl07CisJY2hhciBzaWduLHRtcFs2Nl07CiAJY29uc3QgY2hhciAqZGlnaXRzOwotCXN0YXRpYyBjb25zdCBjaGFyIHNtYWxsX2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgbGFyZ2VfZGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKwkvKiB3ZSBhcmUgY2FsbGVkIHdpdGggYmFzZSA4LCAxMCBvciAxNiwgb25seSwgdGh1cyBkb24ndCBuZWVkICJnLi4uIiAgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBzbWFsbF9kaWdpdHNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmeCI7IC8qICJnaGlqa2xtbm9wcXJzdHV2d3h5eiI7ICovCisJc3RhdGljIGNvbnN0IGNoYXIgbGFyZ2VfZGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRlgiOyAvKiAiR0hJSktMTU5PUFFSU1RVVldYWVoiOyAqLworCWludCBuZWVkX3BmeCA9ICgodHlwZSAmIFNQRUNJQUwpICYmIGJhc2UgIT0gMTApOwogCWludCBpOwogCiAJZGlnaXRzID0gKHR5cGUgJiBMQVJHRSkgPyBsYXJnZV9kaWdpdHMgOiBzbWFsbF9kaWdpdHM7CkBAIC0xNTYsNyArMjU1LDYgQEAKIAkJdHlwZSAmPSB+WkVST1BBRDsKIAlpZiAoYmFzZSA8IDIgfHwgYmFzZSA+IDM2KQogCQlyZXR1cm4gTlVMTDsKLQljID0gKHR5cGUgJiBaRVJPUEFEKSA/ICcwJyA6ICcgJzsKIAlzaWduID0gMDsKIAlpZiAodHlwZSAmIFNJR04pIHsKIAkJaWYgKChzaWduZWQgbG9uZyBsb25nKSBudW0gPCAwKSB7CkBAIC0xNzEsNjQgKzI2OSw4NSBAQAogCQkJc2l6ZS0tOwogCQl9CiAJfQotCWlmICh0eXBlICYgU1BFQ0lBTCkgeworCWlmIChuZWVkX3BmeCkgeworCQlzaXplLS07CiAJCWlmIChiYXNlID09IDE2KQotCQkJc2l6ZSAtPSAyOwotCQllbHNlIGlmIChiYXNlID09IDgpCiAJCQlzaXplLS07CiAJfQorCisJLyogZ2VuZXJhdGUgZnVsbCBzdHJpbmcgaW4gdG1wW10sIGluIHJldmVyc2Ugb3JkZXIgKi8KIAlpID0gMDsKIAlpZiAobnVtID09IDApCi0JCXRtcFtpKytdPScwJzsKLQllbHNlIHdoaWxlIChudW0gIT0gMCkKKwkJdG1wW2krK10gPSAnMCc7CisJLyogR2VuZXJpYyBjb2RlLCBmb3IgYW55IGJhc2U6CisJZWxzZSBkbyB7CiAJCXRtcFtpKytdID0gZGlnaXRzW2RvX2RpdihudW0sYmFzZSldOworCX0gd2hpbGUgKG51bSAhPSAwKTsKKwkqLworCWVsc2UgaWYgKGJhc2UgIT0gMTApIHsgLyogOCBvciAxNiAqLworCQlpbnQgbWFzayA9IGJhc2UgLSAxOworCQlpbnQgc2hpZnQgPSAzOworCQlpZiAoYmFzZSA9PSAxNikgc2hpZnQgPSA0OworCQlkbyB7CisJCQl0bXBbaSsrXSA9IGRpZ2l0c1soKHVuc2lnbmVkIGNoYXIpbnVtKSAmIG1hc2tdOworCQkJbnVtID4+PSBzaGlmdDsKKwkJfSB3aGlsZSAobnVtKTsKKwl9IGVsc2UgeyAvKiBiYXNlIDEwICovCisJCWkgPSBwdXRfZGVjKHRtcCwgbnVtKSAtIHRtcDsKKwl9CisKKwkvKiBwcmludGluZyAxMDAgdXNpbmcgJTJkIGdpdmVzICIxMDAiLCBub3QgIjAwIiAqLwogCWlmIChpID4gcHJlY2lzaW9uKQogCQlwcmVjaXNpb24gPSBpOworCS8qIGxlYWRpbmcgc3BhY2UgcGFkZGluZyAqLwogCXNpemUgLT0gcHJlY2lzaW9uOwotCWlmICghKHR5cGUmKFpFUk9QQUQrTEVGVCkpKSB7Ci0JCXdoaWxlKHNpemUtLT4wKSB7CisJaWYgKCEodHlwZSAmIChaRVJPUEFEK0xFRlQpKSkgeworCQl3aGlsZSgtLXNpemUgPj0gMCkgewogCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gJyAnOwogCQkJKytidWY7CiAJCX0KIAl9CisJLyogc2lnbiAqLwogCWlmIChzaWduKSB7CiAJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gc2lnbjsKIAkJKytidWY7CiAJfQotCWlmICh0eXBlICYgU1BFQ0lBTCkgewotCQlpZiAoYmFzZT09OCkgeworCS8qICIweCIgLyAiMCIgcHJlZml4ICovCisJaWYgKG5lZWRfcGZ4KSB7CisJCWlmIChidWYgPCBlbmQpCisJCQkqYnVmID0gJzAnOworCQkrK2J1ZjsKKwkJaWYgKGJhc2UgPT0gMTYpIHsKIAkJCWlmIChidWYgPCBlbmQpCi0JCQkJKmJ1ZiA9ICcwJzsKLQkJCSsrYnVmOwotCQl9IGVsc2UgaWYgKGJhc2U9PTE2KSB7Ci0JCQlpZiAoYnVmIDwgZW5kKQotCQkJCSpidWYgPSAnMCc7Ci0JCQkrK2J1ZjsKLQkJCWlmIChidWYgPCBlbmQpCi0JCQkJKmJ1ZiA9IGRpZ2l0c1szM107CisJCQkJKmJ1ZiA9IGRpZ2l0c1sxNl07IC8qIGZvciBhcmJpdHJhcnkgYmFzZTogZGlnaXRzWzMzXTsgKi8KIAkJCSsrYnVmOwogCQl9CiAJfQorCS8qIHplcm8gb3Igc3BhY2UgcGFkZGluZyAqLwogCWlmICghKHR5cGUgJiBMRUZUKSkgewotCQl3aGlsZSAoc2l6ZS0tID4gMCkgeworCQljaGFyIGMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOworCQl3aGlsZSAoLS1zaXplID49IDApIHsKIAkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9IGM7CiAJCQkrK2J1ZjsKIAkJfQogCX0KLQl3aGlsZSAoaSA8IHByZWNpc2lvbi0tKSB7CisJLyogaG1tIGV2ZW4gbW9yZSB6ZXJvIHBhZGRpbmc/ICovCisJd2hpbGUgKGkgPD0gLS1wcmVjaXNpb24pIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSAnMCc7CiAJCSsrYnVmOwogCX0KLQl3aGlsZSAoaS0tID4gMCkgeworCS8qIGFjdHVhbCBkaWdpdHMgb2YgcmVzdWx0ICovCisJd2hpbGUgKC0taSA+PSAwKSB7CiAJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gdG1wW2ldOwogCQkrK2J1ZjsKIAl9Ci0Jd2hpbGUgKHNpemUtLSA+IDApIHsKKwkvKiB0cmFpbGluZyBzcGFjZSBwYWRkaW5nICovCisJd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CiAJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gJyAnOwogCQkrK2J1ZjsKQEAgLTI3Niw3ICszOTUsNyBAQAogCSAgIHVzZWQgZm9yIHVua25vd24gYnVmZmVyIHNpemVzLiAqLwogCWlmICh1bmxpa2VseSgoaW50KSBzaXplIDwgMCkpIHsKIAkJLyogVGhlcmUgY2FuIGJlIG9ubHkgb25lLi4gKi8KLQkJc3RhdGljIGludCB3YXJuID0gMTsKKwkJc3RhdGljIGNoYXIgd2FybiA9IDE7CiAJCVdBUk5fT04od2Fybik7CiAJCXdhcm4gPSAwOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDhhYzQxMmIuLjg2MTg3MjIgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTE3LDcgKzExNyw3IEBACiAJYm9vbCAiQWxsb3cgZm9yIG1lbW9yeSBob3QtYWRkIgogCWRlcGVuZHMgb24gU1BBUlNFTUVNIHx8IFg4Nl82NF9BQ1BJX05VTUEKIAlkZXBlbmRzIG9uIEhPVFBMVUcgJiYgIVNPRlRXQVJFX1NVU1BFTkQgJiYgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUcKLQlkZXBlbmRzIG9uIChJQTY0IHx8IFg4NiB8fCBQUEM2NCkKKwlkZXBlbmRzIG9uIChJQTY0IHx8IFg4NiB8fCBQUEM2NCB8fCBTVVBFUkgpCiAKIGNvbW1lbnQgIk1lbW9yeSBob3RwbHVnIGlzIGN1cnJlbnRseSBpbmNvbXBhdGlibGUgd2l0aCBTb2Z0d2FyZSBTdXNwZW5kIgogCWRlcGVuZHMgb24gU1BBUlNFTUVNICYmIEhPVFBMVUcgJiYgU09GVFdBUkVfU1VTUEVORApAQCAtMTYzLDggKzE2MywxNiBAQAogCWRlZmF1bHQgIjAiIGlmICFaT05FX0RNQQogCWRlZmF1bHQgIjEiCiAKK2NvbmZpZyBCT1VOQ0UKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBCTE9DSyAmJiBNTVUgJiYgKFpPTkVfRE1BIHx8IEhJR0hNRU0pCisKIGNvbmZpZyBOUl9RVUlDSwogCWludAogCWRlcGVuZHMgb24gUVVJQ0tMSVNUCiAJZGVmYXVsdCAiMiIgaWYgKFNVUEVSSCAmJiAhU1VQRVJINjQpCiAJZGVmYXVsdCAiMSIKKworY29uZmlnIFZJUlRfVE9fQlVTCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gIUFSQ0hfTk9fVklSVF9UT19CVVMKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggYTkxNDhlYS4uMjQ1ZTMzYSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTEzLDkgKzEzLDcgQEAKIAkJCSAgIHByaW9fdHJlZS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyBiYWNraW5nLWRldi5vIFwKIAkJCSAgICQobW11LXkpCiAKLWlmZXEgKCQoQ09ORklHX01NVSkkKENPTkZJR19CTE9DSykseXkpCi1vYmoteQkJCSs9IGJvdW5jZS5vCi1lbmRpZgorb2JqLSQoQ09ORklHX0JPVU5DRSkJKz0gYm91bmNlLm8KIG9iai0kKENPTkZJR19TV0FQKQkrPSBwYWdlX2lvLm8gc3dhcF9zdGF0ZS5vIHN3YXBmaWxlLm8gdGhyYXNoLm8KIG9iai0kKENPTkZJR19IVUdFVExCRlMpCSs9IGh1Z2V0bGIubwogb2JqLSQoQ09ORklHX05VTUEpIAkrPSBtZW1wb2xpY3kubwpkaWZmIC0tZ2l0IGEvbW0vYWxsb2NwZXJjcHUuYyBiL21tL2FsbG9jcGVyY3B1LmMKaW5kZXggYjI0ODZjZi4uMDBiMDI2MiAxMDA2NDQKLS0tIGEvbW0vYWxsb2NwZXJjcHUuYworKysgYi9tbS9hbGxvY3BlcmNwdS5jCkBAIC01MywxMiArNTMsOSBAQAogCWludCBub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKIAogCUJVR19PTihwZGF0YS0+cHRyc1tjcHVdKTsKLQlpZiAobm9kZV9vbmxpbmUobm9kZSkpIHsKLQkJLyogRklYTUU6IGt6YWxsb2Nfbm9kZShzaXplLCBnZnAsIG5vZGUpICovCi0JCXBkYXRhLT5wdHJzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwgZ2ZwLCBub2RlKTsKLQkJaWYgKHBkYXRhLT5wdHJzW2NwdV0pCi0JCQltZW1zZXQocGRhdGEtPnB0cnNbY3B1XSwgMCwgc2l6ZSk7Ci0JfSBlbHNlCisJaWYgKG5vZGVfb25saW5lKG5vZGUpKQorCQlwZGF0YS0+cHRyc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsIGdmcHxfX0dGUF9aRVJPLCBub2RlKTsKKwllbHNlCiAJCXBkYXRhLT5wdHJzW2NwdV0gPSBremFsbG9jKHNpemUsIGdmcCk7CiAJcmV0dXJuIHBkYXRhLT5wdHJzW2NwdV07CiB9CmRpZmYgLS1naXQgYS9tbS9iYWNraW5nLWRldi5jIGIvbW0vYmFja2luZy1kZXYuYwppbmRleCBlNWRlMzc4Li5mNTBhMjgxIDEwMDY0NAotLS0gYS9tbS9iYWNraW5nLWRldi5jCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTU1LDIyICs1NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNvbmdlc3Rpb25fd2FpdCk7CiAKLWxvbmcgY29uZ2VzdGlvbl93YWl0X2ludGVycnVwdGlibGUoaW50IHJ3LCBsb25nIHRpbWVvdXQpCi17Ci0JbG9uZyByZXQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107Ci0KLQlwcmVwYXJlX3RvX3dhaXQod3FoLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCXJldCA9IC1FUkVTVEFSVFNZUzsKLQllbHNlCi0JCXJldCA9IGlvX3NjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JZmluaXNoX3dhaXQod3FoLCAmd2FpdCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woY29uZ2VzdGlvbl93YWl0X2ludGVycnVwdGlibGUpOwotCiAvKioKICAqIGNvbmdlc3Rpb25fZW5kIC0gd2FrZSB1cCBzbGVlcGVycyBvbiBhIGNvbmdlc3RlZCBiYWNraW5nX2Rldl9pbmZvCiAgKiBAcnc6IFJFQUQgb3IgV1JJVEUKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBjNmViZDlmLi41ZDU0NDlmIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0xMjAsNiArMTIwLDcgQEAKIAlwYWdlLT5tYXBwaW5nID0gTlVMTDsKIAltYXBwaW5nLT5ucnBhZ2VzLS07CiAJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfUEFHRVMpOworCUJVR19PTihwYWdlX21hcHBlZChwYWdlKSk7CiB9CiAKIHZvaWQgcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTg2NiwxMyArODY3LDExIEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBuZXh0X2luZGV4OwogCXVuc2lnbmVkIGxvbmcgcHJldl9pbmRleDsKIAl1bnNpZ25lZCBpbnQgcHJldl9vZmZzZXQ7Ci0JbG9mZl90IGlzaXplOwogCXN0cnVjdCBwYWdlICpjYWNoZWRfcGFnZTsKIAlpbnQgZXJyb3I7CiAJc3RydWN0IGZpbGVfcmFfc3RhdGUgcmEgPSAqX3JhOwpAQCAtODg1LDI3ICs4ODQsMTIgQEAKIAlsYXN0X2luZGV4ID0gKCpwcG9zICsgZGVzYy0+Y291bnQgKyBQQUdFX0NBQ0hFX1NJWkUtMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlvZmZzZXQgPSAqcHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAKLQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlpZiAoIWlzaXplKQotCQlnb3RvIG91dDsKLQotCWVuZF9pbmRleCA9IChpc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJZm9yICg7OykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXg7CisJCWxvZmZfdCBpc2l6ZTsKIAkJdW5zaWduZWQgbG9uZyBuciwgcmV0OwogCi0JCS8qIG5yIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gdGhpcyBwYWdlICovCi0JCW5yID0gUEFHRV9DQUNIRV9TSVpFOwotCQlpZiAoaW5kZXggPj0gZW5kX2luZGV4KSB7Ci0JCQlpZiAoaW5kZXggPiBlbmRfaW5kZXgpCi0JCQkJZ290byBvdXQ7Ci0JCQluciA9ICgoaXNpemUgLSAxKSAmIH5QQUdFX0NBQ0hFX01BU0spICsgMTsKLQkJCWlmIChuciA8PSBvZmZzZXQpIHsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQluciA9IG5yIC0gb2Zmc2V0OwotCiAJCWNvbmRfcmVzY2hlZCgpOwogCQlpZiAoaW5kZXggPT0gbmV4dF9pbmRleCkKIAkJCW5leHRfaW5kZXggPSBwYWdlX2NhY2hlX3JlYWRhaGVhZChtYXBwaW5nLCAmcmEsIGZpbHAsCkBAIC05MjAsNiArOTA0LDMyIEBACiAJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQkJZ290byBwYWdlX25vdF91cF90b19kYXRlOwogcGFnZV9vazoKKwkJLyoKKwkJICogaV9zaXplIG11c3QgYmUgY2hlY2tlZCBhZnRlciB3ZSBrbm93IHRoZSBwYWdlIGlzIFVwdG9kYXRlLgorCQkgKgorCQkgKiBDaGVja2luZyBpX3NpemUgYWZ0ZXIgdGhlIGNoZWNrIGFsbG93cyB1cyB0byBjYWxjdWxhdGUKKwkJICogdGhlIGNvcnJlY3QgdmFsdWUgZm9yICJuciIsIHdoaWNoIG1lYW5zIHRoZSB6ZXJvLWZpbGxlZAorCQkgKiBwYXJ0IG9mIHRoZSBwYWdlIGlzIG5vdCBjb3BpZWQgYmFjayB0byB1c2Vyc3BhY2UgKHVubGVzcworCQkgKiBhbm90aGVyIHRydW5jYXRlIGV4dGVuZHMgdGhlIGZpbGUgLSB0aGlzIGlzIGRlc2lyZWQgdGhvdWdoKS4KKwkJICovCisKKwkJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWVuZF9pbmRleCA9IChpc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlmICh1bmxpa2VseSghaXNpemUgfHwgaW5kZXggPiBlbmRfaW5kZXgpKSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIG5yIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gdGhpcyBwYWdlICovCisJCW5yID0gUEFHRV9DQUNIRV9TSVpFOworCQlpZiAoaW5kZXggPT0gZW5kX2luZGV4KSB7CisJCQluciA9ICgoaXNpemUgLSAxKSAmIH5QQUdFX0NBQ0hFX01BU0spICsgMTsKKwkJCWlmIChuciA8PSBvZmZzZXQpIHsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJbnIgPSBuciAtIG9mZnNldDsKIAogCQkvKiBJZiB1c2VycyBjYW4gYmUgd3JpdGluZyB0byB0aGlzIHBhZ2UgdXNpbmcgYXJiaXRyYXJ5CiAJCSAqIHZpcnR1YWwgYWRkcmVzc2VzLCB0YWtlIGNhcmUgYWJvdXQgcG90ZW50aWFsIGFsaWFzaW5nCkBAIC0xMDA2LDMxICsxMDE2LDYgQEAKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAKLQkJLyoKLQkJICogaV9zaXplIG11c3QgYmUgY2hlY2tlZCBhZnRlciB3ZSBoYXZlIGRvbmUgLT5yZWFkcGFnZS4KLQkJICoKLQkJICogQ2hlY2tpbmcgaV9zaXplIGFmdGVyIHRoZSByZWFkcGFnZSBhbGxvd3MgdXMgdG8gY2FsY3VsYXRlCi0JCSAqIHRoZSBjb3JyZWN0IHZhbHVlIGZvciAibnIiLCB3aGljaCBtZWFucyB0aGUgemVyby1maWxsZWQKLQkJICogcGFydCBvZiB0aGUgcGFnZSBpcyBub3QgY29waWVkIGJhY2sgdG8gdXNlcnNwYWNlICh1bmxlc3MKLQkJICogYW5vdGhlciB0cnVuY2F0ZSBleHRlbmRzIHRoZSBmaWxlIC0gdGhpcyBpcyBkZXNpcmVkIHRob3VnaCkuCi0JCSAqLwotCQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQkJZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJaWYgKHVubGlrZWx5KCFpc2l6ZSB8fCBpbmRleCA+IGVuZF9pbmRleCkpIHsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJLyogbnIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSB0aGlzIHBhZ2UgKi8KLQkJbnIgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWlmIChpbmRleCA9PSBlbmRfaW5kZXgpIHsKLQkJCW5yID0gKChpc2l6ZSAtIDEpICYgflBBR0VfQ0FDSEVfTUFTSykgKyAxOwotCQkJaWYgKG5yIDw9IG9mZnNldCkgewotCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQluciA9IG5yIC0gb2Zmc2V0OwogCQlnb3RvIHBhZ2Vfb2s7CiAKIHJlYWRwYWdlX2Vycm9yOgpAQCAtMTIxOCw2ICsxMjAzLDggQEAKIAkJCQlyZXR2YWwgPSByZXR2YWwgPzogZGVzYy5lcnJvcjsKIAkJCQlicmVhazsKIAkJCX0KKwkJCWlmIChkZXNjLmNvdW50ID4gMCkKKwkJCQlicmVhazsKIAkJfQogCX0KIG91dDoKQEAgLTE5NjQsNyArMTk1MSw2IEBACiAJaWYgKHVubGlrZWx5KCpwb3MgKyAqY291bnQgPiBNQVhfTk9OX0xGUyAmJgogCQkJCSEoZmlsZS0+Zl9mbGFncyAmIE9fTEFSR0VGSUxFKSkpIHsKIAkJaWYgKCpwb3MgPj0gTUFYX05PTl9MRlMpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJcmV0dXJuIC1FRkJJRzsKIAkJfQogCQlpZiAoKmNvdW50ID4gTUFYX05PTl9MRlMgLSAodW5zaWduZWQgbG9uZykqcG9zKSB7CkBAIC0xOTgyLDcgKzE5NjgsNiBAQAogCWlmIChsaWtlbHkoIWlzYmxrKSkgewogCQlpZiAodW5saWtlbHkoKnBvcyA+PSBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykpIHsKIAkJCWlmICgqY291bnQgfHwgKnBvcyA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7Ci0JCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQkJcmV0dXJuIC1FRkJJRzsKIAkJCX0KIAkJCS8qIHplcm8tbGVuZ3RoIHdyaXRlcyBhdCAtPnNfbWF4Ynl0ZXMgYXJlIE9LICovCmRpZmYgLS1naXQgYS9tbS9oaWdobWVtLmMgYi9tbS9oaWdobWVtLmMKaW5kZXggYmU4ZjhkMy4uN2E5NjdiYyAxMDA2NDQKLS0tIGEvbW0vaGlnaG1lbS5jCisrKyBiL21tL2hpZ2htZW0uYwpAQCAtNDYsOSArNDYsMTQgQEAKIAlwZ19kYXRhX3QgKnBnZGF0OwogCXVuc2lnbmVkIGludCBwYWdlcyA9IDA7CiAKLQlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpCisJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7CiAJCXBhZ2VzICs9IHpvbmVfcGFnZV9zdGF0ZSgmcGdkYXQtPm5vZGVfem9uZXNbWk9ORV9ISUdITUVNXSwKIAkJCU5SX0ZSRUVfUEFHRVMpOworCQlpZiAoem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0oKSkKKwkJCXBhZ2VzICs9IHpvbmVfcGFnZV9zdGF0ZSgKKwkJCQkJJnBnZGF0LT5ub2RlX3pvbmVzW1pPTkVfTU9WQUJMRV0sCisJCQkJCU5SX0ZSRUVfUEFHRVMpOworCX0KIAogCXJldHVybiBwYWdlczsKIH0KZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBhNDVkMWYwLi42OTEyYmJmIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0yNyw2ICsyNyw5IEBACiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBodWdlcGFnZV9mcmVlbGlzdHNbTUFYX05VTU5PREVTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfaHVnZV9wYWdlc19ub2RlW01BWF9OVU1OT0RFU107CiBzdGF0aWMgdW5zaWduZWQgaW50IGZyZWVfaHVnZV9wYWdlc19ub2RlW01BWF9OVU1OT0RFU107CitzdGF0aWMgZ2ZwX3QgaHRsYl9hbGxvY19tYXNrID0gR0ZQX0hJR0hVU0VSOwordW5zaWduZWQgbG9uZyBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZTsKKwogLyoKICAqIFByb3RlY3RzIHVwZGF0ZXMgdG8gaHVnZXBhZ2VfZnJlZWxpc3RzLCBucl9odWdlX3BhZ2VzLCBhbmQgZnJlZV9odWdlX3BhZ2VzCiAgKi8KQEAgLTY2LDE0ICs2OSwxNSBAQAogc3RhdGljIHN0cnVjdCBwYWdlICpkZXF1ZXVlX2h1Z2VfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JaW50IG5pZCA9IG51bWFfbm9kZV9pZCgpOworCWludCBuaWQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBodWdlX3pvbmVsaXN0KHZtYSwgYWRkcmVzcyk7CisJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCA9IGh1Z2Vfem9uZWxpc3Qodm1hLCBhZGRyZXNzLAorCQkJCQkJaHRsYl9hbGxvY19tYXNrKTsKIAlzdHJ1Y3Qgem9uZSAqKno7CiAKIAlmb3IgKHogPSB6b25lbGlzdC0+em9uZXM7ICp6OyB6KyspIHsKIAkJbmlkID0gem9uZV90b19uaWQoKnopOwotCQlpZiAoY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbCgqeiwgR0ZQX0hJR0hVU0VSKSAmJgorCQlpZiAoY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbCgqeiwgaHRsYl9hbGxvY19tYXNrKSAmJgogCQkgICAgIWxpc3RfZW1wdHkoJmh1Z2VwYWdlX2ZyZWVsaXN0c1tuaWRdKSkKIAkJCWJyZWFrOwogCX0KQEAgLTEwMSwxMyArMTA1LDIwIEBACiAKIHN0YXRpYyBpbnQgYWxsb2NfZnJlc2hfaHVnZV9wYWdlKHZvaWQpCiB7Ci0Jc3RhdGljIGludCBuaWQgPSAwOworCXN0YXRpYyBpbnQgcHJldl9uaWQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobmlkLCBHRlBfSElHSFVTRVJ8X19HRlBfQ09NUHxfX0dGUF9OT1dBUk4sCi0JCQkJCUhVR0VUTEJfUEFHRV9PUkRFUik7Ci0JbmlkID0gbmV4dF9ub2RlKG5pZCwgbm9kZV9vbmxpbmVfbWFwKTsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5pZF9sb2NrKTsKKwlpbnQgbmlkOworCisJc3Bpbl9sb2NrKCZuaWRfbG9jayk7CisJbmlkID0gbmV4dF9ub2RlKHByZXZfbmlkLCBub2RlX29ubGluZV9tYXApOwogCWlmIChuaWQgPT0gTUFYX05VTU5PREVTKQogCQluaWQgPSBmaXJzdF9ub2RlKG5vZGVfb25saW5lX21hcCk7CisJcHJldl9uaWQgPSBuaWQ7CisJc3Bpbl91bmxvY2soJm5pZF9sb2NrKTsKKworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgaHRsYl9hbGxvY19tYXNrfF9fR0ZQX0NPTVB8X19HRlBfTk9XQVJOLAorCQkJCQlIVUdFVExCX1BBR0VfT1JERVIpOwogCWlmIChwYWdlKSB7CiAJCXNldF9jb21wb3VuZF9wYWdlX2R0b3IocGFnZSwgZnJlZV9odWdlX3BhZ2UpOwogCQlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CkBAIC0yNTYsNiArMjY3LDE5IEBACiAJbWF4X2h1Z2VfcGFnZXMgPSBzZXRfbWF4X2h1Z2VfcGFnZXMobWF4X2h1Z2VfcGFnZXMpOwogCXJldHVybiAwOwogfQorCitpbnQgaHVnZXRsYl90cmVhdF9tb3ZhYmxlX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCWlmIChodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSkKKwkJaHRsYl9hbGxvY19tYXNrID0gR0ZQX0hJR0hVU0VSX01PVkFCTEU7CisJZWxzZQorCQlodGxiX2FsbG9jX21hc2sgPSBHRlBfSElHSFVTRVI7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKIGludCBodWdldGxiX3JlcG9ydF9tZW1pbmZvKGNoYXIgKmJ1ZikKQEAgLTQ3NCw3ICs0OTgsNyBAQAogCXJldHVybiBWTV9GQVVMVF9NSU5PUjsKIH0KIAotaW50IGh1Z2V0bGJfbm9fcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCitzdGF0aWMgaW50IGh1Z2V0bGJfbm9fcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLCBpbnQgd3JpdGVfYWNjZXNzKQogewogCWludCByZXQgPSBWTV9GQVVMVF9TSUdCVVM7CmRpZmYgLS1naXQgYS9tbS9tYWR2aXNlLmMgYi9tbS9tYWR2aXNlLmMKaW5kZXggNjA1NDJkMC4uOTNlZTM3NSAxMDA2NDQKLS0tIGEvbW0vbWFkdmlzZS5jCisrKyBiL21tL21hZHZpc2UuYwpAQCAtMjg3LDkgKzI4NywxMSBAQAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgKnByZXY7CiAJaW50IHVubWFwcGVkX2Vycm9yID0gMDsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWludCB3cml0ZTsKIAlzaXplX3QgbGVuOwogCi0JaWYgKG1hZHZpc2VfbmVlZF9tbWFwX3dyaXRlKGJlaGF2aW9yKSkKKwl3cml0ZSA9IG1hZHZpc2VfbmVlZF9tbWFwX3dyaXRlKGJlaGF2aW9yKTsKKwlpZiAod3JpdGUpCiAJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJZWxzZQogCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CkBAIC0zNTQsNyArMzU2LDcgQEAKIAkJCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBzdGFydCk7CiAJfQogb3V0OgotCWlmIChtYWR2aXNlX25lZWRfbW1hcF93cml0ZShiZWhhdmlvcikpCisJaWYgKHdyaXRlKQogCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAllbHNlCiAJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IGY2NGNiZjkuLjljNmZmN2YgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC03OCwxMSArNzgsOSBAQAogICogYW5kIFpPTkVfSElHSE1FTS4KICAqLwogdm9pZCAqIGhpZ2hfbWVtb3J5OwotdW5zaWduZWQgbG9uZyB2bWFsbG9jX2Vhcmx5cmVzZXJ2ZTsKIAogRVhQT1JUX1NZTUJPTChudW1fcGh5c3BhZ2VzKTsKIEVYUE9SVF9TWU1CT0woaGlnaF9tZW1vcnkpOwotRVhQT1JUX1NZTUJPTCh2bWFsbG9jX2Vhcmx5cmVzZXJ2ZSk7CiAKIGludCByYW5kb21pemVfdmFfc3BhY2UgX19yZWFkX21vc3RseSA9IDE7CiAKQEAgLTEwNTUsNiArMTA1MywxNCBAQAogCQlkbyB7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAorCQkJLyoKKwkJCSAqIElmIHRzayBpcyBvb21pbmcsIGN1dCBvZmYgaXRzIGFjY2VzcyB0byBsYXJnZSBtZW1vcnkKKwkJCSAqIGFsbG9jYXRpb25zLiBJdCBoYXMgYSBwZW5kaW5nIFNJR0tJTEwsIGJ1dCBpdCBjYW4ndAorCQkJICogYmUgcHJvY2Vzc2VkIHVudGlsIHJldHVybmluZyB0byB1c2VyIHNwYWNlLgorCQkJICovCisJCQlpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfTUVNRElFKSkpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJCWlmICh3cml0ZSkKIAkJCQlmb2xsX2ZsYWdzIHw9IEZPTExfV1JJVEU7CiAKQEAgLTE3MDksMTEgKzE3MTUsMTEgQEAKIAlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkKIAkJZ290byBvb207CiAJaWYgKG9sZF9wYWdlID09IFpFUk9fUEFHRShhZGRyZXNzKSkgewotCQluZXdfcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgYWRkcmVzcyk7CisJCW5ld19wYWdlID0gYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZSh2bWEsIGFkZHJlc3MpOwogCQlpZiAoIW5ld19wYWdlKQogCQkJZ290byBvb207CiAJfSBlbHNlIHsKLQkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgYWRkcmVzcyk7CisJCW5ld19wYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsIHZtYSwgYWRkcmVzcyk7CiAJCWlmICghbmV3X3BhZ2UpCiAJCQlnb3RvIG9vbTsKIAkJY293X3VzZXJfcGFnZShuZXdfcGFnZSwgb2xkX3BhZ2UsIGFkZHJlc3MsIHZtYSk7CkBAIC0yMjMxLDcgKzIyMzcsNyBAQAogCiAJCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQogCQkJZ290byBvb207Ci0JCXBhZ2UgPSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIGFkZHJlc3MpOworCQlwYWdlID0gYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZSh2bWEsIGFkZHJlc3MpOwogCQlpZiAoIXBhZ2UpCiAJCQlnb3RvIG9vbTsKIApAQCAtMjMzNCw3ICsyMzQwLDggQEAKIAogCQkJaWYgKHVubGlrZWx5KGFub25fdm1hX3ByZXBhcmUodm1hKSkpCiAJCQkJZ290byBvb207Ci0JCQlwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsIGFkZHJlc3MpOworCQkJcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUl9NT1ZBQkxFLAorCQkJCQkJdm1hLCBhZGRyZXNzKTsKIAkJCWlmICghcGFnZSkKIAkJCQlnb3RvIG9vbTsKIAkJCWNvcHlfdXNlcl9oaWdocGFnZShwYWdlLCBuZXdfcGFnZSwgYWRkcmVzcywgdm1hKTsKQEAgLTI2NzMsNyArMjY4MCw3IEBACiAJd3JpdGUgPSAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSAhPSAwOwogCUJVR19PTihhZGRyID49IGVuZCk7CiAJQlVHX09OKGVuZCA+IHZtYS0+dm1fZW5kKTsKLQlsZW4gPSAoZW5kK1BBR0VfU0laRS0xKS9QQUdFX1NJWkUtYWRkci9QQUdFX1NJWkU7CisJbGVuID0gRElWX1JPVU5EX1VQKGVuZCwgUEFHRV9TSVpFKSAtIGFkZHIvUEFHRV9TSVpFOwogCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBhZGRyLAogCQkJbGVuLCB3cml0ZSwgMCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IGQ3NmU4ZWIuLjlmNGU5YjkgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC0xMDEsOCArMTAxLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcG9saWN5X2NhY2hlOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzbl9jYWNoZTsKIAotI2RlZmluZSBQRHByaW50ayhmbXQuLi4pCi0KIC8qIEhpZ2hlc3Qgem9uZS4gQW4gc3BlY2lmaWMgYWxsb2NhdGlvbiBmb3IgYSB6b25lIGJlbG93IHRoYXQgaXMgbm90CiAgICBwb2xpY2llZC4gKi8KIGVudW0gem9uZV90eXBlIHBvbGljeV96b25lID0gMDsKQEAgLTE3NSw3ICsxNzMsOSBAQAogewogCXN0cnVjdCBtZW1wb2xpY3kgKnBvbGljeTsKIAotCVBEcHJpbnRrKCJzZXR0aW5nIG1vZGUgJWQgbm9kZXNbMF0gJWx4XG4iLCBtb2RlLCBub2Rlc19hZGRyKCpub2RlcylbMF0pOworCXByX2RlYnVnKCJzZXR0aW5nIG1vZGUgJWQgbm9kZXNbMF0gJWx4XG4iLAorCQkgbW9kZSwgbm9kZXMgPyBub2Rlc19hZGRyKCpub2RlcylbMF0gOiAtMSk7CisKIAlpZiAobW9kZSA9PSBNUE9MX0RFRkFVTFQpCiAJCXJldHVybiBOVUxMOwogCXBvbGljeSA9IGttZW1fY2FjaGVfYWxsb2MocG9saWN5X2NhY2hlLCBHRlBfS0VSTkVMKTsKQEAgLTM3OSw3ICszNzksNyBAQAogCWludCBlcnIgPSAwOwogCXN0cnVjdCBtZW1wb2xpY3kgKm9sZCA9IHZtYS0+dm1fcG9saWN5OwogCi0JUERwcmludGsoInZtYSAlbHgtJWx4LyVseCB2bV9vcHMgJXAgdm1fZmlsZSAlcCBzZXRfcG9saWN5ICVwXG4iLAorCXByX2RlYnVnKCJ2bWEgJWx4LSVseC8lbHggdm1fb3BzICVwIHZtX2ZpbGUgJXAgc2V0X3BvbGljeSAlcFxuIiwKIAkJIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCB2bWEtPnZtX3Bnb2ZmLAogCQkgdm1hLT52bV9vcHMsIHZtYS0+dm1fZmlsZSwKIAkJIHZtYS0+dm1fb3BzID8gdm1hLT52bV9vcHMtPnNldF9wb2xpY3kgOiBOVUxMKTsKQEAgLTU5NCw3ICs1OTQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKm5ld19ub2RlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbm9kZSwgaW50ICoqeCkKIHsKLQlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfSElHSFVTRVIsIDApOworCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG5vZGUsIEdGUF9ISUdIVVNFUl9NT1ZBQkxFLCAwKTsKIH0KIAogLyoKQEAgLTcxMCw3ICs3MTAsOCBAQAogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKXByaXZhdGU7CiAKLQlyZXR1cm4gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsIHBhZ2VfYWRkcmVzc19pbl92bWEocGFnZSwgdm1hKSk7CisJcmV0dXJuIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUl9NT1ZBQkxFLCB2bWEsCisJCQkJCXBhZ2VfYWRkcmVzc19pbl92bWEocGFnZSwgdm1hKSk7CiB9CiAjZWxzZQogCkBAIC03NzYsOCArNzc3LDggQEAKIAlpZiAoIW5ldykKIAkJZmxhZ3MgfD0gTVBPTF9NRl9ESVNDT05USUdfT0s7CiAKLQlQRHByaW50aygibWJpbmQgJWx4LSVseCBtb2RlOiVsZCBub2RlczolbHhcbiIsc3RhcnQsc3RhcnQrbGVuLAotCQkJbW9kZSxub2Rlc19hZGRyKG5vZGVzKVswXSk7CisJcHJfZGVidWcoIm1iaW5kICVseC0lbHggbW9kZTolbGQgbm9kZXM6JWx4XG4iLHN0YXJ0LHN0YXJ0K2xlbiwKKwkJIG1vZGUsIG5tYXNrID8gbm9kZXNfYWRkcigqbm1hc2spWzBdIDogLTEpOwogCiAJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAl2bWEgPSBjaGVja19yYW5nZShtbSwgc3RhcnQsIGVuZCwgbm1hc2ssCkBAIC0xMjAyLDcgKzEyMDMsOCBAQAogCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJGUwogLyogUmV0dXJuIGEgem9uZWxpc3Qgc3VpdGFibGUgZm9yIGEgaHVnZSBwYWdlIGFsbG9jYXRpb24uICovCi1zdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCQkJCWdmcF90IGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBnZXRfdm1hX3BvbGljeShjdXJyZW50LCB2bWEsIGFkZHIpOwogCkBAIC0xMjEwLDcgKzEyMTIsNyBAQAogCQl1bnNpZ25lZCBuaWQ7CiAKIAkJbmlkID0gaW50ZXJsZWF2ZV9uaWQocG9sLCB2bWEsIGFkZHIsIEhQQUdFX1NISUZUKTsKLQkJcmV0dXJuIE5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVsaXN0cyArIGdmcF96b25lKEdGUF9ISUdIVVNFUik7CisJCXJldHVybiBOT0RFX0RBVEEobmlkKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShnZnBfZmxhZ3MpOwogCX0KIAlyZXR1cm4gem9uZWxpc3RfcG9saWN5KEdGUF9ISUdIVVNFUiwgcG9sKTsKIH0KQEAgLTE0MzQsNyArMTQzNiw3IEBACiAJfQogCXJiX2xpbmtfbm9kZSgmbmV3LT5uZCwgcGFyZW50LCBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJm5ldy0+bmQsICZzcC0+cm9vdCk7Ci0JUERwcmludGsoImluc2VydGluZyAlbHgtJWx4OiAlZFxuIiwgbmV3LT5zdGFydCwgbmV3LT5lbmQsCisJcHJfZGVidWcoImluc2VydGluZyAlbHgtJWx4OiAlZFxuIiwgbmV3LT5zdGFydCwgbmV3LT5lbmQsCiAJCSBuZXctPnBvbGljeSA/IG5ldy0+cG9saWN5LT5wb2xpY3kgOiAwKTsKIH0KIApAQCAtMTQ1OSw3ICsxNDYxLDcgQEAKIAogc3RhdGljIHZvaWQgc3BfZGVsZXRlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IHNwX25vZGUgKm4pCiB7Ci0JUERwcmludGsoImRlbGV0aW5nICVseC1sJXhcbiIsIG4tPnN0YXJ0LCBuLT5lbmQpOworCXByX2RlYnVnKCJkZWxldGluZyAlbHgtbCVseFxuIiwgbi0+c3RhcnQsIG4tPmVuZCk7CiAJcmJfZXJhc2UoJm4tPm5kLCAmc3AtPnJvb3QpOwogCW1wb2xfZnJlZShuLT5wb2xpY3kpOwogCWttZW1fY2FjaGVfZnJlZShzbl9jYWNoZSwgbik7CkBAIC0xNTU4LDEwICsxNTYwLDEwIEBACiAJc3RydWN0IHNwX25vZGUgKm5ldyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBzeiA9IHZtYV9wYWdlcyh2bWEpOwogCi0JUERwcmludGsoInNldF9zaGFyZWRfcG9saWN5ICVseCBzeiAlbHUgJWQgJWx4XG4iLAorCXByX2RlYnVnKCJzZXRfc2hhcmVkX3BvbGljeSAlbHggc3ogJWx1ICVkICVseFxuIiwKIAkJIHZtYS0+dm1fcGdvZmYsCiAJCSBzeiwgbnBvbD8gbnBvbC0+cG9saWN5IDogLTEsCi0JCW5wb2wgPyBub2Rlc19hZGRyKG5wb2wtPnYubm9kZXMpWzBdIDogLTEpOworCQkgbnBvbCA/IG5vZGVzX2FkZHIobnBvbC0+di5ub2RlcylbMF0gOiAtMSk7CiAKIAlpZiAobnBvbCkgewogCQluZXcgPSBzcF9hbGxvYyh2bWEtPnZtX3Bnb2ZmLCB2bWEtPnZtX3Bnb2ZmICsgc3osIG5wb2wpOwpAQCAtMTU5Nyw2ICsxNTk5LDEwIEBACiAvKiBhc3N1bWVzIGZzID09IEtFUk5FTF9EUyAqLwogdm9pZCBfX2luaXQgbnVtYV9wb2xpY3lfaW5pdCh2b2lkKQogeworCW5vZGVtYXNrX3QgaW50ZXJsZWF2ZV9ub2RlczsKKwl1bnNpZ25lZCBsb25nIGxhcmdlc3QgPSAwOworCWludCBuaWQsIHByZWZlciA9IDA7CisKIAlwb2xpY3lfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibnVtYV9wb2xpY3kiLAogCQkJCQkgc2l6ZW9mKHN0cnVjdCBtZW1wb2xpY3kpLAogCQkJCQkgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CkBAIC0xNjA1LDEwICsxNjExLDMxIEBACiAJCQkJICAgICBzaXplb2Yoc3RydWN0IHNwX25vZGUpLAogCQkJCSAgICAgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CiAKLQkvKiBTZXQgaW50ZXJsZWF2aW5nIHBvbGljeSBmb3Igc3lzdGVtIGluaXQuIFRoaXMgd2F5IG5vdCBhbGwKLQkgICB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBhdCBzeXN0ZW0gYm9vdCBlbmQgdXAgaW4gbm9kZSB6ZXJvLiAqLworCS8qCisJICogU2V0IGludGVybGVhdmluZyBwb2xpY3kgZm9yIHN5c3RlbSBpbml0LiBJbnRlcmxlYXZpbmcgaXMgb25seQorCSAqIGVuYWJsZWQgYWNyb3NzIHN1aXRhYmx5IHNpemVkIG5vZGVzIChkZWZhdWx0IGlzID49IDE2TUIpLCBvcgorCSAqIGZhbGwgYmFjayB0byB0aGUgbGFyZ2VzdCBub2RlIGlmIHRoZXkncmUgYWxsIHNtYWxsZXIuCisJICovCisJbm9kZXNfY2xlYXIoaW50ZXJsZWF2ZV9ub2Rlcyk7CisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCXVuc2lnbmVkIGxvbmcgdG90YWxfcGFnZXMgPSBub2RlX3ByZXNlbnRfcGFnZXMobmlkKTsKIAotCWlmIChkb19zZXRfbWVtcG9saWN5KE1QT0xfSU5URVJMRUFWRSwgJm5vZGVfb25saW5lX21hcCkpCisJCS8qIFByZXNlcnZlIHRoZSBsYXJnZXN0IG5vZGUgKi8KKwkJaWYgKGxhcmdlc3QgPCB0b3RhbF9wYWdlcykgeworCQkJbGFyZ2VzdCA9IHRvdGFsX3BhZ2VzOworCQkJcHJlZmVyID0gbmlkOworCQl9CisKKwkJLyogSW50ZXJsZWF2ZSB0aGlzIG5vZGU/ICovCisJCWlmICgodG90YWxfcGFnZXMgPDwgUEFHRV9TSElGVCkgPj0gKDE2IDw8IDIwKSkKKwkJCW5vZGVfc2V0KG5pZCwgaW50ZXJsZWF2ZV9ub2Rlcyk7CisJfQorCisJLyogQWxsIHRvbyBzbWFsbCwgdXNlIHRoZSBsYXJnZXN0ICovCisJaWYgKHVubGlrZWx5KG5vZGVzX2VtcHR5KGludGVybGVhdmVfbm9kZXMpKSkKKwkJbm9kZV9zZXQocHJlZmVyLCBpbnRlcmxlYXZlX25vZGVzKTsKKworCWlmIChkb19zZXRfbWVtcG9saWN5KE1QT0xfSU5URVJMRUFWRSwgJmludGVybGVhdmVfbm9kZXMpKQogCQlwcmludGsoIm51bWFfcG9saWN5X2luaXQ6IGludGVybGVhdmluZyBmYWlsZWRcbiIpOwogfQogCmRpZmYgLS1naXQgYS9tbS9tZW1wb29sLmMgYi9tbS9tZW1wb29sLmMKaW5kZXggY2MxY2E4Ni4uMDJkNWVjMyAxMDA2NDQKLS0tIGEvbW0vbWVtcG9vbC5jCisrKyBiL21tL21lbXBvb2wuYwpAQCAtNjIsMTAgKzYyLDkgQEAKIAkJCW1lbXBvb2xfZnJlZV90ICpmcmVlX2ZuLCB2b2lkICpwb29sX2RhdGEsIGludCBub2RlX2lkKQogewogCW1lbXBvb2xfdCAqcG9vbDsKLQlwb29sID0ga21hbGxvY19ub2RlKHNpemVvZigqcG9vbCksIEdGUF9LRVJORUwsIG5vZGVfaWQpOworCXBvb2wgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwogCWlmICghcG9vbCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHBvb2wsIDAsIHNpemVvZigqcG9vbCkpOwogCXBvb2wtPmVsZW1lbnRzID0ga21hbGxvY19ub2RlKG1pbl9uciAqIHNpemVvZih2b2lkICopLAogCQkJCQlHRlBfS0VSTkVMLCBub2RlX2lkKTsKIAlpZiAoIXBvb2wtPmVsZW1lbnRzKSB7CkBAIC0yNjMsNiArMjYyLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaWYgKHVubGlrZWx5KGVsZW1lbnQgPT0gTlVMTCkpCisJCXJldHVybjsKKwogCXNtcF9tYigpOwogCWlmIChwb29sLT5jdXJyX25yIDwgcG9vbC0+bWluX25yKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggYTkxY2EwMC4uMzRkOGFkYSAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtNzYxLDcgKzc2MSw4IEBACiAKIAkqcmVzdWx0ID0gJnBtLT5zdGF0dXM7CiAKLQlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShwbS0+bm9kZSwgR0ZQX0hJR0hVU0VSIHwgR0ZQX1RISVNOT0RFLCAwKTsKKwlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShwbS0+bm9kZSwKKwkJCQlHRlBfSElHSFVTRVJfTU9WQUJMRSB8IEdGUF9USElTTk9ERSwgMCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tbS9tbG9jay5jIGIvbW0vbWxvY2suYwppbmRleCA0ZDNmZWEyLi43YjI2NTYwIDEwMDY0NAotLS0gYS9tbS9tbG9jay5jCisrKyBiL21tL21sb2NrLmMKQEAgLTI0NCw5ICsyNDQsMTIgQEAKIAogCWxvY2tlZCA9IChzaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIAlsb2NrX2xpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1cjsKKwlpZiAobG9ja19saW1pdCA9PSBSTElNX0lORklOSVRZKQorCQlhbGxvd2VkID0gMTsKIAlsb2NrX2xpbWl0ID4+PSBQQUdFX1NISUZUOwogCXNwaW5fbG9jaygmc2htbG9ja191c2VyX2xvY2spOwotCWlmIChsb2NrZWQgKyB1c2VyLT5sb2NrZWRfc2htID4gbG9ja19saW1pdCAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKQorCWlmICghYWxsb3dlZCAmJgorCSAgICBsb2NrZWQgKyB1c2VyLT5sb2NrZWRfc2htID4gbG9ja19saW1pdCAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKQogCQlnb3RvIG91dDsKIAlnZXRfdWlkKHVzZXIpOwogCXVzZXItPmxvY2tlZF9zaG0gKz0gbG9ja2VkOwpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDlmNzBjOGUuLjE0NGI0YTIgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTg5NCwxNCArODk0LDExIEBACiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGN1cnJlbnQtPm1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgKiBwcmV2OwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJdW5zaWduZWQgaW50IHZtX2ZsYWdzOwotCWludCBjb3JyZWN0X3djb3VudCA9IDA7CiAJaW50IGVycm9yOwotCXN0cnVjdCByYl9ub2RlICoqIHJiX2xpbmssICogcmJfcGFyZW50OwogCWludCBhY2NvdW50YWJsZSA9IDE7Ci0JdW5zaWduZWQgbG9uZyBjaGFyZ2VkID0gMCwgcmVxcHJvdCA9IHByb3Q7CisJdW5zaWduZWQgbG9uZyByZXFwcm90ID0gcHJvdDsKIAogCS8qCiAJICogRG9lcyB0aGUgYXBwbGljYXRpb24gZXhwZWN0IFBST1RfUkVBRCB0byBpbXBseSBQUk9UX0VYRUM/CkBAIC0xMDI3LDYgKzEwMjQsMjQgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAorCXJldHVybiBtbWFwX3JlZ2lvbihmaWxlLCBhZGRyLCBsZW4sIGZsYWdzLCB2bV9mbGFncywgcGdvZmYsCisJCQkgICBhY2NvdW50YWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRvX21tYXBfcGdvZmYpOworCit1bnNpZ25lZCBsb25nIG1tYXBfcmVnaW9uKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJICB1bnNpZ25lZCBpbnQgdm1fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkgIGludCBhY2NvdW50YWJsZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCAqcHJldjsKKwlpbnQgY29ycmVjdF93Y291bnQgPSAwOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnJiX2xpbmssICpyYl9wYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBjaGFyZ2VkID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gIGZpbGUgPyBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlIDogTlVMTDsKKwogCS8qIENsZWFyIG9sZCBtYXBzICovCiAJZXJyb3IgPSAtRU5PTUVNOwogbXVubWFwX2JhY2s6CkBAIC0xMTc1LDggKzExOTAsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotRVhQT1JUX1NZTUJPTChkb19tbWFwX3Bnb2ZmKTsKLQogLyogR2V0IGFuIGFkZHJlc3MgcmFuZ2Ugd2hpY2ggaXMgY3VycmVudGx5IHVubWFwcGVkLgogICogRm9yIHNobWF0KCkgd2l0aCBhZGRyPTAuCiAgKgpkaWZmIC0tZ2l0IGEvbW0vbm9tbXUuYyBiL21tL25vbW11LmMKaW5kZXggOTg5ZTJlOWEuLjhiYmJmMTQgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMzY3LDYgKzM2NywxMSBAQAogCXJldHVybiBmaW5kX3ZtYShtbSwgYWRkcik7CiB9CiAKK2ludCBleHBhbmRfc3RhY2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogLyoKICAqIGxvb2sgdXAgdGhlIGZpcnN0IFZNQSBleGFjdGx5IHRoYXQgZXhhY3RseSBtYXRjaGVzIGFkZHIKICAqIC0gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG1tLT5tbWFwX3NlbSBhdCBsZWFzdCBoZWxkIHJlYWRsb2NrZWQKZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IGVlYzE0ODEuLjg4NmVhMGQgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtNDc2LDE1ICs0NzYsMTMgQEAKICAqIHN5c2N0bCBoYW5kbGVyIGZvciAvcHJvYy9zeXMvdm0vZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcwogICovCiBpbnQgZGlydHlfd3JpdGViYWNrX2NlbnRpc2Vjc19oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCisJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7CiAJcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKLQlpZiAoZGlydHlfd3JpdGViYWNrX2ludGVydmFsKSB7Ci0JCW1vZF90aW1lcigmd2JfdGltZXIsCi0JCQlqaWZmaWVzICsgZGlydHlfd3JpdGViYWNrX2ludGVydmFsKTsKLQkJfSBlbHNlIHsKKwlpZiAoZGlydHlfd3JpdGViYWNrX2ludGVydmFsKQorCQltb2RfdGltZXIoJndiX3RpbWVyLCBqaWZmaWVzICsgZGlydHlfd3JpdGViYWNrX2ludGVydmFsKTsKKwllbHNlCiAJCWRlbF90aW1lcigmd2JfdGltZXIpOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODI2LDYgKzgyNCw3IEBACiAJCW1hcHBpbmcyID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCQlpZiAobWFwcGluZzIpIHsgLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLwogCQkJQlVHX09OKG1hcHBpbmcyICE9IG1hcHBpbmcpOworCQkJV0FSTl9PTl9PTkNFKCFQYWdlUHJpdmF0ZShwYWdlKSAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKTsKIAkJCWlmIChtYXBwaW5nX2NhcF9hY2NvdW50X2RpcnR5KG1hcHBpbmcpKSB7CiAJCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOwogCQkJCXRhc2tfaW9fYWNjb3VudF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDA1YWNlNDQuLmUyYTEwYjkgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTgwLDggKzgwLDkgQEAKIAkgMjU2LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkgMzIKKwkgMzIsCiAjZW5kaWYKKwkgMzIsCiB9OwogCiBFWFBPUlRfU1lNQk9MKHRvdGFscmFtX3BhZ2VzKTsKQEAgLTk1LDggKzk2LDkgQEAKICNlbmRpZgogCSAiTm9ybWFsIiwKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCSAiSGlnaE1lbSIKKwkgIkhpZ2hNZW0iLAogI2VuZGlmCisJICJNb3ZhYmxlIiwKIH07CiAKIGludCBtaW5fZnJlZV9rYnl0ZXMgPSAxMDI0OwpAQCAtMTI2LDE0ICsxMjgsMjEgQEAKICAgICAjZW5kaWYKICAgI2VuZGlmCiAKLSAgc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiBfX21lbWluaXRkYXRhIGVhcmx5X25vZGVfbWFwW01BWF9BQ1RJVkVfUkVHSU9OU107Ci0gIGludCBfX21lbWluaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKLSAgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107Ci0gIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKKyAgc3RhdGljIHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gX19tZW1pbml0ZGF0YSBlYXJseV9ub2RlX21hcFtNQVhfQUNUSVZFX1JFR0lPTlNdOworICBzdGF0aWMgaW50IF9fbWVtaW5pdGRhdGEgbnJfbm9kZW1hcF9lbnRyaWVzOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUKLSAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107Ci0gIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X2VuZF9wZm5bTUFYX05VTU5PREVTXTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIG5vZGVfYm91bmRhcnlfZW5kX3BmbltNQVhfTlVNTk9ERVNdOwogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFICovCisgIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSByZXF1aXJlZF9rZXJuZWxjb3JlOworICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmVxdWlyZWRfbW92YWJsZWNvcmU7CisgIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSB6b25lX21vdmFibGVfcGZuW01BWF9OVU1OT0RFU107CisKKyAgLyogbW92YWJsZV96b25lIGlzIHRoZSAicmVhbCIgem9uZSBwYWdlcyBpbiBaT05FX01PVkFCTEUgYXJlIHRha2VuIGZyb20gKi8KKyAgaW50IG1vdmFibGVfem9uZTsKKyAgRVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpOwogI2VuZGlmIC8qIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCAqLwogCiAjaWYgTUFYX05VTU5PREVTID4gMQpAQCAtOTAwLDExICs5MDksMTMgQEAKIAogCXUzMiBpZ25vcmVfZ2ZwX2hpZ2htZW07CiAJdTMyIGlnbm9yZV9nZnBfd2FpdDsKKwl1MzIgbWluX29yZGVyOwogCiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUwogCiAJc3RydWN0IGRlbnRyeSAqaWdub3JlX2dmcF9oaWdobWVtX2ZpbGU7CiAJc3RydWN0IGRlbnRyeSAqaWdub3JlX2dmcF93YWl0X2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqbWluX29yZGVyX2ZpbGU7CiAKICNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCiAKQEAgLTkxMiw2ICs5MjMsNyBAQAogCS5hdHRyID0gRkFVTFRfQVRUUl9JTklUSUFMSVpFUiwKIAkuaWdub3JlX2dmcF93YWl0ID0gMSwKIAkuaWdub3JlX2dmcF9oaWdobWVtID0gMSwKKwkubWluX29yZGVyID0gMSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX2ZhaWxfcGFnZV9hbGxvYyhjaGFyICpzdHIpCkBAIC05MjIsNiArOTM0LDggQEAKIAogc3RhdGljIGludCBzaG91bGRfZmFpbF9hbGxvY19wYWdlKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiB7CisJaWYgKG9yZGVyIDwgZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcikKKwkJcmV0dXJuIDA7CiAJaWYgKGdmcF9tYXNrICYgX19HRlBfTk9GQUlMKQogCQlyZXR1cm4gMDsKIAlpZiAoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbSAmJiAoZ2ZwX21hc2sgJiBfX0dGUF9ISUdITUVNKSkKQEAgLTk1MywxMiArOTY3LDE3IEBACiAJZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlID0KIAkJZGVidWdmc19jcmVhdGVfYm9vbCgiaWdub3JlLWdmcC1oaWdobWVtIiwgbW9kZSwgZGlyLAogCQkJCSAgICAgICZmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtKTsKKwlmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyX2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1pbi1vcmRlciIsIG1vZGUsIGRpciwKKwkJCQkgICAmZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcik7CiAKIAlpZiAoIWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX3dhaXRfZmlsZSB8fAotCQkJIWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSkgeworICAgICAgICAgICAgIWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSB8fAorICAgICAgICAgICAgIWZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXJfZmlsZSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlkZWJ1Z2ZzX3JlbW92ZShmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF93YWl0X2ZpbGUpOwogCQlkZWJ1Z2ZzX3JlbW92ZShmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUpOworCQlkZWJ1Z2ZzX3JlbW92ZShmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyX2ZpbGUpOwogCQljbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfcGFnZV9hbGxvYy5hdHRyKTsKIAl9CiAKQEAgLTEzMTQsNyArMTMzMyw3IEBACiAJcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYiA9IDA7CiAJcC0+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+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwppbmRleCA2NmJlZjFjLi5jYTYwYTQ1MSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgpAQCAtMjg3LDcgKzI4OCw2IEBACiAKIAlkYWVtb25pemUoImtjbXRwZF9jdHJfJWQiLCBzZXNzaW9uLT5udW0pOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDQ1MGViMDIuLjY0ZDg5Y2EgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KQEAgLTU0Nyw3ICs1NDgsNiBAQAogCiAJZGFlbW9uaXplKCJraGlkcGRfJTA0eCUwNHgiLCB2ZW5kb3IsIHByb2R1Y3QpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZjdHJsX3dhaXQsIGN1cnJlbnQpOwogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZpbnRyX3dhaXQsIGN1cnJlbnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCmluZGV4IDUyZTA0ZGYuLmJiNzIyMDcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgpAQCAtMTk0MCw3ICsxOTQxLDYgQEAKIAogCWRhZW1vbml6ZSgia3JmY29tbWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xMCk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlCVF9EQkcoIiIpOwogCmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggOWEwZjVmMi4uZDc0ZDgyMSAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMjc2LDcgKzI3Niw4IEBACiAJCWVyciA9IHNlY3VyaXR5X2ZpbGVfcmVjZWl2ZShmcFtpXSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKLQkJZXJyID0gZ2V0X3VudXNlZF9mZCgpOworCQllcnIgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKE1TR19DTVNHX0NMT0VYRUMgJiBrbXNnLT5tc2dfZmxhZ3MKKwkJCQkJICA/IE9fQ0xPRVhFQyA6IDApOwogCQlpZiAoZXJyIDwgMCkKIAkJCWJyZWFrOwogCQluZXdfZmQgPSBlcnI7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRwb2xsLmMgYi9uZXQvY29yZS9uZXRwb2xsLmMKaW5kZXggZDEyNjRlOS4uZGUxYjI2YSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0cG9sbC5jCisrKyBiL25ldC9jb3JlL25ldHBvbGwuYwpAQCAtMTI0LDEzICsxMjQsNiBAQAogCWlmICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZucC0+ZGV2LT5zdGF0ZSkgJiYKIAkgICAgbnBpbmZvLT5wb2xsX293bmVyICE9IHNtcF9wcm9jZXNzb3JfaWQoKSAmJgogCSAgICBzcGluX3RyeWxvY2soJm5waW5mby0+cG9sbF9sb2NrKSkgewotCQkvKiBXaGVuIGNhbGxpbmcgZGV2LT5wb2xsIGZyb20gcG9sbF9uYXBpLCB3ZSBtYXkgZW5kIHVwIGluCi0JCSAqIG5ldGlmX3J4X2NvbXBsZXRlLiBIb3dldmVyLCBvbmx5IHRoZSBDUFUgdG8gd2hpY2ggdGhlCi0JCSAqIGRldmljZSB3YXMgcXVldWVkIGlzIGFsbG93ZWQgdG8gcmVtb3ZlIGl0IGZyb20gcG9sbF9saXN0LgotCQkgKiBTZXR0aW5nIFBPTExfTElTVF9GUk9aRU4gdGVsbHMgbmV0aWZfcnhfY29tcGxldGUKLQkJICogdG8gbGVhdmUgdGhlIE5BUEkgc3RhdGUgYWxvbmUuCi0JCSAqLwotCQlzZXRfYml0KF9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLCAmbnAtPmRldi0+c3RhdGUpOwogCQlucGluZm8tPnJ4X2ZsYWdzIHw9IE5FVFBPTExfUlhfRFJPUDsKIAkJYXRvbWljX2luYygmdHJhcHBlZCk7CiAKQEAgLTEzOCw3ICsxMzEsNiBAQAogCiAJCWF0b21pY19kZWMoJnRyYXBwZWQpOwogCQlucGluZm8tPnJ4X2ZsYWdzICY9IH5ORVRQT0xMX1JYX0RST1A7Ci0JCWNsZWFyX2JpdChfX0xJTktfU1RBVEVfUE9MTF9MSVNUX0ZST1pFTiwgJm5wLT5kZXYtPnN0YXRlKTsKIAkJc3Bpbl91bmxvY2soJm5waW5mby0+cG9sbF9sb2NrKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IDc1MjE1MzMuLmJjYTc4N2YgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0zNDY1LDYgKzM0NjUsOCBAQAogCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAorCXNldF9mcmVlemFibGUoKTsKKwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXBrdF9kZXYgPSBuZXh0X3RvX3J1bih0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2NtLmMgYi9uZXQvY29yZS9zY20uYwppbmRleCAyOTJhZDhkLi40NGM0ZWMyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zY20uYworKysgYi9uZXQvY29yZS9zY20uYwpAQCAtMjI4LDcgKzIyOCw4IEBACiAJCWVyciA9IHNlY3VyaXR5X2ZpbGVfcmVjZWl2ZShmcFtpXSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKLQkJZXJyID0gZ2V0X3VudXNlZF9mZCgpOworCQllcnIgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKE1TR19DTVNHX0NMT0VYRUMgJiBtc2ctPm1zZ19mbGFncworCQkJCQkgID8gT19DTE9FWEVDIDogMCk7CiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAJCW5ld19mZCA9IGVycjsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCmluZGV4IGNjODExMGIuLmFmYjZjNjYgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYwpAQCAtMjcxLDggKzI3MSwxMSBAQAogCQkJICovCiAJCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkFzc29jaWF0ZTogU2Nhbm5pbmcgZm9yIG5ldHdvcmtzIGZpcnN0LlxuIik7CiAJCQlpZWVlODAyMTFzb2Z0bWFjX25vdGlmeShtYWMtPmRldiwgSUVFRTgwMjExU09GVE1BQ19FVkVOVF9TQ0FOX0ZJTklTSEVELCBpZWVlODAyMTFzb2Z0bWFjX2Fzc29jX25vdGlmeV9zY2FuLCBOVUxMKTsKLQkJCWlmIChpZWVlODAyMTFzb2Z0bWFjX3N0YXJ0X3NjYW4obWFjKSkKKwkJCWlmIChpZWVlODAyMTFzb2Z0bWFjX3N0YXJ0X3NjYW4obWFjKSkgewogCQkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQXNzb2NpYXRlOiBmYWlsZWQgdG8gaW5pdGlhdGUgc2Nhbi4gSXMgZGV2aWNlIHVwP1xuIik7CisJCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOworCQkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOworCQkJfQogCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDA7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwppbmRleCA0MmYxMmJkLi44OWRjYzQ4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKQEAgLTQ2LDEwICs0Niw2IEBACiAjaW5jbHVkZSAibmV0bGFiZWxfY2lwc29fdjQuaCIKICNpbmNsdWRlICJuZXRsYWJlbF91c2VyLmgiCiAKLS8qIGRvIG5vdCBkbyBhbnkgYXVkaXRpbmcgaWYgYXVkaXRfZW5hYmxlZCA9PSAwLCBzZWUga2VybmVsL2F1ZGl0LmMgZm9yCi0gKiBkZXRhaWxzICovCi1leHRlcm4gaW50IGF1ZGl0X2VuYWJsZWQ7Ci0KIC8qCiAgKiBOZXRMYWJlbCBORVRMSU5LIFNldHVwIEZ1bmN0aW9ucwogICovCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggZjQ1MzAxOS4uYjcxMTE0MiAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtMTkzOSw5ICsxOTM5LDcgQEAKIAl0b3RhbF9sZW4gPSBlcnI7CiAKIAljbXNnX3B0ciA9ICh1bnNpZ25lZCBsb25nKW1zZ19zeXMubXNnX2NvbnRyb2w7Ci0JbXNnX3N5cy5tc2dfZmxhZ3MgPSAwOwotCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKLQkJbXNnX3N5cy5tc2dfZmxhZ3MgPSBNU0dfQ01TR19DT01QQVQ7CisJbXNnX3N5cy5tc2dfZmxhZ3MgPSBmbGFncyAmIChNU0dfQ01TR19DTE9FWEVDfE1TR19DTVNHX0NPTVBBVCk7CiAKIAlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCiAJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aC5jIGIvbmV0L3N1bnJwYy9hdXRoLmMKaW5kZXggYWE1NWQwYS4uMjlhOGVjYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoLmMKQEAgLTU0MywxNyArNTQzLDE4IEBACiAJCXRlc3RfYml0KFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwgJmNyZWQtPmNyX2ZsYWdzKSAhPSAwOwogfQogCi0KLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnJwY19jcmVkX3Nocmlua2VyOworc3RhdGljIHN0cnVjdCBzaHJpbmtlciBycGNfY3JlZF9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gcnBjYXV0aF9jYWNoZV9zaHJpbmtlciwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKIAogdm9pZCBfX2luaXQgcnBjYXV0aF9pbml0X21vZHVsZSh2b2lkKQogewogCXJwY19pbml0X2F1dGh1bml4KCk7Ci0JcnBjX2NyZWRfc2hyaW5rZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgcnBjYXV0aF9jYWNoZV9zaHJpbmtlcik7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJnJwY19jcmVkX3Nocmlua2VyKTsKIH0KIAogdm9pZCBfX2V4aXQgcnBjYXV0aF9yZW1vdmVfbW9kdWxlKHZvaWQpCiB7Ci0JaWYgKHJwY19jcmVkX3Nocmlua2VyICE9IE5VTEwpCi0JCXJlbW92ZV9zaHJpbmtlcihycGNfY3JlZF9zaHJpbmtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmcnBjX2NyZWRfc2hyaW5rZXIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCmluZGV4IGJhZjQwOTZkLi5hYmZkYTMzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hdXRoLmg+CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IDcxYjlkYWUuLjk4NDNlYWMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC0yMzEsNiArMjMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZ3NzX2FwaV9tZWNoIGdzc19rZXJiZXJvc19tZWNoID0gewogCS5nbV9uYW1lCT0gImtyYjUiLAogCS5nbV9vd25lcgk9IFRISVNfTU9EVUxFLAorCS5nbV9vaWQJCT0gezksICh2b2lkICopIlx4MmFceDg2XHg0OFx4ODZceGY3XHgxMlx4MDFceDAyXHgwMiJ9LAogCS5nbV9vcHMJCT0gJmdzc19rZXJiZXJvc19vcHMsCiAJLmdtX3BmX251bQk9IEFSUkFZX1NJWkUoZ3NzX2tlcmJlcm9zX3BmcyksCiAJLmdtX3BmcwkJPSBnc3Nfa2VyYmVyb3NfcGZzLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKaW5kZXggMjY4NzI1MS4uNjE4MDFhMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCkBAIC0xOTQsNiArMTk0LDIwIEBACiBFWFBPUlRfU1lNQk9MKGdzc19tZWNoX2dldF9ieV9wc2V1ZG9mbGF2b3IpOwogCiB1MzIKK2dzc19zdmNfdG9fcHNldWRvZmxhdm9yKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgc2VydmljZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnbS0+Z21fcGZfbnVtOyBpKyspIHsKKwkJaWYgKGdtLT5nbV9wZnNbaV0uc2VydmljZSA9PSBzZXJ2aWNlKSB7CisJCQlyZXR1cm4gZ20tPmdtX3Bmc1tpXS5wc2V1ZG9mbGF2b3I7CisJCX0KKwl9CisJcmV0dXJuIFJQQ19BVVRIX01BWEZMQVZPUjsgLyogaWxsZWdhbCB2YWx1ZSAqLworfQorRVhQT1JUX1NZTUJPTChnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcik7CisKK3UzMgogZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgcHNldWRvZmxhdm9yKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCmluZGV4IDU3N2Q1OTAuLjVkZWI0YjYgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKQEAgLTIxNyw2ICsyMTcsNyBAQAogc3RhdGljIHN0cnVjdCBnc3NfYXBpX21lY2ggZ3NzX3Nwa20zX21lY2ggPSB7CiAJLmdtX25hbWUJPSAic3BrbTMiLAogCS5nbV9vd25lcgk9IFRISVNfTU9EVUxFLAorCS5nbV9vaWQJCT0gezcsICJcMDUzXDAwNlwwMDFcMDA1XDAwNVwwMDFcMDAzIn0sCiAJLmdtX29wcwkJPSAmZ3NzX3Nwa20zX29wcywKIAkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfc3BrbTNfcGZzKSwKIAkuZ21fcGZzCQk9IGdzc19zcGttM19wZnMsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKaW5kZXggYzA5NDU4My4uNDkwNjk3NSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwpAQCAtNzQzLDYgKzc0MywxNSBAQAogCiBzdGF0aWMgc3RydWN0IGF1dGhfb3BzIHN2Y2F1dGhvcHNfZ3NzOwogCit1MzIgc3ZjYXV0aF9nc3NfZmxhdm9yKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKQoreworCXN0cnVjdCBnc3NfZG9tYWluICpnZCA9IGNvbnRhaW5lcl9vZihkb20sIHN0cnVjdCBnc3NfZG9tYWluLCBoKTsKKworCXJldHVybiBnZC0+cHNldWRvZmxhdm9yOworfQorCitFWFBPUlRfU1lNQk9MKHN2Y2F1dGhfZ3NzX2ZsYXZvcik7CisKIGludAogc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IsIGNoYXIgKiBuYW1lKQogewpAQCAtOTEzLDEwICs5MjIsMjMgQEAKIAlzdHJ1Y3QgZ3NzX3N2Y19kYXRhICpzdmNkYXRhID0gcnFzdHAtPnJxX2F1dGhfZGF0YTsKIAlzdHJ1Y3QgcnNjICpyc2NpID0gc3ZjZGF0YS0+cnNjaTsKIAlzdHJ1Y3QgcnBjX2dzc193aXJlX2NyZWQgKmdjID0gJnN2Y2RhdGEtPmNsY3JlZDsKKwlpbnQgc3RhdDsKIAotCXJxc3RwLT5ycV9jbGllbnQgPSBmaW5kX2dzc19hdXRoX2RvbWFpbihyc2NpLT5tZWNoY3R4LCBnYy0+Z2Nfc3ZjKTsKLQlpZiAocnFzdHAtPnJxX2NsaWVudCA9PSBOVUxMKQorCS8qCisJICogQSBnc3MgZXhwb3J0IGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGJ5OgorCSAqIAlleHBvcnQJKihzZWM9a3JiNSxydykKKwkgKiBvciBieQorCSAqIAlleHBvcnQgZ3NzL2tyYjUocncpCisJICogVGhlIGxhdHRlciBpcyBkZXByZWNhdGVkOyBidXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMKKwkgKiB0aGUgbmZzZCBjb2RlIHdpbGwgc3RpbGwgZmFsbCBiYWNrIG9uIHRyeWluZyBpdCBpZiB0aGUgZm9ybWVyCisJICogZG9lc24ndCB3b3JrOyBzbyB3ZSB0cnkgdG8gbWFrZSBib3RoIGF2YWlsYWJsZSB0byBuZnNkLCBiZWxvdy4KKwkgKi8KKwlycXN0cC0+cnFfZ3NzY2xpZW50ID0gZmluZF9nc3NfYXV0aF9kb21haW4ocnNjaS0+bWVjaGN0eCwgZ2MtPmdjX3N2Yyk7CisJaWYgKHJxc3RwLT5ycV9nc3NjbGllbnQgPT0gTlVMTCkKIAkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJc3RhdCA9IHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KHJxc3RwKTsKKwlpZiAoc3RhdCA9PSBTVkNfRFJPUCkKKwkJcmV0dXJuIHN0YXQ7CiAJcmV0dXJuIFNWQ19PSzsKIH0KIApAQCAtMTA4OCw3ICsxMTEwLDYgQEAKIAkJCXN2Y19wdXRubChyZXN2LCBHU1NfU0VRX1dJTik7CiAJCQlpZiAoc3ZjX3NhZmVfcHV0bmV0b2JqKHJlc3YsICZyc2lwLT5vdXRfdG9rZW4pKQogCQkJCWdvdG8gZHJvcDsKLQkJCXJxc3RwLT5ycV9jbGllbnQgPSBOVUxMOwogCQl9CiAJCWdvdG8gY29tcGxldGU7CiAJY2FzZSBSUENfR1NTX1BST0NfREVTVFJPWToKQEAgLTExMzEsNiArMTE1Miw4IEBACiAJCX0KIAkJc3ZjZGF0YS0+cnNjaSA9IHJzY2k7CiAJCWNhY2hlX2dldCgmcnNjaS0+aCk7CisJCXJxc3RwLT5ycV9mbGF2b3IgPSBnc3Nfc3ZjX3RvX3BzZXVkb2ZsYXZvcigKKwkJCQkJcnNjaS0+bWVjaGN0eC0+bWVjaF90eXBlLCBnYy0+Z2Nfc3ZjKTsKIAkJcmV0ID0gU1ZDX09LOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMzE3LDYgKzEzNDAsOSBAQAogCWlmIChycXN0cC0+cnFfY2xpZW50KQogCQlhdXRoX2RvbWFpbl9wdXQocnFzdHAtPnJxX2NsaWVudCk7CiAJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJaWYgKHJxc3RwLT5ycV9nc3NjbGllbnQpCisJCWF1dGhfZG9tYWluX3B1dChycXN0cC0+cnFfZ3NzY2xpZW50KTsKKwlycXN0cC0+cnFfZ3NzY2xpZW50ID0gTlVMTDsKIAlpZiAocnFzdHAtPnJxX2NyZWQuY3JfZ3JvdXBfaW5mbykKIAkJcHV0X2dyb3VwX2luZm8ocnFzdHAtPnJxX2NyZWQuY3JfZ3JvdXBfaW5mbyk7CiAJcnFzdHAtPnJxX2NyZWQuY3JfZ3JvdXBfaW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwppbmRleCAwN2RjZDIwLi40MTE0Nzk0MSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KQEAgLTYzNyw3ICs2MzgsNyBAQAogCX0KIH0KIAotc3RhdGljIGludAoraW50CiBzdmNhdXRoX3VuaXhfc2V0X2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewogCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gc3ZjX2FkZHJfaW4ocnFzdHApOwpAQCAtNjcyLDYgKzY3Myw4IEBACiAJcmV0dXJuIFNWQ19PSzsKIH0KIAorRVhQT1JUX1NZTUJPTChzdmNhdXRoX3VuaXhfc2V0X2NsaWVudCk7CisKIHN0YXRpYyBpbnQKIHN2Y2F1dGhfbnVsbF9hY2NlcHQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICphdXRocCkKIHsKQEAgLTcwNyw2ICs3MTAsNyBAQAogCXN2Y19wdXRubChyZXN2LCBSUENfQVVUSF9OVUxMKTsKIAlzdmNfcHV0bmwocmVzdiwgMCk7CiAKKwlycXN0cC0+cnFfZmxhdm9yID0gUlBDX0FVVEhfTlVMTDsKIAlyZXR1cm4gU1ZDX09LOwogfQogCkBAIC03ODQsNiArNzg4LDcgQEAKIAlzdmNfcHV0bmwocmVzdiwgUlBDX0FVVEhfTlVMTCk7CiAJc3ZjX3B1dG5sKHJlc3YsIDApOwogCisJcnFzdHAtPnJxX2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7CiAJcmV0dXJuIFNWQ19PSzsKIAogYmFkY3JlZDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCAyNzdjMzI2Li4yNWUyMGEyIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC05LDcgKzksNyBAQAogbXkgJFAgPSAkMDsKICRQID1+IHNALiovQEBnOwogCi1teSAkViA9ICcwLjA2JzsKK215ICRWID0gJzAuMDcnOwogCiB1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgbm9fYXV0b19hYmJyZXYpOwogCkBAIC0yNDYsNiArMjQ2LDE5IEBACiAJcmV0dXJuICR2ZXQ7CiB9CiAKK3N1YiBFUlJPUiB7CisJcHJpbnQgIkVSUk9SOiAkX1swXVxuIjsKKwlvdXIgJGNsZWFuID0gMDsKK30KK3N1YiBXQVJOIHsKKwlwcmludCAiV0FSTklORzogJF9bMF1cbiI7CisJb3VyICRjbGVhbiA9IDA7Cit9CitzdWIgQ0hLIHsKKwlwcmludCAiQ0hFQ0s6ICRfWzBdXG4iOworCW91ciAkY2xlYW4gPSAwOworfQorCiBzdWIgcHJvY2VzcyB7CiAJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CiAJbXkgQGxpbmVzID0gQF87CkBAIC0yNTksNyArMjcyLDcgQEAKIAlteSAkcHJldmluZGVudD0wOwogCW15ICRzdGFzaGluZGVudD0wOwogCi0JbXkgJGNsZWFuID0gMTsKKwlvdXIgJGNsZWFuID0gMTsKIAlteSAkc2lnbm9mZiA9IDA7CiAJbXkgJGlzX3BhdGNoID0gMDsKIApAQCAtMjkwLDggKzMwMywxMSBAQAogCQkJCQlsb25nXHMraW50fAogCQkJCQlsb25nXHMrbG9uZ3wKIAkJCQkJbG9uZ1xzK2xvbmdccytpbnR8CisJCQkJCXU4fHUxNnx1MzJ8dTY0fAorCQkJCQlzOHxzMTZ8czMyfHM2NHwKIAkJCQkJc3RydWN0XHMrJElkZW50fAogCQkJCQl1bmlvblxzKyRJZGVudHwKKwkJCQkJZW51bVxzKyRJZGVudHwKIAkJCQkJJHtJZGVudH1fdAogCQkJCSkKIAkJCQkoPzpccyskU3BhcnNlKSoKQEAgLTMwNCw2ICszMjAsMjMgQEAKIAlteSAkRGVjbGFyZQk9IHFyeyg/OiRTdG9yYWdlXHMrKT8kVHlwZX07CiAJbXkgJEF0dHJpYnV0ZQk9IHFye19fcmVhZF9tb3N0bHl8X19pbml0fF9faW5pdGRhdGF9OwogCisJIyBQcmUtc2NhbiB0aGUgcGF0Y2ggbG9va2luZyBmb3IgYW55IF9fc2V0dXAgZG9jdW1lbnRhdGlvbi4KKwlteSBAc2V0dXBfZG9jcyA9ICgpOworCW15ICRzZXR1cF9kb2NzID0gMDsKKwlmb3JlYWNoIG15ICRsaW5lIChAbGluZXMpIHsKKwkJaWYgKCRsaW5lPX4vXlwrXCtcK1xzKyhcUyspLykgeworCQkJJHNldHVwX2RvY3MgPSAwOworCQkJaWYgKCQxID1+IG1ARG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQkQCkgeworCQkJCSRzZXR1cF9kb2NzID0gMTsKKwkJCX0KKwkJCW5leHQ7CisJCX0KKworCQlpZiAoJHNldHVwX2RvY3MgJiYgJGxpbmUgPX4gL15cKy8pIHsKKwkJCXB1c2goQHNldHVwX2RvY3MsICRsaW5lKTsKKwkJfQorCX0KKwogCWZvcmVhY2ggbXkgJGxpbmUgKEBsaW5lcykgewogCQkkbGluZW5yKys7CiAKQEAgLTM2OSwzMCArNDAyLDQyIEBACiAJCSRoZXJlIC49ICJGSUxFOiAkcmVhbGZpbGU6JHJlYWxsaW5lOiIgaWYgKCRyZWFsY250ICE9IDApOwogCiAJCW15ICRoZXJlbGluZSA9ICIkaGVyZVxuJGxpbmVcbiI7Ci0JCW15ICRoZXJlY3VyciA9ICIkaGVyZVxuJGxpbmVcblxuIjsKLQkJbXkgJGhlcmVwcmV2ID0gIiRoZXJlXG4kcHJldmxpbmVcbiRsaW5lXG5cbiI7CisJCW15ICRoZXJlY3VyciA9ICIkaGVyZVxuJGxpbmVcbiI7CisJCW15ICRoZXJlcHJldiA9ICIkaGVyZVxuJHByZXZsaW5lXG4kbGluZVxuIjsKIAogI2NoZWNrIHRoZSBwYXRjaCBmb3IgYSBzaWdub2ZmOgogCQlpZiAoJGxpbmUgPX4gL15ccypzaWduZWQtb2ZmLWJ5Oi9pKSB7CiAJCQkjIFRoaXMgaXMgYSBzaWdub2ZmLCBpZiB1Z2x5LCBzbyBkbyBub3QgZG91YmxlIHJlcG9ydC4KIAkJCSRzaWdub2ZmKys7CiAJCQlpZiAoISgkbGluZSA9fiAvXlxzKlNpZ25lZC1vZmYtYnk6LykpIHsKLQkJCQlwcmludCAiU2lnbmVkLW9mZi1ieTogaXMgdGhlIHByZWZlcnJlZCBmb3JtXG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJV0FSTigiU2lnbmVkLW9mZi1ieTogaXMgdGhlIHByZWZlcnJlZCBmb3JtXG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJCWlmICgkbGluZSA9fiAvXlxzKnNpZ25lZC1vZmYtYnk6XFMvaSkgewotCQkJCXByaW50ICJuZWVkIHNwYWNlIGFmdGVyIFNpZ25lZC1vZmYtYnk6XG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJV0FSTigibmVlZCBzcGFjZSBhZnRlciBTaWduZWQtb2ZmLWJ5OlxuIiAuCisJCQkJCSRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBDaGVjayBmb3Igd3JhcHBhZ2Ugd2l0aGluIGEgdmFsaWQgaHVuayBvZiB0aGUgZmlsZQogCQlpZiAoJHJlYWxjbnQgIT0gMCAmJiAkbGluZSAhfiBte14oPzpcK3wtfCB8JCl9KSB7Ci0JCQlwcmludCAicGF0Y2ggc2VlbXMgdG8gYmUgY29ycnVwdCAobGluZSB3cmFwcGVkPykgWyRyZWFsY250XVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJwYXRjaCBzZWVtcyB0byBiZSBjb3JydXB0IChsaW5lIHdyYXBwZWQ/KVxuIiAuCisJCQkJJGhlcmVjdXJyKTsKKwkJfQorCisjIFVURi04IHJlZ2V4IGZvdW5kIGF0IGh0dHA6Ly93d3cudzMub3JnL0ludGVybmF0aW9uYWwvcXVlc3Rpb25zL3FhLWZvcm1zLXV0Zi04LmVuLnBocAorCQlpZiAoKCRyZWFsZmlsZSA9fiAvXiQvIHx8ICRsaW5lID1+IC9eXCsvKSAmJgorCQkgICAgICEoJGxpbmUgPX4gbS9eKAorCQkJCVtceDA5XHgwQVx4MERceDIwLVx4N0VdICAgICAgICAgICAgICAjIEFTQ0lJCisJCQkJfCBbXHhDMi1ceERGXVtceDgwLVx4QkZdICAgICAgICAgICAgICMgbm9uLW92ZXJsb25nIDItYnl0ZQorCQkJCXwgIFx4RTBbXHhBMC1ceEJGXVtceDgwLVx4QkZdICAgICAgICAjIGV4Y2x1ZGluZyBvdmVybG9uZ3MKKwkJCQl8IFtceEUxLVx4RUNceEVFXHhFRl1bXHg4MC1ceEJGXXsyfSAgIyBzdHJhaWdodCAzLWJ5dGUKKwkJCQl8ICBceEVEW1x4ODAtXHg5Rl1bXHg4MC1ceEJGXSAgICAgICAgIyBleGNsdWRpbmcgc3Vycm9nYXRlcworCQkJCXwgIFx4RjBbXHg5MC1ceEJGXVtceDgwLVx4QkZdezJ9ICAgICAjIHBsYW5lcyAxLTMKKwkJCQl8IFtceEYxLVx4RjNdW1x4ODAtXHhCRl17M30gICAgICAgICAgIyBwbGFuZXMgNC0xNQorCQkJCXwgIFx4RjRbXHg4MC1ceDhGXVtceDgwLVx4QkZdezJ9ICAgICAjIHBsYW5lIDE2CisJCQkJKSokL3ggKSkgeworCQkJRVJST1IoIkludmFsaWQgVVRGLThcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICNpZ25vcmUgbGluZXMgYmVpbmcgcmVtb3ZlZApAQCAtNDAzLDE2ICs0NDgsMTIgQEAKIAogI3RyYWlsaW5nIHdoaXRlc3BhY2UKIAkJaWYgKCRsaW5lID1+IC9eXCsuKlxTXHMrJC8gfHwgJGxpbmUgPX4gL15cK1xzKyQvKSB7Ci0JCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuXG4iOwotCQkJcHJpbnQgInRyYWlsaW5nIHdoaXRlc3BhY2VcbiI7Ci0JCQlwcmludCAiJGhlcmV2ZXQiOwotCQkJJGNsZWFuID0gMDsKKwkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG4iOworCQkJRVJST1IoInRyYWlsaW5nIHdoaXRlc3BhY2VcbiIgLiAkaGVyZXZldCk7CiAJCX0KICM4MCBjb2x1bW4gbGltaXQKIAkJaWYgKCRsaW5lID1+IC9eXCsvICYmICEoJHByZXZsaW5lPX4vXC9cKlwqLykgJiYgJGxlbmd0aCA+IDgwKSB7Ci0JCQlwcmludCAibGluZSBvdmVyIDgwIGNoYXJhY3RlcnNcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJsaW5lIG92ZXIgODAgY2hhcmFjdGVyc1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayB3ZSBhcmUgaW4gYSB2YWxpZCBzb3VyY2UgZmlsZSAqLltoY10gaWYgbm90IHRoZW4gaWdub3JlIHRoaXMgaHVuawpAQCAtNDIxLDEwICs0NjIsOCBAQAogIyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBhbnkgdGFicyBtdXN0IGNvbWUgZmlyc3QgYW5kIGFueXRoaW5nCiAjIG1vcmUgdGhhbiA4IG11c3QgdXNlIHRhYnMuCiAJCWlmICgkbGluZT1+L15cK1xzKiBcdFxzKlxTLyBvciAkbGluZT1+L15cK1xzKiAgICAgICAgXHMqLykgewotCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcblxuIjsKLQkJCXByaW50ICJ1c2UgdGFicyBub3Qgc3BhY2VzXG4iOwotCQkJcHJpbnQgIiRoZXJldmV0IjsKLQkJCSRjbGVhbiA9IDA7CisJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuIjsKKwkJCUVSUk9SKCJ1c2UgdGFicyBub3Qgc3BhY2VzXG4iIC4gJGhlcmV2ZXQpOwogCQl9CiAKIAkJIwpAQCAtNDYzLDkgKzUwMiwyNyBAQAogCQkJCX0KIAkJCX0KIAkJCWlmICgkZXJyIG5lICcnKSB7Ci0JCQkJcHJpbnQgInN3aXRjaCBhbmQgY2FzZSBzaG91bGQgYmUgYXQgdGhlIHNhbWUgaW5kZW50XG4iOwotCQkJCXByaW50ICIkaGVyZVxuJGxpbmVcbiRlcnJcbiI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlFUlJPUigic3dpdGNoIGFuZCBjYXNlIHNob3VsZCBiZSBhdCB0aGUgc2FtZSBpbmRlbnRcbiRoZXJlbGluZVxuJGVyclxuIik7CisJCQl9CisJCX0KKworIyBpZi93aGlsZS9ldGMgYnJhY2UgZG8gbm90IGdvIG9uIG5leHQgbGluZSwgdW5sZXNzIGRlZmluaW5nIGEgZG8gd2hpbGUgbG9vcCwKKyMgb3IgaWYgdGhhdCBicmFjZSBvbiB0aGUgbmV4dCBsaW5lIGlzIGZvciBzb21ldGhpbmcgZWxzZQorCQlpZiAoJGxpbmUgPX4gL1xiKD86KGlmfHdoaWxlfGZvcnxzd2l0Y2gpXHMqXCh8ZG9cYnxlbHNlXGIpLyAmJiAkbGluZSAhfiAvXi4jLykgeworCQkJbXkgQGN0eCA9IGN0eF9zdGF0ZW1lbnQoJGxpbmVuciwgJHJlYWxjbnQpOworCQkJbXkgJGN0eF9sbiA9ICRsaW5lbnIgKyAkI2N0eCArIDE7CisJCQlteSAkY3R4X2NudCA9ICRyZWFsY250IC0gJCNjdHggLSAxOworCQkJbXkgJGN0eCA9IGpvaW4oIlxuIiwgQGN0eCk7CisKKwkJCXdoaWxlICgkY3R4X2NudCA+IDAgJiYgJGxpbmVzWyRjdHhfbG4gLSAxXSA9fiAvXi0vKSB7CisJCQkJJGN0eF9sbisrOworCQkJCSRjdHhfY250LS07CisJCQl9CisJCQkjI3dhcm4gImxpbmU8JGxpbmU+XG5jdHg8JGN0eD5cbm5leHQ8JGxpbmVzWyRjdHhfbG4gLSAxXT4iOworCisJCQlpZiAoJGN0eCAhfiAve1xzKi8gJiYgJGN0eF9jbnQgPiAwICYmICRsaW5lc1skY3R4X2xuIC0gMV0gPX4gL15cK1xzKnsvKSB7CisJCQkJRVJST1IoIlRoYXQgeyBzaG91bGQgYmUgb24gdGhlIHByZXZpb3VzIGxpbmVcbiIgLgorCQkJCQkiJGhlcmVcbiRjdHhcbiRsaW5lc1skY3R4X2xuIC0gMV0iKTsKIAkJCX0KIAkJfQogCkBAIC00NzQsOSArNTMxLDcgQEAKIAogIyBURVNUOiBhbGxvdyBkaXJlY3QgdGVzdGluZyBvZiB0aGUgdHlwZSBtYXRjaGVyLgogCQlpZiAoJHRzdF90eXBlICYmICRsaW5lID1+IC9eLiREZWNsYXJlJC8pIHsKLQkJCXByaW50ICJURVNUOiBpcyB0eXBlICREZWNsYXJlXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIlRFU1Q6IGlzIHR5cGUgJERlY2xhcmVcbiIgLiAkaGVyZWN1cnIpOwogCQkJbmV4dDsKIAkJfQogCkBAIC00ODgsOSArNTQzLDggQEAKIAkJaWYgKCRyYXdsaW5lID1+IG17Xi4jXHMqaW5jbHVkZVxzK1s8Il0oLiopWyI+XX0pIHsKIAkJCW15ICRwYXRoID0gJDE7CiAJCQlpZiAoJHBhdGggPX4gbXsvL30pIHsKLQkJCQlwcmludCAibWFsZm9ybWVkICNpbmNsdWRlIGZpbGVuYW1lXG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJRVJST1IoIm1hbGZvcm1lZCAjaW5jbHVkZSBmaWxlbmFtZVxuIiAuCisJCQkJCSRoZXJlY3Vycik7CiAJCQl9CiAJCQkjIFNhbml0aXNlIHRoaXMgc3BlY2lhbCBmb3JtIG9mIHN0cmluZy4KIAkJCSRwYXRoID0gJ1gnIHggbGVuZ3RoKCRwYXRoKTsKQEAgLTQ5OSw5ICs1NTMsNyBAQAogCiAjIG5vIEM5OSAvLyBjb21tZW50cwogCQlpZiAoJGxpbmUgPX4gbXsvL30pIHsKLQkJCXByaW50ICJkbyBub3QgdXNlIEM5OSAvLyBjb21tZW50c1xuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJkbyBub3QgdXNlIEM5OSAvLyBjb21tZW50c1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAkJIyBSZW1vdmUgQzk5IGNvbW1lbnRzLgogCQkkbGluZSA9fiBzQC8vLipAQDsKQEAgLTUxNCw0OSArNTY2LDQwIEBACiAJCQkgICAoJHByZXZsaW5lICF+IC9eXCt9LykgJiYKIAkJCSAgICgkcHJldmxpbmUgIX4gL14gfS8pICYmCiAJCQkgICAoJHByZXZsaW5lICF+IC9ccyRuYW1lKD86XHMrJEF0dHJpYnV0ZSk/XHMqKD86O3w9KS8pKSB7Ci0JCQkJcHJpbnQgIkVYUE9SVF9TWU1CT0woZm9vKTsgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyBpdHMgZnVuY3Rpb24vdmFyaWFibGVcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlXQVJOKCJFWFBPUlRfU1lNQk9MKGZvbyk7IHNob3VsZCBpbW1lZGlhdGVseSBmb2xsb3cgaXRzIGZ1bmN0aW9uL3ZhcmlhYmxlXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIGNoZWNrIGZvciBzdGF0aWMgaW5pdGlhbGlzZXJzLgogCQlpZiAoJGxpbmU9fi9ccypzdGF0aWNccy4qPVxzKygwfE5VTEwpOy8pIHsKLQkJCXByaW50ICJkbyBub3QgaW5pdGlhbGlzZSBzdGF0aWNzIHRvIDAgb3IgTlVMTFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJkbyBub3QgaW5pdGlhbGlzZSBzdGF0aWNzIHRvIDAgb3IgTlVMTFxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIGZvciBuZXcgdHlwZWRlZnMsIG9ubHkgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgc3BhcnNlIGFubm90YXRpb25zCiAjIG1ha2Ugc2Vuc2UuCiAJCWlmICgkbGluZSA9fiAvXGJ0eXBlZGVmXHMvICYmCi0JCSAgICAkbGluZSAhfiAvXGJ0eXBlZGVmXHMrJFR5cGVccytcKFxzKiRJZGVudFxzKlwpXHMqXCgvICYmCisJCSAgICAkbGluZSAhfiAvXGJ0eXBlZGVmXHMrJFR5cGVccytcKFxzKlwqJElkZW50XHMqXClccypcKC8gJiYKIAkJICAgICRsaW5lICF+IC9cYl9fYml0d2lzZSg/Ol9ffClcYi8pIHsKLQkJCXByaW50ICJkbyBub3QgYWRkIG5ldyB0eXBlZGVmc1xuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oImRvIG5vdCBhZGQgbmV3IHR5cGVkZWZzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjICogZ29lcyBvbiB2YXJpYWJsZSBub3Qgb24gdHlwZQogCQlpZiAoJGxpbmUgPX4gbXtcKCROb25wdHJUeXBlKFwqKykoPzpccytjb25zdCk/XCl9KSB7Ci0JCQlwcmludCAiXCIoZm9vJDEpXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJcIihmb28kMSlcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCiAJCX0gZWxzaWYgKCRsaW5lID1+IG17XCgkTm9ucHRyVHlwZVxzKyhcKispKD8hXHMrY29uc3QpXHMrXCl9KSB7Ci0JCQlwcmludCAiXCIoZm9vICQxIClcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIlwiKGZvbyAkMSApXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAogCQl9IGVsc2lmICgkbGluZSA9fiBteyROb25wdHJUeXBlKFwqKykoPzpccytjb25zdCk/XHMrW0EtWmEtelxkX10rfSkgewotCQkJcHJpbnQgIlwiZm9vJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiXCJmb28kMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAogCQl9IGVsc2lmICgkbGluZSA9fiBteyROb25wdHJUeXBlXHMrKFwqKykoPyFccytjb25zdClccytbQS1aYS16XGRfXSt9KSB7Ci0JCQlwcmludCAiXCJmb28gJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiXCJmb28gJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAJCX0KIAogIyAjIG5vIEJVRygpIG9yIEJVR19PTigpCkBAIC01ODUsOSArNjI4LDcgQEAKIAkJCQl9CiAJCQl9CiAJCQlpZiAoJG9rID09IDApIHsKLQkJCQlwcmludCAicHJpbnRrKCkgc2hvdWxkIGluY2x1ZGUgS0VSTl8gZmFjaWxpdHkgbGV2ZWxcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlXQVJOKCJwcmludGsoKSBzaG91bGQgaW5jbHVkZSBLRVJOXyBmYWNpbGl0eSBsZXZlbFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIApAQCAtNTk1LDkgKzYzNiw3IEBACiAjIG9yIGlmIGNsb3NlZCBvbiBzYW1lIGxpbmUKIAkJaWYgKCgkbGluZT1+LyRUeXBlXHMqW0EtWmEtelxkX10rXCguKlwpLiogey8pIGFuZAogCQkgICAgISgkbGluZT1+L1wjZGVmaW5lLipkb1xzey8pIGFuZCAhKCRsaW5lPX4vfS8pKSB7Ci0JCQlwcmludCAiYnJhY2VzIGZvbGxvd2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZ28gb24gdGhlIG5leHQgbGluZVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJvcGVuIGJyYWNlICd7JyBmb2xsb3dpbmcgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGdvIG9uIHRoZSBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgQ2hlY2sgb3BlcmF0b3Igc3BhY2luZy4KQEAgLTYzMywyNyArNjcyLDI3IEBACiAJCQkJfQogCiAJCQkJIyBQaWNrIHVwIHRoZSBwcmVjZWVkaW5nIGFuZCBzdWNjZWVkaW5nIGNoYXJhY3RlcnMuCi0JCQkJbXkgJGNhID0gc3Vic3RyKCRvcGxpbmUsICRvZmYgLSAxLCAxKTsKKwkJCQlteSAkY2EgPSBzdWJzdHIoJG9wbGluZSwgMCwgJG9mZik7CiAJCQkJbXkgJGNjID0gJyc7CiAJCQkJaWYgKGxlbmd0aCgkb3BsaW5lKSA+PSAoJG9mZiArIGxlbmd0aCgkZWxlbWVudHNbJG4gKyAxXSkpKSB7CiAJCQkJCSRjYyA9IHN1YnN0cigkb3BsaW5lLCAkb2ZmICsgbGVuZ3RoKCRlbGVtZW50c1skbiArIDFdKSk7CiAJCQkJfQorCQkJCW15ICRjYiA9ICIkY2EkOyRjYyI7CiAKIAkJCQlteSAkY3R4ID0gIiR7YX14JHtjfSI7CiAKIAkJCQlteSAkYXQgPSAiKGN0eDokY3R4KSI7CiAKIAkJCQlteSAkcHRyID0gKCIgIiB4ICRvZmYpIC4gIl4iOwotCQkJCW15ICRoZXJlcHRyID0gIiRoZXJlbGluZSRwdHJcblxuIjsKKwkJCQlteSAkaGVyZXB0ciA9ICIkaGVyZWxpbmUkcHRyXG4iOwogCiAJCQkJIyNwcmludCAiPCRzMTokb3A6JHMyPiA8JGVsZW1lbnRzWyRuXTokZWxlbWVudHNbJG4gKyAxXTokZWxlbWVudHNbJG4gKyAyXT5cbiI7CiAKIAkJCQkjIDsgc2hvdWxkIGhhdmUgZWl0aGVyIHRoZSBlbmQgb2YgbGluZSBvciBhIHNwYWNlIG9yIFwgYWZ0ZXIgaXQKIAkJCQlpZiAoJG9wIGVxICc7JykgewotCQkJCQlpZiAoJGN0eCAhfiAvLnhbV0VdLyAmJiAkY2MgIX4gL15cXC8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCWlmICgkY3R4ICF+IC8ueFtXRUJdLyAmJiAkY2MgIX4gL15cXC8gJiYKKwkJCQkJICAgICRjYyAhfiAvXjsvKSB7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyAvLyBpcyBhIGNvbW1lbnQKQEAgLTY2Miw0MyArNzAxLDMxIEBACiAJCQkJIyAtPiBzaG91bGQgaGF2ZSBubyBzcGFjZXMKIAkJCQl9IGVsc2lmICgkb3AgZXEgJy0+JykgewogCQkJCQlpZiAoJGN0eCA9fiAvV3gufC54Vy8pIHsKLQkJCQkJCXByaW50ICJubyBzcGFjZXMgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibm8gc3BhY2VzIGFyb3VuZCB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyAsIG11c3QgaGF2ZSBhIHNwYWNlIG9uIHRoZSByaWdodC4KIAkJCQl9IGVsc2lmICgkb3AgZXEgJywnKSB7CiAJCQkJCWlmICgkY3R4ICF+IC8ueFd8LnhFLyAmJiAkY2MgIX4gL159LykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIHVuYXJ5ICEgYW5kIHVuYXJ5IH4gYXJlIGFsbG93ZWQgbm8gc3BhY2Ugb24gdGhlIHJpZ2h0CiAJCQkJfSBlbHNpZiAoJG9wIGVxICchJyBvciAkb3AgZXEgJ34nKSB7CiAJCQkJCWlmICgkY3R4ICF+IC9bV09FQl14Li8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAJCQkJCWlmICgkY3R4ID1+IC8ueFcvKSB7Ci0JCQkJCQlwcmludCAibm8gc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJubyBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyB1bmFyeSArKyBhbmQgdW5hcnkgLS0gYXJlIGFsbG93ZWQgbm8gc3BhY2Ugb24gb25lIHNpZGUuCiAJCQkJfSBlbHNpZiAoJG9wIGVxICcrKycgb3IgJG9wIGVxICctLScpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1tXT0JdeFteV10vICYmICRjdHggIX4gL1teV114W1dPQkVdLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2Ugb25lIHNpZGUgb2YgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIG9uZSBzaWRlIG9mIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAJCQkJCWlmICgkY3R4ID1+IC9XeC4vICYmICRjYyA9fiAvXjsvKSB7Ci0JCQkJCQlwcmludCAibm8gc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibm8gc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjICYgaXMgYm90aCB1bmFyeSBhbmQgYmluYXJ5CkBAIC03MTUsOSArNzQyLDcgQEAKIAkJCQkjCiAJCQkJfSBlbHNpZiAoJG9wIGVxICcmJyBvciAkb3AgZXEgJy0nKSB7CiAJCQkJCWlmICgkY3R4ICF+IC9WeFZ8W0VXXXhbV0VdfFtFV0JdeFtWT10vKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyAqIGlzIHRoZSBzYW1lIGFzICYgb25seSBhZGRpbmc6CkBAIC03MjYsMTYgKzc1MSw5IEBACiAJCQkJIwkoZm9vICoqKQogCQkJCSMKIAkJCQl9IGVsc2lmICgkb3AgZXEgJyonKSB7Ci0JCQkJCWlmICgkY2EgZXEgJyonKSB7Ci0JCQkJCQlpZiAoJGNjID1+IC9eXHMoPyFccypjb25zdCkvKSB7Ci0JCQkJCQkJcHJpbnQgIm5vIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkJJGNsZWFuID0gMDsKLQkJCQkJCX0KLQkJCQkJfSBlbHNpZiAoJGN0eCAhfiAvVnhWfFtFV114W1dFXXxbRVdCXXhbVk9dfE94VnxXeEJ8QnhCLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCWlmICgkY2EgIX4gLyRUeXBlJC8gJiYgJGNiICF+IC8oXCokO3wkO1wqKS8gJiYKKwkJCQkJICAgICRjdHggIX4gL1Z4VnxbRVddeFtXRV18W0VXQl14W1ZPXXxPeFZ8V3hCfEJ4Qi8pIHsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyA8PCBhbmQgPj4gbWF5IGVpdGhlciBoYXZlIG9yIG5vdCBoYXZlIHNwYWNlcyBib3RoIHNpZGVzCkBAIC03NDMsNTggKzc2MSw1MSBAQAogCQkJCQkgJG9wIGVxICdeJyBvciAkb3AgZXEgJ3wnKQogCQkJCXsKIAkJCQkJaWYgKCRjdHggIX4gL1Z4VnxXeFd8VnhFfFd4RS8pIHsKLQkJCQkJCXByaW50ICJuZWVkIGNvbnNpc3RlbnQgc3BhY2luZyBhcm91bmQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibmVlZCBjb25zaXN0ZW50IHNwYWNpbmcgYXJvdW5kICckb3AnICRhdFxuIiAuCisJCQkJCQkJJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIEFsbCB0aGUgb3RoZXJzIG5lZWQgc3BhY2VzIGJvdGggc2lkZXMuCiAJCQkJfSBlbHNpZiAoJGN0eCAhfiAvW0VXXXhbV0VdLykgewotCQkJCQlwcmludCAibmVlZCBzcGFjZXMgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkkY2xlYW4gPSAwOworCQkJCQlFUlJPUigibmVlZCBzcGFjZXMgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCX0KIAkJCQkkb2ZmICs9IGxlbmd0aCgkZWxlbWVudHNbJG4gKyAxXSk7CiAJCQl9CiAJCX0KIAogI25lZWQgc3BhY2UgYmVmb3JlIGJyYWNlIGZvbGxvd2luZyBpZiwgd2hpbGUsIGV0YwotCQlpZiAoJGxpbmU9fi9cKC4qXCl7LykgewotCQkJcHJpbnQgIm5lZWQgYSBzcGFjZSBiZWZvcmUgdGhlIGJyYWNlXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQlpZiAoJGxpbmUgPX4gL1woLipcKXsvIHx8ICRsaW5lID1+IC9kb3svKSB7CisJCQlFUlJPUigibmVlZCBhIHNwYWNlIGJlZm9yZSB0aGUgb3BlbiBicmFjZSAneydcbiIgLiAkaGVyZWN1cnIpOworCQl9CisKKyMgY2xvc2luZyBicmFjZSBzaG91bGQgaGF2ZSBhIHNwYWNlIGZvbGxvd2luZyBpdCB3aGVuIGl0IGhhcyBhbnl0aGluZworIyBvbiB0aGUgbGluZQorCQlpZiAoJGxpbmUgPX4gL30oPyEoPzosfDt8XCkpKVxTLykgeworCQkJRVJST1IoIm5lZWQgYSBzcGFjZSBhZnRlciB0aGF0IGNsb3NlIGJyYWNlICd9J1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogI2dvdG8gbGFiZWxzIGFyZW4ndCBpbmRlbnRlZCwgYWxsb3cgYSBzaW5nbGUgc3BhY2UgaG93ZXZlcgogCQlpZiAoJGxpbmU9fi9eLlxzK1tBLVphLXpcZF9dKzooPyFbMC05XSspLyBhbmQKIAkJICAgISgkbGluZT1+L14uIFtBLVphLXpcZF9dKzovKSBhbmQgISgkbGluZT1+L14uXHMrZGVmYXVsdDovKSkgewotCQkJcHJpbnQgImxhYmVscyBzaG91bGQgbm90IGJlIGluZGVudGVkXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJV0FSTigibGFiZWxzIHNob3VsZCBub3QgYmUgaW5kZW50ZWRcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgTmVlZCBhIHNwYWNlIGJlZm9yZSBvcGVuIHBhcmVudGhlc2lzIGFmdGVyIGlmLCB3aGlsZSBldGMKIAkJaWYgKCRsaW5lPX4vXGIoaWZ8d2hpbGV8Zm9yfHN3aXRjaClcKC8pIHsKLQkJCXByaW50ICJuZWVkIGEgc3BhY2UgYmVmb3JlIHRoZSBvcGVuIHBhcmVudGhlc2lzXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIm5lZWQgYSBzcGFjZSBiZWZvcmUgdGhlIG9wZW4gcGFyZW50aGVzaXMgJygnXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIENoZWNrIGZvciBpbGxlZ2FsIGFzc2lnbm1lbnQgaW4gaWYgY29uZGl0aW9uYWwuCiAJCWlmICgkbGluZT1+L1xiaWZccypcKC4qW148PiE9XT1bXj1dLipcKS8pIHsKIAkJCSNuZXh0IGlmICgkbGluZT1+L1wiLipcUSRvcFxFLipcIi8gb3IgJGxpbmU9fi9cJ1xRJG9wXEVcJy8pOwotCQkJcHJpbnQgImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25cbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiZG8gbm90IHVzZSBhc3NpZ25tZW50IGluIGlmIGNvbmRpdGlvblxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogCQkjIENoZWNrIGZvciB9PG5sPmVsc2UgeywgdGhlc2UgbXVzdCBiZSBhdCB0aGUgc2FtZQogCQkjIGluZGVudCBsZXZlbCB0byBiZSByZWxldmFudCB0byBlYWNoIG90aGVyLgogCQlpZiAoJHByZXZsaW5lPX4vfVxzKiQvIGFuZCAkbGluZT1+L14uXHMqZWxzZVxzKi8gYW5kCiAJCQkJCQkkcHJldmluZGVudCA9PSAkaW5kZW50KSB7Ci0JCQlwcmludCAiZWxzZSBzaG91bGQgZm9sbG93IGNsb3NlIGJyYWNlXG4iOwotCQkJcHJpbnQgIiRoZXJlcHJldiI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImVsc2Ugc2hvdWxkIGZvbGxvdyBjbG9zZSBicmFjZSAnfSdcbiIgLiAkaGVyZXByZXYpOwogCQl9CiAKICNzdHVkbHkgY2FwcywgY29tbWVudGVkIG91dCB1bnRpbCBmaWd1cmUgb3V0IGhvdyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVzZSBvZiBleGlzdGluZyBhbmQgYWRkaW5nIG5ldwpAQCAtODA2LDU3ICs4MTcsMjIgQEAKIAogI25vIHNwYWNlcyBhbGxvd2VkIGFmdGVyIFwgaW4gZGVmaW5lCiAJCWlmICgkbGluZT1+L1wjZGVmaW5lLipcXFxzJC8pIHsKLQkJCXByaW50KCJXaGl0ZXBzcGFjZSBhZnRlciBcXCBtYWtlcyBuZXh0IGxpbmVzIHVzZWxlc3NcbiIpOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJV0FSTigiV2hpdGVwc3BhY2UgYWZ0ZXIgXFwgbWFrZXMgbmV4dCBsaW5lcyB1c2VsZXNzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjd2FybiBpZiA8YXNtL2Zvby5oPiBpcyAjaW5jbHVkZWQgYW5kIDxsaW51eC9mb28uaD4gaXMgYXZhaWxhYmxlICh1c2VzIFJBVyBsaW5lKQogCQlpZiAoJHRyZWUgJiYgJHJhd2xpbmUgPX4gbXteLlwjXHMqaW5jbHVkZVxzKlw8YXNtXC8oLiopXC5oXD59KSB7CiAJCQlteSAkY2hlY2tmaWxlID0gImluY2x1ZGUvbGludXgvJDEuaCI7CiAJCQlpZiAoLWYgJGNoZWNrZmlsZSkgewotCQkJCXByaW50ICJVc2UgI2luY2x1ZGUgPGxpbnV4LyQxLmg+IGluc3RlYWQgb2YgPGFzbS8kMS5oPlxuIjsKLQkJCQlwcmludCAkaGVyZWN1cnI7Ci0JCQkJJGNsZWFuID0gMDsKLQkJCX0KLQkJfQotCi0jIGlmL3doaWxlL2V0YyBicmFjZSBkbyBub3QgZ28gb24gbmV4dCBsaW5lLCB1bmxlc3MgZGVmaW5pbmcgYSBkbyB3aGlsZSBsb29wLAotIyBvciBpZiB0aGF0IGJyYWNlIG9uIHRoZSBuZXh0IGxpbmUgaXMgZm9yIHNvbWV0aGluZyBlbHNlCi0JCWlmICgkcHJldmxpbmU9fi9cYig/OihpZnx3aGlsZXxmb3J8c3dpdGNoKVxzKlwofGRvXGJ8ZWxzZVxiKS8pIHsKLQkJCW15IEBvcGVuZWQgPSAkcHJldmxpbmU9fi9cKC9nOwotCQkJbXkgQGNsb3NlZCA9ICRwcmV2bGluZT1+L1wpL2c7Ci0JCQlteSAkbnJfbGluZSA9ICRsaW5lbnI7Ci0JCQlteSAkcmVtYWluaW5nID0gJHJlYWxjbnQgLSAxOwotCQkJbXkgJG5leHRfbGluZSA9ICRsaW5lOwotCQkJbXkgJGV4dHJhX2xpbmVzID0gMDsKLQkJCW15ICRkaXNwbGF5X3NlZ21lbnQgPSAkcHJldmxpbmU7Ci0KLQkJCXdoaWxlICgkcmVtYWluaW5nID4gMCAmJiBzY2FsYXIgQG9wZW5lZCA+IHNjYWxhciBAY2xvc2VkKSB7Ci0JCQkJJHByZXZsaW5lIC49ICRuZXh0X2xpbmU7Ci0JCQkJJGRpc3BsYXlfc2VnbWVudCAuPSAiXG4iIC4gJG5leHRfbGluZTsKLQkJCQkkbmV4dF9saW5lID0gJGxpbmVzWyRucl9saW5lXTsKLQkJCQkkbnJfbGluZSsrOwotCQkJCSRyZW1haW5pbmctLTsKLQotCQkJCUBvcGVuZWQgPSAkcHJldmxpbmU9fi9cKC9nOwotCQkJCUBjbG9zZWQgPSAkcHJldmxpbmU9fi9cKS9nOwotCQkJfQotCi0JCQlpZiAoKCRwcmV2bGluZT1+L1xiKD86KGlmfHdoaWxlfGZvcnxzd2l0Y2gpXHMqXCguKlwpfGRvfGVsc2UpXHMqJC8pIGFuZCAoJG5leHRfbGluZT1+L3svKSBhbmQKLQkJCSAgICEoJG5leHRfbGluZT1+L1xiKD86aWZ8d2hpbGV8Zm9yfHN3aXRjaHxkb3xlbHNlKVxiLykgYW5kICEoJG5leHRfbGluZT1+L1wjZGVmaW5lLipkby4qd2hpbGUvKSkgewotCQkJCXByaW50ICJUaGF0IHsgc2hvdWxkIGJlIG9uIHRoZSBwcmV2aW91cyBsaW5lXG4iOwotCQkJCXByaW50ICIkaGVyZVxuJGRpc3BsYXlfc2VnbWVudFxuJG5leHRfbGluZVxuXG4iOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJQ0hLKCJVc2UgI2luY2x1ZGUgPGxpbnV4LyQxLmg+IGluc3RlYWQgb2YgPGFzbS8kMS5oPlxuIiAuCisJCQkJCSRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBpZiBhbmQgZWxzZSBzaG91bGQgbm90IGhhdmUgZ2VuZXJhbCBzdGF0ZW1lbnRzIGFmdGVyIGl0CiAJCWlmICgkbGluZSA9fiAvXi5ccyooPzp9XHMqKT9lbHNlXGIoLiopLyAmJgotCQkgICAgJDEgIX4gL15ccyooPzpcc2lmfHt8JCkvKSB7Ci0JCQlwcmludCAidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkgICAgJDEgIX4gL15ccyooPzpcc2lmfHt8XFx8JCkvKSB7CisJCQlFUlJPUigidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIG11bHRpLXN0YXRlbWVudCBtYWNyb3Mgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgZG8gd2hpbGUgbG9vcCwgZ3JhYiB0aGUKQEAgLTg3Nyw0OSArODUzLDQ5IEBACiAJCQkJJGxuLS07CiAJCQkJJGNudCsrOwogCQkJfQotCQkJbXkgJGN0eCA9IGpvaW4oJycsIGN0eF9zdGF0ZW1lbnQoJGxuLCAkY250KSk7CisJCQlteSBAY3R4ID0gY3R4X3N0YXRlbWVudCgkbG4sICRjbnQpOworCQkJbXkgJGN0eF9sbiA9ICRsbiArICQjY3R4ICsgMTsKKwkJCW15ICRjdHggPSBqb2luKCJcbiIsIEBjdHgpOworCisJCQkjIFB1bGwgaW4gYW55IGVtcHR5IGV4dGVuc2lvbiBsaW5lcy4KKwkJCXdoaWxlICgkY3R4ID1+IC9cXCQvICYmCisJCQkgICAgICAgJGxpbmVzWyRjdHhfbG4gLSAxXSA9fiAvXi5ccyooPzpcXCk/JC8pIHsKKwkJCQkkY3R4IC49ICRsaW5lc1skY3R4X2xuIC0gMV07CisJCQkJJGN0eF9sbisrOworCQkJfQogCiAJCQlpZiAoJGN0eCA9fiAvXFwkLykgewogCQkJCWlmICgkY3R4ID1+IC87LykgewotCQkJCQlwcmludCAiTWFjcm9zIHdpdGggbXVsdGlwbGUgc3RhdGVtZW50cyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyAtIHdoaWxlIGxvb3BcbiI7CisJCQkJCUVSUk9SKCJNYWNyb3Mgd2l0aCBtdWx0aXBsZSBzdGF0ZW1lbnRzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBhIGRvIC0gd2hpbGUgbG9vcFxuIiAuICIkaGVyZVxuJGN0eFxuIik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnQgIk1hY3JvcyB3aXRoIGNvbXBsZXggdmFsdWVzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNpc1xuIjsKKwkJCQkJRVJST1IoIk1hY3JvcyB3aXRoIGNvbXBsZXggdmFsdWVzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNpc1xuIiAuICIkaGVyZVxuJGN0eFxuIik7CiAJCQkJfQotCQkJCXByaW50ICIkaGVyZXByZXYiOwotCQkJCSRjbGVhbiA9IDA7CiAJCQl9CiAJCX0KIAogIyBkb24ndCBpbmNsdWRlIGRlcHJlY2F0ZWQgaW5jbHVkZSBmaWxlcyAodXNlcyBSQVcgbGluZSkKIAkJZm9yIG15ICRpbmMgKEBkZXBfaW5jbHVkZXMpIHsKIAkJCWlmICgkcmF3bGluZSA9fiBtQFwjXHMqaW5jbHVkZVxzKlw8JGluYz5AKSB7Ci0JCQkJcHJpbnQgIkRvbid0IHVzZSA8JGluYz46IHNlZSBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlFUlJPUigiRG9uJ3QgdXNlIDwkaW5jPjogc2VlIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBkb24ndCB1c2UgZGVwcmVjYXRlZCBmdW5jdGlvbnMKIAkJZm9yIG15ICRmdW5jIChAZGVwX2Z1bmN0aW9ucykgewogCQkJaWYgKCRsaW5lID1+IC9cYiRmdW5jXGIvKSB7Ci0JCQkJcHJpbnQgIkRvbid0IHVzZSAkZnVuYygpOiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJRVJST1IoIkRvbid0IHVzZSAkZnVuYygpOiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIG5vIHZvbGF0aWxlcyBwbGVhc2UKIAkJaWYgKCRsaW5lID1+IC9cYnZvbGF0aWxlXGIvICYmICRsaW5lICF+IC9cYmFzbVxzK3ZvbGF0aWxlXGIvKSB7Ci0JCQlwcmludCAiVXNlIG9mIHZvbGF0aWxlIGlzIHVzdWFsbHkgd3Jvbmc6IHNlZSBEb2N1bWVudGF0aW9uL3ZvbGF0aWxlLWNvbnNpZGVyZWQtaGFybWZ1bC50eHRcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJVc2Ugb2Ygdm9sYXRpbGUgaXMgdXN1YWxseSB3cm9uZzogc2VlIERvY3VtZW50YXRpb24vdm9sYXRpbGUtY29uc2lkZXJlZC1oYXJtZnVsLnR4dFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyB3YXJuIGFib3V0ICNpZiAwCiAJCWlmICgkbGluZSA9fiAvXi4jXHMqaWZccyswXGIvKSB7Ci0JCQlwcmludCAiI2lmIDAgLS0gaWYgdGhpcyBjb2RlIHJlZHVuZGFudCByZW1vdmUgaXRcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlDSEsoImlmIHRoaXMgY29kZSBpcyByZWR1bmRhbnQgY29uc2lkZXIgcmVtb3ZpbmcgaXRcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAJCX0KIAogIyB3YXJuIGFib3V0ICNpZmRlZnMgaW4gQyBmaWxlcwpAQCAtOTMzLDQxICs5MDksNDcgQEAKIAkJaWYgKCRsaW5lID1+IC9eLlxzKihzdHJ1Y3RccyttdXRleHxzcGlubG9ja190KVxzK1xTKzsvKSB7CiAJCQlteSAkd2hpY2ggPSAkMTsKIAkJCWlmICghY3R4X2hhc19jb21tZW50KCRmaXJzdF9saW5lLCAkbGluZW5yKSkgewotCQkJCXByaW50ICIkMSBkZWZpbml0aW9uIHdpdGhvdXQgY29tbWVudFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUNISygiJDEgZGVmaW5pdGlvbiB3aXRob3V0IGNvbW1lbnRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAjIGNoZWNrIGZvciBtZW1vcnkgYmFycmllcnMgd2l0aG91dCBhIGNvbW1lbnQuCiAJCWlmICgkbGluZSA9fiAvXGIobWJ8cm1ifHdtYnxyZWFkX2JhcnJpZXJfZGVwZW5kc3xzbXBfbWJ8c21wX3JtYnxzbXBfd21ifHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcylcKC8pIHsKIAkJCWlmICghY3R4X2hhc19jb21tZW50KCRmaXJzdF9saW5lLCAkbGluZW5yKSkgewotCQkJCXByaW50ICJtZW1vcnkgYmFycmllciB3aXRob3V0IGNvbW1lbnRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlDSEsoIm1lbW9yeSBiYXJyaWVyIHdpdGhvdXQgY29tbWVudFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KICMgY2hlY2sgb2YgaGFyZHdhcmUgc3BlY2lmaWMgZGVmaW5lcwogCQlpZiAoJGxpbmUgPX4gbUBeLiNccyppZi4qXGIoX19pMzg2X198X19wb3dlcnBjNjRfX3xfX3N1bl9ffF9fczM5MHhfXylcYkApIHsKLQkJCXByaW50ICJhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZGVmaW5lcyBzaG91bGQgYmUgYXZvaWRlZFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUNISygiYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGRlZmluZXMgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAgJGhlcmVjdXJyKTsKIAkJfQogCisjIGNoZWNrIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5saW5lIGF0dHJpYnV0ZSwgdGhhdCBpdCBpcyBiZXR3ZWVuCisjIHN0b3JhZ2UgY2xhc3MgYW5kIHR5cGUuCiAJCWlmICgkbGluZSA9fiAvJFR5cGVccysoPzppbmxpbmV8X19hbHdheXNfaW5saW5lKVxiLyB8fAogCQkgICAgJGxpbmUgPX4gL1xiKD86aW5saW5lfGFsd2F5c19pbmxpbmUpXHMrJFN0b3JhZ2UvKSB7Ci0JCQlwcmludCAiaW5saW5lIGtleXdvcmQgc2hvdWxkIHNpdCBiZXR3ZWVuIHN0b3JhZ2UgY2xhc3MgYW5kIHR5cGVcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiaW5saW5lIGtleXdvcmQgc2hvdWxkIHNpdCBiZXR3ZWVuIHN0b3JhZ2UgY2xhc3MgYW5kIHR5cGVcbiIgLiAkaGVyZWN1cnIpOworCQl9CisKKyMgY2hlY2sgZm9yIG5ldyBleHRlcm5zIGluIC5jIGZpbGVzLgorCQlpZiAoJGxpbmUgPX4gL14uXHMqZXh0ZXJuXHMvICYmICgkcmVhbGZpbGUgPX4gL1wuYyQvKSkgeworCQkJV0FSTigiZXh0ZXJucyBzaG91bGQgYmUgYXZvaWRlZCBpbiAuYyBmaWxlc1xuIiAuICAkaGVyZWN1cnIpOworCQl9CisKKyMgY2hlY2tzIGZvciBuZXcgX19zZXR1cCdzCisJCWlmICgkcmF3bGluZSA9fiAvXGJfX3NldHVwXCgiKFteIl0qKSIvKSB7CisJCQlteSAkbmFtZSA9ICQxOworCisJCQlpZiAoIWdyZXAoLyRuYW1lLywgQHNldHVwX2RvY3MpKSB7CisJCQkJQ0hLKCJfX3NldHVwIGFwcGVhcnMgdW4tZG9jdW1lbnRlZCAtLSBjaGVjayBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dFxuIiAuICRoZXJlY3Vycik7CisJCQl9CiAJCX0KIAl9CiAKIAlpZiAoJGNoa19wYXRjaCAmJiAhJGlzX3BhdGNoKSB7Ci0JCSRjbGVhbiA9IDA7Ci0JCXByaW50ICJEb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB1bmlmaWVkLWRpZmYgZm9ybWF0IHBhdGNoXG4iOworCQlFUlJPUigiRG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdW5pZmllZC1kaWZmIGZvcm1hdCBwYXRjaFxuIik7CiAJfQogCWlmICgkaXNfcGF0Y2ggJiYgJGNoa19zaWdub2ZmICYmICRzaWdub2ZmID09IDApIHsKLQkJJGNsZWFuID0gMDsKLQkJcHJpbnQgIk1pc3NpbmcgU2lnbmVkLW9mZi1ieTogbGluZShzKVxuIjsKKwkJRVJST1IoIk1pc3NpbmcgU2lnbmVkLW9mZi1ieTogbGluZShzKVxuIik7CiAJfQogCiAJaWYgKCRjbGVhbiA9PSAxICYmICRxdWlldCA9PSAwKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2RlY29kZWNvZGUgYi9zY3JpcHRzL2RlY29kZWNvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxYThmNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZGVjb2RlY29kZQpAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKyMgRGlzYXNzZW1ibGUgdGhlIENvZGU6IGxpbmUgaW4gTGludXggb29wc2VzCisjIHVzYWdlOiBkZWNvZGVjb2RlIDwgb29wcy5maWxlCisjCisjIG9wdGlvbnM6IHNldCBlbnYuIHZhcmlhYmxlIEFGTEFHUz1vcHRpb25zIHRvIHBhc3Mgb3B0aW9ucyB0byAiYXMiOworIyBlLmcuLCB0byBkZWNvZGUgYW4gaTM4NiBvb3BzIG9uIGFuIHg4Nl82NCBzeXN0ZW0sIHVzZToKKyMgQUZMQUdTPS0tMzIgZGVjb2RlY29kZSA8IDM4Ni5vb3BzCisKK1Q9YG1rdGVtcGAKK2NvZGU9CisKK3doaWxlIHJlYWQgaSA7IGRvCisKK2Nhc2UgIiRpIiBpbgorKkNvZGU6KikKKwljb2RlPSRpCisJOzsKK2VzYWMKKworZG9uZQorCitpZiBbIC16ICIkY29kZSIgXTsgdGhlbgorCWV4aXQKK2ZpCisKK2VjaG8gJGNvZGUKK2NvZGU9YGVjaG8gJGNvZGUgfCBzZWQgLWUgJ3MvLipDb2RlOiAvLydgCisKK21hcmtlcj1gZXhwciBpbmRleCAiJGNvZGUiICJcPCJgCitpZiBbICRtYXJrZXIgLWVxIDAgXTsgdGhlbgorCW1hcmtlcj1gZXhwciBpbmRleCAiJGNvZGUiICJcKCJgCitmaQorCitpZiBbICRtYXJrZXIgLW5lIDAgXTsgdGhlbgorCWJlZm9yZW1hcms9YGVjaG8gIiRjb2RlIiB8IGN1dCAtYy0kKCgke21hcmtlcn0gLSAxKSlgCisJZWNobyAtbiAiCS5ieXRlIDB4IiA+ICRULnMKKwllY2hvICRiZWZvcmVtYXJrIHwgc2VkIC1lICdzLyAvLDB4L2cnID4+ICRULnMKKwlhcyAkQUZMQUdTIC1vICRULm8gJFQucworCW9iamR1bXAgLVMgJFQubworCXJtICRULm8gJFQucworCisjIGFuZCBmaXggY29kZSBhdC1hbmQtYWZ0ZXIgbWFya2VyCisJY29kZT1gZWNobyAiJGNvZGUiIHwgY3V0IC1jJCgoJHttYXJrZXJ9ICsgMSkpLWAKK2ZpCisKK2NvZGU9YGVjaG8gJGNvZGUgfCBzZWQgLWUgJ3MvIFs8KF0vIC87cy9bPildIC8gLztzLyAvLDB4L2cnYAorZWNobyAtbiAiCS5ieXRlIDB4IiA+ICRULnMKK2VjaG8gJGNvZGUgPj4gJFQucworYXMgJEFGTEFHUyAtbyAkVC5vICRULnMKK29iamR1bXAgLVMgJFQubworcm0gJFQubyAkVC5zCmRpZmYgLS1naXQgYS9zY3JpcHRzL2thbGxzeW1zLmMgYi9zY3JpcHRzL2thbGxzeW1zLmMKaW5kZXggOGI4MDliMi4uMTBiMDA2NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rYWxsc3ltcy5jCisrKyBiL3NjcmlwdHMva2FsbHN5bXMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAKLSNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI3CisjZGVmaW5lIEtTWU1fTkFNRV9MRU4JCTEyOAogCiAKIHN0cnVjdCBzeW1fZW50cnkgewpAQCAtMjU0LDcgKzI1NCw3IEBACiAJdW5zaWduZWQgaW50IGksIGssIG9mZjsKIAl1bnNpZ25lZCBpbnQgYmVzdF9pZHhbMjU2XTsKIAl1bnNpZ25lZCBpbnQgKm1hcmtlcnM7Ci0JY2hhciBidWZbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIGJ1ZltLU1lNX05BTUVfTEVOXTsKIAogCXByaW50ZigiI2luY2x1ZGUgPGFzbS90eXBlcy5oPlxuIik7CiAJcHJpbnRmKCIjaWYgQklUU19QRVJfTE9ORyA9PSA2NFxuIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKaW5kZXggY2NmZTg3NS4uZWRkYzdiNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwpAQCAtMTEwLDYgKzExMCw4IEBACiAJeyBBVURJVF9ERUxfUlVMRSwJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1dSSVRFICAgIH0sCiAJeyBBVURJVF9VU0VSLAkJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1JFTEFZICAgIH0sCiAJeyBBVURJVF9TSUdOQUxfSU5GTywJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1JFQUQgICAgIH0sCisJeyBBVURJVF9UVFlfR0VULAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVBRCAgICAgfSwKKwl7IEFVRElUX1RUWV9TRVQsCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19XUklURSAgICB9LAogfTsKIAogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvS2NvbmZpZyBiL3NvdW5kL29zcy9LY29uZmlnCmluZGV4IDRiMzBhZTYuLjg2NmQ0ZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9LY29uZmlnCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC01LDM1ICs1LDYgQEAKICMKICMgUHJvbXB0IHVzZXIgZm9yIHByaW1hcnkgZHJpdmVycy4KIAotY29uZmlnIE9TU19PQlNPTEVURQotCWJvb2wgIk9ic29sZXRlIE9TUyBkcml2ZXJzIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIG9ic29sZXRlIE9TUyBkcml2ZXJzIHRoYXQKLQkgIGFyZSBzY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4gdGhlIG5lYXIgZnV0dXJlLgotCi0JICBQbGVhc2UgY29udGFjdCBBZHJpYW4gQnVuayA8YnVua0BzdHVzdGEuZGU+IGlmIHlvdSBoYWQgdG8KLQkgIHNheSBZIGhlcmUgYmVjYXVzZSB5b3VyIGhhcmR3YXJlIGlzIG5vdCBwcm9wZXJseSBzdXBwb3J0ZWQKLQkgIGJ5IEFMU0EuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBTT1VORF9CVDg3OAotCXRyaXN0YXRlICJCVDg3OCBhdWRpbyBkbWEiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kgJiYgT1NTX09CU09MRVRFCi0JLS0taGVscC0tLQotCSAgQXVkaW8gRE1BIHN1cHBvcnQgZm9yIGJ0ODc4IGJhc2VkIGdyYWJiZXIgYm9hcmRzLiAgQXMgeW91IG1pZ2h0IGhhdmUKLQkgIGFscmVhZHkgbm90aWNlZCwgYnQ4NzggaXMgbGlzdGVkIHdpdGggdHdvIGZ1bmN0aW9ucyBpbiAvcHJvYy9wY2kuCi0JICBGdW5jdGlvbiAwIGRvZXMgdGhlIHZpZGVvIHN0dWZmIChidDg0OCBjb21wYXRpYmxlKSwgZnVuY3Rpb24gMSBkb2VzCi0JICB0aGUgc2FtZSBmb3IgYXVkaW8gZGF0YS4gIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBhdWRpbyBwYXJ0IG9mCi0JICB0aGUgY2hpcC4gIElmIHlvdSBzYXkgJ1knIGhlcmUgeW91IGdldCBhIG9zcy1jb21wYXRpYmxlIGRzcCBkZXZpY2UKLQkgIHdoZXJlIHlvdSBjYW4gcmVjb3JkIGZyb20uICBJZiB5b3Ugd2FudCBqdXN0IHdhdGNoIFRWIHlvdSBwcm9iYWJseQotCSAgZG9uJ3QgbmVlZCB0aGlzIGRyaXZlciBhcyBtb3N0IFRWIGNhcmRzIGhhbmRsZSBzb3VuZCB3aXRoIGEgc2hvcnQKLQkgIGNhYmxlIGZyb20gdGhlIFRWIGNhcmQgdG8geW91ciBzb3VuZCBjYXJkJ3MgbGluZS1pbi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgYnRhdWRpby4KLQogY29uZmlnIFNPVU5EX0JDTV9DUzQyOTdBCiAJdHJpc3RhdGUgIkNyeXN0YWwgU291bmQgQ1M0Mjk3YSAoZm9yIFN3YXJtKSIKIAlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFNJQllURV9TV0FSTQpAQCAtNDQsMTMgKzE1LDYgQEAKIAkgIG5vdGUgdGhhdCBDT05GSUdfS0dEQiBzaG91bGQgbm90IGJlIGVuYWJsZWQgYXQgdGhlIHNhbWUKIAkgIHRpbWUsIHNpbmNlIGl0IGFsc28gYXR0ZW1wdHMgdG8gdXNlIHRoaXMgVUFSVCBwb3J0LgogCi1jb25maWcgU09VTkRfSUNICi0JdHJpc3RhdGUgIkludGVsIElDSCAoaTh4eCkgYXVkaW8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBPU1NfT0JTT0xFVEUKLQloZWxwCi0JICBTdXBwb3J0IGZvciBpbnRlZ3JhbCBhdWRpbyBpbiBJbnRlbCdzIEkvTyBDb250cm9sbGVyIEh1YiAoSUNIKQotCSAgY2hpcHNldCwgYXMgdXNlZCBvbiB0aGUgODEwLzgyMC84NDAgbW90aGVyYm9hcmRzLgotCiBjb25maWcgU09VTkRfVldTTkQKIAl0cmlzdGF0ZSAiU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBTb3VuZCIKIAlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFg4Nl9WSVNXUwpAQCAtMzQ2LDI5ICszMTAsOSBAQAogCSAgYW5kIFBpbm5hY2xlKS4gTGFyZ2VyIHZhbHVlcyByZWR1Y2UgdGhlIGNoYW5jZSBvZiBkYXRhIG92ZXJydW5zIGF0CiAJICB0aGUgZXhwZW5zZSBvZiBvdmVyYWxsIGxhdGVuY3kuIElmIHVuc3VyZSwgdXNlIHRoZSBkZWZhdWx0LgogCi1jb25maWcgU09VTkRfVklBODJDWFhYCi0JdHJpc3RhdGUgIlZJQSA4MkM2ODYgQXVkaW8gQ29kZWMiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kgJiYgT1NTX09CU09MRVRFCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBhdWRpbyBjb2RlYyBmb3VuZCBvbiBWSUEKLQkgIDgyQ3h4eC1iYXNlZCBjaGlwcy4gVHlwaWNhbGx5IHRoZXNlIGFyZSBidWlsdCBpbnRvIGEgbW90aGVyYm9hcmQuCi0KLQkgIERPIE5PVCBzZWxlY3QgU291bmQgQmxhc3RlciBvciBBZGxpYiB3aXRoIHRoaXMgZHJpdmVyLCB1bmxlc3MKLQkgIHlvdSBoYXZlIGEgU291bmQgQmxhc3RlciBvciBBZGxpYiBjYXJkIGluIGFkZGl0aW9uIHRvIHlvdXIgVklBCi0JICBhdWRpbyBjaGlwLgotCi1jb25maWcgTUlESV9WSUE4MkNYWFgKLQlib29sICJWSUEgODJDNjg2IE1JREkiCi0JZGVwZW5kcyBvbiBTT1VORF9WSUE4MkNYWFggJiYgSVNBX0RNQV9BUEkKLQloZWxwCi0JICBBbnN3ZXIgWSB0byB1c2UgdGhlIE1JREkgaW50ZXJmYWNlIG9mIHRoZSBWaWE2ODYuIFlvdSBtYXkgbmVlZCB0bwotCSAgZW5hYmxlIHRoaXMgaW4gdGhlIEJJT1MgYmVmb3JlIGl0IHdpbGwgd29yay4gVGhpcyBpcyBmb3IgY29ubmVjdGlvbgotCSAgdG8gZXh0ZXJuYWwgTUlESSBoYXJkd2FyZSwgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3Igc29mdHdhcmUgcGxheWJhY2sKLQkgIG9mIE1JREkgZmlsZXMuCi0KIGNvbmZpZyBTT1VORF9PU1MKIAl0cmlzdGF0ZSAiT1NTIHNvdW5kIG1vZHVsZXMiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBJU0FfRE1BX0FQSQorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgSVNBX0RNQV9BUEkgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBPU1MgaXMgdGhlIE9wZW4gU291bmQgU3lzdGVtIHN1aXRlIG9mIHNvdW5kIGNhcmQgZHJpdmVycy4gIFRoZXkgbWFrZQogCSAgc291bmQgcHJvZ3JhbW1pbmcgZWFzaWVyIHNpbmNlIHRoZXkgcHJvdmlkZSBhIGNvbW1vbiBBUEkuICBTYXkgWSBvcgpAQCAtNDAwLDIzICszNDQsMTAgQEAKIAogCSAgU2F5IFkgdW5sZXNzIHlvdSBoYXZlIDE2TUIgb3IgbW9yZSBSQU0gb3IgYSBQQ0kgc291bmQgY2FyZC4KIAotY29uZmlnIFNPVU5EX0NTNDIzMgotCXRyaXN0YXRlICJDcnlzdGFsIENTNDIzMiBiYXNlZCAoUG5QKSBjYXJkcyIKLQlkZXBlbmRzIG9uIFNPVU5EX09TUyAmJiBPU1NfT0JTT0xFVEUKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgY2FyZCBiYXNlZCBvbiB0aGUgQ3J5c3RhbCBDUzQyMzIgY2hpcCBzZXQsCi0JICB3aGljaCB1c2VzIGl0cyBvd24gUGx1ZyBhbmQgUGxheSBwcm90b2NvbC4KLQotCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAotCSAgImNzNDIzMj08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXB1aW8+LDxtcHVpcnE+IiB0byB0aGUga2VybmVsCi0JICBjb21tYW5kIGxpbmUuCi0KLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9DUzQyMzI+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCi0JICBjb25maWd1cmluZyB0aGlzIGNhcmQuCi0KIGNvbmZpZyBTT1VORF9TU0NBUEUKIAl0cmlzdGF0ZSAiRW5zb25pcSBTb3VuZFNjYXBlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgQW5zd2VyIFkgaWYgeW91IGhhdmUgYSBzb3VuZCBjYXJkIGJhc2VkIG9uIHRoZSBFbnNvbmlxIFNvdW5kU2NhcGUKIAkgIGNoaXBzZXQuIFN1Y2ggY2FyZHMgYXJlIGJlaW5nIG1hbnVmYWN0dXJlZCBhdCBsZWFzdCBieSBFbnNvbmlxLCBTcGVhCkBAIC03MTksMTMgKzY1MCw2IEBACiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFJvY2t3ZWxsIFdhdmVBcnRpc3Qgc291bmQKIAkgIHN5c3RlbS4gIFRoaXMgZHJpdmVyIGlzIG1haW5seSBmb3IgdGhlIE5ldFdpbmRlci4KIAotY29uZmlnIFNPVU5EX1RWTUlYRVIKLQl0cmlzdGF0ZSAiVFYgY2FyZCAoYnQ4NDgpIG1peGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBJMkMgJiYgVklERU9fVjRMMSAmJiBPU1NfT0JTT0xFVEUKLQloZWxwCi0JICBTdXBwb3J0IGZvciBhdWRpbyBtaXhlciBmYWNpbGl0aWVzIG9uIHRoZSBCVDg0OCBUViBmcmFtZS1ncmFiYmVyCi0JICBjYXJkLgotCiBjb25maWcgU09VTkRfS0FITFVBCiAJdHJpc3RhdGUgIlhwcmVzc0F1ZGlvIFNvdW5kIEJsYXN0ZXIgZW11bGF0aW9uIgogCWRlcGVuZHMgb24gU09VTkRfU0IKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9NYWtlZmlsZSBiL3NvdW5kL29zcy9NYWtlZmlsZQppbmRleCAyNDg5YmQ2Li43YTJmOWFlIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvTWFrZWZpbGUKKysrIGIvc291bmQvb3NzL01ha2VmaWxlCkBAIC0xOCwyMCArMTgsMTUgQEAKIG9iai0kKENPTkZJR19TT1VORF9TU0NBUEUpCSs9IHNzY2FwZS5vIGFkMTg0OC5vIG1wdTQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfQ1M0MjMyKQkrPSBjczQyMzIubyB1YXJ0NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9NU1MpCQkrPSBhZDE4NDgubwotb2JqLSQoQ09ORklHX1NPVU5EX09QTDNTQTIpCSs9IG9wbDNzYTIubyBhZDE4NDgubyBtcHU0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX1BBUykJCSs9IHBhczIubyBzYi5vIHNiX2xpYi5vIHVhcnQ0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX1NCKQkJKz0gc2IubyBzYl9saWIubyB1YXJ0NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9LQUhMVUEpCSs9IGthaGx1YS5vCiBvYmotJChDT05GSUdfU09VTkRfTVBVNDAxKQkrPSBtcHU0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX1VBUlQ2ODUwKQkrPSB1YXJ0Njg1MC5vCi1vYmotJChDT05GSUdfU09VTkRfQURMSUIpCSs9IGFkbGliX2NhcmQubyBvcGwzLm8KIG9iai0kKENPTkZJR19TT1VORF9ZTTM4MTIpCSs9IG9wbDMubwogb2JqLSQoQ09ORklHX1NPVU5EX1ZNSURJKQkrPSB2X21pZGkubwogb2JqLSQoQ09ORklHX1NPVU5EX1ZJREMpCSs9IHZpZGNfbW9kLm8KIG9iai0kKENPTkZJR19TT1VORF9XQVZFQVJUSVNUKQkrPSB3YXZlYXJ0aXN0Lm8KLW9iai0kKENPTkZJR19TT1VORF9BRDE4MTYpCSs9IGFkMTgxNi5vCi1vYmotJChDT05GSUdfU09VTkRfQUQxODg5KQkrPSBhZDE4ODkubyBhYzk3X2NvZGVjLm8KLW9iai0kKENPTkZJR19TT1VORF9BQ0lfTUlYRVIpCSs9IGFjaS5vCiAKIG9iai0kKENPTkZJR19TT1VORF9WSUE4MkNYWFgpCSs9IHZpYTgyY3h4eF9hdWRpby5vIGFjOTdfY29kZWMubwogaWZlcSAoJChDT05GSUdfTUlESV9WSUE4MkNYWFgpLHkpCkBAIC00MCwyNCArMzUsMTYgQEAKIG9iai0kKENPTkZJR19TT1VORF9NU05EQ0xBUykJKz0gbXNuZC5vIG1zbmRfY2xhc3NpYy5vCiBvYmotJChDT05GSUdfU09VTkRfTVNORFBJTikJKz0gbXNuZC5vIG1zbmRfcGlubmFjbGUubwogb2JqLSQoQ09ORklHX1NPVU5EX1ZXU05EKQkrPSB2d3NuZC5vCi1vYmotJChDT05GSUdfU09VTkRfTk0yNTYpCSs9IG5tMjU2X2F1ZGlvLm8gYWM5Ny5vCiBvYmotJChDT05GSUdfU09VTkRfSUNIKQkJKz0gaTgxMF9hdWRpby5vIGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX0VTMTM3MSkJKz0gZXMxMzcxLm8gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfVlJDNTQ3NykJKz0gbmVjX3ZyYzU0NzcubyBhYzk3X2NvZGVjLm8KIG9iai0kKENPTkZJR19TT1VORF9BVTE1NTBfQUM5NykJKz0gYXUxNTUwX2FjOTcubyBhYzk3X2NvZGVjLm8KLW9iai0kKENPTkZJR19TT1VORF9GVVNJT04pCSs9IGNzNDZ4eC5vIGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX1RSSURFTlQpCSs9IHRyaWRlbnQubyBhYzk3X2NvZGVjLm8KLW9iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKQkrPSBhYzk3X2NvZGVjLm8KIG9iai0kKENPTkZJR19TT1VORF9CQ01fQ1M0Mjk3QSkJKz0gc3dhcm1fY3M0Mjk3YS5vCiBvYmotJChDT05GSUdfU09VTkRfQlQ4NzgpCSs9IGJ0YXVkaW8ubwogCiBvYmotJChDT05GSUdfU09VTkRfV005N1hYKQkrPSBhYzk3X3BsdWdpbl93bTk3eHgubwogCi1pZmVxICgkKENPTkZJR19NSURJX0VNVTEwSzEpLHkpCi0gIG9iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKQkrPSBzb3VuZC5vCi1lbmRpZgotCi1vYmotJChDT05GSUdfU09VTkRfRU1VMTBLMSkJKz0gZW11MTBrMS8KIG9iai0kKENPTkZJR19ETUFTT1VORCkJCSs9IGRtYXNvdW5kLwogCiAjIERlY2xhcmUgbXVsdGktcGFydCBkcml2ZXJzLgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTcuYyBiL3NvdW5kL29zcy9hYzk3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2Y0ZWQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FjOTcuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgImFjOTcuaCIKLQotLyogRmxhZyBmb3IgbW9ubyBjb250cm9scy4gKi8KLSNkZWZpbmUgTU8gMAotLyogQW5kIGZvciBzdGVyZW8uICovCi0jZGVmaW5lIFNUIDEKLQotLyogV2hldGhlciBvciBub3QgdGhlIGJpdHMgaW4gdGhlIGNoYW5uZWwgYXJlIGludmVydGVkLiAqLwotI2RlZmluZSBJTlYgMQotI2RlZmluZSBOSU5WIDAKLQotc3RhdGljIHN0cnVjdCBhYzk3X2Nobl9kZXNjIHsKLSAgICBpbnQgYWM5N19yZWdudW07Ci0gICAgaW50IG9zc19jaGFubmVsOwotICAgIGludCBtYXh2YWw7Ci0gICAgaW50IGlzX3N0ZXJlbzsKLSAgICBpbnQgb3NzX21hc2s7Ci0gICAgaW50IHJlY29yZE51bTsKLSAgICB1MTYgcmVnbWFzazsKLSAgICBpbnQgaXNfaW52ZXJ0ZWQ7Ci19IG1peGVyUmVnc1tdID0gewotICAgIHsgQUM5N19NQVNURVJfVk9MX1NURVJFTywgU09VTkRfTUlYRVJfVk9MVU1FLCAgIDB4M2YsIFNULCBTT1VORF9NQVNLX1ZPTFVNRSwgICA1LCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfTUFTVEVSX1ZPTF9NT05PLCAgIFNPVU5EX01JWEVSX1BIT05FT1VULCAweDNmLCBNTywgU09VTkRfTUFTS19QSE9ORU9VVCwgNiwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X01BU1RFUl9UT05FLCAgICAgICBTT1VORF9NSVhFUl9UUkVCTEUsICAgMHgwZiwgTU8sIFNPVU5EX01BU0tfVFJFQkxFLCAgLTEsIDB4MDBmZiwgSU5WICB9LAotICAgIHsgQUM5N19NQVNURVJfVE9ORSwgICAgICAgU09VTkRfTUlYRVJfQkFTUywgICAgIDB4MGYsIE1PLCBTT1VORF9NQVNLX0JBU1MsICAgIC0xLCAweGZmMDAsIElOViAgfSwKLSAgICB7IEFDOTdfUENCRUVQX1ZPTCwgICAgICAgIFNPVU5EX01JWEVSX1NQRUFLRVIsICAweDBmLCBNTywgU09VTkRfTUFTS19TUEVBS0VSLCAtMSwgMHgwMDFlLCBJTlYgIH0sCi0gICAgeyBBQzk3X1BIT05FX1ZPTCwgICAgICAgICBTT1VORF9NSVhFUl9QSE9ORUlOLCAgMHgxZiwgTU8sIFNPVU5EX01BU0tfUEhPTkVJTiwgIDcsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19NSUNfVk9MLCAgICAgICAgICAgU09VTkRfTUlYRVJfTUlDLCAgICAgIDB4MWYsIE1PLCBTT1VORF9NQVNLX01JQywgICAgICAwLCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfTElORUlOX1ZPTCwgICAgICAgIFNPVU5EX01JWEVSX0xJTkUsICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19MSU5FLCAgICAgNCwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X0NEX1ZPTCwgICAgICAgICAgICBTT1VORF9NSVhFUl9DRCwgICAgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfQ0QsICAgICAgIDEsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19WSURFT19WT0wsICAgICAgICAgU09VTkRfTUlYRVJfVklERU8sICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX1ZJREVPLCAgICAyLCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfQVVYX1ZPTCwgICAgICAgICAgIFNPVU5EX01JWEVSX0xJTkUxLCAgICAweDFmLCBTVCwgU09VTkRfTUFTS19MSU5FMSwJICAgMywgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X1BDTU9VVF9WT0wsICAgICAgICBTT1VORF9NSVhFUl9QQ00sICAgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfUENNLCAgICAgLTEsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19SRUNPUkRfR0FJTiwgICAgICAgU09VTkRfTUlYRVJfSUdBSU4sICAgIDB4MGYsIFNULCBTT1VORF9NQVNLX0lHQUlOLCAgIC0xLCAweDAwMDAsIE5JTlYgfSwKLSAgICB7IC0xLAkJICAgICAgLTEsCQkgICAgMHhmZiwgMCwgIDAsICAgICAgICAgICAgICAgICAgLTEsIDB4MDAwMCwgMCAgICB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhYzk3X2Nobl9kZXNjICoKLWFjOTdfZmluZF9jaG5kZXNjIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX2NoYW5uZWwpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0ub3NzX2NoYW5uZWwgIT0gLTE7IHgrKykgewotCWlmIChtaXhlclJlZ3NbeF0ub3NzX2NoYW5uZWwgPT0gb3NzX2NoYW5uZWwpCi0JICAgIHJldHVybiBtaXhlclJlZ3MgKyB4OwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotYWM5N19pc192YWxpZF9jaGFubmVsIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2huKQotewotICAgIHJldHVybiAoZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW2Nobi0+YWM5N19yZWdudW0gLyAyXQotCSAgICAhPSBBQzk3X1JFR19VTlNVUFBPUlRFRCk7Ci19Ci0KLWludAotYWM5N19pbml0IChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQotewotICAgIGludCB4OwotICAgIGludCByZWcwOwotCi0gICAgLyogQ2xlYXIgb3V0IHRoZSBhcnJheXMgb2YgY2FjaGVkIHZhbHVlcy4gKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgQUM5N19SRUdfQ05UOyB4KyspCi0JZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3hdID0gQUM5N19SRUdWQUxfVU5LTk9XTjsKLQotICAgIGZvciAoeCA9IDA7IHggPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IHgrKykKLQlkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW3hdID0gQUM5N19SRUdWQUxfVU5LTk9XTjsKLQotICAgIC8qIENsZWFyIHRoZSBkZXZpY2UgbWFza3MuICAqLwotICAgIGRldi0+bWl4ZXJfZGV2bWFzayA9IDA7Ci0gICAgZGV2LT5taXhlcl9zdGVyZW9tYXNrID0gMDsKLSAgICBkZXYtPm1peGVyX3JlY21hc2sgPSAwOwotCi0gICAgLyogPz8/IERvIGEgInN0YW5kYXJkIHJlc2V0IiB2aWEgcmVnaXN0ZXIgMD8gKi8KLQotICAgIC8qIEhhcmR3YXJlLWRlcGVuZGVudCByZXNldC4gICovCi0gICAgaWYgKGRldi0+cmVzZXRfZGV2aWNlIChkZXYpKQotCXJldHVybiAtMTsKLQotICAgIC8qIENoZWNrIHRoZSBtaXhlciBkZXZpY2UgY2FwYWJpbGl0aWVzLiAgKi8KLSAgICByZWcwID0gZGV2LT5yZWFkX3JlZyAoZGV2LCBBQzk3X1JFU0VUKTsKLQotICAgIGlmIChyZWcwIDwgMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAvKiBDaGVjayBmb3Igc3VwcG9ydCBmb3IgdHJlYmxlL2Jhc3MgY29udHJvbHMuICAqLwotICAgIGlmICghIChyZWcwICYgNCkpIHsKLQlkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbQUM5N19NQVNURVJfVE9ORSAvIDJdIAotCSAgICA9IEFDOTdfUkVHX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8qID8/PyBUaGVyZSBtYXkgYmUgb3RoZXIgdGVzdHMgaGVyZT8gKi8KLQotICAgIC8qIEZpbGwgaW4gdGhlIGRldmljZSBtYXNrcy4gICovCi0gICAgZm9yICh4ID0gMDsgbWl4ZXJSZWdzW3hdLmFjOTdfcmVnbnVtICE9IC0xOyB4KyspIHsKLQlpZiAoYWM5N19pc192YWxpZF9jaGFubmVsIChkZXYsIG1peGVyUmVncyArIHgpKSB7Ci0JICAgIGRldi0+bWl4ZXJfZGV2bWFzayB8PSBtaXhlclJlZ3NbeF0ub3NzX21hc2s7Ci0KLQkgICAgaWYgKG1peGVyUmVnc1t4XS5pc19zdGVyZW8pCi0JCWRldi0+bWl4ZXJfc3RlcmVvbWFzayB8PSBtaXhlclJlZ3NbeF0ub3NzX21hc2s7Ci0KLQkgICAgaWYgKG1peGVyUmVnc1t4XS5yZWNvcmROdW0gIT0gLTEpCi0JCWRldi0+bWl4ZXJfcmVjbWFzayB8PSBtaXhlclJlZ3NbeF0ub3NzX21hc2s7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFRzsgdXNlIHRoZSBjYWNoZSBpZiB0aGUgdmFsdWUgaW4gaXQKLSAgIGlzIHZhbGlkLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gKi8KLXN0YXRpYyBpbnQKLWFjOTdfZ2V0X3JlZ2lzdGVyIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpIAotewotICAgIGlmIChyZWcgPiAxMjcgfHwgKHJlZyAmIDEpKQotCXJldHVybiAtRUlOVkFMOwotCi0gICAgLyogU2VlIGlmIGl0J3MgaW4gdGhlIGNhY2hlLCBvciBpZiBpdCdzIGp1c3QgcGxhaW4gaW52YWxpZC4gICovCi0gICAgc3dpdGNoIChkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbcmVnIC8gMl0pIHsKLSAgICBjYXNlIEFDOTdfUkVHX1VOU1VQUE9SVEVEOgotCXJldHVybiAtRUlOVkFMOwotCWJyZWFrOwotICAgIGNhc2UgQUM5N19SRUdWQUxfVU5LTk9XTjoKLQlkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbcmVnIC8gMl0gPSBkZXYtPnJlYWRfcmVnIChkZXYsIHJlZyk7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXTsKLX0KLQotLyogV3JpdGUgVkFMVUUgdG8gQUM5NyByZWdpc3RlciBSRUcsIGFuZCBjYWNoZSBpdHMgdmFsdWUgaW4gdGhlIGxhc3Qtd3JpdHRlbgotICAgY2FjaGUuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCBvciAwIG9uIHN1Y2Nlc3MuICovCi1pbnQKLWFjOTdfcHV0X3JlZ2lzdGVyIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLSAgICBpZiAocmVnID4gMTI3IHx8IChyZWcgJiAxKSkKLQlyZXR1cm4gLUVJTlZBTDsKLQotICAgIGlmIChkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbcmVnIC8gMl0gPT0gQUM5N19SRUdfVU5TVVBQT1JURUQpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgZWxzZSB7Ci0JaW50IHJlcyA9IGRldi0+d3JpdGVfcmVnIChkZXYsIHJlZywgdmFsdWUpOwotCWlmIChyZXMgPj0gMCkgewotCSAgICBkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbcmVnIC8gMl0gPSB2YWx1ZTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWVsc2UKLQkgICAgcmV0dXJuIHJlczsKLSAgICB9Ci19Ci0KLS8qIFNjYWxlIFZBTFVFIChhIHZhbHVlIGZybyAwIHRvIE1BWFZBTCkgdG8gYSB2YWx1ZSBmcm9tIDAtMTAwLiAgSWYKLSAgIElTX1NURVJFTyBpcyBzZXQsIFZBTFVFIGlzIGEgc3RlcmVvIHZhbHVlOyB0aGUgbGVmdCBjaGFubmVsIHZhbHVlCi0gICBpcyBpbiB0aGUgbG93ZXIgOCBiaXRzLCBhbmQgdGhlIHJpZ2h0IGNoYW5uZWwgdmFsdWUgaXMgaW4gdGhlIHVwcGVyCi0gICA4IGJpdHMuCi0KLSAgIEEgbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZCBvbiBmYWlsdXJlLCBvciB0aGUgdW5zaWduZWQKLSAgIHNjYWxlZCB2YWx1ZSBvbiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGludAotYWM5N19zY2FsZV90b19vc3NfdmFsIChpbnQgdmFsdWUsIGludCBtYXh2YWwsIGludCBpc19zdGVyZW8sIGludCBpbnYpCi17Ci0gICAgLyogTXV0ZWQ/ICAqLwotICAgIGlmICh2YWx1ZSAmIEFDOTdfTVVURSkKLQlyZXR1cm4gMDsKLQotICAgIGlmIChpc19zdGVyZW8pCi0JcmV0dXJuIChhYzk3X3NjYWxlX3RvX29zc192YWwgKHZhbHVlICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgOCkKLQl8IChhYzk3X3NjYWxlX3RvX29zc192YWwgKCh2YWx1ZSA+PiA4KSAmIDI1NSwgbWF4dmFsLCAwLCBpbnYpIDw8IDApOwotICAgIGVsc2UgewotCWludCBpOwotCQotCS8qIEludmVydGVkLiAqLwotCWlmIChpbnYpCi0JICAgIHZhbHVlID0gbWF4dmFsIC0gdmFsdWU7Ci0KLQlpID0gKHZhbHVlICogMTAwICsgKG1heHZhbCAvIDIpKSAvIG1heHZhbDsKLQlpZiAoaSA+IDEwMCkKLQkgICAgIGkgPSAxMDA7Ci0JaWYgKGkgPCAwKQotCSAgICBpID0gMDsKLQlyZXR1cm4gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWFjOTdfc2NhbGVfZnJvbV9vc3NfdmFsIChpbnQgdmFsdWUsIGludCBtYXh2YWwsIGludCBpc19zdGVyZW8sIGludCBpbnYpCi17Ci0gICAgaWYgKGlzX3N0ZXJlbykKLQlyZXR1cm4gKGFjOTdfc2NhbGVfZnJvbV9vc3NfdmFsICh2YWx1ZSAmIDI1NSwgbWF4dmFsLCAwLCBpbnYpIDw8IDgpCi0JfCAoYWM5N19zY2FsZV9mcm9tX29zc192YWwgKCh2YWx1ZSA+PiA4KSAmIDI1NSwgbWF4dmFsLCAwLCBpbnYpIDw8IDApOwotICAgIGVsc2UgewotCWludCBpID0gKCh2YWx1ZSAmIDI1NSkgKiBtYXh2YWwgKyA1MCkgLyAxMDA7Ci0JaWYgKGludikKLQkgICAgaSA9IG1heHZhbCAtIGk7Ci0JaWYgKGkgPCAwKQotCSAgICBpID0gMDsKLQlpZiAoaSA+IG1heHZhbCkKLQkgICAgaSA9IG1heHZhbDsKLQlyZXR1cm4gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWFjOTdfc2V0X21peGVyIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX2NoYW5uZWwsIHUxNiBvc3NfdmFsdWUpCi17Ci0gICAgaW50IHNjYWxlZF92YWx1ZTsKLSAgICBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2hhbm5lbCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIG9zc19jaGFubmVsKTsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICBpZiAoISBhYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKGRldiwgY2hhbm5lbCkpCi0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgc2NhbGVkX3ZhbHVlID0gYWM5N19zY2FsZV9mcm9tX29zc192YWwgKG9zc192YWx1ZSwgY2hhbm5lbC0+bWF4dmFsLAotCQkJCQkgICAgY2hhbm5lbC0+aXNfc3RlcmVvLCAKLQkJCQkJICAgIGNoYW5uZWwtPmlzX2ludmVydGVkKTsKLSAgICBpZiAoc2NhbGVkX3ZhbHVlIDwgMCkKLQlyZXR1cm4gc2NhbGVkX3ZhbHVlOwotCi0gICAgaWYgKGNoYW5uZWwtPnJlZ21hc2sgIT0gMCkgewotCWludCBtdjsKLQotCWludCBvbGR2YWwgPSBhYzk3X2dldF9yZWdpc3RlciAoZGV2LCBjaGFubmVsLT5hYzk3X3JlZ251bSk7Ci0JaWYgKG9sZHZhbCA8IDApCi0JICAgIHJldHVybiBvbGR2YWw7Ci0KLQlmb3IgKG12ID0gY2hhbm5lbC0+cmVnbWFzazsgISAobXYgJiAxKTsgbXYgPj49IDEpCi0JICAgIHNjYWxlZF92YWx1ZSA8PD0gMTsKLQotCXNjYWxlZF92YWx1ZSAmPSBjaGFubmVsLT5yZWdtYXNrOwotCXNjYWxlZF92YWx1ZSB8PSAob2xkdmFsICYgfmNoYW5uZWwtPnJlZ21hc2spOwotICAgIH0KLSAgICByZXN1bHQgPSBhYzk3X3B1dF9yZWdpc3RlciAoZGV2LCBjaGFubmVsLT5hYzk3X3JlZ251bSwgc2NhbGVkX3ZhbHVlKTsKLSAgICBpZiAocmVzdWx0ID09IDApCi0JZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tvc3NfY2hhbm5lbF0gPSBvc3NfdmFsdWU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludAotYWM5N19nZXRfbWl4ZXJfc2NhbGVkIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX2NoYW5uZWwpCi17Ci0gICAgc3RydWN0IGFjOTdfY2huX2Rlc2MgKmNoYW5uZWwgPSBhYzk3X2ZpbmRfY2huZGVzYyAoZGV2LCBvc3NfY2hhbm5lbCk7Ci0gICAgaW50IHJlZ3ZhbDsKLQotICAgIGlmIChjaGFubmVsID09IE5VTEwpCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoISBhYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKGRldiwgY2hhbm5lbCkpCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICByZWd2YWwgPSBhYzk3X2dldF9yZWdpc3RlciAoZGV2LCBjaGFubmVsLT5hYzk3X3JlZ251bSk7Ci0KLSAgICBpZiAocmVndmFsIDwgMCkKLQlyZXR1cm4gcmVndmFsOwotCi0gICAgaWYgKGNoYW5uZWwtPnJlZ21hc2sgIT0gMCkgewotCWludCBtdjsKLQotCXJlZ3ZhbCAmPSBjaGFubmVsLT5yZWdtYXNrOwotCi0JZm9yIChtdiA9IGNoYW5uZWwtPnJlZ21hc2s7ICEgKG12ICYgMSk7IG12ID4+PSAxKQotCSAgICByZWd2YWwgPj49IDE7Ci0gICAgfQotICAgIHJldHVybiBhYzk3X3NjYWxlX3RvX29zc192YWwgKHJlZ3ZhbCwgY2hhbm5lbC0+bWF4dmFsLAotCQkJCSAgY2hhbm5lbC0+aXNfc3RlcmVvLCAKLQkJCQkgIGNoYW5uZWwtPmlzX2ludmVydGVkKTsKLX0KLQotc3RhdGljIGludAotYWM5N19nZXRfcmVjbWFzayAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKLXsKLSAgICBpbnQgcmVjUmVnID0gYWM5N19nZXRfcmVnaXN0ZXIgKGRldiwgQUM5N19SRUNPUkRfU0VMRUNUKTsKLQotICAgIGlmIChyZWNSZWcgPCAwKQotCXJldHVybiByZWNSZWc7Ci0gICAgZWxzZSB7Ci0JaW50IHg7Ci0JZm9yICh4ID0gMDsgbWl4ZXJSZWdzW3hdLmFjOTdfcmVnbnVtID49IDA7IHgrKykgewotCSAgICBpZiAobWl4ZXJSZWdzW3hdLnJlY29yZE51bSA9PSAocmVjUmVnICYgNykpCi0JCXJldHVybiBtaXhlclJlZ3NbeF0ub3NzX21hc2s7Ci0JfQotCXJldHVybiAtRU5PREVWOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWM5N19zZXRfcmVjbWFzayAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgaW50IG9zc19yZWNtYXNrKQotewotICAgIGludCB4OwotCi0gICAgaWYgKG9zc19yZWNtYXNrID09IDApCi0Jb3NzX3JlY21hc2sgPSBTT1VORF9NSVhFUl9NSUM7Ci0KLSAgICBmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gPj0gMDsgeCsrKSB7IAotCWlmICgobWl4ZXJSZWdzW3hdLnJlY29yZE51bSA+PSAwKQotCSAgICAgJiYgKG9zc19yZWNtYXNrICYgbWl4ZXJSZWdzW3hdLm9zc19tYXNrKSkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gPCAwKQotCXJldHVybiAtRU5PREVWOwotICAgIGVsc2UgewotCWludCByZWd2YWwgPSAobWl4ZXJSZWdzW3hdLnJlY29yZE51bSA8PCA4KSB8IG1peGVyUmVnc1t4XS5yZWNvcmROdW07Ci0JaW50IHJlcyA9IGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsIEFDOTdfUkVDT1JEX1NFTEVDVCwgcmVndmFsKTsKLQlpZiAocmVzID09IDApCi0JICAgIHJldHVybiBhYzk3X2dldF9yZWNtYXNrIChkZXYpOwotCWVsc2UKLQkgICAgcmV0dXJuIHJlczsKLSAgICB9Ci19Ci0KLS8qIFNldCB0aGUgbWl4ZXIgREVWIHRvIHRoZSBsaXN0IG9mIHZhbHVlcyBpbiBWQUxVRV9MSVNULiAgUmV0dXJuIDAgb24KLSAgIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCi1pbnQKLWFjOTdfc2V0X3ZhbHVlcyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgCi0JCSBzdHJ1Y3QgYWM5N19taXhlcl92YWx1ZV9saXN0ICp2YWx1ZV9saXN0KQotewotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgdmFsdWVfbGlzdFt4XS5vc3NfY2hhbm5lbCAhPSAtMTsgeCsrKSB7Ci0JaW50IGNobnVtID0gdmFsdWVfbGlzdFt4XS5vc3NfY2hhbm5lbDsKLQlzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2hlbnQgPSBhYzk3X2ZpbmRfY2huZGVzYyAoZGV2LCBjaG51bSk7Ci0JaWYgKGNoZW50ICE9IE5VTEwpIHsKLQkgICAgdTE2IHZhbDsKLQkgICAgaW50IHJlczsKLQotCSAgICBpZiAoY2hlbnQtPmlzX3N0ZXJlbykKLQkJdmFsID0gKHZhbHVlX2xpc3RbeF0udmFsdWUuc3RlcmVvLnJpZ2h0IDw8IDgpIAotCQkgICAgICB8IHZhbHVlX2xpc3RbeF0udmFsdWUuc3RlcmVvLmxlZnQ7Ci0JICAgIGVsc2UgewotCQkvKiBXZSBkbyB0aGlzIHNvIHRoZSByZXR1cm5lZCB2YWx1ZSBsb29rcyBPSyBpbiB0aGUKLQkJICAgbWl4ZXIgYXBwLiAgSXQncyBub3QgbmVjZXNzYXJ5IG90aGVyd2lzZS4gICovCi0JCXZhbCA9ICh2YWx1ZV9saXN0W3hdLnZhbHVlLm1vbm8gPDwgOCkgCi0JCSAgICAgIHwgdmFsdWVfbGlzdFt4XS52YWx1ZS5tb25vOwotCSAgICB9Ci0JICAgIHJlcyA9IGFjOTdfc2V0X21peGVyIChkZXYsIGNobnVtLCB2YWwpOwotCSAgICBpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHJlczsKLQl9Ci0JZWxzZQotCSAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotYWM5N19taXhlcl9pb2N0bCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgotCXJldCA9IGFjOTdfZ2V0X3JlY21hc2sgKGRldik7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKLQl7Ci0JICAgIGlmIChnZXRfdXNlciAocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQlyZXQgPSAtRUZBVUxUOwotCSAgICBlbHNlCi0JCXJldCA9IGFjOTdfc2V0X3JlY21hc2sgKGRldiwgcmV0KTsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfQ0FQUzoKLQlyZXQgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgotCXJldCA9IGRldi0+bWl4ZXJfZGV2bWFzazsKLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLOgotCXJldCA9IGRldi0+bWl4ZXJfcmVjbWFzazsKLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgotCXJldCA9IGRldi0+bWl4ZXJfc3RlcmVvbWFzazsKLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JLyogUmVhZCBvciB3cml0ZSByZXF1ZXN0LiAqLwotCXJldCA9IC1FSU5WQUw7Ci0JaWYgKF9JT0NfVFlQRSAoY21kKSA9PSAnTScpIHsKLQkgICAgaW50IGRpciA9IF9TSU9DX0RJUiAoY21kKTsKLQkgICAgaW50IGNoYW5uZWwgPSBfSU9DX05SIChjbWQpOwotCi0JICAgIGlmIChjaGFubmVsID49IDAgJiYgY2hhbm5lbCA8IFNPVU5EX01JWEVSX05SREVWSUNFUykgewotCQlyZXQgPSAwOwotCQlpZiAoZGlyICYgX1NJT0NfV1JJVEUpIHsKLQkJICAgIGludCB2YWw7Ci0JCSAgICBpZiAoZ2V0X3VzZXIgKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKSA9PSAwKQotCQkJcmV0ID0gYWM5N19zZXRfbWl4ZXIgKGRldiwgY2hhbm5lbCwgdmFsKTsKLQkJICAgIGVsc2UKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKHJldCA+PSAwICYmIChkaXIgJiBfU0lPQ19SRUFEKSkgewotCQkgICAgaWYgKGRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF0KLQkJCT09IEFDOTdfUkVHVkFMX1VOS05PV04pCi0JCQlkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW2NoYW5uZWxdCi0JCQkgICAgPSBhYzk3X2dldF9taXhlcl9zY2FsZWQgKGRldiwgY2hhbm5lbCk7Ci0JCSAgICByZXQgPSBkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW2NoYW5uZWxdOwotCQl9Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJldCA8IDApCi0JcmV0dXJuIHJldDsKLSAgICBlbHNlCi0JcmV0dXJuIHB1dF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKTsKLX0KLQotRVhQT1JUX1NZTUJPTChhYzk3X2luaXQpOwotRVhQT1JUX1NZTUJPTChhYzk3X3NldF92YWx1ZXMpOwotRVhQT1JUX1NZTUJPTChhYzk3X3B1dF9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGFjOTdfbWl4ZXJfaW9jdGwpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hYzk3LmggYi9zb3VuZC9vc3MvYWM5Ny5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTgzN2E5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hYzk3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIGFjOTcuaCAKLSAqIAotICogZGVmaW5pdGlvbnMgZm9yIHRoZSBBQzk3LCBJbnRlbCdzIEF1ZGlvIENvZGVjIDk3IFNwZWMKLSAqIGFsc28gaW5jbHVkZXMgc3VwcG9ydCBmb3IgYSBnZW5lcmljIEFDOTcgaW50ZXJmYWNlCi0gKi8KLQotI2lmbmRlZiBfQUM5N19IXwotI2RlZmluZSBfQUM5N19IXwotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotI2luY2x1ZGUgInNvdW5kX2NhbGxzLmgiCi0KLSNkZWZpbmUgIEFDOTdfUkVTRVQgICAgICAgICAgICAgIDB4MDAwMCAgICAgIC8vCi0jZGVmaW5lICBBQzk3X01BU1RFUl9WT0xfU1RFUkVPICAweDAwMDIgICAgICAvLyBMaW5lIE91dAotI2RlZmluZSAgQUM5N19IRUFEUEhPTkVfVk9MICAgICAgMHgwMDA0ICAgICAgLy8gCi0jZGVmaW5lICBBQzk3X01BU1RFUl9WT0xfTU9OTyAgICAweDAwMDYgICAgICAvLyBUQUQgT3V0cHV0Ci0jZGVmaW5lICBBQzk3X01BU1RFUl9UT05FICAgICAgICAweDAwMDggICAgICAvLwotI2RlZmluZSAgQUM5N19QQ0JFRVBfVk9MICAgICAgICAgMHgwMDBhICAgICAgLy8gbm9uZQotI2RlZmluZSAgQUM5N19QSE9ORV9WT0wgICAgICAgICAgMHgwMDBjICAgICAgLy8gVEFEIElucHV0IChtb25vKQotI2RlZmluZSAgQUM5N19NSUNfVk9MICAgICAgICAgICAgMHgwMDBlICAgICAgLy8gTUlDIElucHV0IChtb25vKQotI2RlZmluZSAgQUM5N19MSU5FSU5fVk9MICAgICAgICAgMHgwMDEwICAgICAgLy8gTGluZSBJbnB1dCAoc3RlcmVvKQotI2RlZmluZSAgQUM5N19DRF9WT0wgICAgICAgICAgICAgMHgwMDEyICAgICAgLy8gQ0QgSW5wdXQgKHN0ZXJlbykKLSNkZWZpbmUgIEFDOTdfVklERU9fVk9MICAgICAgICAgIDB4MDAxNCAgICAgIC8vIG5vbmUKLSNkZWZpbmUgIEFDOTdfQVVYX1ZPTCAgICAgICAgICAgIDB4MDAxNiAgICAgIC8vIEF1eCBJbnB1dCAoc3RlcmVvKQotI2RlZmluZSAgQUM5N19QQ01PVVRfVk9MICAgICAgICAgMHgwMDE4ICAgICAgLy8gV2F2ZSBPdXRwdXQgKHN0ZXJlbykKLSNkZWZpbmUgIEFDOTdfUkVDT1JEX1NFTEVDVCAgICAgIDB4MDAxYSAgICAgIC8vCi0jZGVmaW5lICBBQzk3X1JFQ09SRF9HQUlOICAgICAgICAweDAwMWMKLSNkZWZpbmUgIEFDOTdfUkVDT1JEX0dBSU5fTUlDICAgIDB4MDAxZQotI2RlZmluZSAgQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgMHgwMDIwCi0jZGVmaW5lICBBQzk3XzNEX0NPTlRST0wgICAgICAgICAweDAwMjIKLSNkZWZpbmUgIEFDOTdfTU9ERU1fUkFURSAgICAgICAgIDB4MDAyNAotI2RlZmluZSAgQUM5N19QT1dFUl9DT05UUk9MICAgICAgMHgwMDI2Ci0KLS8qIHJlZ2lzdGVycyAweDAwMjggLSAweDAwNTggYXJlIHJlc2VydmVkICovCi0KLS8qIEFDJzk3IDIuMCAqLwotI2RlZmluZSBBQzk3X0VYVEVOREVEX0lECTB4MDAyOAkvKiBFeHRlbmRlZCBBdWRpbyBJRCAqLwotI2RlZmluZSBBQzk3X0VYVEVOREVEX1NUQVRVUwkweDAwMkEJLyogRXh0ZW5kZWQgQXVkaW8gU3RhdHVzICovCi0jZGVmaW5lIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFIDB4MDAyQyAgLyogUENNIEZyb250IERBQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfUENNX1NVUlJfREFDX1JBVEUgIDB4MDAyRSAgLyogUENNIFN1cnJvdW5kIERBQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfUENNX0xGRV9EQUNfUkFURSAgIDB4MDAzMCAgLyogUENNIExGRSBEQUMgUmF0ZSAqLwotI2RlZmluZSBBQzk3X1BDTV9MUl9BRENfUkFURQkweDAwMzIJLyogUENNIExSIERBQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfUENNX01JQ19BRENfUkFURSAgIDB4MDAzNCAgLyogUENNIE1JQyBBREMgUmF0ZSAqLwotI2RlZmluZSBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSICAweDAwMzYgIC8qIENlbnRlciArIExGRSBNYXN0ZXIgVm9sdW1lICovCi0jZGVmaW5lIEFDOTdfU1VSUk9VTkRfTUFTVEVSICAgIDB4MDAzOCAgLyogU3Vycm91bmQgKFJlYXIpIE1hc3RlciBWb2x1bWUgKi8KLSNkZWZpbmUgQUM5N19SRVNFUlZFRF8zQQkweDAwM0EJLyogUmVzZXJ2ZWQgKi8KLS8qIHJhbmdlIDB4M2MtMHg1OCAtIE1PREVNICovCi0KLS8qIHJlZ2lzdGVycyAweDAwNWEgLSAweDAwN2EgYXJlIHZlbmRvciByZXNlcnZlZCAqLwotCi0jZGVmaW5lICBBQzk3X1ZFTkRPUl9JRDEgICAgICAgICAweDAwN2MKLSNkZWZpbmUgIEFDOTdfVkVORE9SX0lEMiAgICAgICAgIDB4MDA3ZQotCi0vKiB2b2x1bWUgY29udHJvbCBiaXQgZGVmaW5lcyAqLwotCi0jZGVmaW5lIEFDOTdfTVVURSAgICAgICAgICAgICAgICAweDgwMDAKLSNkZWZpbmUgQUM5N19NSUNCT09TVCAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBBQzk3X0xFRlRWT0wgICAgICAgICAgICAgMHgzZjAwCi0jZGVmaW5lIEFDOTdfUklHSFRWT0wgICAgICAgICAgICAweDAwM2YKLQotLyogcmVjb3JkIG11eCBkZWZpbmVzICovCi0KLSNkZWZpbmUgQUM5N19SRUNNVVhfTUlDICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBBQzk3X1JFQ01VWF9DRCAgICAgICAgICAgMHgwMTAxCi0jZGVmaW5lIEFDOTdfUkVDTVVYX1ZJREVPICAgICAgICAweDAyMDIgICAgICAvKiBub3QgdXNlZCAqLwotI2RlZmluZSBBQzk3X1JFQ01VWF9BVVggICAgICAgICAgMHgwMzAzICAgICAgCi0jZGVmaW5lIEFDOTdfUkVDTVVYX0xJTkUgICAgICAgICAweDA0MDQgICAgICAKLSNkZWZpbmUgQUM5N19SRUNNVVhfU1RFUkVPX01JWCAgIDB4MDUwNQotI2RlZmluZSBBQzk3X1JFQ01VWF9NT05PX01JWCAgICAgMHgwNjA2Ci0jZGVmaW5lIEFDOTdfUkVDTVVYX1BIT05FICAgICAgICAweDA3MDcKLQotCi0vKiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgYml0IGRlZmluZXMgKi8KLQotI2RlZmluZSBBQzk3X0dQX0xQQksgICAgICAgICAgICAgMHgwMDgwICAgICAgLyogTG9vcGJhY2sgbW9kZSAqLwotI2RlZmluZSBBQzk3X0dQX01TICAgICAgICAgICAgICAgMHgwMTAwICAgICAgLyogTWljIFNlbGVjdCAwPU1pYzEsIDE9TWljMiAqLwotI2RlZmluZSBBQzk3X0dQX01JWCAgICAgICAgICAgICAgMHgwMjAwICAgICAgLyogTW9ubyBvdXRwdXQgc2VsZWN0IDA9TWl4LCAxPU1pYyAqLwotI2RlZmluZSBBQzk3X0dQX1JMQksgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogUmVtb3RlIExvb3BiYWNrIC0gTW9kZW0gbGluZSBjb2RlYyAqLwotI2RlZmluZSBBQzk3X0dQX0xMQksgICAgICAgICAgICAgMHgwODAwICAgICAgLyogTG9jYWwgTG9vcGJhY2sgLSBNb2RlbSBMaW5lIGNvZGVjICovCi0jZGVmaW5lIEFDOTdfR1BfTEQgICAgICAgICAgICAgICAweDEwMDAgICAgICAvKiBMb3VkbmVzcyAxPW9uICovCi0jZGVmaW5lIEFDOTdfR1BfM0QgICAgICAgICAgICAgICAweDIwMDAgICAgICAvKiAzRCBFbmhhbmNlbWVudCAxPW9uICovCi0jZGVmaW5lIEFDOTdfR1BfU1QgICAgICAgICAgICAgICAweDQwMDAgICAgICAvKiBTdGVyZW8gRW5oYW5jZW1lbnQgMT1vbiAqLwotI2RlZmluZSBBQzk3X0dQX1BPUCAgICAgICAgICAgICAgMHg4MDAwICAgICAgLyogUGNtIE91dCBQYXRoLCAwPXByZSAzRCwgMT1wb3N0IDNEICovCi0KLQotLyogcG93ZXJkb3duIGNvbnRyb2wgYW5kIHN0YXR1cyBiaXQgZGVmaW5lcyAqLwotCi0vKiBzdGF0dXMgKi8KLSNkZWZpbmUgQUM5N19QV1JfTURNICAgICAgICAgICAgIDB4MDAxMCAgICAgIC8qIE1vZGVtIHNlY3Rpb24gcmVhZHkgKi8KLSNkZWZpbmUgQUM5N19QV1JfUkVGICAgICAgICAgICAgIDB4MDAwOCAgICAgIC8qIFZyZWYgbm9taW5hbCAqLwotI2RlZmluZSBBQzk3X1BXUl9BTkwgICAgICAgICAgICAgMHgwMDA0ICAgICAgLyogQW5hbG9nIHNlY3Rpb24gcmVhZHkgKi8KLSNkZWZpbmUgQUM5N19QV1JfREFDICAgICAgICAgICAgIDB4MDAwMiAgICAgIC8qIERBQyBzZWN0aW9uIHJlYWR5ICovCi0jZGVmaW5lIEFDOTdfUFdSX0FEQyAgICAgICAgICAgICAweDAwMDEgICAgICAvKiBBREMgc2VjdGlvbiByZWFkeSAqLwotCi0vKiBjb250cm9sICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSMCAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBBREMgYW5kIE11eCBwb3dlcmRvd24gKi8KLSNkZWZpbmUgQUM5N19QV1JfUFIxICAgICAgICAgICAgIDB4MDIwMCAgICAgIC8qIERBQyBwb3dlcmRvd24gKi8KLSNkZWZpbmUgQUM5N19QV1JfUFIyICAgICAgICAgICAgIDB4MDQwMCAgICAgIC8qIE91dHB1dCBtaXhlciBwb3dlcmRvd24gKFZyZWYgb24pICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSMyAgICAgICAgICAgICAweDA4MDAgICAgICAvKiBPdXRwdXQgbWl4ZXIgcG93ZXJkb3duIChWcmVmIG9mZikgKi8KLSNkZWZpbmUgQUM5N19QV1JfUFI0ICAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIEFDLWxpbmsgcG93ZXJkb3duICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSNSAgICAgICAgICAgICAweDIwMDAgICAgICAvKiBJbnRlcm5hbCBDbGsgZGlzYWJsZSAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjYgICAgICAgICAgICAgMHg0MDAwICAgICAgLyogSFAgYW1wIHBvd2VyZG93biAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjcgICAgICAgICAgICAgMHg4MDAwICAgICAgLyogTW9kZW0gb2ZmIC0gaWYgc3VwcG9ydGVkICovCi0KLS8qIHVzZWZ1bCBwb3dlciBzdGF0ZXMgKi8KLSNkZWZpbmUgQUM5N19QV1JfRDAgICAgICAgICAgICAgIDB4MDAwMCAgICAgIC8qIGV2ZXJ5dGhpbmcgb24gKi8KLSNkZWZpbmUgQUM5N19QV1JfRDEgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFI0Ci0jZGVmaW5lIEFDOTdfUFdSX0QyICAgICAgICAgICAgICBBQzk3X1BXUl9QUjB8QUM5N19QV1JfUFIxfEFDOTdfUFdSX1BSMnxBQzk3X1BXUl9QUjN8QUM5N19QV1JfUFI0Ci0jZGVmaW5lIEFDOTdfUFdSX0QzICAgICAgICAgICAgICBBQzk3X1BXUl9QUjB8QUM5N19QV1JfUFIxfEFDOTdfUFdSX1BSMnxBQzk3X1BXUl9QUjN8QUM5N19QV1JfUFI0Ci0jZGVmaW5lIEFDOTdfUFdSX0FOTE9GRiAgICAgICAgICBBQzk3X1BXUl9QUjJ8QUM5N19QV1JfUFIzICAvKiBhbmFsb2cgc2VjdGlvbiBvZmYgKi8KLQotLyogVG90YWwgbnVtYmVyIG9mIGRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLSNkZWZpbmUgQUM5N19SRUdfQ05UIDY0Ci0KLS8qIEdlbmVyaWMgQUM5NyBtaXhlciBpbnRlcmZhY2UuICovCi0KLS8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUuICovCi1zdHJ1Y3QgYWM5N19od2ludAotewotICAgIC8qIFBlcmZvcm0gYW55IGhhcmR3YXJlLXNwZWNpZmljIHJlc2V0IGFuZCBpbml0aWFsaXphdGlvbi4gIFJldHVybnMKLSAgICAgMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLwotICAgIGludCAoKnJlc2V0X2RldmljZSkgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpOwotCi0gICAgLyogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlciBSRUcuICBUaGUgY2FsbGVyCi0gICAgICAgc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVzaXJlZCBjb250ZW50cyBhcmUgYXZhaWxhYmxlIGluCi0gICAgICAgdGhlIGNhY2hlIGZpcnN0LCBpZiBhcHBsaWNhYmxlLiBSZXR1cm5zIGEgcG9zaXRpdmUgdW5zaWduZWQgdmFsdWUKLSAgICAgICByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWdpc3Rlciwgb3IgYSBuZWdhdGl2ZSBlcnJvcgotICAgICAgIGNvZGUuICAqLwotICAgIGludCAoKnJlYWRfcmVnKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnKTsKLQotICAgIC8qIFdyaXRlcyBWQUxVRSB0byByZWdpc3RlciBSRUcuICBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYQotICAgICAgIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLwotICAgIGludCAoKndyaXRlX3JlZykgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKTsKLQotICAgIC8qIEhhcmR3YXJlLXNwZWNpZmljIGluZm9ybWF0aW9uLiAqLwotICAgIHZvaWQgKmRyaXZlcl9wcml2YXRlOwotCi0gICAgLyogVGhyZWUgT1NTIG1hc2tzLiAqLwotICAgIGludCBtaXhlcl9kZXZtYXNrOwotICAgIGludCBtaXhlcl9zdGVyZW9tYXNrOwotICAgIGludCBtaXhlcl9yZWNtYXNrOwotCi0gICAgLyogVGhlIG1peGVyIGNhY2hlLiBUaGUgaW5kaWNlcyBjb3JyZXNwb25kIHRvIHRoZSBBQzk3IGhhcmR3YXJlIHJlZ2lzdGVyCi0gICAgICAgbnVtYmVyIC8gMiwgc2luY2UgdGhlIHJlZ2lzdGVyIG51bWJlcnMgYXJlIGFsd2F5cyBhbiBldmVuIG51bWJlci4KLQotICAgICAgIFVua25vd24gdmFsdWVzIGFyZSBzZXQgdG8gLTE7IHVuc3VwcG9ydGVkIHJlZ2lzdGVycyBjb250YWluIGEKLSAgICAgICAtMi4gICovCi0gICAgaW50IGxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbQUM5N19SRUdfQ05UXTsKLQotICAgIC8qIEEgY2FjaGUgb2YgdmFsdWVzIHdyaXR0ZW4gdmlhIE9TUzsgd2UgbmVlZCB0aGVzZSBzbyB3ZSBjYW4gcmV0dXJuCi0gICAgICAgdGhlIHZhbHVlcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgdGhlIHVzZXIuCi0KLSAgICAgICBXaHkgdGhlIG9yaWdpbmFsIHVzZXIgdmFsdWVzPyAgQmVjYXVzZSB0aGUgcmVhbC13b3JsZCBoYXJkd2FyZQotICAgICAgIGhhcyBsZXNzIHByZWNpc2lvbiwgYW5kIHNvbWUgZXhpc3RpbmcgYXBwbGljYXRpb25zIGFzc3VtZSB0aGF0Ci0gICAgICAgdGhleSB3aWxsIGdldCBiYWNrIHRoZSBleGFjdCB2YWx1ZSB0aGF0IHRoZXkgd3JvdGUgKGF1bWl4KS4KLQotICAgICAgIEEgLTEgdmFsdWUgaW5kaWNhdGVzIHRoYXQgbm8gdmFsdWUgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGlzIG1peGVyCi0gICAgICAgY2hhbm5lbCB2aWEgT1NTLiAgKi8KLSAgICBpbnQgbGFzdF93cml0dGVuX09TU192YWx1ZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKLX07Ci0KLS8qIFZhbHVlcyBzdG9yZWQgaW4gdGhlIHJlZ2lzdGVyIGNhY2hlLiAgKi8KLSNkZWZpbmUgQUM5N19SRUdWQUxfVU5LTk9XTiAtMQotI2RlZmluZSBBQzk3X1JFR19VTlNVUFBPUlRFRCAtMgotCi1zdHJ1Y3QgYWM5N19taXhlcl92YWx1ZV9saXN0Ci17Ci0gICAgLyogTWl4ZXIgY2hhbm5lbCB0byBzZXQuICBMaXN0IGlzIHRlcm1pbmF0ZWQgYnkgYSB2YWx1ZSBvZiAtMS4gICovCi0gICAgaW50IG9zc19jaGFubmVsOwotICAgIC8qIFRoZSBzY2FsZWQgdmFsdWUgdG8gc2V0IGl0IHRvOyB2YWx1ZXMgZ2VuZXJhbGx5IHJhbmdlIGZyb20gMC0xMDAuICovCi0gICAgdW5pb24gewotCXN0cnVjdCB7Ci0JICAgIHU4IGxlZnQsIHJpZ2h0OwotCX0gc3RlcmVvOwotCXU4IG1vbm87Ci0gICAgfSB2YWx1ZTsKLX07Ci0KLS8qIEluaXRpYWxpemUgdGhlIGFjOTcgbWl4ZXIgYnkgcmVzZXR0aW5nIGl0LiAgKi8KLWV4dGVybiBpbnQgYWM5N19pbml0IChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KTsKLQotLyogU2V0cyB0aGUgbWl4ZXIgREVWIHRvIHRoZSB2YWx1ZXMgaW4gVkFMVUVfTElTVC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLAotICAgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KLWV4dGVybiBpbnQgYWM5N19zZXRfdmFsdWVzIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LAotCQkJICAgIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgKnZhbHVlX2xpc3QpOwotCi0vKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBWQUxVRSB0byB0aGUgQUM5NyByZWdpc3RlciBSRUcgaW4gdGhlIG1peGVyLgotICAgVGFrZXMgY2FyZSBvZiBzZXR0aW5nIHRoZSBsYXN0LXdyaXR0ZW4gY2FjaGUgYXMgd2VsbC4gICovCi1leHRlcm4gaW50IGFjOTdfcHV0X3JlZ2lzdGVyIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcsIHUxNiB2YWx1ZSk7Ci0KLS8qIERlZmF1bHQgaW9jdGwuICovCi1leHRlcm4gaW50IGFjOTdfbWl4ZXJfaW9jdGwgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgIHZvaWQgX191c2VyICogYXJnKTsKLQotI2VuZGlmCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hY2kuYyBiL3NvdW5kL29zcy9hY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmYWMzNy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTIgKzAsMCBAQAotLyoKLSAqIEF1ZGlvIENvbW1hbmQgSW50ZXJmYWNlIChBQ0kpIGRyaXZlciAoc291bmQvYWNpLmMpCi0gKgotICogQUNJIGlzIGEgcHJvdG9jb2wgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtaWNyb2NvbnRyb2xsZXIgb24KLSAqIHNvbWUgc291bmQgY2FyZHMgcHJvZHVjZWQgYnkgbWlybywgZS5nLiB0aGUgbWlyb1NPVU5EIFBDTTEyIGFuZAotICogUENNMjAuIFRoZSBBQ0kgaGFzIGJlZW4gZGV2ZWxvcGVkIGZvciBtaXJvIGJ5IE5vcmJlcnRvIFBlbGxpY2NpCi0gKiA8cGVsbGljY2lAaG9tZS5jb20+LiBTcGVjaWFsIHRoYW5rcyB0byBib3RoIGhpbSBhbmQgbWlybyBmb3IKLSAqIHByb3ZpZGluZyB0aGUgQUNJIHNwZWNpZmljYXRpb24uCi0gKgotICogVGhlIG1haW4gZnVuY3Rpb24gb2YgdGhlIEFDSSBpcyB0byBjb250cm9sIHRoZSBtaXhlciBhbmQgdG8gZ2V0IGEKLSAqIHByb2R1Y3QgaWRlbnRpZmljYXRpb24uIE9uIHRoZSBQQ00yMCwgQUNJIGFsc28gY29udHJvbHMgdGhlIHJhZGlvCi0gKiB0dW5lciBvbiB0aGlzIGNhcmQsIHRoaXMgaXMgc3VwcG9ydGVkIGluIHRoZSBWaWRlbyBmb3IgTGludXggCi0gKiBtaXJvcGNtMjAgZHJpdmVyLgotICogLQotICogVGhpcyBpcyBhIGZ1bGxmZWF0dXJlZCBpbXBsZW1lbnRhdGlvbi4gVW5zdXBwb3J0ZWQgZmVhdHVyZXMKLSAqIGFyZSBidWdzLi4uICg6Ci0gKgotICogSXQgaXMgbm90IGxvbmdlciBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgbWFkMTYgbW9kdWxlIGZpcnN0LiBUaGUKLSAqIHVzZXIgaXMgY3VycmVudGx5IHJlc3BvbnNpYmxlIHRvIHNldCB0aGUgbWFkMTYgbWl4ZXIgY29ycmVjdGx5LgotICoKLSAqIFRvIHRvZ2dsZSB0aGUgc29sbyBtb2RlIGZvciBmdWxsIGR1cGxleCBvcGVyYXRpb24ganVzdCB1c2UgdGhlIE9TUwotICogcmVjb3JkIHN3aXRjaCBmb3IgdGhlIHBjbSAoJ3dhdmUnKSBjb250cm9sbGVyLiAgICAgICAgICAgUm9iZXJ0Ci0gKiAtCi0gKgotICogUmV2aXNpb24gaGlzdG9yeToKLSAqCi0gKiAgIDE5OTUtMTEtMTAgIE1hcmt1cyBLdWhuIDxtc2t1aG5AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgotICogICAgICAgIEZpcnN0IHZlcnNpb24gd3JpdHRlbi4KLSAqICAgMTk5NS0xMi0zMSAgTWFya3VzIEt1aG4KLSAqICAgICAgICBTZWNvbmQgcmV2aXNpb24sIGdlbmVyYWwgY29kZSBjbGVhbnVwLgotICogICAxOTk2LTA1LTE2CSBIYW5udSBTYXZvbGFpbmVuCi0gKgkgIEludGVncmF0ZWQgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgZHJpdmVyLgotICogICAxOTk2LTA1LTI4ICBNYXJrdXMgS3VobgotICogICAgICAgIEluaXRpYWxpemUgQ1M0MjMxQSBtaXhlciwgbWFrZSBBQ0kgZmlyc3QgbWl4ZXIsCi0gKiAgICAgICAgdXNlIG5ldyBwcml2YXRlIG1peGVyIEFQSSBmb3Igc29sbyBtb2RlLgotICogICAxOTk4LTA4LTE4ICBSdXVyZCBSZWl0c21hIDxSLkEuUmVpdHNtYUB3Ym10LnR1ZGVsZnQubmw+Ci0gKgkgIFNtYWxsIG1vZGlmaWNhdGlvbiB0byBleHBvcnQgQUNJIGZ1bmN0aW9ucyBhbmQgCi0gKgkgIGNvbXBsZXRlIG1vZHVsYXJpc2F0aW9uLgotICogICAyMDAwLTA2LTIwICBSb2JlcnQgU2llbWVyIDxSb2JlcnQuU2llbWVyQGdteC5kZT4KLSAqICAgICAgICBEb24ndCBpbml0aWFsaXplIHRoZSBDUzQyMzFBIG1peGVyIGFueW1vcmUsIHNvIHRoZSBjb2RlIGlzCi0gKiAgICAgICAgd29ya2luZyBhZ2FpbiwgYW5kIG90aGVyIHNtYWxsIGNoYW5nZXMgdG8gZml0IGluIHRvZGF5cwotICogICAgICAgIGtlcm5lbHMuCi0gKiAgIDIwMDAtMDgtMjYgIFJvYmVydCBTaWVtZXIKLSAqICAgICAgICBDbGVhbiB1cCBhbmQgcmV3cml0ZSBmb3IgMi40LnguIE1heWJlIGl0J3MgU01QIHNhZmUgbm93Li4uICg6Ci0gKiAgICAgICAgaW9jdGwgYnVnZml4LCBhbmQgaW50ZWdyYXRpb24gb2Ygc29sby1tb2RlIGludG8gT1NTLUFQSSwKLSAqICAgICAgICBhZGRlZCAoT1NTLWxpbWl0ZWQpIGVxdWFsaXplciBzdXBwb3J0LCByZXR1cm4gdmFsdWUgYnVnZml4LAotICogICAgICAgIGNoYW5nZWQgcGFyYW0gYWNpX3Jlc2V0IHRvIHJlc2V0LCBuZXcgcGFyYW1zOiBpZGUsIHdzcy4KLSAqICAgMjAwMS0wNC0yMCAgUm9iZXJ0IFNpZW1lcgotICogICAgICAgIGV2ZW4gbW9yZSBjbGVhbnVwcy4uLgotICogICAyMDAxLTEwLTA4ICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KLSAqICAgCSAgR2V0IHJpZCBvZiBjaGVja19yZWdpb24sIC5ic3Mgb3B0aW1pemF0aW9ucywgdXNlIHNldF9jdXJyZW50X3N0YXRlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4gCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotaW50IGFjaV9wb3J0OwkvKiBhcyBkZXRlcm1pbmVkIGJ5IGJpdCA0IGluIHRoZSBPUFRpIDkyOSBNQzQgcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQgYWNpX2lkY29kZVsyXTsJLyogbWFudWZhY3R1cmVyIGFuZCBwcm9kdWN0IElEICovCi1pbnQgYWNpX3ZlcnNpb247CS8qIEFDSSBmaXJtd2FyZSB2ZXJzaW9uCSovCi0KLUVYUE9SVF9TWU1CT0woYWNpX3BvcnQpOwotRVhQT1JUX1NZTUJPTChhY2lfdmVyc2lvbik7Ci0KLSNpbmNsdWRlICJhY2kuaCIKLQotCi1zdGF0aWMgaW50IGFjaV9zb2xvOwkvKiBzdGF0dXMgYml0IG9mIHRoZSBjYXJkIHRoYXQgY2FuJ3QgYmUJCSoKLQkJCSAqIGNoZWNrZWQgd2l0aCBBQ0kgdmVyc2lvbnMgcHJpb3IgdG8gMHhiMAkqLwotc3RhdGljIGludCBhY2lfYW1wOyAgIC8qIHN0YXR1cyBiaXQgZm9yIHBvd2VyLWFtcC9saW5lLW91dCBsZXZlbAotCQkJICAgYnV0IEkgaGF2ZSBubyBkb2NzIGFib3V0IHdoYXQgaXMgd2hhdC4uLiAqLwotc3RhdGljIGludCBhY2lfbWljcHJlYW1wPTM7IC8qIG1pY3JvcGhvbmUgcHJlYW1wLWxldmVsIHRoYXQgY2FuJ3QgYmUgICAgKgotCQkJICogY2hlY2tlZCB3aXRoIEFDSSB2ZXJzaW9ucyBwcmlvciB0byAweGIwCSovCi0KLXN0YXRpYyBpbnQgbWl4ZXJfZGV2aWNlOwotc3RhdGljIHN0cnVjdCBtdXRleCBhY2lfbXV0ZXg7Ci0KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgcmVzZXQ7Ci1tb2R1bGVfcGFyYW0ocmVzZXQsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhyZXNldCwiV2hlbiBzZXQgdG8gMSwgcmVzZXQgYWNpIG1peGVyLiIpOwotI2Vsc2UKLXN0YXRpYyBpbnQgcmVzZXQgPSAxOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaWRlPS0xOwotbW9kdWxlX3BhcmFtKGlkZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaWRlLCIxIGVuYWJsZSwgMCBkaXNhYmxlIGlkZS1wb3J0IC0gdW50ZXN0ZWQiCi0JCSAiIGRlZmF1bHQ6IGRvIG5vdGhpbmciKTsKLXN0YXRpYyBpbnQgd3NzPS0xOwotbW9kdWxlX3BhcmFtKHdzcywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0Mod3NzLCJjaGFuZ2UgYmV0d2VlbiBBQ0kvV1NTLW1peGVyOyB1c2UgMCBhbmQgMSAtIHVudGVzdGVkIgotCQkgIiBkZWZhdWx0OiBkbyBub3RoaW5nOyBmb3IgUENNMS1wcm8gb25seSIpOwotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIHByaW50X2JpdHModW5zaWduZWQgY2hhciBjKQotewotCWludCBqOwotCXByaW50ayhLRVJOX0RFQlVHICJhY2k6ICIpOwotCi0JZm9yIChqPTc7IGo+PTA7IGotLSkgewotCQlwcmludGsoIiVkIiwgKGMgPj4gaikgJiAweDEpOwotCX0KLQotCXByaW50aygiXG4iKTsKLX0KLSNlbmRpZgotCi0vKgotICogVGhpcyBidXN5IHdhaXQgY29kZSBub3JtYWxseSByZXF1aXJlcyBsZXNzIHRoYW4gMTUgbG9vcHMgYW5kCi0gKiBwcmFjdGljYWxseSBhbHdheXMgbGVzcyB0aGFuIDEwMCBsb29wcyBvbiBteSBpNDg2L0RYMiA2NiBNSHouCi0gKgotICogV2FybmluZzogV2FpdGluZyBvbiB0aGUgZ2VuZXJhbCBzdGF0dXMgZmxhZyBhZnRlciByZXNldGluZyB0aGUgTVVURQotICogZnVuY3Rpb24gY2FuIHRha2UgYSBWRVJZIGxvbmcgdGltZSwgYmVjYXVzZSB0aGUgUENNMTIgZG9lcyBzb21lIGtpbmQKLSAqIG9mIGZhZGUtaW4gZWZmZWN0LiBGb3IgdGhpcyByZWFzb24sIGFjY2VzcyB0byB0aGUgTVVURSBmdW5jdGlvbiBoYXMKLSAqIG5vdCBiZWVuIGltcGxlbWVudGVkIGF0IGFsbC4KLSAqCi0gKiAtIFRoZSBPU1MgaW50ZXJmYWNlIGhhcyBubyBtdXRlIG9wdGlvbi4gSXQgdGFrZXMgYWJvdXQgMyBzZWNvbmRzIHRvCi0gKiBmYWRlLWluIG9uIG15IFBDTTIwLiBidXN5X3dhaXQoKSBoYW5kbGVzIGl0IGdyZWF0IG5vdy4uLiAgICAgUm9iZXJ0Ci0gKi8KLQotc3RhdGljIGludCBidXN5X3dhaXQodm9pZCkKLXsKLQkjZGVmaW5lIE1JTlRJTUUgNTAwCi0JbG9uZyB0aW1lb3V0OwotCXVuc2lnbmVkIGNoYXIgYnl0ZTsKLQotCWZvciAodGltZW91dCA9IDE7IHRpbWVvdXQgPD0gTUlOVElNRSszMDsgdGltZW91dCsrKSB7Ci0JCWlmICgoKGJ5dGU9aW5iKEJVU1lfUkVHSVNURVIpKSAmIDEpID09IDApIHsKLQkJCWlmICh0aW1lb3V0ID49IE1JTlRJTUUpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImFjaTogR290IFJFQURZRkxBRyBpbiByb3VuZCAlbGQuXG4iLCB0aW1lb3V0LU1JTlRJTUUpOwotCQkJcmV0dXJuIGJ5dGU7Ci0JCX0KLQkJaWYgKHRpbWVvdXQgPj0gTUlOVElNRSkgewotCQkJbG9uZyBvdXQ9MTAqSFo7Ci0JCQlzd2l0Y2ggKHRpbWVvdXQtTUlOVElNRSkgewotCQkJY2FzZSAwIC4uLiA5OgotCQkJCW91dCAvPSAxMDsKLQkJCWNhc2UgMTAgLi4uIDE5OgotCQkJCW91dCAvPSAxMDsKLQkJCWNhc2UgMjAgLi4uIDMwOgotCQkJCW91dCAvPSAxMDsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJCXNjaGVkdWxlX3RpbWVvdXQob3V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJhY2k6IGJ1c3lfd2FpdCgpIHRpbWUgb3V0LlxuIik7Ci0JcmV0dXJuIC1FQlVTWTsKLX0KLQotLyogVGhlIGZvdXIgQUNJIGNvbW1hbmQgdHlwZXMgYXJlIGZ1Y2tlZCB1cC4gWy06Ci0gKiBpbXBsaWVkIGlzOiAxdyAgICAgIC0gc3BlY2lhbCBjYXNlIGZvciBJTklUCi0gKiB3cml0ZSAgIGlzOiAydzFyCi0gKiByZWFkICAgIGlzOiB4KDF3MXIpIHdoZXJlIHggaXMgMSBvciAyICgxIENIRUNLX1NJRywgMSBDSEVDS19TVEVSLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBWRVJTSU9OLCAyIElEQ09ERSkKLSAqICB0aGUgY29tbWFuZCBpcyBvbmx5IGluIHRoZSBmaXJzdCB3cml0ZSwgcmVzdCBpcyBwcm90b2NvbCBvdmVyaGVhZAotICoKLSAqIGluZGV4ZWQgaXMgdGVjaG5pY2FsbHkgYSB3cml0ZSBhbmQgdXNlZCBmb3IgU1RBVFVTCi0gKiBhbmQgdGhlIHNwZWNpYWwgY2FzZSBmb3IgVFVORSBpczogM3cxcgotICogCi0gKiBIZXJlIHRoZSBuZXcgZ2VuZXJhbCBzaGVtZTogVFVORSAtLT4gYWNpX3J3X2NtZCh4LCAgeSwgIHopCi0gKiAgICAgICAgICAgICAgICBpbmRleGVkIGFuZCB3cml0ZSAtLT4gYWNpX3J3X2NtZCh4LCAgeSwgLTEpCi0gKiAgICAgICAgICAgaW1wbGllZCBhbmQgcmVhZCAoeD0xKSAtLT4gYWNpX3J3X2NtZCh4LCAtMSwgLTEpCi0gKgotICogUmVhZCAoeD49MikgaXMgbm90IGltcGxlbWVudGVkIChvbmx5IHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uKS4KLSAqIFVzZSBhY2lfaWRjb2RlWzJdIGFuZCBhY2lfdmVyc2lvbi4uLiAgICAgICAgICAgICAgICAgICAgUm9iZXJ0Ci0gKi8KLQotLyogU29tZSBub3RlcyBmb3IgZXJyb3IgZGV0ZWN0aW9uOiB0aGVvcmV0aWNhbGx5IGl0IGlzIHBvc3NpYmxlLgotICogQnV0IGl0IGRvdWJsZXMgdGhlIEkvTy10cmFmZmljIGZyb20gd3cocikgdG8gd3d3cncocikgaW4gdGhlIG5vcm1hbCAKLSAqIGNhc2UgYW5kIGRvZXNuJ3Qgc2VlbSB0byBiZSBkZXNpZ25lZCBmb3IgdGhhdC4uLiAgICAgICAgUm9iZXJ0Ci0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgYWNpX3Jhd3dyaXRlKHVuc2lnbmVkIGNoYXIgYnl0ZSkKLXsKLQlpZiAoYnVzeV93YWl0KCkgPj0gMCkgewotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJhY2lfcmF3d3JpdGUoJWQpXG4iLCBieXRlKTsKLSNlbmRpZgotCQlvdXRiKGJ5dGUsIENPTU1BTkRfUkVHSVNURVIpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FQlVTWTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYWNpX3Jhd3JlYWQodm9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLQlpZiAoYnVzeV93YWl0KCkgPj0gMCkgewotCQlieXRlPWluYihTVEFUVVNfUkVHSVNURVIpOwotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlZCA9IGFjaV9yYXdyZWFkKClcbiIsIGJ5dGUpOwotI2VuZGlmCi0JCXJldHVybiBieXRlOwotCX0gZWxzZQotCQlyZXR1cm4gLUVCVVNZOwotfQotCi0KLWludCBhY2lfcndfY21kKGludCB3cml0ZTEsIGludCB3cml0ZTIsIGludCB3cml0ZTMpCi17Ci0JaW50IHdyaXRlW10gPSB7d3JpdGUxLCB3cml0ZTIsIHdyaXRlM307Ci0JaW50IHJlYWQgPSAtRUlOVFIsIGk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhY2lfbXV0ZXgpKQotCQlnb3RvIG91dDsKLQotCWZvciAoaT0wOyBpPDM7IGkrKykgewotCQlpZiAod3JpdGVbaV08IDAgfHwgd3JpdGVbaV0gPiAyNTUpCi0JCQlicmVhazsKLQkJZWxzZSB7Ci0JCQlyZWFkID0gYWNpX3Jhd3dyaXRlKHdyaXRlW2ldKTsKLQkJCWlmIChyZWFkIDwgMCkKLQkJCQlnb3RvIG91dF91cDsKLQkJfQotCQkKLQl9Ci0JCi0JcmVhZCA9IGFjaV9yYXdyZWFkKCk7Ci1vdXRfdXA6CW11dGV4X3VubG9jaygmYWNpX211dGV4KTsKLW91dDoJcmV0dXJuIHJlYWQ7Ci19Ci0KLUVYUE9SVF9TWU1CT0woYWNpX3J3X2NtZCk7Ci0KLXN0YXRpYyBpbnQgc2V0dm9sdW1lKGludCBfX3VzZXIgKmFyZywgCi0JCSAgICAgdW5zaWduZWQgY2hhciBsZWZ0X2luZGV4LCB1bnNpZ25lZCBjaGFyIHJpZ2h0X2luZGV4KQotewotCWludCB2b2wsIHJldCwgdXNlcnZvbCwgYnVmOwotCi0JX19nZXRfdXNlcih1c2Vydm9sLCBhcmcpOwotCi0JLyogbGVmdCBjaGFubmVsICovCi0Jdm9sID0gdXNlcnZvbCAmIDB4ZmY7Ci0JaWYgKHZvbCA+IDEwMCkKLQkJdm9sID0gMTAwOwotCXZvbCA9IFNDQUxFKDEwMCwgMHgyMCwgdm9sKTsKLQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKGxlZnRfaW5kZXgsIDB4MjAgLSB2b2wpKTwwKQotCQlyZXR1cm4gYnVmOwotCXJldCA9IFNDQUxFKDB4MjAsIDEwMCwgdm9sKTsKLQotCi0JLyogcmlnaHQgY2hhbm5lbCAqLwotCXZvbCA9ICh1c2Vydm9sID4+IDgpICYgMHhmZjsKLQlpZiAodm9sID4gMTAwKQotCQl2b2wgPSAxMDA7Ci0Jdm9sID0gU0NBTEUoMTAwLCAweDIwLCB2b2wpOwotCWlmICgoYnVmPWFjaV93cml0ZV9jbWQocmlnaHRfaW5kZXgsIDB4MjAgLSB2b2wpKTwwKQotCQlyZXR1cm4gYnVmOwotCXJldCB8PSBTQ0FMRSgweDIwLCAxMDAsIHZvbCkgPDwgODsKLSAKLQlfX3B1dF91c2VyKHJldCwgYXJnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldHZvbHVtZShpbnQgX191c2VyICphcmcsCi0JCSAgICAgdW5zaWduZWQgY2hhciBsZWZ0X2luZGV4LCB1bnNpZ25lZCBjaGFyIHJpZ2h0X2luZGV4KQotewotCWludCB2b2w7Ci0JaW50IGJ1ZjsKLQotCS8qIGxlZnQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCBsZWZ0X2luZGV4KSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQl2b2wgPSBTQ0FMRSgweDIwLCAxMDAsIGJ1ZiA8IDB4MjAgPyAweDIwLWJ1ZiA6IDApOwotCQotCS8qIHJpZ2h0IGNoYW5uZWwgKi8KLQlpZiAoKGJ1Zj1hY2lfaW5kZXhlZF9jbWQoQUNJX1NUQVRVUywgcmlnaHRfaW5kZXgpKTwwKQotCQlyZXR1cm4gYnVmOwotCXZvbCB8PSBTQ0FMRSgweDIwLCAxMDAsIGJ1ZiA8IDB4MjAgPyAweDIwLWJ1ZiA6IDApIDw8IDg7Ci0KLQlfX3B1dF91c2VyKHZvbCwgYXJnKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qIFRoZSBlcXVhbGl6ZXIgaXMgc29tZXdoYXQgc3RyYW5nZSBvbiB0aGUgQUNJLiBGcm9tIC0xMmRCIHRvICsxMmRCCi0gKiB3cml0ZTogIDB4ZmYuLmRvd24udG8uLjB4ODA9PTB4MDAuLnVwLnRvLi4weDdmCi0gKi8KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXFfb3NzMmFjaSh1bnNpZ25lZCBpbnQgdm9sKQotewotCWludCBib29zdD0wOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQlpZiAodm9sID4gMTAwKQotCQl2b2wgPSAxMDA7Ci0JaWYgKHZvbCA+IDUwKSB7Ci0JCXZvbCAtPSA1MTsKLQkJYm9vc3Q9MTsKLQl9Ci0JaWYgKGJvb3N0KQotCQlyZXQ9U0NBTEUoNDksIDB4N2UsIHZvbCkrMTsKLQllbHNlCi0JCXJldD0weGZmIC0gU0NBTEUoNTAsIDB4N2YsIHZvbCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXFfYWNpMm9zcyh1bnNpZ25lZCBpbnQgdm9sKQotewotCWlmICh2b2wgPCAweDgwKQotCQlyZXR1cm4gU0NBTEUoMHg3ZiwgNTAsIHZvbCkgKyA1MDsKLQllbHNlCi0JCXJldHVybiBTQ0FMRSgweDdmLCA1MCwgMHhmZi12b2wpOwotfQotCi0KLXN0YXRpYyBpbnQgc2V0ZXF1YWxpemVyKGludCBfX3VzZXIgKmFyZywgCi0JCQl1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IGJ1ZjsKLQl1bnNpZ25lZCBpbnQgdm9sOwotCi0JX19nZXRfdXNlcih2b2wsIGFyZyk7Ci0KLQkvKiBsZWZ0IGNoYW5uZWwgKi8KLQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKGxlZnRfaW5kZXgsIGVxX29zczJhY2kodm9sICYgMHhmZikpKTwwKQotCQlyZXR1cm4gYnVmOwotCi0JLyogcmlnaHQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV93cml0ZV9jbWQocmlnaHRfaW5kZXgsIGVxX29zczJhY2koKHZvbD4+OCkgJiAweGZmKSkpPDApCi0JCXJldHVybiBidWY7Ci0KLQkvKiB0aGUgQUNJIGVxdWFsaXplciBpcyBtb3JlIHByZWNpc2UgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRlcXVhbGl6ZXIoaW50IF9fdXNlciAqYXJnLAotCQkJdW5zaWduZWQgY2hhciBsZWZ0X2luZGV4LCB1bnNpZ25lZCBjaGFyIHJpZ2h0X2luZGV4KQotewotCWludCBidWY7Ci0JdW5zaWduZWQgaW50IHZvbDsKLQotCS8qIGxlZnQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCBsZWZ0X2luZGV4KSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQl2b2wgPSBlcV9hY2kyb3NzKGJ1Zik7Ci0JCi0JLyogcmlnaHQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCByaWdodF9pbmRleCkpPDApCi0JCXJldHVybiBidWY7Ci0Jdm9sIHw9IGVxX2FjaTJvc3MoYnVmKSA8PCA4OwotCi0JX19wdXRfdXNlcih2b2wsIGFyZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY2lfbWl4ZXJfaW9jdGwgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQotewotCWludCB2b2wsIGJ1ZjsKLQlpbnQgX191c2VyICpwID0gYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRToKLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDAxLCAweDAwKTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0NEOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4M2MsIDB4MzQpOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTUlDOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MzgsIDB4MzApOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORToKLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDM5LCAweDMxKTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1NZTlRIOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4M2IsIDB4MzMpOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUENNOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4M2EsIDB4MzIpOwotCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUkFESU8pOiAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUxOiAgLyogQVVYMSBvciByYWRpbyAqLwotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4M2QsIDB4MzUpOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORTI6ICAvKiBBVVgyICovCi0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzZSwgMHgzNik7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9CQVNTOiAgIC8qIHNldCBiYW5kIG9uZSBhbmQgdHdvICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCWlmICgoYnVmPXNldGVxdWFsaXplcihwLCAweDQ4LCAweDQwKSkgfHwgCi0JCQkgICAgKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0OSwgMHg0MSkpKTsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9UUkVCTEU6IC8qIHNldCBiYW5kIHNpeCBhbmQgc2V2ZW4gKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJaWYgKChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NGQsIDB4NDUpKSB8fCAKLQkJCSAgICAoYnVmPXNldGVxdWFsaXplcihwLCAweDRlLCAweDQ2KSkpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0lHQUlOOiAgLyogTUlDIHByZS1hbXAgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdCJyB8fCBhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCV9fZ2V0X3VzZXIodm9sLCBwKTsKLQkJCXZvbCA9IHZvbCAmIDB4ZmY7Ci0JCQlpZiAodm9sID4gMTAwKQotCQkJCXZvbCA9IDEwMDsKLQkJCXZvbCA9IFNDQUxFKDEwMCwgMywgdm9sKTsKLQkJCWlmICgoYnVmPWFjaV93cml0ZV9jbWQoQUNJX1dSSVRFX0lHQUlOLCB2b2wpKTwwKQotCQkJCXJldHVybiBidWY7Ci0JCQlhY2lfbWljcHJlYW1wID0gdm9sOwotCQkJdm9sID0gU0NBTEUoMywgMTAwLCB2b2wpOwotCQkJdm9sIHw9ICh2b2wgPDwgOCk7Ci0JCQlfX3B1dF91c2VyKHZvbCwgcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX09HQUlOOiAgLyogUG93ZXItYW1wL2xpbmUtb3V0IGxldmVsICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQScgfHwgYWNpX2lkY29kZVsxXT09J0InKSB7Ci0JCQlfX2dldF91c2VyKGJ1ZiwgcCk7Ci0JCQlidWYgPSBidWYgJiAweGZmOwotCQkJaWYgKGJ1ZiA+IDUwKQotCQkJCXZvbCA9IDE7Ci0JCQllbHNlCi0JCQkJdm9sID0gMDsKLQkJCWlmICgoYnVmPWFjaV93cml0ZV9jbWQoQUNJX1NFVF9QT1dFUkFNUCwgdm9sKSk8MCkKLQkJCQlyZXR1cm4gYnVmOwotCQkJYWNpX2FtcCA9IHZvbDsKLQkJCWlmIChhY2lfYW1wKQotCQkJCWJ1ZiA9ICgxMDAgfHwgMTAwPDw4KTsKLQkJCWVsc2UKLQkJCQlidWYgPSAwOwotCQkJX19wdXRfdXNlcihidWYsIHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNTUkM6Ci0JCS8qIGhhbmRsZSBzb2xvIG1vZGUgY29udHJvbCAqLwotCQlfX2dldF91c2VyKGJ1ZiwgcCk7Ci0JCS8qIHVuc2V0IHNvbG8gd2hlbiBSRUNTUkMgZm9yIFBDTSBpcyByZXF1ZXN0ZWQgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdCJyB8fCBhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCXZvbCA9ICEoYnVmICYgU09VTkRfTUFTS19QQ00pOwotCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfU0VUX1NPTE9NT0RFLCB2b2wpKTwwKQotCQkJCXJldHVybiBidWY7Ci0JCQlhY2lfc29sbyA9IHZvbDsKLQkJfQotCQlidWYgPSAoU09VTkRfTUFTS19DRHwgU09VTkRfTUFTS19NSUN8IFNPVU5EX01BU0tfTElORXwKLQkJICAgICAgIFNPVU5EX01BU0tfU1lOVEh8IFNPVU5EX01BU0tfTElORTIpOwotCQlpZiAoYWNpX2lkY29kZVsxXSA9PSAnQycpIC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gU09VTkRfTUFTS19SQURJTzsKLQkJZWxzZQotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0JCWlmICghYWNpX3NvbG8pCi0JCQlidWYgfD0gU09VTkRfTUFTS19QQ007Ci0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfQ0QgICAgfAotCQkgICAgICAgU09VTkRfTUFTS19NSUMgICAgfCBTT1VORF9NQVNLX0xJTkUgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfU1lOVEggIHwgU09VTkRfTUFTS19QQ00gICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX0xJTkUyKTsKLQkJc3dpdGNoIChhY2lfaWRjb2RlWzFdKSB7Ci0JCWNhc2UgJ0MnOiAvKiBQQ00yMCByYWRpbyAqLwotCQkJYnVmIHw9IChTT1VORF9NQVNLX1JBRElPIHwgU09VTkRfTUFTS19JR0FJTiB8Ci0JCQkJU09VTkRfTUFTS19CQVNTICB8IFNPVU5EX01BU0tfVFJFQkxFKTsKLQkJCWJyZWFrOwotCQljYXNlICdCJzogLyogUENNMTIgKi8KLQkJCWJ1ZiB8PSAoU09VTkRfTUFTS19MSU5FMSB8IFNPVU5EX01BU0tfSUdBSU4gfAotCQkJCVNPVU5EX01BU0tfT0dBSU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0EnOiAvKiBQQ00xLXBybyAqLwotCQkJYnVmIHw9IChTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19PR0FJTik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCQl9Ci0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfQ0QgICAgfAotCQkgICAgICAgU09VTkRfTUFTS19NSUMgICAgfCBTT1VORF9NQVNLX0xJTkUgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfU1lOVEggIHwgU09VTkRfTUFTS19QQ00gICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX0xJTkUyKTsKLQkJc3dpdGNoIChhY2lfaWRjb2RlWzFdKSB7Ci0JCWNhc2UgJ0MnOiAvKiBQQ00yMCByYWRpbyAqLwotCQkJYnVmIHw9IChTT1VORF9NQVNLX1JBRElPIHwKLQkJCQlTT1VORF9NQVNLX0JBU1MgIHwgU09VTkRfTUFTS19UUkVCTEUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKLQkJfQotCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLOgotCQlidWYgPSAoU09VTkRfTUFTS19DRHwgU09VTkRfTUFTS19NSUN8IFNPVU5EX01BU0tfTElORXwKLQkJICAgICAgIFNPVU5EX01BU0tfU1lOVEh8IFNPVU5EX01BU0tfTElORTJ8IFNPVU5EX01BU0tfUENNKTsKLQkJaWYgKGFjaV9pZGNvZGVbMV0gPT0gJ0MnKSAvKiBQQ00yMCByYWRpbyAqLwotCQkJYnVmIHw9IFNPVU5EX01BU0tfUkFESU87Ci0JCWVsc2UKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCi0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQzoKLQkJYnVmID0gKFNPVU5EX01BU0tfQ0QgICAgfCBTT1VORF9NQVNLX01JQyAgIHwgU09VTkRfTUFTS19MSU5FICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19MSU5FMik7Ci0JCS8qIGRvIHdlIG5lZWQgYWNpX3NvbG8gb3IgY2FuIEkgZ2V0IGl0IGZyb20gdGhlIEFDST8gKi8KLQkJc3dpdGNoIChhY2lfaWRjb2RlWzFdKSB7Ci0JCWNhc2UgJ0InOiAvKiBQQ00xMiAqLwotCQljYXNlICdDJzogLyogUENNMjAgcmFkaW8gKi8KLQkJCWlmIChhY2lfdmVyc2lvbiA+PSAweGIwKSB7Ci0JCQkJaWYgKCh2b2w9YWNpX3J3X2NtZChBQ0lfU1RBVFVTLAotCQkJCQkJICAgIEFDSV9TX0dFTkVSQUwsIC0xKSk8MCkKLQkJCQkJcmV0dXJuIHZvbDsKLQkJCQlpZiAodm9sICYgMHgyMCkKLQkJCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOwotCQkJfQotCQkJZWxzZQotCQkJCWlmICghYWNpX3NvbG8pCi0JCQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOwotCQl9Ci0JCWlmIChhY2lfaWRjb2RlWzFdID09ICdDJykgLyogUENNMjAgcmFkaW8gKi8KLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1JBRElPOwotCQllbHNlCi0JCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKLQotCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgotCQlfX3B1dF91c2VyKDAsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MDQsIDB4MDMpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9DRDoKLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDBhLCAweDA5KTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfTUlDOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MDYsIDB4MDUpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MDgsIDB4MDcpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TWU5USDoKLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDBjLCAweDBiKTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfUENNOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGUsIDB4MGQpOwotCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SQURJTyk6IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FMTogIC8qIEFVWDEgKi8KLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDExLCAweDEwKTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfTElORTI6ICAvKiBBVVgyICovCi0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgxMywgMHgxMik7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0JBU1M6ICAgLyogZ2V0IGJhbmQgb25lICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCXJldHVybiBnZXRlcXVhbGl6ZXIocCwgMHgyMywgMHgyMik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1RSRUJMRTogLyogZ2V0IGJhbmQgc2V2ZW4gKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJcmV0dXJuIGdldGVxdWFsaXplcihwLCAweDJmLCAweDJlKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfSUdBSU46ICAvKiBNSUMgcHJlLWFtcCAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJLyogYWNpX21pY3ByZWFtcCBvciBBQ0k/ICovCi0JCQlpZiAoYWNpX3ZlcnNpb24gPj0gMHhiMCkgewotCQkJCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLAotCQkJCQkJCSBBQ0lfU19SRUFEX0lHQUlOKSk8MCkKLQkJCQkJcmV0dXJuIGJ1ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCQlidWY9YWNpX21pY3ByZWFtcDsKLQkJCXZvbCA9IFNDQUxFKDMsIDEwMCwgYnVmIDw9IDMgPyBidWYgOiAzKTsKLQkJCXZvbCB8PSB2b2wgPDwgODsKLQkJCV9fcHV0X3VzZXIodm9sLCBwKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9PR0FJTjoKLQkJaWYgKGFjaV9hbXApCi0JCQlidWYgPSAoMTAwIHx8IDEwMDw8OCk7Ci0JCWVsc2UKLQkJCWJ1ZiA9IDA7Ci0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgYWNpX21peGVyX29wZXJhdGlvbnMgPQotewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5pZCAgICA9ICJBQ0kiLAotCS5pb2N0bCA9IGFjaV9taXhlcl9pb2N0bAotfTsKLQotLyoKLSAqIFRoZXJlIGlzIGFsc28gYW4gaW50ZXJuYWwgbWl4ZXIgaW4gdGhlIGNvZGVjIChDUzQyMzFBIG9yIEFEMTg0NSksCi0gKiB0aGF0IGRlc2VydmVzIG5vIHB1cnBvc2UgaW4gYW4gQUNJIGJhc2VkIHN5c3RlbSB3aGljaCB1c2VzIGFuCi0gKiBleHRlcm5hbCBBQ0kgY29udHJvbGxlZCBzdGVyZW8gbWl4ZXIuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgY29kZWMKLSAqIG1peGVyIGhhcyB0aGUgQVVYMSBpbnB1dCBzZWxlY3RlZCBhcyB0aGUgcmVjb3JkaW5nIHNvdXJjZSwgdGhhdCB0aGUKLSAqIGlucHV0IGdhaW4gaXMgc2V0IG5lYXIgbWF4aW11bSBhbmQgdGhhdCB0aGUgb3RoZXIgY2hhbm5lbHMgZ29pbmcKLSAqIGZyb20gdGhlIGlucHV0cyB0byB0aGUgY29kZWMgb3V0cHV0IGFyZSBtdXRlZC4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhdHRhY2hfYWNpKHZvaWQpCi17Ci0JY2hhciAqYm9hcmRuYW1lOwotCWludCBpLCByYyA9IC1FQlVTWTsKLQotCW11dGV4X2luaXQoJmFjaV9tdXRleCk7Ci0KLQlvdXRiKDB4RTMsIDB4ZjhmKTsgLyogV3JpdGUgTUFEMTYgcGFzc3dvcmQgKi8KLQlhY2lfcG9ydCA9IChpbmIoMHhmOTApICYgMHgxMCkgPwotCQkweDM0NDogMHgzNTQ7IC8qIEdldCBhY2lfcG9ydCBmcm9tIE1DNF9QT1JUICovCi0KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFjaV9wb3J0LCAzLCAic291bmQgbWl4ZXIgKEFDSSkiKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJICAgICAgICJhY2k6IEkvTyBhcmVhIDB4JTAzeC0weCUwM3ggYWxyZWFkeSB1c2VkLlxuIiwKLQkJICAgICAgIGFjaV9wb3J0LCBhY2lfcG9ydCsyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogZm9yY2UgQUNJIGludG8gYSBrbm93biBzdGF0ZSAqLwotCXJjID0gLUVGQVVMVDsKLQlmb3IgKGk9MDsgaTwzOyBpKyspCi0JCWlmIChhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgLTEsIC0xKTwwKQotCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0KLQkvKiBvZmZpY2lhbCB0aGlzIGlzIG9uZSBhY2kgcmVhZCBjYWxsOiAqLwotCXJjID0gLUVGQVVMVDsKLQlpZiAoKGFjaV9pZGNvZGVbMF09YWNpX3J3X2NtZChBQ0lfUkVBRF9JRENPREUsIC0xLCAtMSkpPDAgfHwKLQkgICAgKGFjaV9pZGNvZGVbMV09YWNpX3J3X2NtZChBQ0lfUkVBRF9JRENPREUsIC0xLCAtMSkpPDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhY2k6IEZhaWxlZCB0byByZWFkIGlkY29kZSBvbiAweCUwM3guXG4iLAotCQkgICAgICAgYWNpX3BvcnQpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQlpZiAoKGFjaV92ZXJzaW9uPWFjaV9yd19jbWQoQUNJX1JFQURfVkVSU0lPTiwgLTEsIC0xKSk8MCkgewotCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIHJlYWQgdmVyc2lvbiBvbiAweCUwM3guXG4iLAotCQkgICAgICAgYWNpX3BvcnQpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQlpZiAoYWNpX2lkY29kZVswXSA9PSAnbScpIHsKLQkJLyogSXQgbG9va3MgbGlrZSBhIG1pcm8gc291bmQgY2FyZC4gKi8KLQkJc3dpdGNoIChhY2lfaWRjb2RlWzFdKSB7Ci0JCWNhc2UgJ0EnOgotCQkJYm9hcmRuYW1lID0gIlBDTTEgcHJvIC8gZWFybHkgUENNMTIiOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0InOgotCQkJYm9hcmRuYW1lID0gIlBDTTEyIjsKLQkJCWJyZWFrOwotCQljYXNlICdDJzoKLQkJCWJvYXJkbmFtZSA9ICJQQ00yMCByYWRpbyI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJvYXJkbmFtZSA9ICJ1bmtub3duIG1pcm8iOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNpOiBXYXJuaW5nOiB1bnN1cHBvcnRlZCBjYXJkISAtICIKLQkJICAgICAgICJubyBoYXJkd2FyZSwgbm8gc3BlY3MuLi5cbiIpOwotCQlib2FyZG5hbWUgPSAidW5rbm93biBDYXJkaW5hbCBUZWNobm9sb2dpZXMiOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIjxBQ0kgMHglMDJ4LCBpZCAlMDJ4LyUwMnggXCIlYy8lY1wiLCAoJXMpPiBhdCAweCUwM3hcbiIsCi0JICAgICAgIGFjaV92ZXJzaW9uLAotCSAgICAgICBhY2lfaWRjb2RlWzBdLCBhY2lfaWRjb2RlWzFdLAotCSAgICAgICBhY2lfaWRjb2RlWzBdLCBhY2lfaWRjb2RlWzFdLAotCSAgICAgICBib2FyZG5hbWUsIGFjaV9wb3J0KTsKLQotCXJjID0gLUVCVVNZOwotCWlmIChyZXNldCkgewotCQkvKiBmaXJzdCB3cml0ZSgpcyBhZnRlciByZXNldCBmYWlsIHdpdGggbXkgUENNMjAgKi8KLQkJaWYgKGFjaV9yd19jbWQoQUNJX0lOSVQsIC0xLCAtMSk8MCB8fAotCQkgICAgYWNpX3J3X2NtZChBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QKTwwIHx8Ci0JCSAgICBhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1ApPDApCi0JCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiB0aGUgUENNMjAgaXMgbXV0ZWQgYWZ0ZXIgcmVzZXQgKGFuZCByZWJvb3QpICovCi0JaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9NVVRFLCAweDAwLCAtMSk8MCkKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0KLQlpZiAoaWRlPj0wKQotCQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX0lERSwgIWlkZSwgLTEpPDApCi0JCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQkKLQlpZiAod3NzPj0wICYmIGFjaV9pZGNvZGVbMV09PSdBJykKLQkJaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9XU1MsICEhd3NzLCAtMSk8MCkKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCi0JbWl4ZXJfZGV2aWNlID0gc291bmRfaW5zdGFsbF9taXhlcihNSVhFUl9EUklWRVJfVkVSU0lPTiwgYm9hcmRuYW1lLAotCQkJCQkgICAmYWNpX21peGVyX29wZXJhdGlvbnMsCi0JCQkJCSAgIHNpemVvZihhY2lfbWl4ZXJfb3BlcmF0aW9ucyksIE5VTEwpOwotCXJjID0gMDsKLQlpZiAobWl4ZXJfZGV2aWNlIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIGluc3RhbGwgbWl4ZXIuXG4iKTsKLQkJcmMgPSBtaXhlcl9kZXZpY2U7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0gLyogZWxzZSBNYXliZSBpbml0aWFsaXplIHRoZSBDUzQyMzFBIG1peGVyIGhlcmUuLi4gKi8KLW91dDoJcmV0dXJuIHJjOwotb3V0X3JlbGVhc2VfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGFjaV9wb3J0LCAzKTsKLQlnb3RvIG91dDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9hY2kodm9pZCkKLXsKLQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYobWl4ZXJfZGV2aWNlKTsKLQlyZWxlYXNlX3JlZ2lvbihhY2lfcG9ydCwgMyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF0dGFjaF9hY2kpOwotbW9kdWxlX2V4aXQodW5sb2FkX2FjaSk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWNpLmggYi9zb3VuZC9vc3MvYWNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTAyZWUuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI2lmbmRlZiBfQUNJX0hfCi0jZGVmaW5lIF9BQ0lfSF8KLQotZXh0ZXJuIGludCBhY2lfcG9ydDsKLWV4dGVybiBpbnQgYWNpX3ZlcnNpb247CQkvKiBBQ0kgZmlybXdhcmUgdmVyc2lvbgkqLwotZXh0ZXJuIGludCBhY2lfcndfY21kKGludCB3cml0ZTEsIGludCB3cml0ZTIsIGludCB3cml0ZTMpOwotCi0jZGVmaW5lIGFjaV9pbmRleGVkX2NtZChhLCBiKSBhY2lfcndfY21kKGEsIGIsIC0xKQotI2RlZmluZSBhY2lfd3JpdGVfY21kKGEsIGIpICAgYWNpX3J3X2NtZChhLCBiLCAtMSkKLSNkZWZpbmUgYWNpX3JlYWRfY21kKGEpICAgICAgIGFjaV9yd19jbWQoYSwtMSwgLTEpCi0KLSNkZWZpbmUgQ09NTUFORF9SRUdJU1RFUiAgICAoYWNpX3BvcnQpICAgICAgLyogd3JpdGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1RBVFVTX1JFR0lTVEVSICAgICAoYWNpX3BvcnQgKyAxKSAgLyogcmVhZCByZWdpc3RlciAqLwotI2RlZmluZSBCVVNZX1JFR0lTVEVSICAgICAgIChhY2lfcG9ydCArIDIpICAvKiBhbHNvIHVzZWQgZm9yIHJkcyAqLwotCi0jZGVmaW5lIFJEU19SRUdJU1RFUiAgICAgICAgQlVTWV9SRUdJU1RFUgotCi0jZGVmaW5lIEFDSV9TRVRfTVVURSAgICAgICAgICAweDBkCi0jZGVmaW5lIEFDSV9TRVRfUE9XRVJBTVAgICAgICAweDBmCi0jZGVmaW5lIEFDSV9TRVRfVFVORVJNVVRFICAgICAweGEzCi0jZGVmaW5lIEFDSV9TRVRfVFVORVJNT05PICAgICAweGE0Ci0jZGVmaW5lIEFDSV9TRVRfSURFICAgICAgICAgICAweGQwCi0jZGVmaW5lIEFDSV9TRVRfV1NTICAgICAgICAgICAweGQxCi0jZGVmaW5lIEFDSV9TRVRfU09MT01PREUgICAgICAweGQyCi0jZGVmaW5lIEFDSV9XUklURV9JR0FJTiAgICAgICAweDAzCi0jZGVmaW5lIEFDSV9XUklURV9UVU5FICAgICAgICAweGE3Ci0jZGVmaW5lIEFDSV9SRUFEX1RVTkVSU1RFUkVPICAweGE4Ci0jZGVmaW5lIEFDSV9SRUFEX1RVTkVSU1RBVElPTiAweGE5Ci0jZGVmaW5lIEFDSV9SRUFEX1ZFUlNJT04gICAgICAweGYxCi0jZGVmaW5lIEFDSV9SRUFEX0lEQ09ERSAgICAgICAweGYyCi0jZGVmaW5lIEFDSV9JTklUICAgICAgICAgICAgICAweGZmCi0jZGVmaW5lIEFDSV9TVEFUVVMgICAgICAgICAgICAweGYwCi0jZGVmaW5lICAgICBBQ0lfU19HRU5FUkFMICAgICAweDAwCi0jZGVmaW5lICAgICBBQ0lfU19SRUFEX0lHQUlOICAweDIxCi0jZGVmaW5lIEFDSV9FUlJPUl9PUCAgICAgICAgICAweGRmCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1hY3JvIFNDQUxFIGNhbiBiZSB1c2VkIHRvIHNjYWxlIG9uZSBpbnRlZ2VyIHZvbHVtZQotICogdmFsdWUgaW50byBhbm90aGVyIG9uZSB1c2luZyBvbmx5IGludGVnZXIgYXJpdGhtZXRpYy4gSWYgdGhlIGlucHV0Ci0gKiB2YWx1ZSB4IGlzIGluIHRoZSByYW5nZSAwIDw9IHggPD0geG1heCwgdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmUgaW4KLSAqIHRoZSByYW5nZSAwIDw9IFNDQUxFKHhtYXgseW1heCx4KSA8PSB5bWF4LgotICoKLSAqIFRoaXMgbWFjcm8gaGFzIGZvciBhbGwgeG1heCwgeW1heCA+IDAgYW5kIGFsbCAwIDw9IHggPD0geG1heCB0aGUKLSAqIGZvbGxvd2luZyBuaWNlIHByb3BlcnRpZXM6Ci0gKgotICogLSBTQ0FMRSh4bWF4LHltYXgseG1heCkgPSB5bWF4Ci0gKiAtIFNDQUxFKHhtYXgseW1heCwwKSA9IDAKLSAqIC0gU0NBTEUoeG1heCx5bWF4LFNDQUxFKHltYXgseG1heCxTQ0FMRSh4bWF4LHltYXgseCkpKSA9IFNDQUxFKHhtYXgseW1heCx4KQotICoKLSAqIEluIGFkZGl0aW9uLCB0aGUgcm91bmRpbmcgZXJyb3IgaXMgbWluaW1hbCBhbmQgbmljZWx5IGRpc3RyaWJ1dGVkLgotICogVGhlIHByb29mcyBhcmUgbGVmdCBhcyBhbiBleGVyY2lzZSB0byB0aGUgcmVhZGVyLgotICovCi0KLSNkZWZpbmUgU0NBTEUoeG1heCx5bWF4LHgpICgoKHgpKih5bWF4KSsoeG1heCkvMikvKHhtYXgpKQotCi0KLSNlbmRpZiAgLyogX0FDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTgxNi5jIGIvc291bmQvb3NzL2FkMTgxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFiZjMxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hZDE4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjggKzAsMCBAQAotLyoKLSAqCi0gKiBBRDE4MTYgbG93bGV2ZWwgc291bmQgZHJpdmVyIGZvciBMaW51eCAyLjYuMCBhbmQgYWJvdmUKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBieSBUaG9yc3RlbiBLbmFiZSA8bGludXhAdGhvcnN0ZW4ta25hYmUuZGU+Ci0gKgotICogQmFzZWQgb24gdGhlIENTNDIzMi9BRDE4NDggZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTYKLSAqCi0gKgotICogdmVyc2lvbjogMS41Ci0gKiBzdGF0dXM6IGJldGEKLSAqIGRhdGU6IDIwMDMvMDcvMTUKLSAqCi0gKiBDaGFuZ2VzOgotICoJT2xlZyBEcm9raW46IFNvbWUgY2xlYW51cCBvZiBsb2FkL3VubG9hZCBmdW5jdGlvbnMuCTE5OTgvMTEvMjQKLSAqCQotICoJVGhvcnN0ZW4gS25hYmU6IGF0dGFjaCBhbmQgdW5sb2FkIHJld3JpdHRlbiwgCi0gKglzb21lIGFyZ3VtZW50IGNoZWNrcyBhZGRlZAkJCQkxOTk4LzExLzMwCi0gKgotICoJVGhvcnN0ZW4gS25hYmU6IEJ1Z2d5IGlzYSBicmlkZ2Ugd29ya2Fyb3VuZCBhZGRlZAkxOTk5LzAxLzE2Ci0gKgkKLSAqCURhdmlkIE1vZXdzL1Rob3JzdGVuIEtuYWJlOiBJbnRyb2R1Y2VkIG9wdGlvbnMgCi0gKglwYXJhbWV0ZXIuIEFkZGVkIHNsaWdodGx5IG1vZGlmaWVkIHBhdGNoIGZyb20gCi0gKglEYXZpZCBNb2V3cyB0byBkaXNhYmxlIGRzcCBhdWRpbyBzb3VyY2VzIGJ5IHNldHRpbmcgCi0gKgliaXQgMCBvZiBvcHRpb25zIHBhcmFtZXRlci4gVGhpcyBzZWVtcyB0byBiZQotICoJcmVxdWlyZWQgYnkgc29tZSBBenRlY2gvTmV3Y29tIFNDLTE2IGNhcmRzLgkJMTk5OS8wNC8xOAotICoKLSAqCUNocmlzdG9waCBIZWxsd2lnOiBBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0LgkyMDAwLzAzLzAzCi0gKgotICoJQ2hyaXN0b3BoIEhlbGx3aWc6IEFkZGVkIGlzYXBucCBzdXBwb3J0CQkJMjAwMC8wMy8xNQotICoKLSAqCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbzogZ2V0IHJpZCBvZiBjaGVja19yZWdpb24JMjAwMS8xMC8wNwotICogICAgICAKLSAqICAgICAgVGhvcnN0ZW4gS25hYmU6IENvbXBpbGluZyB3aXRoIENPTkZJR19QTlAgZW5hYmxlZAotICoJd29ya3MgYWdhaW4uIEl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSAKLSAqCUFEMTgxNiBzb3VuZCBjYXJkLiBTYW1wbGUgcmF0ZSBub3cgbWF5IGJlIGNoYW5nZWQgZHVyaW5nCi0gKglwbGF5YmFjay9jYXB0dXJlLiBwcmludGsoKSB1c2VzIGxvZyBsZXZlbHMgZXZlcnl3aGVyZS4KLSAqCVNNUCBmaXhlcy4gRE1BIGhhbmRsaW5nIGZpeGVzLgotICoJT3RoZXIgbWlub3IgY29kZSBjbGVhbnVwLgkJCQkyMDAzLzA3LzE1Ci0gKgotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi0jZGVmaW5lIERFQlVHTk9JU0UoeCkKLQotI2RlZmluZSBDSEVDS19GT1JfUE9XRVIgeyBpbnQgdGltZW91dD0xMDA7IFwKLSAgd2hpbGUgKHRpbWVvdXQgPiAwICYmIChpbmIoZGV2Yy0+YmFzZSkmMHg4MCkhPSAweDgwKSB7XAotICAgICAgICAgIHRpbWVvdXQtLTsgXAotICB9IFwKLSAgaWYgKHRpbWVvdXQ9PTApIHtcCi0gICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDaGVjayBmb3IgcG93ZXIgZmFpbGVkIGluICVzIGxpbmU6ICVkXG4iLF9fRklMRV9fLF9fTElORV9fKTsgXAotICB9IFwKLX0KLQotLyogc3RydWN0dXJlIHRvIGhvbGQgZGV2aWNlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgICBpbnQgICAgICAgICAgICBiYXNlOyAgICAgICAgICAvKiBzZXQgaW4gYXR0YWNoICovCi0JaW50ICAgICAgICAgICAgaXJxOwotCWludCAgICAgICAgICAgIGRtYV9wbGF5YmFjazsKLSAgICAgICAgaW50ICAgICAgICAgICAgZG1hX2NhcHR1cmU7Ci0gIAotCWludCAgICAgICAgICAgIG9wZW5lZDsgICAgICAgICAvKiBvcGVuICovCi0gICAgICAgIGludCAgICAgICAgICAgIHNwZWVkOwkKLQlpbnQgICAgICAgICAgICBjaGFubmVsczsKLQlpbnQgICAgICAgICAgICBhdWRpb19mb3JtYXQ7Ci0gICAgICAgIGludCAgICAgICAgICAgIGF1ZGlvX21vZGU7IAotICAKLSAgICAgICAgaW50ICAgICAgICAgICAgcmVjbWFzazsgICAgICAgIC8qIHNldHVwICovCi0JdW5zaWduZWQgY2hhciAgZm9ybWF0X2JpdHM7Ci0JaW50ICAgICAgICAgICAgc3VwcG9ydGVkX2RldmljZXM7Ci0JaW50ICAgICAgICAgICAgc3VwcG9ydGVkX3JlY19kZXZpY2VzOwotCXVuc2lnbmVkIHNob3J0IGxldmVsc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOwotCQkJCQkvKiBtaXNjICovCi0Jc3RydWN0IHBucF9kZXYgKnBucGRldjsJIC8qIGNvbmZpZ3VyZWQgdmlhIHBucCAqLwotICAgICAgICBpbnQgICAgICAgICAgICBkZXZfbm87ICAgLyogdGhpcyBpcyB0aGUgIyBpbiBhdWRpb19kZXZzIGFuZCBOT1QgCi0JCQkJICAgIGluIGFkMTgxNl9pbmZvICovCi0Jc3BpbmxvY2tfdAlsb2NrOyAgCi19IGFkMTgxNl9pbmZvOwotCi1zdGF0aWMgaW50IG5yX2FkMTgxNl9kZXZzOwotc3RhdGljIGludCBhZDE4MTZfY2xvY2tmcmVxID0gMzMwMDA7Ci1zdGF0aWMgaW50IG9wdGlvbnM7Ci0KLS8qIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzICovCi1zdGF0aWMgaW50ICBhZF9mb3JtYXRfbWFzayA9Ci1BRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX1MxNl9CRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVzsKLQotLyogYXJyYXkgb2YgZGV2aWNlIGluZm8gc3RydWN0dXJlcyAqLwotc3RhdGljIGFkMTgxNl9pbmZvIGRldl9pbmZvW01BWF9BVURJT19ERVZdOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogZnVuY3Rpb25zIGZvciBlYXNpZXIgYWNjZXNzIHRvIGluZGVyZWN0IHJlZ2lzdGVycyAqLwotCi1zdGF0aWMgaW50IGFkX3JlYWQgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IHJlZykKLXsKLQlpbnQgcmVzdWx0OwotCQotCUNIRUNLX0ZPUl9QT1dFUjsKLQlvdXRiICgodW5zaWduZWQgY2hhcikgKHJlZyAmIDB4M2YpLCBkZXZjLT5iYXNlKzApOwotCXJlc3VsdCA9IGluYihkZXZjLT5iYXNlKzIpOwotCXJlc3VsdCs9IGluYihkZXZjLT5iYXNlKzMpPDw4OwotCXJldHVybiAocmVzdWx0KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhZF93cml0ZSAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgcmVnLCBpbnQgZGF0YSkKLXsKLQlDSEVDS19GT1JfUE9XRVI7Ci0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChyZWcgJiAweGZmKSwgZGV2Yy0+YmFzZSswKTsKLQlvdXRiICgodW5zaWduZWQgY2hhcikgKGRhdGEgJiAweGZmKSxkZXZjLT5iYXNlKzIpOwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAoKGRhdGE+PjgpJjB4ZmYpLGRldmMtPmJhc2UrMyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogZnVuY3Rpb24gaW50ZXJmYWNlIHJlcXVpcmVkIGJ5IHN0cnVjdCBhdWRpb19kcml2ZXIgKi8KLQotc3RhdGljIHZvaWQgYWQxODE2X2hhbHRfaW5wdXQgKGludCBkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JdW5zaWduZWQgY2hhciBidWZmZXI7Ci0JCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBoYWx0X2lucHV0IGNhbGxlZFxuIikpOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsgCi0JCi0JaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7Ci0JICAgICAgICBkaXNhYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSk7Ci0JfQotCQotCWJ1ZmZlcj1pbmIoZGV2Yy0+YmFzZSs5KTsKLQlpZiAoYnVmZmVyICYgMHgwMSkgewotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihidWZmZXIgJiB+MHgwMSxkZXZjLT5iYXNlKzkpOyAKLQl9Ci0KLQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKLQkgICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOwotCX0KLQotCS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KLQlvdXRiICh+MHg0MCwgZGV2Yy0+YmFzZSsxKTsJCi0JCi0JZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9JTlBVVDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODE2X2hhbHRfb3V0cHV0IChpbnQgZGV2KQotewotCXVuc2lnbmVkIGxvbmcgIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQkKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogaGFsdF9vdXRwdXQgY2FsbGVkIVxuIikpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOyAKLQkvKiBNdXRlIHBjbSBvdXRwdXQgKi8KLQlhZF93cml0ZShkZXZjLCA0LCBhZF9yZWFkKGRldmMsNCl8MHg4MDgwKTsKLQotCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgewotCSAgICAgICAgZGlzYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hKTsKLQl9Ci0KLQlidWZmZXI9aW5iKGRldmMtPmJhc2UrOCk7Ci0JaWYgKGJ1ZmZlciAmIDB4MDEpIHsKLQkJLyogZGlzYWJsZSBjYXB0dXJlICovCi0JCW91dGIoYnVmZmVyICYgfjB4MDEsZGV2Yy0+YmFzZSs4KTsgCi0JfQotCi0JaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7Ci0JICAgICAgICBlbmFibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSk7Ci0JfQotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKX4weDgwLCBkZXZjLT5iYXNlKzEpOwkKLQotCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfT1VUUFVUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfb3V0cHV0X2Jsb2NrIChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgCi0JCQkJIGludCBjb3VudCwgaW50IGludHJmbGFnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBjbnQ7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogb3V0cHV0X2Jsb2NrIGNhbGxlZCBidWY9JWxkIGNvdW50PSVkIGZsYWdzPSVkXG4iLGJ1Zixjb3VudCxpbnRyZmxhZykpOwotICAKLQljbnQgPSBjb3VudC80IC0gMTsKLSAgCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCQotCS8qIHNldCB0cmFuc2ZlciBjb3VudCAqLwotCWFkX3dyaXRlIChkZXZjLCA4LCBjbnQgJiAweGZmZmYpOyAKLQkKLQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfT1VUUFVUOyAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfc3RhcnRfaW5wdXQgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsCi0JCQkJaW50IGludHJmbGFnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyAgY250OwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQkKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IHN0YXJ0X2lucHV0IGNhbGxlZCBidWY9JWxkIGNvdW50PSVkIGZsYWdzPSVkXG4iLGJ1Zixjb3VudCxpbnRyZmxhZykpOwotCi0JY250ID0gY291bnQvNCAtIDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0KLQkvKiBzZXQgdHJhbnNmZXIgY291bnQgKi8KLQlhZF93cml0ZSAoZGV2YywgMTAsIGNudCAmIDB4ZmZmZik7IAotCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBhZDE4MTZfcHJlcGFyZV9mb3JfaW5wdXQgKGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBmcmVxOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQl1bnNpZ25lZCBjaGFyIGZtdF9iaXRzOwotCQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogcHJlcGFyZV9mb3JfaW5wdXQgY2FsbGVkOiBic2l6ZT0lZCBiY291bnQ9JWRcbiIsYnNpemUsYmNvdW50KSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JZm10X2JpdHM9IChkZXZjLT5mb3JtYXRfYml0cyYweDcpPDwzOwotCQotCS8qIHNldCBtb25vL3N0ZXJlbyBtb2RlICovCi0JaWYgKGRldmMtPmNoYW5uZWxzID4gMSkgewotCQlmbXRfYml0cyB8PTB4NDsKLQl9Ci0JLyogc2V0IE1vbm8vU3RlcmVvIGluIHBsYXliYWNrL2NhcHR1cmUgcmVnaXN0ZXIgKi8KLQlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOCkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOCk7IAotCW91dGIoIChpbmIoZGV2Yy0+YmFzZSs5KSAmIH4weDNDKXxmbXRfYml0cywgZGV2Yy0+YmFzZSs5KTsKLQotCWZyZXE9KCh1bnNpZ25lZCBpbnQpZGV2Yy0+c3BlZWQqMzMwMDApL2FkMTgxNl9jbG9ja2ZyZXE7IAotCi0JLyogd3JpdGUgcGxheWJhY2svY2FwdHVyZSBzcGVlZHMgKi8KLQlhZF93cml0ZSAoZGV2YywgMiwgZnJlcSAmIDB4ZmZmZik7CQotCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsJCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQotCWFkMTgxNl9oYWx0X2lucHV0KGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODE2X3ByZXBhcmVfZm9yX291dHB1dCAoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGZyZXE7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCXVuc2lnbmVkIGNoYXIgZm10X2JpdHM7Ci0KLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IHByZXBhcmVfZm9yX291dHB1dCBjYWxsZWQ6IGJzaXplPSVkIGJjb3VudD0lZFxuIixic2l6ZSxiY291bnQpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQotCWZtdF9iaXRzPSAoZGV2Yy0+Zm9ybWF0X2JpdHMmMHg3KTw8MzsKLQkvKiBzZXQgbW9uby9zdGVyZW8gbW9kZSAqLwotCWlmIChkZXZjLT5jaGFubmVscyA+IDEpIHsKLQkJZm10X2JpdHMgfD0weDQ7Ci0JfQotCi0JLyogd3JpdGUgZm9ybWF0IGJpdHMgdG8gcGxheWJhY2svY2FwdHVyZSByZWdpc3RlcnMgKi8KLQlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOCkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOCk7IAotCW91dGIoIChpbmIoZGV2Yy0+YmFzZSs5KSAmIH4weDNDKXxmbXRfYml0cywgZGV2Yy0+YmFzZSs5KTsKLSAgCi0JZnJlcT0oKHVuc2lnbmVkIGludClkZXZjLT5zcGVlZCozMzAwMCkvYWQxODE2X2Nsb2NrZnJlcTsgCi0JCi0JLyogd3JpdGUgcGxheWJhY2svY2FwdHVyZSBzcGVlZHMgKi8KLQlhZF93cml0ZSAoZGV2YywgMiwgZnJlcSAmIDB4ZmZmZik7Ci0JYWRfd3JpdGUgKGRldmMsIDMsIGZyZXEgJiAweGZmZmYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JCi0JYWQxODE2X2hhbHRfb3V0cHV0KGRldik7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotc3RhdGljIHZvaWQgYWQxODE2X3RyaWdnZXIgKGludCBkZXYsIGludCBzdGF0ZSkgCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0KLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IHRyaWdnZXIgY2FsbGVkISAoZGV2Yz0lZCxkZXZjLT5iYXNlPSVkXG4iLCBkZXZjLCBkZXZjLT5iYXNlKSk7Ci0KLQkvKiBtb2RlIG1heSBoYXZlIGNoYW5nZWQgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQotCS8qIG1hc2sgb3V0IG1vZGVzIG5vdCBzcGVjaWZpZWQgb24gb3BlbiBjYWxsICovCi0Jc3RhdGUgJj0gZGV2Yy0+YXVkaW9fbW9kZTsgCi0JCQkJCi0JLyogc2V0dXAgc291bmRjaGlwIHRvIG5ldyBpby1tb2RlICovCi0JaWYgKHN0YXRlICYgUENNX0VOQUJMRV9JTlBVVCkgewotCQkvKiBlbmFibGUgY2FwdHVyZSAqLwotCQlvdXRiKGluYihkZXZjLT5iYXNlKzkpfDB4MDEsIGRldmMtPmJhc2UrOSk7Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBjYXB0dXJlICovCi0JCW91dGIoaW5iKGRldmMtPmJhc2UrOSkmfjB4MDEsIGRldmMtPmJhc2UrOSk7Ci0JfQotCi0JaWYgKHN0YXRlICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKLQkJLyogZW5hYmxlIHBsYXliYWNrICovCi0JCW91dGIoaW5iKGRldmMtPmJhc2UrOCl8MHgwMSwgZGV2Yy0+YmFzZSs4KTsKLQkJLyogdW5tdXRlIHBjbSBvdXRwdXQgKi8KLQkJYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpJn4weDgwODApOwotCX0gZWxzZSB7Ci0JCS8qIG11dGUgcGNtIG91dHB1dCAqLwotCQlhZF93cml0ZShkZXZjLCA0LCBhZF9yZWFkKGRldmMsNCl8MHg4MDgwKTsKLQkJLyogZGlzYWJsZSBjYXB0dXJlICovCi0JCW91dGIoaW5iKGRldmMtPmJhc2UrOCkmfjB4MDEsIGRldmMtPmJhc2UrOCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi0KLS8qIGhhbHQgaW5wdXQgJiBvdXRwdXQgKi8KLXN0YXRpYyB2b2lkIGFkMTgxNl9oYWx0IChpbnQgZGV2KQotewotCWFkMTgxNl9oYWx0X2lucHV0KGRldik7Ci0JYWQxODE2X2hhbHRfb3V0cHV0KGRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl9yZXNldCAoaW50IGRldikKLXsKLQlhZDE4MTZfaGFsdCAoZGV2KTsKLX0KLQotLyogc2V0IHBsYXliYWNrIHNwZWVkICovCi1zdGF0aWMgaW50IGFkMTgxNl9zZXRfc3BlZWQgKGludCBkZXYsIGludCBhcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgZnJlcTsKLQlpbnQgcmV0OwotCi0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGFyZyA9PSAwKSB7Ci0JCXJldCA9IGRldmMtPnNwZWVkOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCS8qIHJhbmdlIGNoZWNraW5nICovCi0JaWYgKGFyZyA8IDQwMDApIHsKLQkJYXJnID0gNDAwMDsKLQl9Ci0JaWYgKGFyZyA+IDU1MDAwKSB7Ci0JCWFyZyA9IDU1MDAwOwotCX0KLQlkZXZjLT5zcGVlZCA9IGFyZzsKLQotCS8qIGNoYW5nZSBzcGVlZCBkdXJpbmcgcGxheWJhY2sgKi8KLQlmcmVxPSgodW5zaWduZWQgaW50KWRldmMtPnNwZWVkKjMzMDAwKS9hZDE4MTZfY2xvY2tmcmVxOyAKLQkvKiB3cml0ZSBwbGF5YmFjay9jYXB0dXJlIHNwZWVkcyAqLwotCWFkX3dyaXRlIChkZXZjLCAyLCBmcmVxICYgMHhmZmZmKTsJCi0JYWRfd3JpdGUgKGRldmMsIDMsIGZyZXEgJiAweGZmZmYpOwkKLQotCXJldCA9IGRldmMtPnNwZWVkOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYWQxODE2X3NldF9iaXRzIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCXN0YXRpYyBzdHJ1Y3QgZm9ybWF0X3RibCB7Ci0JCWludCAgICAgICAgICAgICBmb3JtYXQ7Ci0JCXVuc2lnbmVkIGNoYXIgICBiaXRzOwotCX0gZm9ybWF0MmJpdHNbXSA9IHsKLQkJeyAwLCAwIH0sCi0JCXsgQUZNVF9NVV9MQVcsIDEgfSwKLQkJeyBBRk1UX0FfTEFXLCAzIH0sCi0JCXsgQUZNVF9JTUFfQURQQ00sIDAgfSwKLQkJeyBBRk1UX1U4LCAwIH0sCi0JCXsgQUZNVF9TMTZfTEUsIDIgfSwKLQkJeyBBRk1UX1MxNl9CRSwgNiB9LAotCQl7IEFGTVRfUzgsIDAgfSwKLQkJeyBBRk1UX1UxNl9MRSwgMCB9LAotCQl7IEFGTVRfVTE2X0JFLCAwIH0KLSAgCX07Ci0KLQlpbnQgIGksIG4gPSBzaXplb2YgKGZvcm1hdDJiaXRzKSAvIHNpemVvZiAoc3RydWN0IGZvcm1hdF90YmwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQkvKiByZXR1cm4gY3VycmVudCBmb3JtYXQgKi8KLQlpZiAoYXJnID09IDApIHsKLQkgIAlhcmcgPSBkZXZjLT5hdWRpb19mb3JtYXQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIGFyZzsKLQl9Ci0JZGV2Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOwotCi0JLyogc2VhcmNoIG1hdGNoaW5nIGZvcm1hdCBiaXRzICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJaWYgKGZvcm1hdDJiaXRzW2ldLmZvcm1hdCA9PSBhcmcpIHsKLQkJCWRldmMtPmZvcm1hdF9iaXRzID0gZm9ybWF0MmJpdHNbaV0uYml0czsKLQkJCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IGFyZzsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiBhcmc7Ci0JCX0KLQotCS8qIFN0aWxsIGhhbmdpbmcgaGVyZS4gU29tZXRoaW5nIG11c3QgYmUgdGVycmlibHkgd3JvbmcgKi8KLQlkZXZjLT5mb3JtYXRfYml0cyA9IDA7Ci0JZGV2Yy0+YXVkaW9fZm9ybWF0ID0gQUZNVF9VODsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuKEFGTVRfVTgpOyAKLX0KLQotc3RhdGljIHNob3J0IGFkMTgxNl9zZXRfY2hhbm5lbHMgKGludCBkZXYsIHNob3J0IGFyZykKLXsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0KLQlpZiAoYXJnICE9IDEgJiYgYXJnICE9IDIpCi0JCXJldHVybiBkZXZjLT5jaGFubmVsczsKLQotCWRldmMtPmNoYW5uZWxzID0gYXJnOwotCXJldHVybiBhcmc7Ci19Ci0KLS8qIG9wZW4gZGV2aWNlICovCi1zdGF0aWMgaW50IGFkMTgxNl9vcGVuIChpbnQgZGV2LCBpbnQgbW9kZSkgCi17Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKLQotCS8qIGlzIGRldmljZSBudW1iZXIgdmFsaWQgPyAqLwotCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fYXVkaW9kZXZzKQotCQlyZXR1cm4gLShFTlhJTyk7Ci0KLQkvKiBnZXQgZGV2aWNlIGluZm8gb2YgdGhpcyBkZXYgKi8KLQlkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsgCi0KLQkvKiBtYWtlIGNoZWNrIGlmIGRldmljZSBhbHJlYWR5IG9wZW4gYXRvbWljICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JaWYgKGRldmMtPm9wZW5lZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQkJcmV0dXJuIC0oRUJVU1kpOwotCX0KLQotCS8qIG1hcmsgZGV2aWNlIGFzIG9wZW4gKi8KLQlkZXZjLT5vcGVuZWQgPSAxOyAKLQotCWRldmMtPmF1ZGlvX21vZGUgPSAwOwotCWRldmMtPnNwZWVkID0gODAwMDsKLQlkZXZjLT5hdWRpb19mb3JtYXQ9QUZNVF9VODsKLQlkZXZjLT5jaGFubmVscz0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCWFkMTgxNl9yZXNldChkZXZjLT5kZXZfbm8pOyAvKiBoYWx0IGFsbCBwZW5kaW5nIG91dHB1dCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfY2xvc2UgKGludCBkZXYpIC8qIGNsb3NlIGRldmljZSAqLwotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCi0JLyogaGFsdCBhbGwgcGVuZGluZyBvdXRwdXQgKi8KLQlhZDE4MTZfcmVzZXQoZGV2Yy0+ZGV2X25vKTsgCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JZGV2Yy0+b3BlbmVkID0gMDsKLQlkZXZjLT5hdWRpb19tb2RlID0gMDsKLQlkZXZjLT5zcGVlZCA9IDgwMDA7Ci0JZGV2Yy0+YXVkaW9fZm9ybWF0PUFGTVRfVTg7Ci0JZGV2Yy0+Zm9ybWF0X2JpdHMgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogQXVkaW8gZHJpdmVyIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBhZDE4MTZfYXVkaW9fZHJpdmVyID0KLXsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQkJPSBhZDE4MTZfb3BlbiwKLQkuY2xvc2UJCQk9IGFkMTgxNl9jbG9zZSwKLQkub3V0cHV0X2Jsb2NrCQk9IGFkMTgxNl9vdXRwdXRfYmxvY2ssCi0JLnN0YXJ0X2lucHV0CQk9IGFkMTgxNl9zdGFydF9pbnB1dCwKLQkucHJlcGFyZV9mb3JfaW5wdXQJPSBhZDE4MTZfcHJlcGFyZV9mb3JfaW5wdXQsCi0JLnByZXBhcmVfZm9yX291dHB1dAk9IGFkMTgxNl9wcmVwYXJlX2Zvcl9vdXRwdXQsCi0JLmhhbHRfaW8JCT0gYWQxODE2X2hhbHQsCi0JLmhhbHRfaW5wdXQJCT0gYWQxODE2X2hhbHRfaW5wdXQsCi0JLmhhbHRfb3V0cHV0CQk9IGFkMTgxNl9oYWx0X291dHB1dCwKLQkudHJpZ2dlcgkJPSBhZDE4MTZfdHJpZ2dlciwKLQkuc2V0X3NwZWVkCQk9IGFkMTgxNl9zZXRfc3BlZWQsCi0JLnNldF9iaXRzCQk9IGFkMTgxNl9zZXRfYml0cywKLQkuc2V0X2NoYW5uZWxzCQk9IGFkMTgxNl9zZXRfY2hhbm5lbHMsCi19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWQxODE2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGNoYXIJc3RhdHVzOwotCWFkMTgxNl9pbmZvCSpkZXZjID0gKGFkMTgxNl9pbmZvICopZGV2X2lkOwotCQotCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7Ci0JICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEdvdCBib2d1cyBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlzcGluX2xvY2soJmRldmMtPmxvY2spOwotCi0JLyogcmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KLQlzdGF0dXMgPSBpbmIgKGRldmMtPmJhc2UrMSk7IAotCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgICovCi0Jb3V0YiAofnN0YXR1cywgZGV2Yy0+YmFzZSsxKTsJCi0KLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IEdvdCBpbnRlcnJ1cHQgc3ViY2xhc3MgJWRcbiIsc3RhdHVzKSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBpbnRlcnJ1cHQ6IEdvdCBpbnRlcnJ1cHQsIGJ1dCBubyBzb3VyY2UuXG4iKSk7Ci0JCXNwaW5fdW5sb2NrKCZkZXZjLT5sb2NrKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWlmIChkZXZjLT5vcGVuZWQgJiYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiAoc3RhdHVzJjY0KSkKLQkJRE1BYnVmX2lucHV0aW50ciAoZGV2Yy0+ZGV2X25vKTsKLQotCWlmIChkZXZjLT5vcGVuZWQgJiYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX09VVFBVVCkgJiYgKHN0YXR1cyAmIDEyOCkpCi0JCURNQWJ1Zl9vdXRwdXRpbnRyIChkZXZjLT5kZXZfbm8sIDEpOwotCi0Jc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBNaXhlciBzdHVmZiAqLwotCi1zdHJ1Y3QgbWl4ZXJfZGVmIHsKLQl1bnNpZ25lZCBpbnQgcmVnbm86IDc7Ci0JdW5zaWduZWQgaW50IHBvbGFyaXR5OjE7CS8qIDA9bm9ybWFsLCAxPXJldmVyc2VkICovCi0JdW5zaWduZWQgaW50IGJpdHBvczo0OwotCXVuc2lnbmVkIGludCBuYml0czo0OwotfTsKLQotc3RhdGljIGNoYXIgbWl4X2N2dFsxMDFdID0gewotCSAwLCAwLCAzLCA3LDEwLDEzLDE2LDE5LDIxLDIzLDI2LDI4LDMwLDMyLDM0LDM1LDM3LDM5LDQwLDQyLAotCTQzLDQ1LDQ2LDQ3LDQ5LDUwLDUxLDUyLDUzLDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LAotCTY1LDY2LDY3LDY4LDY5LDcwLDcwLDcxLDcyLDczLDczLDc0LDc1LDc1LDc2LDc3LDc3LDc4LDc5LDc5LAotCTgwLDgxLDgxLDgyLDgyLDgzLDg0LDg0LDg1LDg1LDg2LDg2LDg3LDg3LDg4LDg4LDg5LDg5LDkwLDkwLAotCTkxLDkxLDkyLDkyLDkzLDkzLDk0LDk0LDk1LDk1LDk2LDk2LDk2LDk3LDk3LDk4LDk4LDk4LDk5LDk5LAotCTEwMAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfZGVmIG1peGVyX2VudDsKLQotLyoKLSAqIE1vc3Qgb2YgdGhlIG1peGVyIGVudHJpZXMgd29yayBpbiBiYWNrd2FyZHMuIFNldHRpbmcgdGhlIHBvbGFyaXR5IGZpZWxkCi0gKiBtYWtlcyB0aGVtIHRvIHdvcmsgY29ycmVjdGx5LgotICoKLSAqIFRoZSBjaGFubmVsIG51bWJlcmluZyB1c2VkIGJ5IGluZGl2aWR1YWwgc291bmRjYXJkcyBpcyBub3QgZml4ZWQuIFNvbWUKLSAqIGNhcmRzIGhhdmUgYXNzaWduZWQgZGlmZmVyZW50IG1lYW5pbmdzIGZvciB0aGUgQVVYMSwgQVVYMiBhbmQgTElORSBpbnB1dHMuCi0gKiBUaGUgY3VycmVudCB2ZXJzaW9uIGRvZXNuJ3QgdHJ5IHRvIGNvbXBlbnNhdGUgdGhpcy4KLSAqLwotCi0jZGVmaW5lIE1JWF9FTlQobmFtZSwgcmVnX2wsIHBvbGFfbCwgcG9zX2wsIGxlbl9sLCByZWdfciwgcG9sYV9yLCBwb3NfciwgbGVuX3IpCVwKLSAge3tyZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2x9LCB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yfX0KLQotCi1zdGF0aWMgbWl4ZXJfZW50IG1peF9kZXZpY2VzW1NPVU5EX01JWEVSX05SREVWSUNFU11bMl0gPSB7Ci1NSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJMTQsIDEsIDgsIDUsCTE0LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfQkFTUywJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJIDUsIDEsIDgsIDYsCSA1LCAxLCAwLCA2KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfUENNLAkgNCwgMSwgOCwgNiwJIDQsIDEsIDAsIDYpLAotTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkxOCwgMSwgOCwgNSwJMTgsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9NSUMsCTE5LCAxLCA4LCA1LAkxOSwgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0NELAkgCTE1LCAxLCA4LCA1LAkxNSwgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkyMCwgMCwgOCwgNCwJMjAsIDAsIDAsIDQpLAotTUlYX0VOVChTT1VORF9NSVhFUl9JR0FJTiwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUxLCAJMTcsIDEsIDgsIDUsCTE3LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCTE2LCAxLCA4LCA1LAkxNiwgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUzLCAgICAgIDM5LCAwLCA5LCA0LCAgICAzOSwgMSwgMCwgNSkKLX07Ci0KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IGRlZmF1bHRfbWl4ZXJfbGV2ZWxzW1NPVU5EX01JWEVSX05SREVWSUNFU10gPQotewotCTB4NDM0MywJCS8qIE1hc3RlciBWb2x1bWUgKi8KLQkweDMyMzIsCQkvKiBCYXNzICovCi0JMHgzMjMyLAkJLyogVHJlYmxlICovCi0JMHgwMDAwLAkJLyogRk0gKi8KLQkweDQzNDMsCQkvKiBQQ00gKi8KLQkweDAwMDAsCQkvKiBQQyBTcGVha2VyICovCi0JMHgwMDAwLAkJLyogRXh0IExpbmUgKi8KLQkweDAwMDAsCQkvKiBNaWMgKi8KLQkweDAwMDAsCQkvKiBDRCAqLwotCTB4MDAwMCwJCS8qIFJlY29yZGluZyBtb25pdG9yICovCi0JMHgwMDAwLAkJLyogU0IgUENNICovCi0JMHgwMDAwLAkJLyogUmVjb3JkaW5nIGxldmVsICovCi0JMHgwMDAwLAkJLyogSW5wdXQgZ2FpbiAqLwotCTB4MDAwMCwJCS8qIE91dHB1dCBnYWluICovCi0JMHgwMDAwLAkJLyogTGluZTEgKi8KLQkweDAwMDAsCQkvKiBMaW5lMiAqLwotCTB4MDAwMAkJLyogTGluZTMgKHVzdWFsbHkgbGluZSBpbikqLwotfTsKLQotI2RlZmluZSBMRUZUX0NITgkwCi0jZGVmaW5lIFJJR0hUX0NITgkxCi0KLQotCi1zdGF0aWMgaW50Ci1hZDE4MTZfc2V0X3JlY21hc2sgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IG1hc2spCi17Ci0gIAl1bnNpZ25lZCBsb25nIAlmbGFnczsKLQl1bnNpZ25lZCBjaGFyICAgcmVjZGV2OwotCWludCAgICAgICAgICAgICBpLCBuOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JbWFzayAmPSBkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXM7Ci0JCi0JbiA9IDA7Ci0JLyogQ291bnQgc2VsZWN0ZWQgZGV2aWNlIGJpdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKLQkJCW4rKzsKLQkKLQlpZiAobiA9PSAwKQotCQltYXNrID0gU09VTkRfTUFTS19NSUM7Ci0JZWxzZSBpZiAobiAhPSAxKSB7IC8qIFRvbyBtYW55IGRldmljZXMgc2VsZWN0ZWQgKi8KLQkJLyogRmlsdGVyIG91dCBhY3RpdmUgc2V0dGluZ3MgKi8KLQkJbWFzayAmPSB+ZGV2Yy0+cmVjbWFzazsJCi0JCQotCQluID0gMDsKLQkJLyogQ291bnQgc2VsZWN0ZWQgZGV2aWNlIGJpdHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIAotCQkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKLQkJCQluKys7Ci0JCQotCQlpZiAobiAhPSAxKQotCQkJbWFzayA9IFNPVU5EX01BU0tfTUlDOwotCX0KLQkKLQlzd2l0Y2ggKG1hc2spIHsKLQljYXNlIFNPVU5EX01BU0tfTUlDOgotCQlyZWNkZXYgPSA1OwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NQVNLX0xJTkU6Ci0JCXJlY2RldiA9IDA7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01BU0tfQ0Q6Ci0JCXJlY2RldiA9IDI7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01BU0tfTElORTE6Ci0JCXJlY2RldiA9IDQ7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01BU0tfTElORTI6Ci0JCXJlY2RldiA9IDM7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01BU0tfVk9MVU1FOgotCQlyZWNkZXYgPSAxOwotCQlicmVhazsKLQkJCi0JZGVmYXVsdDoKLQkJbWFzayA9IFNPVU5EX01BU0tfTUlDOwotCQlyZWNkZXYgPSA1OwotCX0KLQkKLQlyZWNkZXYgPDw9IDQ7Ci0JYWRfd3JpdGUgKGRldmMsIDIwLCAKLQkJICAoYWRfcmVhZCAoZGV2YywgMjApICYgMHg4ZjhmKSB8IHJlY2RldiB8IChyZWNkZXY8PDgpKTsKLQotCWRldmMtPnJlY21hc2sgPSBtYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIHZvaWQKLWNoYW5nZV9iaXRzIChpbnQgKnJlZ3ZhbCwgaW50IGRldiwgaW50IGNobiwgaW50IG5ld3ZhbCkKLXsKLQl1bnNpZ25lZCBjaGFyICAgbWFzazsKLQlpbnQgICAgICAgICAgICAgc2hpZnQ7Ci0gIAotCS8qIFJldmVyc2UgcG9sYXJpdHkqLwotCi0JaWYgKG1peF9kZXZpY2VzW2Rldl1bY2huXS5wb2xhcml0eSA9PSAxKSAKLQkJbmV3dmFsID0gMTAwIC0gbmV3dmFsOwotCi0JbWFzayA9ICgxIDw8IG1peF9kZXZpY2VzW2Rldl1bY2huXS5uYml0cykgLSAxOwotCXNoaWZ0ID0gbWl4X2RldmljZXNbZGV2XVtjaG5dLmJpdHBvczsKLQkvKiBTY2FsZSBpdCAqLwotCW5ld3ZhbCA9IChpbnQpICgobmV3dmFsICogbWFzaykgKyA1MCkgLyAxMDA7CQotCS8qIENsZWFyIGJpdHMgKi8KLQkqcmVndmFsICY9IH4obWFzayA8PCBzaGlmdCk7CQotCS8qIFNldCBuZXcgdmFsdWUgKi8KLQkqcmVndmFsIHw9IChuZXd2YWwgJiBtYXNrKSA8PCBzaGlmdDsJCi19Ci0KLXN0YXRpYyBpbnQKLWFkMTgxNl9taXhlcl9nZXQgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IGRldikKLXsKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG1peGVyX2dldCBjYWxsZWQhXG4iKSk7Ci0JCi0JLyogcmFuZ2UgY2hlY2sgKyBzdXBwb3J0ZWQgbWl4ZXIgY2hlY2sgKi8KLQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTICkKLQkgICAgICAgIHJldHVybiAoLShFSU5WQUwpKTsKLQlpZiAoISgoMSA8PCBkZXYpICYgZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMpKQotCQlyZXR1cm4gLShFSU5WQUwpOwotCQotCXJldHVybiBkZXZjLT5sZXZlbHNbZGV2XTsKLX0KLQotc3RhdGljIGludAotYWQxODE2X21peGVyX3NldCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgZGV2LCBpbnQgdmFsdWUpCi17Ci0JaW50ICAgbGVmdCA9IHZhbHVlICYgMHgwMDAwMDBmZjsKLQlpbnQgICByaWdodCA9ICh2YWx1ZSAmIDB4MDAwMGZmMDApID4+IDg7Ci0JaW50ICAgcmV0dm9sOwotCi0JaW50ICAgcmVnb2ZmczsKLQlpbnQgICB2YWw7Ci0JaW50ICAgdmFsbXV0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBtaXhlcl9zZXQgY2FsbGVkIVxuIikpOwotCQotCWlmIChkZXYgPCAwIHx8IGRldiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgKQotCQlyZXR1cm4gLShFSU5WQUwpOwotCi0JaWYgKGxlZnQgPiAxMDApCi0JCWxlZnQgPSAxMDA7Ci0JaWYgKGxlZnQgPCAwKQotCQlsZWZ0ID0gMDsKLQlpZiAocmlnaHQgPiAxMDApCi0JCXJpZ2h0ID0gMTAwOwotCWlmIChyaWdodCA8IDApCi0JCXJpZ2h0ID0gMDsKLQkKLQkvKiBNb25vIGNvbnRyb2wgKi8KLQlpZiAobWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApIAotCQlyaWdodCA9IGxlZnQ7Ci0JcmV0dm9sID0gbGVmdCB8IChyaWdodCA8PCA4KTsKLQkKLQkvKiBTY2FsZSBpdCAqLwotCQotCWxlZnQgPSBtaXhfY3Z0W2xlZnRdOwotCXJpZ2h0ID0gbWl4X2N2dFtyaWdodF07Ci0KLQkvKiByZWplY3QgYWxsIG1peGVycyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkICovCi0JaWYgKCEoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBkZXYpKSkKLQkJcmV0dXJuIC0oRUlOVkFMKTsKLQkKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAobWl4X2RldmljZXNbZGV2XVtMRUZUX0NITl0ubmJpdHMgPT0gMCkKLQkJcmV0dXJuIC0oRUlOVkFMKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCi0JLyoga2VlcCBwcmVjaXNlIHZvbHVtZSBpbnRlcm5hbCAqLwotCWRldmMtPmxldmVsc1tkZXZdID0gcmV0dm9sOwotCi0JLyogU2V0IHRoZSBsZWZ0IGNoYW5uZWwgKi8KLQlyZWdvZmZzID0gbWl4X2RldmljZXNbZGV2XVtMRUZUX0NITl0ucmVnbm87Ci0JdmFsID0gYWRfcmVhZCAoZGV2YywgcmVnb2Zmcyk7Ci0JY2hhbmdlX2JpdHMgKCZ2YWwsIGRldiwgTEVGVF9DSE4sIGxlZnQpOwotCi0JdmFsbXV0ZT12YWw7Ci0KLQkvKiBNdXRlIGJpdCBtYXNraW5nIG9uIHNvbWUgcmVnaXN0ZXJzICovCi0JaWYgKCByZWdvZmZzPT01IHx8IHJlZ29mZnM9PTE0IHx8IHJlZ29mZnM9PTE1IHx8Ci0JICAgICByZWdvZmZzPT0xNiB8fCByZWdvZmZzPT0xNyB8fCByZWdvZmZzPT0xOCB8fCAKLQkgICAgIHJlZ29mZnM9PTE5IHx8IHJlZ29mZnM9PTM5KSB7Ci0JCWlmIChsZWZ0PT0wKQotCQkJdmFsbXV0ZSB8PSAweDgwMDA7Ci0JCWVsc2UKLQkJCXZhbG11dGUgJj0gfjB4ODAwMDsKLQl9Ci0JYWRfd3JpdGUgKGRldmMsIHJlZ29mZnMsIHZhbG11dGUpOyAvKiBtdXRlICovCi0KLQkvKgotCSAqIFNldCB0aGUgcmlnaHQgY2hhbm5lbAotCSAqLwotIAotCS8qIFdhcyBqdXN0IGEgbW9ubyBjaGFubmVsICovCi0JaWYgKG1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5uYml0cyA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHJldHZvbDsJCQotCX0KLQotCXJlZ29mZnMgPSBtaXhfZGV2aWNlc1tkZXZdW1JJR0hUX0NITl0ucmVnbm87Ci0JdmFsID0gYWRfcmVhZCAoZGV2YywgcmVnb2Zmcyk7Ci0JY2hhbmdlX2JpdHMgKCZ2YWwsIGRldiwgUklHSFRfQ0hOLCByaWdodCk7Ci0KLQl2YWxtdXRlPXZhbDsKLQlpZiAoIHJlZ29mZnM9PTUgfHwgcmVnb2Zmcz09MTQgfHwgcmVnb2Zmcz09MTUgfHwKLQkgICAgIHJlZ29mZnM9PTE2IHx8IHJlZ29mZnM9PTE3IHx8IHJlZ29mZnM9PTE4IHx8IAotCSAgICAgcmVnb2Zmcz09MTkgfHwgcmVnb2Zmcz09MzkpIHsKLQkJaWYgKHJpZ2h0PT0wKQotCQkJdmFsbXV0ZSB8PSAweDgwOwotCQllbHNlCi0JCQl2YWxtdXRlICY9IH4weDgwOwotCX0KLQlhZF93cml0ZSAoZGV2YywgcmVnb2ZmcywgdmFsbXV0ZSk7IC8qIG11dGUgKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgCXJldHVybiByZXR2b2w7Ci19Ci0KLSNkZWZpbmUgTUlYRVJfREVWSUNFUyAoIFNPVU5EX01BU0tfVk9MVU1FIHwgXAotCQkJU09VTkRfTUFTS19TWU5USCB8IFwKLQkJCVNPVU5EX01BU0tfUENNIHwgXAotCQkJU09VTkRfTUFTS19MSU5FIHwgXAotCQkJU09VTkRfTUFTS19MSU5FMSB8IFwKLQkJCVNPVU5EX01BU0tfTElORTIgfCBcCi0JCQlTT1VORF9NQVNLX0xJTkUzIHwgXAotCQkJU09VTkRfTUFTS19NSUMgfCBcCi0JCQlTT1VORF9NQVNLX0NEIHwgXAotCQkJU09VTkRfTUFTS19SRUNMRVYgIFwKLQkJCSkKLSNkZWZpbmUgUkVDX0RFVklDRVMgKCBTT1VORF9NQVNLX0xJTkUyIHxcCi0JCSAgICAgIFNPVU5EX01BU0tfTElORSB8XAotCQkgICAgICBTT1VORF9NQVNLX0xJTkUxIHxcCi0JCSAgICAgIFNPVU5EX01BU0tfTUlDIHxcCi0JCSAgICAgIFNPVU5EX01BU0tfQ0QgfFwKLQkJICAgICAgU09VTkRfTUFTS19WT0xVTUUgXAotCQkgICAgICApCi0gICAgIAotc3RhdGljIHZvaWQKLWFkMTgxNl9taXhlcl9yZXNldCAoYWQxODE2X2luZm8gKiBkZXZjKQotewotCWludCAgaTsKLQotCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gTUlYRVJfREVWSUNFUzsKLQkKLQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgPSBSRUNfREVWSUNFUzsKLQotCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKLQkJaWYgKGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzICYgKDEgPDwgaSkpCi0JCQlhZDE4MTZfbWl4ZXJfc2V0IChkZXZjLCBpLCBkZWZhdWx0X21peGVyX2xldmVsc1tpXSk7Ci0JYWQxODE2X3NldF9yZWNtYXNrIChkZXZjLCBTT1VORF9NQVNLX01JQyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWFkMTgxNl9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSBtaXhlcl9kZXZzW2Rldl0tPmRldmM7Ci0JaW50IHZhbDsKLQlpbnQgX191c2VyICpwID0gYXJnOwotICAKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG1peGVyX2lvY3RsIGNhbGxlZCFcbiIpKTsKLSAgCi0JLyogTWl4ZXIgaW9jdGwgKi8KLQlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSA9PSAnTScpIHsgCi0JCQotCQkvKiBzZXQgaW9jdGwgKi8KLQkJaWYgKF9TSU9DX0RJUiAoY21kKSAmIF9TSU9DX1dSSVRFKSB7IAotCQkJc3dpdGNoIChjbWQgJiAweGZmKXsKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQkJCQotCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl2YWw9YWQxODE2X3NldF9yZWNtYXNrIChkZXZjLCB2YWwpOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJZGVmYXVsdDoKLQkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYgKCh2YWw9YWQxODE2X21peGVyX3NldCAoZGV2YywgY21kICYgMHhmZiwgdmFsKSk8MCkKLQkJCQkgICAgICAgIHJldHVybiB2YWw7Ci0JCQkJZWxzZQotCQkJCSAgICAgICAgcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQl9Ci0JCX0gZWxzZSB7IAotCQkJLyogcmVhZCBpb2N0bCAqLwotCQkJc3dpdGNoIChjbWQgJiAweGZmKSB7Ci0JCQkJCi0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJCQl2YWw9ZGV2Yy0+cmVjbWFzazsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJCQl2YWw9ZGV2Yy0+c3VwcG9ydGVkX2RldmljZXM7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKLQkJCQl2YWw9ZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiB+KFNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfSU1JWCk7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6Ci0JCQkJdmFsPWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKLQkJCQl2YWw9U09VTkRfQ0FQX0VYQ0xfSU5QVVQ7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQlkZWZhdWx0OgotCQkJICAgICAgICBpZiAoKHZhbD1hZDE4MTZfbWl4ZXJfZ2V0IChkZXZjLCBjbWQgJiAweGZmKSk8MCkKLQkJCQkgICAgICAgIHJldHVybiB2YWw7Ci0JCQkJZWxzZQotCQkJCSAgICAgICAgcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UKLQkJLyogbm90IGZvciBtaXhlciAqLwotCQlyZXR1cm4gLShFSU5WQUwpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIE1peGVyIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgYWQxODE2X21peGVyX29wZXJhdGlvbnMgPSB7Ci0JLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLmlkCT0gIkFEMTgxNiIsCi0JLm5hbWUJPSAiQUQxODE2IE1peGVyIiwKLQkuaW9jdGwJPSBhZDE4MTZfbWl4ZXJfaW9jdGwKLX07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBzdHVmZiBmb3IgY2FyZCByZWNvZ25pdGlvbiwgaW5pdCBhbmQgdW5sb2FkaW5nIFBOUCAuLi4qLwotCi0KLS8qIGNoZWNrIGlmIEFEMTgxNiBwcmVzZW50IGF0IHNwZWNpZmllZCBod19jb25maWcgYW5kIHJlZ2lzdGVyIGRldmljZSB3aXRoIE9TIAotICogcmV0dXJuIDEgaWYgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwsIDAgb3RoZXJ3aXNlCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGFkMTgxNl9pbml0X2NhcmQgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgCi0Jc3RydWN0IHBucF9kZXYgKnBucCkKLXsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IE5VTEw7Ci0JaW50IHRtcDsKLQlpbnQgb3NzX2Rldm5vID0gLTE7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IGluaXRpYWxpemluZyBjYXJkOiBpbz0weCV4LCBpcnE9JWQsIGRtYT0lZCwgIgotCQkJICJkbWEyPSVkLCBjbG9ja2ZyZXE9JWQsIG9wdGlvbnM9JWQgaXNhZG1hYnVnPSVkICIKLQkJCSAiJXNcbiIsCi0JICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSwKLQkgICAgICAgaHdfY29uZmlnLT5pcnEsCi0JICAgICAgIGh3X2NvbmZpZy0+ZG1hLAotCSAgICAgICBod19jb25maWctPmRtYTIsCi0JICAgICAgIGFkMTgxNl9jbG9ja2ZyZXEsCi0JICAgICAgIG9wdGlvbnMsCi0JICAgICAgIGlzYV9kbWFfYnJpZGdlX2J1Z2d5LAotCSAgICAgICBwbnA/IihQTlApIjoiIik7Ci0KLQkvKiBhZDE4MTZfaW5mbyBzdHJ1Y3R1cmUgcmVtYWluaW5nID8gKi8KLQlpZiAobnJfYWQxODE2X2RldnMgPj0gTUFYX0FVRElPX0RFVikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IG5vIG1vcmUgYWQxODE2X2luZm8gc3RydWN0dXJlcyAiCi0JCQkibGVmdFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRldmMgPSAmZGV2X2luZm9bbnJfYWQxODE2X2RldnNdOwotCWRldmMtPmJhc2UgPSBod19jb25maWctPmlvX2Jhc2U7Ci0JZGV2Yy0+aXJxID0gaHdfY29uZmlnLT5pcnE7Ci0JZGV2Yy0+ZG1hX3BsYXliYWNrPWh3X2NvbmZpZy0+ZG1hOwotCWRldmMtPmRtYV9jYXB0dXJlPWh3X2NvbmZpZy0+ZG1hMjsKLQlkZXZjLT5vcGVuZWQgPSAwOwotCWRldmMtPnBucGRldiA9IHBucDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+bG9jayk7Ci0KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldmMtPmJhc2UsIDE2LCAiQUQxODE2IFNvdW5kIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBJL08gcG9ydCAweCUwM3ggbm90IGZyZWVcbiIsCi0JCQkJICAgIGRldmMtPmJhc2UpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IEV4YW1pbmluZyBBRDE4MTYgYXQgYWRkcmVzcyAweCUwM3guXG4iLCAKLQkJZGV2Yy0+YmFzZSk7Ci0JCi0KLQkvKiB0ZXN0cyBmb3IgYWQxODE2ICovCi0JLyogYmFzZSswOiBiaXQgMSBtdXN0IGJlIHNldCBidXQgbm90IDI1NSAqLwotCXRtcD1pbmIoZGV2Yy0+YmFzZSk7Ci0JaWYgKCAodG1wJjB4ODApPT0wIHx8IHRtcD09MjU1ICkgewotCQlwcmludGsgKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgb3IgY2hpcCAiCi0JCQkiaXMgbm90IGFjdGl2ZSAoVGVzdCAwKVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIHdyaXRlcyB0byBpcmVnIDggYXJlIGNvcGllZCB0byBpcmVnIDkgKi8KLQlhZF93cml0ZShkZXZjLDgsMTIzNDUpOyAKLQlpZiAoYWRfcmVhZChkZXZjLDkpIT0xMjM0NSkgewotCQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCAxKVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLSAgCi0JLyogd3JpdGVzIHRvIGlyZWcgOCBhcmUgY29waWVkIHRvIGlyZWcgOSAqLwotCWFkX3dyaXRlKGRldmMsOCw1NDMyMSk7IAotCWlmIChhZF9yZWFkKGRldmMsOSkhPTU0MzIxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDIpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogd3JpdGVzIHRvIGlyZWcgMTAgYXJlIGNvcGllZCB0byBpcmVnIDExICovCi0JYWRfd3JpdGUoZGV2YywxMCw1NDMyMSk7IAotCWlmIChhZF9yZWFkKGRldmMsMTEpIT01NDMyMSkgewotCQlwcmludGsgKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgMylcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiB3cml0ZXMgdG8gaXJlZyAxMCBhcmUgY29waWVkIHRvIGlyZWcgMTEgKi8KLQlhZF93cml0ZShkZXZjLDEwLDEyMzQ1KTsgCi0JaWYgKGFkX3JlYWQoZGV2YywxMSkhPTEyMzQ1KSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCA0KVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIGJpdCBpbiBiYXNlICsxIGNhbm5vdCBiZSBzZXQgdG8gMSAqLwotCXRtcD1pbmIoZGV2Yy0+YmFzZSsxKTsKLQlvdXRiKDB4ZmYsZGV2Yy0+YmFzZSsxKTsgCi0JaWYgKGluYihkZXZjLT5iYXNlKzEpIT10bXApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgNSlcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0gIAotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQUQxODE2ICh2ZXJzaW9uICVkKSBzdWNjZXNzZnVsbHkgZGV0ZWN0ZWQhXG4iLAotCQlhZF9yZWFkKGRldmMsNDUpKTsKLQotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLQlhZF93cml0ZShkZXZjLDEsMCk7ICAgICAKLQotCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLwotCW91dGIgKDAsIGRldmMtPmJhc2UrMSk7CQotCi0JLyogYWxsb2NhdGUgaXJxICovCi0JaWYgKGRldmMtPmlycSA8IDAgfHwgZGV2Yy0+aXJxID4gMTUpCi0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCWlmIChyZXF1ZXN0X2lycShkZXZjLT5pcnEsIGFkMTgxNl9pbnRlcnJ1cHQsMCwKLQkJCSJTb3VuZFBvcnQiLCBkZXZjKSA8IDApCXsKLQkgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogSVJRIGluIHVzZVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIERNQSBzdHVmZiAqLwotCWlmIChzb3VuZF9hbGxvY19kbWEgKGRldmMtPmRtYV9wbGF5YmFjaywgIlNvdW5kIFN5c3RlbSIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogQ2FuJ3QgYWxsb2NhdGUgRE1BJWRcbiIsCi0JCQkJICAgIGRldmMtPmRtYV9wbGF5YmFjayk7Ci0JCWdvdG8gb3V0X2ZyZWVfaXJxOwotCX0KLQkKLQlpZiAoIGRldmMtPmRtYV9jYXB0dXJlID49IDAgJiYgCi0JICAJZGV2Yy0+ZG1hX2NhcHR1cmUgIT0gZGV2Yy0+ZG1hX3BsYXliYWNrKSB7Ci0JCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+ZG1hX2NhcHR1cmUsCi0JCQkJICAgICJTb3VuZCBTeXN0ZW0gKGNhcHR1cmUpIikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogQ2FuJ3QgYWxsb2NhdGUgRE1BJWRcbiIsCi0JCQkJCSAgICBkZXZjLT5kbWFfY2FwdHVyZSk7Ci0JCQlnb3RvIG91dF9mcmVlX2RtYTsKLQkJfQotCQlkZXZjLT5hdWRpb19tb2RlPURNQV9BVVRPTU9ERXxETUFfRFVQTEVYOwotCX0gZWxzZSB7Ci0JICAJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBPbmx5IG9uZSBETUEgY2hhbm5lbCAiCi0JCQkiYXZhaWxhYmxlL2NvbmZpZ3VyZWQuIE5vIGR1cGxleCBvcGVyYXRpb24gcG9zc2libGVcbiIpOwotCQlkZXZjLT5hdWRpb19tb2RlPURNQV9BVVRPTU9ERTsKLQl9Ci0KLQljb25mX3ByaW50ZjIgKCJBRDE4MTYgYXVkaW8gZHJpdmVyIiwKLQkJICAgICAgZGV2Yy0+YmFzZSwgZGV2Yy0+aXJxLCBkZXZjLT5kbWFfcGxheWJhY2ssIAotCQkgICAgICBkZXZjLT5kbWFfY2FwdHVyZSk7Ci0KLQkvKiByZWdpc3RlciBkZXZpY2UgKi8KLQlpZiAoKG9zc19kZXZubyA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYgKEFVRElPX0RSSVZFUl9WRVJTSU9OLAotCQkJCQkgICAgICAiQUQxODE2IGF1ZGlvIGRyaXZlciIsCi0JCQkJCSAgICAgICZhZDE4MTZfYXVkaW9fZHJpdmVyLAotCQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBhdWRpb19kcml2ZXIpLAotCQkJCQkgICAgICBkZXZjLT5hdWRpb19tb2RlLAotCQkJCQkgICAgICBhZF9mb3JtYXRfbWFzaywKLQkJCQkJICAgICAgZGV2YywKLQkJCQkJICAgICAgZGV2Yy0+ZG1hX3BsYXliYWNrLCAKLQkJCQkJICAgICAgZGV2Yy0+ZG1hX2NhcHR1cmUpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBpbnN0YWxsIHNvdW5kIGRyaXZlclxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfZG1hXzI7Ci0JfQotCi0KLQlhZF93cml0ZShkZXZjLDMyLDB4ODBmMCk7IC8qIHNvdW5kIHN5c3RlbSBtb2RlICovCi0JaWYgKG9wdGlvbnMmMSkgewotCSAgICAgICAgYWRfd3JpdGUoZGV2YywzMywwKTsgLyogZGlzYWJsZSBhbGwgYXVkaW9zb3VyY2VzIGZvciBkc3AgKi8KLQl9IGVsc2UgewotCSAgICAgICAgYWRfd3JpdGUoZGV2YywzMywweDAzZjgpOyAvKiBlbmFibGUgYWxsIGF1ZGlvc291cmNlcyBmb3IgZHNwICovCi0JfQotCWFkX3dyaXRlKGRldmMsNCwweDgwODApOyAgLyogZGVmYXVsdCB2YWx1ZXMgZm9yIHZvbHVtZXMgKG11dGVkKSovCi0JYWRfd3JpdGUoZGV2Yyw1LDB4ODA4MCk7Ci0JYWRfd3JpdGUoZGV2Yyw2LDB4ODA4MCk7Ci0JYWRfd3JpdGUoZGV2Yyw3LDB4ODA4MCk7Ci0JYWRfd3JpdGUoZGV2YywxNSwweDg4ODgpOwotCWFkX3dyaXRlKGRldmMsMTYsMHg4ODg4KTsKLQlhZF93cml0ZShkZXZjLDE3LDB4ODg4OCk7Ci0JYWRfd3JpdGUoZGV2YywxOCwweDg4ODgpOwotCWFkX3dyaXRlKGRldmMsMTksMHhjODg4KTsgLyogKzIwZGIgbWljIGFjdGl2ZSAqLwotCWFkX3dyaXRlKGRldmMsMTQsMHgwMDAwKTsgLyogTWFzdGVyIHZvbHVtZSB1bm11dGVkICovCi0JYWRfd3JpdGUoZGV2YywzOSwweDAwOWYpOyAvKiAzRCBlZmZlY3Qgb24gMCUgcGhvbmUgb3V0IG11dGVkICovCi0JYWRfd3JpdGUoZGV2Yyw0NCwweDAwODApOyAvKiBldmVyeXRoaW5nIG9uIHBvd2VyLCAzZCBlbmFibGVkIGZvciBkL2EgKi8KLQlvdXRiKDB4MTAsZGV2Yy0+YmFzZSs4KTsgLyogc2V0IGRtYSBtb2RlICovCi0Jb3V0YigweDEwLGRldmMtPmJhc2UrOSk7Ci0gIAotCS8qIGVuYWJsZSBjYXB0dXJlICsgcGxheWJhY2sgaW50ZXJydXB0ICovCi0JYWRfd3JpdGUoZGV2YywxLDB4YzAwMCk7IAotCQotCS8qIHNldCBtaXhlciBkZWZhdWx0cyAqLwotCWFkMTgxNl9taXhlcl9yZXNldCAoZGV2Yyk7IAotICAKLQkvKiByZWdpc3RlciBtaXhlciAqLwotCWlmICgoYXVkaW9fZGV2c1tvc3NfZGV2bm9dLT5taXhlcl9kZXY9c291bmRfaW5zdGFsbF9taXhlcigKLQkJCQkgICAgICAgTUlYRVJfRFJJVkVSX1ZFUlNJT04sCi0JCQkJICAgICAgICJBRDE4MTYgYXVkaW8gZHJpdmVyIiwKLQkJCQkgICAgICAgJmFkMTgxNl9taXhlcl9vcGVyYXRpb25zLAotCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSwKLQkJCQkgICAgICAgZGV2YykpIDwgMCkgewotCSAgCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGluc3RhbGwgbWl4ZXJcbiIpOwotCX0KLQkvKiBtYWtlIGFkMTgxNl9pbmZvIGFjdGl2ZSAqLwotCW5yX2FkMTgxNl9kZXZzKys7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBjYXJkIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQhXG4iKTsKLQlyZXR1cm4gMTsKLQkvKiBlcnJvciBoYW5kbGluZyAqLwotb3V0X2ZyZWVfZG1hXzI6Ci0JaWYgKGRldmMtPmRtYV9jYXB0dXJlID49IDAgJiYgZGV2Yy0+ZG1hX2NhcHR1cmUgIT0gZGV2Yy0+ZG1hX3BsYXliYWNrKQotCSAgICAgICAgc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hX2NhcHR1cmUpOwotb3V0X2ZyZWVfZG1hOgotCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmRtYV9wbGF5YmFjayk7Ci1vdXRfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKLW91dF9yZWxlYXNlX3JlZ2lvbjoKLQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAxNik7Ci1vdXQ6Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfY2FyZChhZDE4MTZfaW5mbyAqZGV2YykKLXsKLQlpbnQgIG1peGVyLCBkZXYgPSAwOwotCQotCWlmIChkZXZjICE9IE5VTEwpIHsKLQkJcHJpbnRrKCJhZDE4MTY6IFVubG9hZGluZyBjYXJkIGF0IGFkZHJlc3MgMHglMDN4XG4iLGRldmMtPmJhc2UpOwotCQkKLQkJZGV2ID0gZGV2Yy0+ZGV2X25vOwotCQltaXhlciA9IGF1ZGlvX2RldnNbZGV2XS0+bWl4ZXJfZGV2OwotCi0JCS8qIHVucmVnIG1peGVyKi8KLQkJaWYobWl4ZXI+PTApIHsKLQkJCXNvdW5kX3VubG9hZF9taXhlcmRldihtaXhlcik7Ci0JCX0KLQkJLyogdW5yZWcgYXVkaW9kZXYgKi8KLQkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGRldik7Ci0JCQotCQkvKiBmcmVlIGRtYSBjaGFubmVscyAqLwotCQlpZiAoZGV2Yy0+ZG1hX2NhcHR1cmU+PTAgJiYgCi0JCSAgCWRldmMtPmRtYV9jYXB0dXJlICE9IGRldmMtPmRtYV9wbGF5YmFjaykgewotCQkJc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hX2NhcHR1cmUpOwotCQl9Ci0JCXNvdW5kX2ZyZWVfZG1hIChkZXZjLT5kbWFfcGxheWJhY2spOwotCQkvKiBmcmVlIGlycSAqLwotCQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOwotCQkvKiBmcmVlIGlvICovCi0JCXJlbGVhc2VfcmVnaW9uIChkZXZjLT5iYXNlLCAxNik7Ci0jaWZkZWYgX19JU0FQTlBfXwotCQlpZiAoZGV2Yy0+cG5wZGV2KSB7Ci0JCSAgCXBucF9kaXNhYmxlX2RldihkZXZjLT5wbnBkZXYpOwotCQkJcG5wX2RldmljZV9kZXRhY2goZGV2Yy0+cG5wZGV2KTsKLQkJfQotI2VuZGlmCi0JCQotCX0gZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IG5vIGRldmljZS9jYXJkIHNwZWNpZmllZFxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGlycSA9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGRtYSA9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGRtYTIgPSAtMTsKLQotI2lmZGVmIF9fSVNBUE5QX18KLS8qIHVzZSBpc2FwbnAgZm9yIGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBpbnQgaXNhcG5wCT0gMTsKLXN0YXRpYyBpbnQgaXNhcG5wanVtcDsKLW1vZHVsZV9wYXJhbShpc2FwbnAsIGJvb2wsIDApOwotbW9kdWxlX3BhcmFtKGlzYXBucGp1bXAsIGludCwgMCk7Ci0jZW5kaWYKLQotbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShkbWEsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShhZDE4MTZfY2xvY2tmcmVxLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKG9wdGlvbnMsIGludCwgMCk7Ci0KLSNpZmRlZiBfX0lTQVBOUF9fCi1zdGF0aWMgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCBjYXJkX3ZlbmRvciwgY2FyZF9kZXZpY2U7Ci0JdW5zaWduZWQgc2hvcnQgdmVuZG9yOwotCXVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uOwotCXN0cnVjdCBhZDE4MTZfZGF0YSAqZGF0YTsKLX0gaXNhcG5wX2FkMTgxNl9saXN0W10gX19pbml0ZGF0YSA9IHsKLQl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCi0JCUlTQVBOUF9WRU5ET1IoJ0EnLCdEJywnUycpLCBJU0FQTlBfRlVOQ1RJT04oMHg3MTUwKSwgCi0JCU5VTEwgfSwKLQl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCi0JCUlTQVBOUF9WRU5ET1IoJ0EnLCdEJywnUycpLCBJU0FQTlBfRlVOQ1RJT04oMHg3MTgwKSwKLQkJTlVMTCB9LAotCXswfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGlzYXBucF9hZDE4MTZfbGlzdCk7Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IGFkMTgxNl9jb25maWdfcG5wX2NhcmQoc3RydWN0IHBucF9jYXJkICpjYXJkLAotCQkJCQkgIHVuc2lnbmVkIHNob3J0IHZlbmRvciwKLQkJCQkJICB1bnNpZ25lZCBzaG9ydCBmdW5jdGlvbikKLXsKLQlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKLSAgCXN0cnVjdCBwbnBfZGV2ICpjYXJkX2RldiA9IHBucF9maW5kX2RldihjYXJkLCB2ZW5kb3IsIGZ1bmN0aW9uLCBOVUxMKTsKLQlpZiAoIWNhcmRfZGV2KSByZXR1cm47Ci0JaWYgKHBucF9kZXZpY2VfYXR0YWNoKGNhcmRfZGV2KSA8IDApIHsKLQkgIAlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEZhaWxlZCB0byBhdHRhY2ggUG5QIGRldmljZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBucF9hY3RpdmF0ZV9kZXYoY2FyZF9kZXYpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEZhaWxlZCB0byBhY3RpdmF0ZSBQblAgZGV2aWNlXG4iKTsKLQkJcG5wX2RldmljZV9kZXRhY2goY2FyZF9kZXYpOwotCQlyZXR1cm47Ci0JfQotCWNmZy5pb19iYXNlID0gcG5wX3BvcnRfc3RhcnQoY2FyZF9kZXYsIDIpOwotCWNmZy5pcnEgPSBwbnBfaXJxKGNhcmRfZGV2LCAwKTsKLQljZmcuZG1hID0gcG5wX2lycShjYXJkX2RldiwgMCk7Ci0JY2ZnLmRtYTIgPSBwbnBfaXJxKGNhcmRfZGV2LCAxKTsKLQlpZiAoIWFkMTgxNl9pbml0X2NhcmQoJmNmZywgY2FyZF9kZXYpKSB7Ci0JICAJcG5wX2Rpc2FibGVfZGV2KGNhcmRfZGV2KTsKLQkJcG5wX2RldmljZV9kZXRhY2goY2FyZF9kZXYpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGFkMTgxNl9jb25maWdfcG5wX2NhcmRzKHZvaWQpCi17Ci0JaW50IG5yX3BucF9jZmc7Ci0JaW50IGk7Ci0JCi0JLyogQ291bnQgZW50cmllcyBpbiBpc2FwbnBfYWQxODE2X2xpc3QgKi8KLQlmb3IgKG5yX3BucF9jZmcgPSAwOyBpc2FwbnBfYWQxODE2X2xpc3RbbnJfcG5wX2NmZ10uY2FyZF92ZW5kb3IgIT0gMDsgCi0JCW5yX3BucF9jZmcrKyk7Ci0JLyogQ2hlY2sgYW5kIGFkanVzdCBpc2FwbnBqdW1wICovCi0JaWYoIGlzYXBucGp1bXAgPCAwIHx8IGlzYXBucGp1bXAgPj0gbnJfcG5wX2NmZykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJImFkMTgxNjogVmFsaWQgcmFuZ2UgZm9yIGlzYXBucGp1bXAgaXMgMC0lZC4gIgotCQkJIkFkanVzdGVkIHRvIDAuXG4iLCBucl9wbnBfY2ZnLTEpOwotCQlpc2FwbnBqdW1wID0gMDsKLQl9Ci0JZm9yIChpID0gaXNhcG5wanVtcDsgaXNhcG5wX2FkMTgxNl9saXN0W2ldLmNhcmRfdmVuZG9yICE9IDA7IGkrKykgewotCSAJc3RydWN0IHBucF9jYXJkICpjYXJkID0gTlVMTDsKLQkJLyogaXRlcmF0ZSBvdmVyIGFsbCBwbnAgY2FyZHMgKi8JCQotCQl3aGlsZSAoKGNhcmQgPSBwbnBfZmluZF9jYXJkKGlzYXBucF9hZDE4MTZfbGlzdFtpXS5jYXJkX3ZlbmRvciwKLQkJICAgICAgICAgICAgICAJaXNhcG5wX2FkMTgxNl9saXN0W2ldLmNhcmRfZGV2aWNlLCBjYXJkKSkpIAotCQkJYWQxODE2X2NvbmZpZ19wbnBfY2FyZChjYXJkLCAKLQkJCQlpc2FwbnBfYWQxODE2X2xpc3RbaV0udmVuZG9yLAotCQkJCWlzYXBucF9hZDE4MTZfbGlzdFtpXS5mdW5jdGlvbik7Ci0JfQotfQotI2VuZGlmCi0KLS8qIG1vZHVsZSBpbml0aWFsaXphdGlvbiAqLwotc3RhdGljIGludCBfX2luaXQgaW5pdF9hZDE4MTYodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IEFEMTgxNiBzb3VuZGRyaXZlciAiCi0JCQkgIkNvcHlyaWdodCAoQykgMTk5OC0yMDAzIGJ5IFRob3JzdGVuIEtuYWJlIGFuZCAiCi0JCQkgIm90aGVyc1xuIik7Ci0jaWZkZWYgQUQxODE2X0NMT0NLIAotCS8qIHNldCBhZDE4MTZfY2xvY2tmcmVxIGlmIHNldCBkdXJpbmcgY29tcGlsYXRpb24gKi8KLQlhZDE4MTZfY2xvY2tmcmVxPUFEMTgxNl9DTE9DSzsKLSNlbmRpZgotCWlmIChhZDE4MTZfY2xvY2tmcmVxPDUwMDAgfHwgYWQxODE2X2Nsb2NrZnJlcT4xMDAwMDApIHsKLQkJYWQxODE2X2Nsb2NrZnJlcT0zMzAwMDsKLQl9Ci0KLSNpZmRlZiBfX0lTQVBOUF9fCi0JLyogY29uZmlndXJlIFBuUCBjYXJkcyAqLwotCWlmKGlzYXBucCkgYWQxODE2X2NvbmZpZ19wbnBfY2FyZHMoKTsKLSNlbmRpZgotCS8qIGNvbmZpZ3VyZSBjYXJkIGJ5IG1vZHVsZSBwYXJhbXMgKi8KLQlpZiAoaW8gIT0gLTEgJiYgaXJxICE9IC0xICYmIGRtYSAhPSAtMSkgewotCQlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKLQkJY2ZnLmlvX2Jhc2UgPSBpbzsKLQkJY2ZnLmlycSA9IGlycTsKLQkJY2ZnLmRtYSA9IGRtYTsKLQkJY2ZnLmRtYTIgPSBkbWEyOwotCQlhZDE4MTZfaW5pdF9jYXJkKCZjZmcsIE5VTEwpOwotCX0KLQlpZiAobnJfYWQxODE2X2RldnMgPD0gMCkKLQkgIAlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gMDsKLX0KLQotLyogbW9kdWxlIGNsZWFudXAgKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkMTgxNiAodm9pZCkKLXsKLQlpbnQgICAgICAgICAgaTsKLQlhZDE4MTZfaW5mbyAgKmRldmMgPSBOVUxMOwotICAKLQkvKiByZW1vdmUgYW55IHNvdW5kY2FyZCAqLwotCWZvciAoaSA9IDA7ICBpIDwgbnJfYWQxODE2X2RldnM7IGkrKykgewotCQlkZXZjID0gJmRldl9pbmZvW2ldOwotCQl1bmxvYWRfY2FyZChkZXZjKTsKLQl9ICAgICAKLQlucl9hZDE4MTZfZGV2cz0wOwotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogZHJpdmVyIHVubG9hZGVkIVxuIik7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfYWQxODE2KTsKLW1vZHVsZV9leGl0KGNsZWFudXBfYWQxODE2KTsKLQotI2lmbmRlZiBNT0RVTEUKLS8qIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGV2YWx1YXRpb24gKi8KLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX2FkMTgxNihjaGFyICpzdHIpCi17Ci0JLyogaW8sIGlycSwgZG1hLCBkbWEyICovCi0JaW50IGludHNbNV07Ci0JCi0Jc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQkKLQlpbwk9IGludHNbMV07Ci0JaXJxCT0gaW50c1syXTsKLQlkbWEJPSBpbnRzWzNdOwotCWRtYTIJPSBpbnRzWzRdOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJhZDE4MTY9Iiwgc2V0dXBfYWQxODE2KTsKLSNlbmRpZgotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5jIGIvc291bmQvb3NzL2FkMTg4OS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDczMGEzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hZDE4ODkuYworKysgL2Rldi9udWxsCkBAIC0xLDExMDEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgotICoKLSAqICBBbmFsb2cgRGV2aWNlcyAxODg5IFBDSSBhdWRpbyBkcml2ZXIgKEFEMTgxOSBBQzk3LWNvbXBhdGlibGUgY29kZWMpCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICAgTm90ZXM6Ci0gKiAgIDEuIE9ubHkgZmxhdCBETUEgaXMgc3VwcG9ydGVkOyBzLWcgaXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cKLSAqCi0gKgotPGpzbT4gdGF1c3E6IEFueXdheSwgdG8gc2V0IHVwIHNhbXBsZSByYXRlcyBmb3IgRCB0byBBLCB5b3UganVzdCB1c2UgdGhlIHNhbXBsZSByYXRlIG9uIHRoZSBjb2RlYy4gRm9yIEEgdG8gRCwgeW91IG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBhbHdheXMgdG8gNDhLICh1c2luZyB0aGUgc3BsaXQgc2FtcGxlIHJhdGUgZmVhdHVyZSBvbiB0aGUgY29kZWMpIGFuZCB0aGVuIHNldCB0aGUgcmVzYW1wbGVyIG9uIHRoZSBBRDE4ODkgdG8gdGhlIHNhbXBsZSByYXRlIHlvdSB3YW50LgotPGpzbT4gQWxzbywgd2hlbiBjaGFuZ2luZyB0aGUgc2FtcGxlIHJhdGUgb24gdGhlIGNvZGVjIHlvdSBuZWVkIHRvIHBvd2VyIGl0IGRvd24gYW5kIHJlIHBvd2VyIGl0IHVwIGZvciB0aGUgY2hhbmdlIHRvIHRha2UgZWZmZWN0IQotICoKLSAqICRJZDogYWQxODg5LmMsdiAxLjMgMjAwMi8xMC8xOSAyMTozMTo0NCBncnVuZGxlciBFeHAgJAotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgImFkMTg4OS5oIgotCi0jZGVmaW5lIERCRyhmbXQsIGFyZy4uLikgcHJpbnRrKGZtdCwgIyNhcmcpCi0jZGVmaW5lIERFVk5BTUUgImFkMTg4OSIKLQotI2RlZmluZSBOUl9IV19DSAk0Ci0jZGVmaW5lIERBQ19SVU5OSU5HCTEKLSNkZWZpbmUgQURDX1JVTk5JTkcJMgotCi0jZGVmaW5lIFVOREVSUlVOKGRldikJKDApCi0KLSNkZWZpbmUgQUQxODg5X1JFQURXKGRldixyZWcpIHJlYWR3KGRldi0+cmVnYmFzZSArIHJlZykKLSNkZWZpbmUgQUQxODg5X1dSSVRFVyhkZXYscmVnLHZhbCkgd3JpdGV3KCh2YWwpLCBkZXYtPnJlZ2Jhc2UgKyByZWcpCi0jZGVmaW5lIEFEMTg4OV9SRUFETChkZXYscmVnKSByZWFkbChkZXYtPnJlZ2Jhc2UgKyByZWcpCi0jZGVmaW5lIEFEMTg4OV9XUklURUwoZGV2LHJlZyx2YWwpIHdyaXRlbCgodmFsKSwgZGV2LT5yZWdiYXNlICsgcmVnKQotCi0vL25vdyAxMDBtcwotLyogI2RlZmluZSBXQUlUXzEwTVMoKQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKSAqLwotI2RlZmluZSBXQUlUXzEwTVMoKQlkbyB7IGludCBfX2k7IGZvciAoX19pID0gMDsgX19pIDwgMTAwOyBfX2krKykgdWRlbGF5KDEwMDApOyB9IHdoaWxlKDApCi0KLS8qIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgZGV2aWNlICovCi1zdGF0aWMgYWQxODg5X2Rldl90ICphZDE4ODlfZGV2ID0gTlVMTDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogaGVscGVyIHJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWQxODg5X3NldF93YXZfcmF0ZShhZDE4ODlfZGV2X3QgKmRldiwgaW50IHJhdGUpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWMgPSBkZXYtPmFjOTdfY29kZWM7Ci0KLQlEQkcoIlNldHRpbmcgV0FWIHJhdGUgdG8gJWRcbiIsIHJhdGUpOwotCWRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWYucmF0ZSA9IHJhdGU7Ci0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTX1dBUywgcmF0ZSk7Ci0KLQkvKiBDeWNsZSB0aGUgREFDIHRvIGVuYWJsZSB0aGUgbmV3IHJhdGUgKi8KLQlhYzk3X2NvZGVjLT5jb2RlY193cml0ZShkZXYtPmFjOTdfY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMjAwKTsKLQlXQUlUXzEwTVMoKTsKLQlhYzk3X2NvZGVjLT5jb2RlY193cml0ZShkZXYtPmFjOTdfY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfc2V0X3dhdl9mbXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBmbXQpCi17Ci0JdTE2IHRtcDsKLQotCURCRygiU2V0dGluZyBXQVYgZm9ybWF0IHRvIDB4JXhcbiIsIGZtdCk7Ci0KLQl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7Ci0JaWYgKGZtdCAmIEFGTVRfUzE2X0xFKSB7Ci0JCS8vdG1wIHw9IDB4MDEwMDsgLyogc2V0IFdBMTYgKi8KLQkJdG1wIHw9IDB4MDMwMDsgLyogc2V0IFdBMTYgc3RlcmVvICovCi0JfSBlbHNlIGlmIChmbXQgJiBBRk1UX1U4KSB7Ci0JCXRtcCAmPSB+MHgwMTAwOyAvKiBjbGVhciBXQTE2ICovCi0JfSAKLQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMsIHRtcCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfc2V0X2FkY19mbXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBmbXQpCi17Ci0JdTE2IHRtcDsKLQotCURCRygiU2V0dGluZyBBREMgZm9ybWF0IHRvIDB4JXhcbiIsIGZtdCk7Ci0KLQl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfUkFNQyk7Ci0JaWYgKGZtdCAmIEFGTVRfUzE2X0xFKSB7Ci0JCXRtcCB8PSAweDAxMDA7IC8qIHNldCBXQTE2ICovCi0JfSBlbHNlIGlmIChmbXQgJiBBRk1UX1U4KSB7Ci0JCXRtcCAmPSB+MHgwMTAwOyAvKiBjbGVhciBXQTE2ICovCi0JfSAKLQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMsIHRtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg4OV9zdGFydF93YXYoYWQxODg5X3N0YXRlX3QgKnN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JaW50IGNudDsKLQl1MTYgdG1wOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZG1hYnVmLT5kbWFfbGVuKQkvKiBETUEgYWxyZWFkeSBpbiBmbGlnaHQgKi8KLQkJZ290byBza2lwX2RtYTsKLQotCS8qIHNldHVwIGRtYSAqLwotCWNudCA9IGRtYWJ1Zi0+d3JfcHRyIC0gZG1hYnVmLT5yZF9wdHI7Ci0JaWYgKGNudCA9PSAwKQkJLyogZG9uZSAtIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KLQkJZ290byBza2lwX2RtYTsKLQotCS8qIElmIHRoZSB3cl9wdHIgaGFzIHdyYXBwZWQsIG9ubHkgbWFwIHRvIHRoZSBlbmQgKi8KLQlpZiAoY250IDwgMCkKLQkJY250ID0gRE1BX1NJWkUgLSBkbWFidWYtPnJkX3B0cjsKLQotCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKGFkMTg4OV9kZXYtPnBjaSwKLQkJCQkJZG1hYnVmLT5yYXdidWYgKyBkbWFidWYtPnJkX3B0ciwKLQkJCQkJY250LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlkbWFidWYtPmRtYV9sZW4gPSBjbnQ7Ci0JZG1hYnVmLT5yZWFkeSA9IDE7Ci0KLQlEQkcoIlN0YXJ0aW5nIHBsYXliYWNrIGF0IDB4JXAgZm9yICVsZCBieXRlc1xuIiwgZG1hYnVmLT5yYXdidWYgKwotCSAgICBkbWFidWYtPnJkX3B0ciwgZG1hYnVmLT5kbWFfbGVuKTsKLQotICAgICAgICAvKiBsb2FkIHVwIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHNldCAqLwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVkNDLCBjbnQpOwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVklDQywgY250KTsKLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9XQVZDQSwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKLQotCS8qIFRPRE86IGZvciBub3cgd2UgbG9hZCB0aGUgYmFzZSByZWdpc3RlcnMgd2l0aCB0aGUgc2FtZSB0aGluZyAqLwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVkJDLCBjbnQpOwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVklCQywgY250KTsKLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9XQVZCQSwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKLQotCS8qIGFuZCB3ZSdyZSBvZmYgdG8gdGhlIHJhY2VzLi4uICovCi0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfQ0hTUywgMHg4KTsKLQl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7Ci0JdG1wIHw9IDB4MDQwMDsgLyogc2V0IFdBRU4gKi8KLQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMsIHRtcCk7Ci0JKHZvaWQpIEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsgLyogZmx1c2ggcG9zdGVkIFBDSSB3cml0ZSAqLwotCi0JZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7Ci0KLXNraXBfZG1hOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWQxODg5X3N0b3Bfd2F2KGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgewotCQl1MTYgdG1wOwotCQl1bnNpZ25lZCBsb25nIGNudCA9IGRtYWJ1Zi0+ZG1hX2xlbjsKLQotCQl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7Ci0JCXRtcCAmPSB+MHgwNDAwOyAvKiBjbGVhciBXQUVOICovCi0JCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV1NNQywgdG1wKTsKLQkJKHZvaWQpIEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsgLyogZmx1c2ggcG9zdGVkIFBDSSB3cml0ZSAqLwotCQlwY2lfdW5tYXBfc2luZ2xlKGFkMTg4OV9kZXYtPnBjaSwgZG1hYnVmLT5kbWFfaGFuZGxlLCAKLQkJCQljbnQsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JCWRtYWJ1Zi0+ZW5hYmxlICY9IH5EQUNfUlVOTklORzsKLQotCQkvKiB1cGRhdGUgZG1hIHBvaW50ZXJzICovCi0JCWRtYWJ1Zi0+cmRfcHRyICs9IGNudDsKLQkJZG1hYnVmLT5yZF9wdHIgJj0gKERNQV9TSVpFIC0gMSk7Ci0KLQkJZG1hYnVmLT5kbWFfaGFuZGxlID0gMDsKLQkJZG1hYnVmLT5kbWFfbGVuID0gMDsKLQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0KLQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZCBhZDE4ODlfc3RhcnRzdG9wX2FkYyhhZDE4ODlfc3RhdGVfdCAqc3RhdGUsIGludCBzdGFydCkKLXsKLQl1MTYgdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkKLQl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfUkFNQyk7Ci0JaWYgKHN0YXJ0KSB7Ci0JCXN0YXRlLT5kbWFidWYuZW5hYmxlIHw9IEFEQ19SVU5OSU5HOwotCQl0bXAgfD0gMHgwMDA0OyAvKiBzZXQgQURFTiAqLwotCX0gZWxzZSB7Ci0JCXN0YXRlLT5kbWFidWYuZW5hYmxlICY9IH5BRENfUlVOTklORzsKLQkJdG1wICY9IH4weDAwMDQ7IC8qIGNsZWFyIEFERU4gKi8KLQl9Ci0JQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DLCB0bXApOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgYWQxODg5X2Rldl90ICphZDE4ODlfYWxsb2NfZGV2KHN0cnVjdCBwY2lfZGV2ICpwY2kpCi17Ci0JYWQxODg5X2Rldl90ICpkZXY7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCWludCBpOwotCi0JaWYgKChkZXYgPSBremFsbG9jKHNpemVvZihhZDE4ODlfZGV2X3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7Ci0JZGV2LT5wY2kgPSBwY2k7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQURfTUFYX1NUQVRFUzsgaSsrKSB7Ci0JCWRldi0+c3RhdGVbaV0uY2FyZCA9IGRldjsKLQkJbXV0ZXhfaW5pdCgmZGV2LT5zdGF0ZVtpXS5tdXRleCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+c3RhdGVbaV0uZG1hYnVmLndhaXQpOwotCX0KLQotCS8qIGFsbG9jYXRlIGRtYSBidWZmZXIgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBBRF9NQVhfU1RBVEVTOyBpKyspIHsKLQkJZG1hYnVmID0gJmRldi0+c3RhdGVbaV0uZG1hYnVmOwotCQlkbWFidWYtPnJhd2J1ZiA9IGttYWxsb2MoRE1BX1NJWkUsIEdGUF9LRVJORUx8R0ZQX0RNQSk7Ci0JCWlmICghZG1hYnVmLT5yYXdidWYpCi0JCQlnb3RvIGVycl9mcmVlX2RtYWJ1ZjsKLQkJZG1hYnVmLT5yYXdidWZfc2l6ZSA9IERNQV9TSVpFOwotCQlkbWFidWYtPmRtYV9oYW5kbGUgPSAwOwotCQlkbWFidWYtPnJkX3B0ciA9IGRtYWJ1Zi0+d3JfcHRyID0gZG1hYnVmLT5kbWFfbGVuID0gMFVMOwotCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJZG1hYnVmLT5yYXRlID0gNDgwMDA7Ci0JfQotCXJldHVybiBkZXY7Ci0KLWVycl9mcmVlX2RtYWJ1ZjoKLQl3aGlsZSAoLS1pID49IDApCi0JCWtmcmVlKGRldi0+c3RhdGVbaV0uZG1hYnVmLnJhd2J1Zik7Ci0Ja2ZyZWUoZGV2KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X2ZyZWVfZGV2KGFkMTg4OV9kZXZfdCAqZGV2KQotewotCWludCBqOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQotCWlmIChkZXYgPT0gTlVMTCkgCi0JCXJldHVybjsKLQotCWlmIChkZXYtPmFjOTdfY29kZWMpCi0JCWFjOTdfcmVsZWFzZV9jb2RlYyhkZXYtPmFjOTdfY29kZWMpOwotCi0JZm9yIChqID0gMDsgaiA8IEFEX01BWF9TVEFURVM7IGorKykgewotCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtqXS5kbWFidWY7Ci0JCWtmcmVlKGRtYWJ1Zi0+cmF3YnVmKTsKLQl9Ci0KLQlrZnJlZShkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWQxODg5X3RyaWdnZXJfcGxheWJhY2soYWQxODg5X2Rldl90ICpkZXYpCi17Ci0jaWYgMAotCXUzMiB2YWw7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWY7Ci0jZW5kaWYKLQotCWFkMTg4OV9zdGFydF93YXYoJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X3JlYWRfcHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JY2hhciAqb3V0ID0gcGFnZTsKLQlpbnQgbGVuLCBpOwotCWFkMTg4OV9kZXZfdCAqZGV2ID0gZGF0YTsKLQlhZDE4ODlfcmVnX3QgcmVnc1tdID0gewotCQl7ICJXU01DIiwgQURfRFNfV1NNQywgMTYgfSwKLQkJeyAiUkFNQyIsIEFEX0RTX1JBTUMsIDE2IH0sCi0JCXsgIldBREEiLCBBRF9EU19XQURBLCAxNiB9LAotCQl7ICJTWURBIiwgQURfRFNfU1lEQSwgMTYgfSwKLQkJeyAiV0FTIiwgQURfRFNfV0FTLCAxNiB9LAotCQl7ICJSRVMiLCBBRF9EU19SRVMsIDE2IH0sCi0JCXsgIkNDUyIsIEFEX0RTX0NDUywgMTYgfSwKLQkJeyAiQURDQkEiLCBBRF9ETUFfQURDQkEsIDMyIH0sCi0JCXsgIkFEQ0NBIiwgQURfRE1BX0FEQ0NBLCAzMiB9LAotCQl7ICJBRENCQyIsIEFEX0RNQV9BRENCQywgMzIgfSwKLQkJeyAiQURDQ0MiLCBBRF9ETUFfQURDQ0MsIDMyIH0sCi0JCXsgIkFEQ0lCQyIsIEFEX0RNQV9BRENJQkMsIDMyIH0sCi0JCXsgIkFEQ0lDQyIsIEFEX0RNQV9BRENJQ0MsIDMyIH0sCi0JCXsgIkFEQ0NUUkwiLCBBRF9ETUFfQURDQ1RSTCwgMTYgfSwKLQkJeyAiV0FWQkEiLCBBRF9ETUFfV0FWQkEsIDMyIH0sCi0JCXsgIldBVkNBIiwgQURfRE1BX1dBVkNBLCAzMiB9LAotCQl7ICJXQVZCQyIsIEFEX0RNQV9XQVZCQywgMzIgfSwKLQkJeyAiV0FWQ0MiLCBBRF9ETUFfV0FWQ0MsIDMyIH0sCi0JCXsgIldBVklCQyIsIEFEX0RNQV9XQVZJQkMsIDMyIH0sCi0JCXsgIldBVklDQyIsIEFEX0RNQV9XQVZJQ0MsIDMyIH0sCi0JCXsgIldBVkNUUkwiLCBBRF9ETUFfV0FWQ1RSTCwgMTYgfSwKLQkJeyAiRElTUiIsIEFEX0RNQV9ESVNSLCAzMiB9LAotCQl7ICJDSFNTIiwgQURfRE1BX0NIU1MsIDMyIH0sCi0JCXsgIklQQyIsIEFEX0dQSU9fSVBDLCAxNiB9LAotCQl7ICJPUCIsIEFEX0dQSU9fT1AsIDE2IH0sCi0JCXsgIklQIiwgQURfR1BJT19JUCwgMTYgfSwKLQkJeyAiQUNJQyIsIEFEX0FDOTdfQUNJQywgMTYgfSwKLQkJeyAiQUM5N19SRVNFVCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUkVTRVQsIDE2IH0sCi0JCXsgIkFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8iLCBBRF9BQzk3X0JBU0UgKyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCAxNiB9LAotCQl7ICJBQzk3X0hFQURQSE9ORV9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X0hFQURQSE9ORV9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfTUFTVEVSX1ZPTF9NT05PIiwgQURfQUM5N19CQVNFICsgQUM5N19NQVNURVJfVk9MX01PTk8sIDE2IH0sCi0JCXsgIkFDOTdfTUFTVEVSX1RPTkUiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X01BU1RFUl9UT05FLCAxNiB9LAotCQl7ICJBQzk3X1BDQkVFUF9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1BDQkVFUF9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfUEhPTkVfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19QSE9ORV9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfTUlDX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTUlDX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19MSU5FSU5fVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19MSU5FSU5fVk9MLCAxNiB9LAotCQl7ICJBQzk3X0NEX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfQ0RfVk9MLCAxNiB9LAotCQl7ICJBQzk3X1ZJREVPX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfVklERU9fVk9MLCAxNiB9LAotCQl7ICJBQzk3X0FVWF9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X0FVWF9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfUENNT1VUX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUENNT1VUX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19SRUNPUkRfU0VMRUNUIiwgQURfQUM5N19CQVNFICsgQUM5N19SRUNPUkRfU0VMRUNULCAxNiB9LAotCQl7ICJBQzk3X1JFQ09SRF9HQUlOIiwgQURfQUM5N19CQVNFICsgQUM5N19SRUNPUkRfR0FJTiwgMTYgfSwKLQkJeyAiQUM5N19SRUNPUkRfR0FJTl9NSUMiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1JFQ09SRF9HQUlOX01JQywgMTYgfSwKLQkJeyAiQUM5N19HRU5FUkFMX1BVUlBPU0UiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTYgfSwKLQkJeyAiQUM5N18zRF9DT05UUk9MIiwgQURfQUM5N19CQVNFICsgQUM5N18zRF9DT05UUk9MLCAxNiB9LAotCQl7ICJBQzk3X01PREVNX1JBVEUiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X01PREVNX1JBVEUsIDE2IH0sCi0JCXsgIkFDOTdfUE9XRVJfQ09OVFJPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUE9XRVJfQ09OVFJPTCwgMTYgfSwKLQkJeyBOVUxMIH0KLQl9OwotCi0JaWYgKGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWZvciAoaSA9IDA7IHJlZ3NbaV0ubmFtZSAhPSAwOyBpKyspCi0JCW91dCArPSBzcHJpbnRmKG91dCwgIiVzOiAweCUwKnhcbiIsIHJlZ3NbaV0ubmFtZSwgCi0JCQlyZWdzW2ldLndpZHRoID4+IDIsIAotCQkJKHJlZ3NbaV0ud2lkdGggPT0gMTYgCi0JCQkgCT8gQUQxODg5X1JFQURXKGRldiwgcmVnc1tpXS5vZmZzZXQpCi0JCQkJOiBBRDE4ODlfUkVBREwoZGV2LCByZWdzW2ldLm9mZnNldCkpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBRF9NQVhfU1RBVEVTOyBpKyspIHsKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiRE1BIHN0YXR1cyBmb3IgJXM6XG4iLCAKLQkJCShpID09IEFEX1dBVl9TVEFURSA/ICJXQVYiIDogIkFEQyIpKTsgCi0JCW91dCArPSBzcHJpbnRmKG91dCwgIlx0XHQweCVwIChJT1ZBOiAweCVsbHUpXG4iLAotCQkJZGV2LT5zdGF0ZVtpXS5kbWFidWYucmF3YnVmLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5kbWFfaGFuZGxlKTsKLQotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdHJlYWQgcHRyOiBvZmZzZXQgJXVcbiIsIAotCQkJKHVuc2lnbmVkIGludClkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5yZF9wdHIpOwotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdHdyaXRlIHB0cjogb2Zmc2V0ICV1XG4iLCAKLQkJCSh1bnNpZ25lZCBpbnQpZGV2LT5zdGF0ZVtpXS5kbWFidWYud3JfcHRyKTsKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiXHRkbWEgbGVuOiBvZmZzZXQgJXVcbiIsIAotCQkJKHVuc2lnbmVkIGludClkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5kbWFfbGVuKTsKLQl9Ci0KLQlsZW4gPSBvdXQgLSBwYWdlIC0gb2ZmOwotCWlmIChsZW4gPCBjb3VudCkgewotCQkqZW9mID0gMTsKLQkJaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKLQl9IGVsc2UgewotCQlsZW4gPSBjb3VudDsKLQl9Ci0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQlyZXR1cm4gbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIGludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSNpZiAwCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWQxODg5X2dldF9kbWFfYWRkcihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JdTMyIG9mZnNldDsKLQotCWlmICghKGRtYWJ1Zi0+ZW5hYmxlICYgKERBQ19SVU5OSU5HIHwgQURDX1JVTk5JTkcpKSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBnZXRfZG1hX2FkZHIgY2FsbGVkIHdpdGhvdXQgZG1hIGVuYWJsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCi0JCW9mZnNldCA9IGxlMzJfdG9fY3B1KEFEMTg4OV9SRUFETChzdGF0ZS0+Y2FyZCwgQURfRE1BX1dBVkJBKSk7Ci0JZWxzZQotCQlvZmZzZXQgPSBsZTMyX3RvX2NwdShBRDE4ODlfUkVBREwoc3RhdGUtPmNhcmQsIEFEX0RNQV9BRENCQSkpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW9mZnNldCkgLSAodW5zaWduZWQgbG9uZylkbWFidWYtPnJhd2J1ZjsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X3VwZGF0ZV9wdHIoYWQxODg5X2Rldl90ICpkZXYsIGludCB3YWtlKQotewotCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JdW5zaWduZWQgbG9uZyBod3B0cjsKLQlpbnQgZGlmZjsKLQotCS8qIGNoZWNrIEFEQyBmaXJzdCAqLwotCXN0YXRlID0gJmRldi0+YWRjX3N0YXRlOwotCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7Ci0JCWh3cHRyID0gYWQxODg5X2dldF9kbWFfYWRkcihzdGF0ZSk7Ci0JCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLQotCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7Ci0JCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKLQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwotCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKLQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7Ci0KLQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQlpZiAod2FrZSAmIGRtYWJ1Zi0+Y291bnQgPj0gZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQl9IGVsc2UgewotCQkJaWYgKHdha2UgJiBkbWFidWYtPmNvdW50ID4gMCkKLQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQl9Ci0JfQotCi0JLyogY2hlY2sgREFDICovCi0Jc3RhdGUgPSAmZGV2LT53YXZfc3RhdGU7Ci0JZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKLVhYWAotCi19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9kc3AgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBzc2l6ZV90IGFkMTg4OV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCi0JbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDE4ODlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKLQlsb2ZmX3QgKnBwb3MpCi17Ci0JYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV07Ci0Jdm9sYXRpbGUgc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3NpemVfdCByZXQgPSAwOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKLSNpZiAwCi0JaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCXJldCA9IC1FTlhJTzsKLQkJZ290byBlcnIxOwotCX0KLSNlbmRpZgotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkgewotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JYWRkX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotCi0JLyogc3RhcnQgZmlsbGluZyBkbWEgYnVmZmVyLi4uLiAqLwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJbG9uZyByZW07Ci0JCWxvbmcgY250ID0gY291bnQ7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJZm9yICg7OykgewotCQkJbG9uZyB1c2VkX2J5dGVzOwotCQkJbG9uZyB0aW1lb3V0OwkvKiBtYXggdGltZSBmb3IgRE1BIGluIGppZmZpZXMgKi8KLQotCQkJLyogYnVmZmVyIGlzIGZ1bGwgaWYgd3IgY2F0Y2hlcyB1cCB0byByZCAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQl1c2VkX2J5dGVzID0gZG1hYnVmLT53cl9wdHIgLSBkbWFidWYtPnJkX3B0cjsKLQkJCXRpbWVvdXQgPSAoZG1hYnVmLT5kbWFfbGVuICogSFopIC8gZG1hYnVmLT5yYXRlOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJLyogYWRqdXN0IGZvciBidWZmZXIgd3JhcCBhcm91bmQgKi8KLQkJCXVzZWRfYnl0ZXMgPSAodXNlZF9ieXRlcyArIERNQV9TSVpFKSAmIChETUFfU0laRSAtIDEpOwotCi0JCQkvKiBJZiBhdCBsZWFzdCBvbmUgcGFnZSB1bnVzZWQgKi8KLQkJCWlmICh1c2VkX2J5dGVzIDwgKERNQV9TSVpFIC0gMHgxMDAwKSkKLQkJCQlicmVhazsKLQotCQkJLyogZG1hIGJ1ZmZlciBmdWxsICovCi0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCXJldCA9IC1FQUdBSU47Ci0JCQkJZ290byBlcnIyOwotCQkJfQotCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0ICsgMSk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJZ290byBlcnIyOwotCQkJfQotCQl9Ci0KLQkJLyogd2F0Y2ggb3V0IGZvciB3cmFwcGluZyBhcm91bmQgc3RhdGljIGJ1ZmZlciAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmVtID0gRE1BX1NJWkUgLSBkbWFidWYtPndyX3B0cjsKLQkJaWYgKGNudCA+IHJlbSkKLQkJCWNudCA9IHJlbTsKLQotCQlyZW0gPSBkbWFidWYtPndyX3B0cjsKLQotCQkvKiB1cGRhdGUgZG1hIHBvaW50ZXJzICovCi0JCWRtYWJ1Zi0+d3JfcHRyICs9IGNudDsKLQkJZG1hYnVmLT53cl9wdHIgJj0gRE1BX1NJWkUgLSAxOwkvKiB3cmFwIHB0ciBpZiBuZWNlc3NhcnkgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiB0cmFuc2ZlciB1bndyYXBwZWQgY2h1bmsgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgcmVtLCBidWZmZXIsIGNudCkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVycjI7Ci0JCX0KLQotCQlEQkcoIldyaXRpbmcgMHglbHggYnl0ZXMgdG8gKzB4JWx4XG4iLCBjbnQsIHJlbSk7Ci0KLQkJLyogdXBkYXRlIGNvdW50ZXJzICovCi0JCWNvdW50IC09IGNudDsKLQkJYnVmZmVyICs9IGNudDsKLQkJcmV0ICs9IGNudDsKLQotCQkvKiB3ZSBoYXZlIHNvbWV0aGluZyB0byBwbGF5IC0gZ28gcGxheSBpdCEgKi8KLQkJYWQxODg5X3RyaWdnZXJfcGxheWJhY2soZGV2KTsKLQl9Ci0KLWVycjI6Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotZXJyMToKLQltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhZDE4ODlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLSNpZiAwCi0JYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCi0JaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV07Ci0JCWlmICghc3RhdGUpIHJldHVybiAwOwotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXTsKLQkJaWYgKCFzdGF0ZSkgcmV0dXJuIDA7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCWFkMTg4OV91cGRhdGVfcHRyKGRldiwgMCk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtXQVZfU1RBVEVdOwotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoaW50KWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJfSBlbHNlIHsKLQkJCWlmICgoaW50KWRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50ICsgCi0JCQkJKGludClkbWFidWYtPmZyYWdzaXplKQotCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCX0KLQl9Ci0KLQlpZiAoZmlsZSAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9BRENfU1RBVEVdOwotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKGludClkbWFidWYtPmZyYWdzaXplKQotCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotI2VuZGlmCi0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgdmFsID0gMDsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IChhZDE4ODlfZGV2X3QgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKLQlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7Ci0KLQlEQkcoImFkMTg4OV9pb2N0bCBjbWQgMHgleCBhcmcgJWx1XG4iLCBjbWQsIGFyZyk7Ci0KLQlzd2l0Y2ggKGNtZCkKLQl7Ci0JY2FzZSBPU1NfR0VUVkVSU0lPTjoKLQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1JFU0VUOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKLQkJLyogc2V0IHNhbXBsaW5nIHJhdGUgKi8KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHZhbCA+IDU0MDAgJiYgdmFsIDwgNDgwMDApCi0JCXsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dBUywgdmFsKTsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfUkVTLCB2YWwpOwotCQl9Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX1NURVJFTzogLyogdW5kb2N1bWVudGVkPyAqLwotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJdmFsID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOwotCQkJaWYgKHZhbCkgewotCQkJCXZhbCB8PSAweDAyMDA7ICAvKiBzZXQgV0FTVCAqLwotCQkJfSBlbHNlIHsKLQkJCQl2YWwgJj0gfjB4MDIwMDsgLyogY2xlYXIgV0FTVCAqLwotCQkJfQotCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DLCB2YWwpOwotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJdmFsID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMpOwotCQkJaWYgKHZhbCkgewotCQkJCXZhbCB8PSAweDAwMDI7ICAvKiBzZXQgQURTVCAqLwotCQkJfSBlbHNlIHsKLQkJCQl2YWwgJj0gfjB4MDAwMjsgLyogY2xlYXIgQURTVCAqLwotCQkJfQotCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DLCB2YWwpOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKLQkJcmV0dXJuIHB1dF91c2VyKERNQV9TSVpFLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgotCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURk1UOgotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICh2YWwgPT0gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIAotCQkJCWFkMTg4OV9zZXRfYWRjX2ZtdChkZXYsIHZhbCk7Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgCi0JCQkJYWQxODg5X3NldF93YXZfZm10KGRldiwgdmFsKTsKLQkJfSBlbHNlIHsKLQkJCXZhbCA9IEFGTVRfUzE2X0xFIHwgQUZNVF9VODsKLQkJfQotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgotCQkvKiBzZW5kIGFsbCBkYXRhIHRvIGRldmljZSAqLwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgotCQkvKiBub3Qgc3VwcG9ydGVkOyB1c2VzIGZpeGVkIGZyYWdtZW50IHNpemVzICovCi0JCXJldHVybiBwdXRfdXNlcihETUFfU0laRSwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgotCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6Ci0JCS8qIHNwYWNlIGxlZnQgaW4gZG1hIGJ1ZmZlcnMgKi8KLQkJaWYgKGNtZCA9PSBTTkRDVExfRFNQX0dFVE9TUEFDRSkKLQkJCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0uZG1hYnVmOwotCQllbHNlCi0JCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9BRENfU1RBVEVdLmRtYWJ1ZjsKLQkJYWJpbmZvLmZyYWdtZW50cyA9IDE7Ci0JCWFiaW5mby5mcmFnc3RvdGFsID0gMTsKLQkJYWJpbmZvLmZyYWdzaXplID0gRE1BX1NJWkU7Ci0JCWFiaW5mby5ieXRlcyA9IERNQV9TSVpFOwotCQlyZXR1cm4gY29weV90b191c2VyKHAsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOwotCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKLQkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKLQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKLQljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgotCQlicmVhazsKLQkKLQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgotCQlicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKLQkJcmV0dXJuIHB1dF91c2VyKEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XQVMpLCBwKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKLQljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgotCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86Ci0JY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgotCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAtRU5PVFRZOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCS8qIGNoZWNrIG1pbm9yOyBvbmx5IHN1cHBvcnQgL2Rldi9kc3AgYXRtICovCi0JaWYgKGltaW5vcihpbm9kZSkgIT0gMykKLQkJcmV0dXJuIC1FTlhJTzsKLQkKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhZDE4ODlfZGV2OwotCi0JYWQxODg5X3NldF93YXZfcmF0ZShhZDE4ODlfZGV2LCA0ODAwMCk7Ci0JYWQxODg5X3NldF93YXZfZm10KGFkMTg4OV9kZXYsIEFGTVRfUzE2X0xFKTsKLQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dBREEsIDB4MDQwNCk7IC8qIGF0dGVudWF0aW9uICovCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCS8qIGlmIHdlIGhhdmUgc3RhdGUgZnJlZSBpdCBoZXJlICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkMTg4OV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBhZDE4ODlfcmVhZCwKLQkud3JpdGUJCT0gYWQxODg5X3dyaXRlLAotCS5wb2xsCQk9IGFkMTg4OV9wb2xsLAotCS5pb2N0bAkJPSBhZDE4ODlfaW9jdGwsCi0JLm1tYXAJCT0gYWQxODg5X21tYXAsCi0JLm9wZW4JCT0gYWQxODg5X29wZW4sCi0JLnJlbGVhc2UJPSBhZDE4ODlfcmVsZWFzZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIC9kZXYvbWl4ZXIgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBpbnQgYWQxODg5X21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaWYgKGFkMTg4OV9kZXYtPmFjOTdfY29kZWMtPmRldl9taXhlciAhPSBpbWlub3IoaW5vZGUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFkMTg4OV9kZXYtPmFjOTdfY29kZWM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X21peGVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IChzdHJ1Y3QgYWM5N19jb2RlYyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkMTg4OV9taXhlcl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkuaW9jdGwJCT0gYWQxODg5X21peGVyX2lvY3RsLAotCS5vcGVuCQk9IGFkMTg4OV9taXhlcl9vcGVuLAotCS5yZWxlYXNlCT0gYWQxODg5X21peGVyX3JlbGVhc2UsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBBQzk3IGludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZCBhZDE4ODlfY29kZWNfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmFjOTcsIHU4IHJlZywgdTE2IHZhbCkKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IGFjOTctPnByaXZhdGVfZGF0YTsKLQotCS8vREJHKCJXcml0aW5nIDB4JXggdG8gMHglbHhcbiIsIHZhbCwgZGV2LT5yZWdiYXNlICsgQURfQUM5N19CQVNFICsgcmVnKTsKLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUM5N19CQVNFICsgcmVnLCB2YWwpOwotfQotCi1zdGF0aWMgdTE2IGFkMTg4OV9jb2RlY19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICphYzk3LCB1OCByZWcpCi17Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBhYzk3LT5wcml2YXRlX2RhdGE7Ci0JLy9EQkcoIlJlYWRpbmcgZnJvbSAweCVseFxuIiwgZGV2LT5yZWdiYXNlICsgQURfQUM5N19CQVNFICsgcmVnKTsKLQlyZXR1cm4gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19CQVNFICsgcmVnKTsKLX0JCi0KLXN0YXRpYyBpbnQgYWQxODg5X2FjOTdfaW5pdChhZDE4ODlfZGV2X3QgKmRldiwgaW50IGlkKQotewotCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3OwotCXUxNiBlaWQ7Ci0KLQlpZiAoKGFjOTcgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpIAotCQlyZXR1cm4gLUVOT01FTTsKLQotCWFjOTctPnByaXZhdGVfZGF0YSA9IGRldjsKLQlhYzk3LT5pZCA9IGlkOwotCi0JYWM5Ny0+Y29kZWNfcmVhZCA9IGFkMTg4OV9jb2RlY19yZWFkOwotCWFjOTctPmNvZGVjX3dyaXRlID0gYWQxODg5X2NvZGVjX3dyaXRlOwotCi0JaWYgKGFjOTdfcHJvYmVfY29kZWMoYWM5NykgPT0gMCkgewotCQlwcmludGsoREVWTkFNRSAiOiBhYzk3X3Byb2JlX2NvZGVjIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JZWlkID0gYWQxODg5X2NvZGVjX3JlYWQoYWM5NywgQUM5N19FWFRFTkRFRF9JRCk7Ci0JaWYgKGVpZCA9PSAweGZmZmYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBERVZOQU1FICI6IG5vIGNvZGVjIGF0dGFjaGVkP1xuIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JZGV2LT5hYzk3X2ZlYXR1cmVzID0gZWlkOwotCi0JaWYgKChhYzk3LT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmYWQxODg5X21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGNhbm5vdCByZWdpc3RlciBtaXhlclxuIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JZGV2LT5hYzk3X2NvZGVjID0gYWM5NzsKLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWU6Ci0JYWM5N19yZWxlYXNlX2NvZGVjKGFjOTcpOwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9hY2xpbmtfcmVzZXQoc3RydWN0IHBjaV9kZXYgKiBwY2lkZXYpCi17Ci0JdTE2IHN0YXQ7Ci0JaW50IHJldHJ5ID0gMjAwOwotCWFkMTg4OV9kZXZfdCAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0KLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfRFNfQ0NTLCAweDgwMDApOyAvKiB0dXJuIG9uIGNsb2NrICovCi0JQUQxODg5X1JFQURXKGRldiwgQURfRFNfQ0NTKTsKLQotCVdBSVRfMTBNUygpOwotCi0Jc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQUNJQyk7Ci0Jc3RhdCB8PSAweDAwMDI7CQkJCS8qIFJlc2V0IERpc2FibGUgKi8KLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUM5N19BQ0lDLCBzdGF0KTsKLQkodm9pZCkgQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCi0KLQl1ZGVsYXkoMTApOwotCi0Jc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQUNJQyk7Ci0Jc3RhdCB8PSAweDAwMDE7CQkJCS8qIEludGVyZmFjZSBFbmFibGUgKi8KLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUM5N19BQ0lDLCBzdGF0KTsKLQotCWRvIHsKLQkJaWYgKEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQUNJQykgJiAweDgwMDApCS8qIFJlYWR5ICovCi0JCQlicmVhazsKLQkJV0FJVF8xME1TKCk7Ci0JCXJldHJ5LS07Ci0JfSB3aGlsZSAocmV0cnkgPiAwKTsKLQotCWlmICghcmV0cnkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhZDE4ODlfYWNsaW5rX3Jlc2V0OiBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAotCQkJICAgIEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQUNJQykpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIFRPRE8gcmVzZXQgQUM5NyBjb2RlYyAqLwotCS8qIFRPRE8gc2V0IHdhdmUvYWRjIHBjaSBjdHJsIHN0YXR1cyAqLwotCi0Jc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQUNJQyk7Ci0Jc3RhdCB8PSAweDAwMDQ7CQkJCS8qIEF1ZGlvIFN0cmVhbSBPdXRwdXQgRW5hYmxlICovCi0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDOTdfQUNJQywgc3RhdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogUENJIGRldmljZSB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFkMTg4OV9pZF90YmxbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfQU5BTE9HX0RFVklDRVMsIFBDSV9ERVZJQ0VfSURfQUQxODg5SlMsIFBDSV9BTllfSUQsIAotCSAgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpREVWTkFNRSB9LAotCXsgfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWQxODg5X2lkX3RibCk7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhZDE4ODlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1MzIgc3RhdDsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IChhZDE4ODlfZGV2X3QgKilkZXZfaWQ7Ci0KLQlzdGF0ID0gQUQxODg5X1JFQURMKGRldiwgQURfRE1BX0RJU1IpOwotCi0JLyogY2xlYXIgSVNSICovCi0JQUQxODg5X1dSSVRFTChkZXYsIEFEX0RNQV9ESVNSLCBzdGF0KTsKLQotCWlmIChzdGF0ICYgMHg4KSB7CQkvKiBXQVZJICovCi0JCURCRygiV0FWIGludGVycnVwdFxuIik7Ci0JCWRldi0+c3RhdHMud2F2X2ludHJzKys7Ci0JCWlmIChkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0uZG1hYnVmLnJlYWR5KSB7Ci0JCQlhZDE4ODlfc3RvcF93YXYoJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXSk7CS8qIGNsZWFuIHVwICovCi0JCQlhZDE4ODlfc3RhcnRfd2F2KCZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0pOwkvKiBzdGFydCBuZXcgKi8KLQkJfQotCX0KLQotCWlmICgoc3RhdCAmIDB4MikgJiYgZGV2LT5zdGF0ZVtBRF9BRENfU1RBVEVdLmRtYWJ1Zi5yZWFkeSkgeyAvKiBBRENJICovCi0JCURCRygiQURDIGludGVycnVwdFxuIik7Ci0JCWRldi0+c3RhdHMuYWRjX2ludHJzKys7Ci0JfQotCWlmKHN0YXQpCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg4OV9pbml0Y2ZnKGFkMTg4OV9kZXZfdCAqZGV2KQotewotCXUxNiB0bXAxNjsKLQl1MzIgdG1wMzI7Ci0KLQkvKiBtYWtlIHN1cmUgdGhlIGludGVycnVwdCBiaXRzIGFyZSBzZXR1cCB0aGUgd2F5IHdlIHdhbnQgKi8KLQl0bXAzMiA9IEFEMTg4OV9SRUFETChkZXYsIEFEX0RNQV9XQVZDVFJMKTsKLQl0bXAzMiAmPSB+MHhmZjsgLyogZmxhdCBkbWEsIG5vIHNnLCBtYXNrIG91dCB0aGUgaW50ciBiaXRzICovCi0JdG1wMzIgfD0gMHg2OyAgLyogaW50ciBvbiBjb3VudCwgbG9vcCAqLwotCUFEMTg4OV9XUklURUwoZGV2LCBBRF9ETUFfV0FWQ1RSTCwgdG1wMzIpOwotCi0JLyogdW5tdXRlLi4uICovCi0JdG1wMTYgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9EU19XQURBKTsKLQl0bXAxNiAmPSB+MHg4MDgwOwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9EU19XQURBLCB0bXAxNik7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGFkMTg4OV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCWludCBlcnI7Ci0JYWQxODg5X2Rldl90ICpkZXY7Ci0JdW5zaWduZWQgbG9uZyBiYXI7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3Jvb3QgPSBOVUxMOwotCi0JaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZFxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKLQlpZiAoKGRldiA9IGFkMTg4OV9hbGxvY19kZXYocGNpZGV2KSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgZGV2KTsKLQliYXIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKLQkKLSAgICAgICAgaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogbWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpOwotCQlnb3RvIG91dDE7Ci0JfQotCi0JaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbihwY2lkZXYsIDAsIERFVk5BTUUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHVuYWJsZSB0byByZXF1ZXN0IG1lbW9yeSByZWdpb25cbiIpOwotCQlnb3RvIG91dDE7Ci0JfQotCi0JZGV2LT5yZWdiYXNlID0gaW9yZW1hcF9ub2NhY2hlKGJhciwgQURfRFNfSU9NRU1TSVpFKTsKLQlpZiAoIWRldi0+cmVnYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVtYXAgaW9tZW1cbiIpOwotCQlnb3RvIG91dDI7Ci0JfQotCi0JaWYgKHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBhZDE4ODlfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgREVWTkFNRSwgZGV2KSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHVuYWJsZSB0byByZXF1ZXN0IGludGVycnVwdFxuIik7Ci0JCWdvdG8gb3V0MzsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogJXMgYXQgJXAgSVJRICVkXG4iLAotCQkoY2hhciAqKWVudC0+ZHJpdmVyX2RhdGEsIGRldi0+cmVnYmFzZSwgcGNpZGV2LT5pcnEpOwotCi0JaWYgKGFkMTg4OV9hY2xpbmtfcmVzZXQocGNpZGV2KSAhPSAwKQotCQlnb3RvIG91dDQ7Ci0KLQkvKiByZWdpc3RlciAvZGV2L2RzcCAqLwotCWlmICgoZGV2LT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmFkMTg4OV9mb3BzLCAtMSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgcmVnaXN0ZXIgL2Rldi9kc3BcbiIpOwotCQlnb3RvIG91dDQ7Ci0JfQotCi0JaWYgKChlcnIgPSBhZDE4ODlfYWM5N19pbml0KGRldiwgMCkpICE9IDApCi0JCWdvdG8gb3V0NTsKLQotCS8qIFhYWDogY2xlYW51cHMgKi8KLQlpZiAoKChwcm9jX3Jvb3QgPSBwcm9jX21rZGlyKCJkcml2ZXIvYWQxODg5IiwgTlVMTCkpID09IE5VTEwpIHx8Ci0JICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImFjOTciLCBTX0lGUkVHfFNfSVJVR08sIHByb2Nfcm9vdCwgYWM5N19yZWFkX3Byb2MsIGRldi0+YWM5N19jb2RlYykgPT0gTlVMTCB8fAotCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgU19JRlJFR3xTX0lSVUdPLCBwcm9jX3Jvb3QsIGFkMTg4OV9yZWFkX3Byb2MsIGRldikgPT0gTlVMTCkgCi0JCWdvdG8gb3V0NTsKLQkKLQlhZDE4ODlfaW5pdGNmZyhkZXYpOwotCi0JLy9EQkcoREVWTkFNRSAiOiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gZG9uZSFcbiIpOwotCi0JYWQxODg5X2RldiA9IGRldjsKLQotCXJldHVybiAwOwotCi1vdXQ1OgotCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi0+ZGV2X2F1ZGlvKTsKLW91dDQ6Ci0JZnJlZV9pcnEocGNpZGV2LT5pcnEsIGRldik7Ci1vdXQzOgotCWlvdW5tYXAoZGV2LT5yZWdiYXNlKTsKLW91dDI6Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBjaWRldiwgMCk7Ci1vdXQxOgotCWFkMTg4OV9mcmVlX2RldihkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOwotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZDE4ODlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCi17Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKLQotCWlmIChkZXYgPT0gTlVMTCkgcmV0dXJuOwotCQotCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoZGV2LT5hYzk3X2NvZGVjLT5kZXZfbWl4ZXIpOwotCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi0+ZGV2X2F1ZGlvKTsKLQlmcmVlX2lycShwY2lkZXYtPmlycSwgZGV2KTsKLQlpb3VubWFwKGRldi0+cmVnYmFzZSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBjaWRldiwgMCk7Ci0KLQkvKiBhbnkgaHcgcHJvZ3JhbW1pbmcgbmVlZGVkPyAqLwotCWFkMTg4OV9mcmVlX2RldihkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOwotfQotCi1NT0RVTEVfQVVUSE9SKCJSYW5kb2xwaCBDaHVuZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDE4ODkgUENJIEF1ZGlvIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZDE4ODlfZHJpdmVyID0gewotCS5uYW1lCQk9IERFVk5BTUUsCi0JLmlkX3RhYmxlCT0gYWQxODg5X2lkX3RibCwKLQkucHJvYmUJCT0gYWQxODg5X3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQxODg5X3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhZDE4ODlfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWQxODg5X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg4OV9leGl0X21vZHVsZSh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQxODg5X2RyaXZlcik7Ci0JcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChhZDE4ODlfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoYWQxODg5X2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZDE4ODkuaCBiL3NvdW5kL29zcy9hZDE4ODkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MTM3Ni4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWQxODg5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotI2lmbmRlZiBfQUQxODg5X0hfCi0jZGVmaW5lIF9BRDE4ODlfSF8KLQotI2RlZmluZSBBRF9EU19XU01DCTB4MDAJLyogRE1BIGlucHV0IHdhdmUvc3luIG1peGVyIGNvbnRyb2wgKi8KLSNkZWZpbmUgQURfRFNfUkFNQwkweDAyCS8qIERNQSBvdXRwdXQgcmVzYW1wL0FEQyBtaXhlciBjb250cm9sICovCi0jZGVmaW5lIEFEX0RTX1dBREEJMHgwNAkvKiBETUEgaW5wdXQgd2F2ZSBhdHRlbnVhdGlvbiAqLwotI2RlZmluZSBBRF9EU19TWURBCTB4MDYJLyogRE1BIGlucHV0IHN5biBhdHRlbnR1YXRpb24gKi8KLSNkZWZpbmUgQURfRFNfV0FTCTB4MDgJLyogd2F2ZSBpbnB1dCBzYW1wbGUgcmF0ZSAqLwotI2RlZmluZSBBRF9EU19SRVMJMHgwYQkvKiByZXNhbXBsZXIgb3V0cHV0IHNhbXBsZSByYXRlICovCi0jZGVmaW5lIEFEX0RTX0NDUwkweDBjCS8qIGNoaXAgY29udHJvbC9zdGF0dXMgKi8KLQotI2RlZmluZSBBRF9ETUFfUkVTQkEJMHg0MAkvKiBSRVMgYmFzZSBhZGRyICovCi0jZGVmaW5lIEFEX0RNQV9SRVNDQQkweDQ0CS8qIFJFUyBjdXJyZW50IGFkZHIgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0JDCTB4NDgJLyogUkVTIGJhc2UgY250ICovCi0jZGVmaW5lIEFEX0RNQV9SRVNDQwkweDRjCS8qIFJFUyBjdXJyZW50IGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9BRENCQQkweDUwCS8qIEFEQyAqLwotI2RlZmluZSBBRF9ETUFfQURDQ0EJMHg1NAotI2RlZmluZSBBRF9ETUFfQURDQkMJMHg1OAotI2RlZmluZSBBRF9ETUFfQURDQ0MJMHg1YwotI2RlZmluZSBBRF9ETUFfU1lOQkEJMHg2MAkvKiBTWU4gKi8KLSNkZWZpbmUgQURfRE1BX1NZTkNBCTB4NjQKLSNkZWZpbmUgQURfRE1BX1NZTkJDCTB4NjgKLSNkZWZpbmUgQURfRE1BX1NZTkNDCTB4NmMKLSNkZWZpbmUgQURfRE1BX1dBVkJBCTB4NzAJLyogV0FWICovCi0jZGVmaW5lIEFEX0RNQV9XQVZDQQkweDc0Ci0jZGVmaW5lIEFEX0RNQV9XQVZCQwkweDc4Ci0jZGVmaW5lIEFEX0RNQV9XQVZDQwkweDdjCi0jZGVmaW5lIEFEX0RNQV9SRVNJQ0MJMHg4MAkvKiBSRVMgaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0lCQwkweDg0CS8qIFJFUyBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfQURDSUNDCTB4ODgJLyogQURDIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9BRENJQkMJMHg4YwkvKiBBREMgaW50ZXJydXB0IGJhc2UgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1NZTklDQwkweDkwCS8qIFNZTiBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfU1lOSUJDCTB4OTQJLyogU1lOIGludGVycnVwdCBiYXNlIGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9XQVZJQ0MJMHg5OAkvKiBXQVYgaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1dBVklCQwkweDljCS8qIFdBViBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfUkVTQ1RSTAkweGEwCS8qIFJFUyBQQ0kgY29udHJvbC9zdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0NUUkwJMHhhOAkvKiBBREMgUENJIGNvbnRyb2wvc3RhdHVzICovCi0jZGVmaW5lIEFEX0RNQV9TWU5DVFJMCTB4YjAJLyogU1lOIFBDSSBjb250cm9sL3N0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfV0FWQ1RSTAkweGI4CS8qIFdBViBQQ0kgY29udHJvbC9zdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX0RJU1IJMHhjMAkvKiBQQ0kgRE1BIGludHIgc3RhdHVzICovCi0jZGVmaW5lIEFEX0RNQV9DSFNTCTB4YzQJLyogUENJIERNQSBjaGFubmVsIHN0b3Agc3RhdHVzICovCi0KLSNkZWZpbmUgQURfR1BJT19JUEMJMHhjOAkvKiBJTyBwb3J0IGN0cmwgKi8KLSNkZWZpbmUgQURfR1BJT19PUAkweGNhCS8qIElPIG91dHB1dCBzdGF0dXMgKi8KLSNkZWZpbmUgQURfR1BJT19JUAkweGNjCS8qIElPIGlucHV0IHN0YXR1cyAqLwotCi0vKiBBQzk3IHJlZ2lzdGVycywgMHgxMDAgLSAweDE3Zjsgc2VlIGFjOTcuaCAqLwotI2RlZmluZSBBRF9BQzk3X0JBU0UgICAgMHgxMDAgICAvKiBhYzk3IGJhc2UgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQURfQUM5N19BQ0lDCTB4MTgwCS8qIEFDIExpbmsgaW50ZXJmYWNlIGN0cmwgKi8KLQotLyogT1BMMzsgQkFSMSAqLwotI2RlZmluZSBBRF9PUExfTTBBUwkweDAwCS8qIE11c2ljMCBhZGRyZXNzL3N0YXR1cyAqLwotI2RlZmluZSBBRF9PUExfTTBEQVRBCTB4MDEJLyogTXVzaWMwIGRhdGEgKi8KLSNkZWZpbmUgQURfT1BMX00xQQkweDAyCS8qIE11c2ljMSBhZGRyZXNzICovCi0jZGVmaW5lIEFEX09QTF9NMURBVEEJMHgwMwkvKiBNdXNpYzEgZGF0YSAqLwotLyogMHgwNC0weDBmIHJlc2VydmVkICovCi0KLS8qIE1JREk7IEJBUjIgKi8KLSNkZWZpbmUgQURfTUlEQQkJMHgwMAkvKiBNSURJIGRhdGEgKi8KLSNkZWZpbmUgQURfTUlTQwkJMHgwMQkvKiBNSURJIHN0YXR1cy9jbWQgKi8KLS8qIDB4MDItMHhmZiByZXNlcnZlZCAqLwotCi0jZGVmaW5lIEFEX0RTX0lPTUVNU0laRQk1MTIKLSNkZWZpbmUgQURfT1BMX01FTVNJWkUJMTYKLSNkZWZpbmUgQURfTUlESV9NRU1TSVpFCTE2Ci0KLSNkZWZpbmUgQURfV0FWX1NUQVRFCTAKLSNkZWZpbmUgQURfQURDX1NUQVRFCTEKLSNkZWZpbmUgQURfTUFYX1NUQVRFUwkyCi0KLSNkZWZpbmUgRE1BX1NJWkUJKDEyOCoxMDI0KQotCi0jZGVmaW5lIERNQV9GTEFHX01BUFBFRAkxCi0KLXN0cnVjdCBhZDE4ODlfZGV2OwotCi10eXBlZGVmIHN0cnVjdCBhZDE4ODlfc3RhdGUgewotCXN0cnVjdCBhZDE4ODlfZGV2ICpjYXJkOwotCi0JbW9kZV90IG9wZW5fbW9kZTsKLQlzdHJ1Y3QgZG1hYnVmIHsKLQkJdW5zaWduZWQgaW50IHJhdGU7Ci0JCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7Ci0KLQkJLyogYnVmIG1hbmFnZW1lbnQgKi8KLQkJc2l6ZV90IHJhd2J1Zl9zaXplOwotCQl2b2lkICpyYXdidWY7Ci0JCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsJLyogbWFwcGVkIGFkZHJlc3MgKi8KLQkJdW5zaWduZWQgbG9uZyBkbWFfbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgbWFwcGVkICovCi0KLQkJLyogaW5kZXhlcyBpbnRvIHJhd2J1ZiBmb3Igc2V0dGluZyB1cCBETUEgZW5naW5lICovCi0JCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcmRfcHRyLCB3cl9wdHI7Ci0KLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsgLyogdG8gd2FpdCBmb3IgYnVmIHNlcnZpY2luZyAqLwotCi0JCS8qIE9TUyBiaXRzICovCi0JCXVuc2lnbmVkIGludCBtYXBwZWQ6MTsKLQkJdW5zaWduZWQgaW50IHJlYWR5OjE7Ci0JCXVuc2lnbmVkIGludCBvc3NmcmFnc2hpZnQ7Ci0JCWludCBvc3NtYXhmcmFnczsKLQkJdW5zaWduZWQgaW50IHN1YmRpdmlzaW9uOwotCX0gZG1hYnVmOwotCi0Jc3RydWN0IG11dGV4IG11dGV4OwotfSBhZDE4ODlfc3RhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODg5X2RldiB7Ci0Jdm9pZCBfX2lvbWVtICpyZWdiYXNlOwotCXN0cnVjdCBwY2lfZGV2ICpwY2k7Ci0JCi0Jc3BpbmxvY2tfdCBsb2NrOwotCi0JaW50IGRldl9hdWRpbzsKLQotCS8qIHN0YXRlczsgb25lIHBlciBjaGFubmVsOyByaWdodCBub3cgb25seSBXQVYgYW5kIEFEQyAqLwotCXN0cnVjdCBhZDE4ODlfc3RhdGUgc3RhdGVbQURfTUFYX1NUQVRFU107Ci0KLQkvKiBBQzk3IGNvZGVjICovCi0Jc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWM7Ci0JdTE2IGFjOTdfZmVhdHVyZXM7Ci0KLQkvKiBkZWJ1Z2dpbmcgc3R1ZmYgKi8KLQlzdHJ1Y3Qgc3RhdHMgewotCQl1bnNpZ25lZCBpbnQgd2F2X2ludHJzLCBhZGNfaW50cnM7Ci0JCXVuc2lnbmVkIGludCBibG9ja3MsIHVuZGVycnVuLCBlcnJvcjsKLQl9IHN0YXRzOwotfSBhZDE4ODlfZGV2X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGFkMTg4OV9yZWcgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IG9mZnNldDsKLQlpbnQgd2lkdGg7Ci19IGFkMTg4OV9yZWdfdDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jIGIvc291bmQvb3NzL2FkbGliX2NhcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhN2M5Yi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIHNvdW5kL29zcy9hZGxpYl9jYXJkLmMKLSAqCi0gKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIEFkTGliIGNhcmQuCi0gKgotICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NwotICoKLSAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKLSAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKLSAqIGZvciBtb3JlIGluZm8uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAib3BsMy5oIgotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX2FkbGliX2NhcmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBvcGwzX2luaXQoaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPm9zcCwgVEhJU19NT0RVTEUpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9iZV9hZGxpYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JcmV0dXJuIG9wbDNfZGV0ZWN0KGh3X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5vc3ApOwotfQotCi1zdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOwotCi1tb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfYWRsaWIodm9pZCkKLXsKLQljZmcuaW9fYmFzZSA9IGlvOwotCi0JaWYgKGNmZy5pb19iYXNlID09IC0xKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWRsaWI6IG11c3Qgc3BlY2lmeSBJL08gYWRkcmVzcy5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHByb2JlX2FkbGliKCZjZmcpID09IDApCi0JCXJldHVybiAtRU5PREVWOwotCWF0dGFjaF9hZGxpYl9jYXJkKCZjZmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkbGliKHZvaWQpCi17Ci0Jc291bmRfdW5sb2FkX3N5bnRoZGV2KGNmZy5zbG90c1swXSk7Ci0JCi19Ci0KLW1vZHVsZV9pbml0KGluaXRfYWRsaWIpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9hZGxpYik7Ci0KLSNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGxpYihjaGFyICpzdHIpCi17Ci0gICAgICAgIC8qIGlvICovCi0JaW50IGludHNbMl07Ci0Jc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQkKLQlpbyA9IGludHNbMV07Ci0KLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImFkbGliPSIsIHNldHVwX2FkbGliKTsKLSNlbmRpZgotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDYxeC5oIGIvc291bmQvb3NzL2NzNDYxeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U0MTMzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2MXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OTEgKzAsMCBAQAotI2lmbmRlZiBfX0NTNDYxWF9ICi0jZGVmaW5lIF9fQ1M0NjFYX0gKLQotLyoKLSAqICBDb3B5cmlnaHQgKGMpIGJ5IENpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiA8cGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Ci0gKiAgRGVmaW5pdGlvbnMgZm9yIENpcnJ1cyBMb2dpYyBDUzQ2MXggY2hpcHMKLSAqCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0lSUlVTCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0lSUlVTICAgICAgICAgICAgMHgxMDEzCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEwICAgICAgIDB4NjAwMQotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMiAgICAgICAweDYwMDMKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTUgICAgICAgMHg2MDA0Ci0jZW5kaWYKLQotLyoKLSAqICBEaXJlY3QgcmVnaXN0ZXJzCi0gKi8KLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFjY2Vzc2VkIHZpYSBiYXNlIGFkZHJlc3MKLSAqICByZWdpc3RlciB6ZXJvIG9uIHRoZSBDUzQ2MXggcGFydC4KLSAqLwotI2RlZmluZSBCQTBfSElTUgkJCQkweDAwMDAwMDAwCi0jZGVmaW5lIEJBMF9IU1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEJBMF9ISUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEJBMF9ETVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEJBMF9IU0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEwCi0jZGVmaW5lIEJBMF9IREFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE0Ci0jZGVmaW5lIEJBMF9IRE1SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4Ci0jZGVmaW5lIEJBMF9IRENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDCi0jZGVmaW5lIEJBMF9QRk1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEJBMF9QRkNWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIEJBMF9QRkNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIEJBMF9QQ0lDRkcwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA0Ci0jZGVmaW5lIEJBMF9QQ0lDRkcwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzBDCi0jZGVmaW5lIEJBMF9QQ0lDRkcxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzEwCi0jZGVmaW5lIEJBMF9QQ0lDRkcxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzE0Ci0jZGVmaW5lIEJBMF9QQ0lDRkcxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzE4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcxQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzFDCi0jZGVmaW5lIEJBMF9QQ0lDRkcyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzIwCi0jZGVmaW5lIEJBMF9QQ0lDRkcyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI0Ci0jZGVmaW5lIEJBMF9QQ0lDRkcyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzJDCi0jZGVmaW5lIEJBMF9QQ0lDRkczMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzMwCi0jZGVmaW5lIEJBMF9QQ0lDRkczNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzM0Ci0jZGVmaW5lIEJBMF9QQ0lDRkczOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzM4Ci0jZGVmaW5lIEJBMF9QQ0lDRkczQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzNDCi0jZGVmaW5lIEJBMF9DTEtDUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEJBMF9DTEtDUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDA0Ci0jZGVmaW5lIEJBMF9QTExNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDA4Ci0jZGVmaW5lIEJBMF9QTExDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDBDCi0jZGVmaW5lIEJBMF9GUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDEwIAotI2RlZmluZSBCQTBfQ0ZMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxNAotI2RlZmluZSBCQTBfQ0ZMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxOAotI2RlZmluZSBCQTBfU0VSTUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyMAotI2RlZmluZSBCQTBfU0VSTUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyNAotI2RlZmluZSBCQTBfU0VSQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyOAotI2RlZmluZSBCQTBfU0VSQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyQwotI2RlZmluZSBCQTBfU0VSQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzMAotI2RlZmluZSBCQTBfU0VSQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzNAotI2RlZmluZSBCQTBfU0VSQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzOAotI2RlZmluZSBCQTBfU0VSQlNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzQwotI2RlZmluZSBCQTBfU0VSQlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0MAotI2RlZmluZSBCQTBfU0VSQkNNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0NAotI2RlZmluZSBCQTBfU0VSQkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0OAotI2RlZmluZSBCQTBfU0VSQkNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0QwotI2RlZmluZSBCQTBfU0VSQldQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ1MAotI2RlZmluZSBCQTBfU0VSQlJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ1NAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQkEwX0FTRVJfRkFERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTgKLSNlbmRpZgotI2RlZmluZSBCQTBfQUNDVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2MAotI2RlZmluZSBCQTBfQUNTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2NAotI2RlZmluZSBCQTBfQUNPU1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2OAotI2RlZmluZSBCQTBfQUNDQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2QwotI2RlZmluZSBCQTBfQUNDREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3MAotI2RlZmluZSBCQTBfQUNJU1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3NAotI2RlZmluZSBCQTBfQUNTQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3OAotI2RlZmluZSBCQTBfQUNTREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3QwotI2RlZmluZSBCQTBfSlNQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4MAotI2RlZmluZSBCQTBfSlNDVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4NAotI2RlZmluZSBCQTBfSlNDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4OAotI2RlZmluZSBCQTBfSlNDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4QwotI2RlZmluZSBCQTBfTUlEQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5MAotI2RlZmluZSBCQTBfTUlEU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5NAotI2RlZmluZSBCQTBfTUlEV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5OAotI2RlZmluZSBCQTBfTUlEUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5QwotI2RlZmluZSBCQTBfSlNJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRBMAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQkEwX0FTRVJfTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QTQKLSNlbmRpZgotI2RlZmluZSBCQTBfQ0ZHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCMAotI2RlZmluZSBCQTBfU1NWSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCNAotI2RlZmluZSBCQTBfR1BJT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCOAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQkEwX0VHUElPRFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QkMKLSNkZWZpbmUgQkEwX0VHUElPUFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QzAKLSNkZWZpbmUgQkEwX0VHUElPVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QzQKLSNkZWZpbmUgQkEwX0VHUElPV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QzgKLSNkZWZpbmUgQkEwX0VHUElPU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0Q0MKLSNkZWZpbmUgQkEwX1NFUkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RDAKLSNkZWZpbmUgQkEwX1NFUkM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RDQKLSNkZWZpbmUgQkEwX1NFUkFDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RDgKLSNkZWZpbmUgQkEwX0FDQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RTAKLSNkZWZpbmUgQkEwX0FDU1RTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RTQKLSNkZWZpbmUgQkEwX0FDT1NWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RTgKLSNkZWZpbmUgQkEwX0FDQ0FEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RUMKLSNkZWZpbmUgQkEwX0FDQ0RBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjAKLSNkZWZpbmUgQkEwX0FDSVNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjQKLSNkZWZpbmUgQkEwX0FDU0FEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjgKLSNkZWZpbmUgQkEwX0FDU0RBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RkMKLSNkZWZpbmUgQkEwX0lPVEFDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKLSNkZWZpbmUgQkEwX0lPVEFDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDQKLSNkZWZpbmUgQkEwX0lPVEFDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDgKLSNkZWZpbmUgQkEwX0lPVEFDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MEMKLSNkZWZpbmUgQkEwX0lPVEFDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTAKLSNkZWZpbmUgQkEwX0lPVEFDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTQKLSNkZWZpbmUgQkEwX0lPVEFDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTgKLSNkZWZpbmUgQkEwX0lPVEFDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MUMKLSNkZWZpbmUgQkEwX0lPVEFDOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjAKLSNkZWZpbmUgQkEwX0lPVEFDOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjQKLSNkZWZpbmUgQkEwX0lPVEFDMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjgKLSNkZWZpbmUgQkEwX0lPVEFDMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MkMKLSNkZWZpbmUgQkEwX0lPVEZSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NDAKLSNkZWZpbmUgQkEwX0lPVEZSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NDQKLSNkZWZpbmUgQkEwX0lPVEZSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NDgKLSNkZWZpbmUgQkEwX0lPVEZSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NEMKLSNkZWZpbmUgQkEwX0lPVEZSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NTAKLSNkZWZpbmUgQkEwX0lPVEZSNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NTQKLSNkZWZpbmUgQkEwX0lPVEZSNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NTgKLSNkZWZpbmUgQkEwX0lPVEZSNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NUMKLSNkZWZpbmUgQkEwX0lPVEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1ODAKLSNkZWZpbmUgQkEwX0lPVFJSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1ODQKLSNkZWZpbmUgQkEwX0lPVEZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1ODgKLSNkZWZpbmUgQkEwX0lPVENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OEMKLSNkZWZpbmUgQkEwX0RQQ0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OTAKLSNkZWZpbmUgQkEwX0RQQ0lBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OTQKLSNkZWZpbmUgQkEwX0RQQ0lDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OTgKLSNkZWZpbmUgQkEwX1BDUENJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKLSNkZWZpbmUgQkEwX1BDUENJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDQKLSNkZWZpbmUgQkEwX1BDUENJRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDgKLSNkZWZpbmUgQkEwX0VQQ0lQTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MTAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSByZWdpc3RlcnMgYW5kIG1lbW9yaWVzIGFjY2Vzc2VkIHZpYQotICogIGJhc2UgYWRkcmVzcyByZWdpc3RlciBvbmUgb24gdGhlIENTNDYxeCBwYXJ0LgotICovCi0jZGVmaW5lIEJBMV9TUF9ETUVNMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEJBMV9TUF9ETUVNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEJBMV9TUF9QTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEJBMV9TUF9SRUcJCQkJMHgwMDAzMDAwMAotI2RlZmluZSBCQTFfU1BDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBCQTFfRFJFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwNAotI2RlZmluZSBCQTFfRFNSV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwOAotI2RlZmluZSBCQTFfVFdQUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwQwotI2RlZmluZSBCQTFfU1BXUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAxMAotI2RlZmluZSBCQTFfU1BJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAxNAotI2RlZmluZSBCQTFfRkdSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAyMAotI2RlZmluZSBCQTFfU1BDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAyOAotI2RlZmluZSBCQTFfU0RTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAyQwotI2RlZmluZSBCQTFfRlJNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAzMAotI2RlZmluZSBCQTFfRlJDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAzNAotI2RlZmluZSBCQTFfRlJTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAzOAotI2RlZmluZSBCQTFfT01OSV9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBpbnRlcnJ1cHQgc3RhdHVzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSElTUl9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSElTUl9WQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSElTUl9WQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSElTUl9WQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSElTUl9WQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSElTUl9WQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSElTUl9WQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSElTUl9WQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSElTUl9WQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgSElTUl9WQzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgSElTUl9WQzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSElTUl9WQzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgSElTUl9WQzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgSElTUl9WQzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgSElTUl9WQzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgSElTUl9WQzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgSElTUl9WQzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgSElTUl9JTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgSElTUl9JTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSElTUl9ETUFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgSElTUl9GUk9WUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgSElTUl9NSURJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNpZmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSElTUl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZFMDAwMDAKLSNlbHNlCi0jZGVmaW5lIEhJU1JfU0JJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGQzAwMDAwCi0jZW5kaWYKLSNkZWZpbmUgSElTUl9IMFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSElTUl9JTlRFTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3Qgc2lnbmFsIHJlZ2lzdGVyIDAuCi0gKi8KLSNkZWZpbmUgSFNSMF9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgSFNSMF9WQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSFNSMF9WQzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSFNSMF9WQzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSFNSMF9WQzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSFNSMF9WQzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSFNSMF9WQzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSFNSMF9WQzIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSFNSMF9WQzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgSFNSMF9WQzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgSFNSMF9WQzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSFNSMF9WQzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgSFNSMF9WQzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgSFNSMF9WQzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgSFNSMF9WQzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgSFNSMF9WQzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgSFNSMF9WQzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgSFNSMF9WQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgSFNSMF9WQzMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSFNSMF9WQzM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgSFNSMF9WQzM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IGNvbnRyb2wKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBISUNSX0lFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBISUNSX0NIR00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgRE1BIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBETVNSX0hQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBETVNSX0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBETVNSX1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBETVNSX1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgc291cmNlIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBIU0FSX0hPU1RfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIU0FSX0RTUF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIU0FSX01FTUlEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAotI2RlZmluZSBIU0FSX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBIU0FSX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgZGVzdGluYXRpb24gYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhEQVJfSE9TVF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhEQVJfRFNQX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhEQVJfTUVNSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfREVCVUcgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfT01OSV9NRU0gICAgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCi0jZGVmaW5lIEhEQVJfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhEQVJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IERNQSBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhETVJfQUNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGMDAwCi0jZGVmaW5lIEhETVJfQUNfOF8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEhETVJfQUNfTV9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEhETVJfQUNfQl9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEhETVJfQUNfU19VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IERNQSBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhEQ1JfQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0ZGCi0jZGVmaW5lIEhEQ1JfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEhEQ1JfT1BUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEhEQ1JfV0JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIEhEQ1JfV0JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzE2X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzMyX0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzY0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzEyOF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzI1Nl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDA1MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzUxMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDA2MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzEwMjRfRFdPUkRTICAgICAgICAgICAgICAgICAgICAweDA3MDAwMDAwCi0jZGVmaW5lIEhEQ1JfREggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzE2X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzMyX0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzY0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDMwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzEyOF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzI1Nl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDUwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzUxMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDYwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzEwMjRfRFdPUkRTICAgICAgICAgICAgICAgICAgICAweDcwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfQ09VTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQRk1DX0MxU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBQRk1DX0MxRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBQRk1DX0MxUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBQRk1DX0MyU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFGMDAwMAotI2RlZmluZSBQRk1DX0MyRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBQRk1DX0MyUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBQRk1DX0MxU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQRk1DX0MyU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgUEZNQ19CVVNfR1JBTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUEZNQ19HUkFOVF9BRlRFUl9SRVEgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUEZNQ19UUkFOU0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUEZNQ19EV09SRF9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUEZNQ19TTEFWRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUEZNQ19TTEFWRV9XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgUEZNQ19QUkVFTVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgUEZNQ19ESVNDT05ORUNUX1JFVFJZICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgUEZNQ19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgUEZNQ19CVVNfT1dORVJTSElQICAgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgUEZNQ19UUkFOU0FDVElPTl9MQUcgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFBGTUNfUENJX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBQRk1DX1NFUklBTF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgUEZNQ19TUF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyIHZhbHVlIDEKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQRkNWMV9QQzFWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBQRkNWMV9QQzFWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSAyCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUEZDVjJfUEMyVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgUEZDVjJfUEMyVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMS4KLSAqLwotI2RlZmluZSBDTEtDUjFfT1NDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDTEtDUjFfT1NDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDTEtDUjFfUExMU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBDTEtDUjFfUExMU1NfU0VSSUFMICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDTEtDUjFfUExMU1NfQ1JZU1RBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBDTEtDUjFfUExMU1NfUENJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBDTEtDUjFfUExMU1NfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBDTEtDUjFfUExMUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBDTEtDUjFfU1dDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBDTEtDUjFfUExMT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY2xvY2sgY29udHJvbCByZWdpc3RlciAyLgotICovCi0jZGVmaW5lIENMS0NSMl9QRElWU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIENMS0NSMl9QRElWU18xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIENMS0NSMl9QRElWU18yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIENMS0NSMl9QRElWU180ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIENMS0NSMl9QRElWU183ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIENMS0NSMl9QRElWU184ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIENMS0NSMl9QRElWU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQTEwgbXVsdGlwbGllciByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQTExNX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBQTExNX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUExMIGNhcGFjaXRvciBjb2VmZmljaWVudAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFBMTENDX0NEUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jaWZuZGVmIE5PX0NTNDYxMAotI2RlZmluZSBQTExDQ19DRFJfMjQwXzM1MF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19DRFJfMTg0XzI2NV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQTExDQ19DRFJfMTQ0XzIwNV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBQTExDQ19DRFJfMTExXzE2MF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQTExDQ19DRFJfODdfMTIzX01IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBQTExDQ19DRFJfNjdfOTZfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQotI2RlZmluZSBQTExDQ19DRFJfNTJfNzRfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBQTExDQ19DRFJfNDVfNThfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2VuZGlmCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQTExDQ19DRFJfMjcxXzM5OF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19DRFJfMjI3XzMzMF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQTExDQ19DRFJfMTY3XzIzOV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBQTExDQ19DRFJfMTUwXzIxNV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQTExDQ19DRFJfMTA3XzE1NF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBQTExDQ19DRFJfOThfMTQwX01IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQotI2RlZmluZSBQTExDQ19DRFJfNzNfMTA0X01IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBQTExDQ19DRFJfNjNfOTBfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2VuZGlmCi0jZGVmaW5lIFBMTENDX0xQRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEY4Ci0jaWZuZGVmIE5PX0NTNDYxMAotI2RlZmluZSBQTExDQ19MUEZfMjM4NTBfNjAwMDBfS0haICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19MUEZfNzk2MF8yNjI5MF9LSFogICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBQTExDQ19MUEZfNDE2MF8xMDk4MF9LSFogICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBQTExDQ19MUEZfMTc0MF80NTgwX0tIWiAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBQTExDQ19MUEZfNzI0XzE5MTBfS0haICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3OAotI2RlZmluZSBQTExDQ19MUEZfMzE3Xzc5OF9LSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAotI2VuZGlmCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQTExDQ19MUEZfMjU1ODBfNjQ1MzBfS0haICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19MUEZfMTQzNjBfMzcyNzBfS0haICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBQTExDQ19MUEZfNjEwMF8xNjAyMF9LSFogICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBQTExDQ19MUEZfMjU0MF82NjkwX0tIWiAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBQTExDQ19MUEZfMTA1MF8yNzgwX0tIWiAgICAgICAgICAgICAgICAgMHgwMDAwMDA3OAotI2RlZmluZSBQTExDQ19MUEZfNDUwXzExNjBfS0haICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmZWF0dXJlIHJlcG9ydGluZyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGUlJfRkFCX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBGUlJfTUFTS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQwotI2lmZGVmIE5PX0NTNDYxMgotI2RlZmluZSBGUlJfQ0ZPUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBFMAotI2Vsc2UKLSNkZWZpbmUgRlJSX0NGT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBGRTAKLSNlbmRpZgotI2RlZmluZSBGUlJfQ0ZPUF9OT1RfRFZEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBGUlJfQ0ZPUF9BM0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBGUlJfQ0ZPUF8xMjhfUElOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRlJSX0NGT1BfQ1M0MjgwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNlbmRpZgotI2RlZmluZSBGUlJfRkFCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGUlJfTUFTS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBGUlJfQ0ZPUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNQotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBsb2FkIDEKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9DUzQyM1ggICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9BQzk3ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9DUllTVEFMICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9EVUFMX0FDOTcgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBDRkwxX1ZBTElEX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBsb2FkIDIKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBDRkwyX1ZBTElEX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKLSAqICByZWdpc3RlciAxLgotICovCi0jZGVmaW5lIFNFUk1DMV9NU1BFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUk1DMV9QVENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFCi0jZGVmaW5lIFNFUk1DMV9QVENfQ1M0MjNYICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUk1DMV9QVENfQUM5NyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUk1DMV9QVENfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUk1DMV9QTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFNFUk1DMV9YTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBtYXN0ZXIgY29udHJvbAotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNkZWZpbmUgU0VSTUMyX0xST0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSTUMyX01DT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSTUMyX01DRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDEgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkMxX1NPMUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkMxX1NPMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFCi0jZGVmaW5lIFNFUkMxX1NPMUZfQ1M0MjNYICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkMxX1NPMUZfQUM5NyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUkMxX1NPMUZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUkMxX1NPMUZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAyIGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDMl9TSTFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDMl9TSTFGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQotI2RlZmluZSBTRVJDMl9TSTFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDMl9TSTFGX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJDMl9TSTFGX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJDMl9TSTFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgMyBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQzNfU08yRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzNfU08yRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgU0VSQzNfU08yRl9EQUMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQzNfU08yRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDQgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkM0X1NPM0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkM0X1NPM0ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFNFUkM0X1NPM0ZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkM0X1NPM0ZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA1IGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDNV9TSTJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDNV9TSTJGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBTRVJDNV9TSTJGX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDNV9TSTJGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3Igc2FtcGxlCi0gKiAgcG9pbnRlciByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCU1BfRlNQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBTRVJCU1BfRlNQX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3Igc3RhdHVzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQlNUX1JSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQlNUX1dCU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIGNvbW1hbmQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCQ01fUkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJCQ01fV1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IgYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jaWZkZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNFUkJBRF9GQURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZWxzZQotI2RlZmluZSBTRVJCQURfRkFEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFGRgotI2VuZGlmCi0jZGVmaW5lIFNFUkJBRF9GQURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vcgotICogIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQkNGX0hCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHdyaXRlCi0gKiAgcG9ydCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCV1BfRldEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGRkZGRgotI2RlZmluZSBTRVJCV1BfRldEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IgcmVhZAotICogIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQlJQX0ZSRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRkZGRkYKLSNkZWZpbmUgU0VSQlJQX0ZSRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGFzeW5jIEZJRk8gYWRkcmVzcyByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQVNFUl9GQUREUl9BMV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRkYKLSNkZWZpbmUgQVNFUl9GQUREUl9FTjEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgQVNFUl9GQUREUl9BMl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDFGRjAwMDAKLSNkZWZpbmUgQVNFUl9GQUREUl9FTjIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQVNFUl9GQUREUl9BMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVNFUl9GQUREUl9BMl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ0NUTF9SU1ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ0NUTF9FU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ0NUTF9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ0NUTF9EQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ0NUTF9DUlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ0NUTF9BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDVExfVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNTVFNfQ1JEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNTVFNfVlNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDU1RTX1dLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ09TVl9TTFYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ09TVl9TTFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ09TVl9TTFY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ09TVl9TTFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ09TVl9TTFY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ09TVl9TTFY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBQ09TVl9TTFY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBBQ09TVl9TTFYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBBQ09TVl9TTFYxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBQ09TVl9TTFYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ0NBRF9DSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBBQ0NBRF9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGRhdGEgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNDREFfQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgQUNDREFfQ0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgaW5wdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDSVNWX0lTVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDSVNWX0lTVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDSVNWX0lTVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDSVNWX0lTVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDSVNWX0lTVjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDSVNWX0lTVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDSVNWX0lTVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDSVNWX0lTVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDSVNWX0lTVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDSVNWX0lTVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNTQURfU0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgQUNTQURfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGRhdGEgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNTREFfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgQUNTREFfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIHBvbGwvdHJpZ2dlcgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTUFRfQ0FYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTUFRfQ0FZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTUFRfQ0JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEpTUFRfQ0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEpTUFRfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEpTUFRfQkEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEpTUFRfQkIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEpTUFRfQkIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTQ1RMX1NQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEpTQ1RMX1NQX1NMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9TTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9GQVNUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTQ1RMX1NQX0ZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEpTQ1RMX0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBjb29yZGluYXRlIHBhaXIgMQotICogIHJlYWRiYWNrIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTQzFfWTFWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEpTQzFfWDFWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCi0jZGVmaW5lIEpTQzFfWTFWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEpTQzFfWDFWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29vcmRpbmF0ZSBwYWlyIDIKLSAqICByZWFkYmFjayByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBKU0MyX1kyVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBKU0MyX1gyVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBKU0MyX1kyVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBKU0MyX1gyVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSURDUl9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBFbmFibGUgdHJhbnNtaXR0aW5nLiAqLwotI2RlZmluZSBNSURDUl9SWEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBFbmFibGUgcmVjZWl2aW5nLiAqLwotI2RlZmluZSBNSURDUl9SSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAkvKiBJbnRlcnJ1cHQgdXBvbiB0eCByZWFkeS4gKi8KLSNkZWZpbmUgTUlEQ1JfVElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgJLyogSW50ZXJydXB0IHVwb24gcnggcmVhZHkuICovCi0jZGVmaW5lIE1JRENSX01MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCS8qIEVuYWJsZSBtaWRpIGxvb3BiYWNrLiAqLwotI2RlZmluZSBNSURDUl9NUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAkvKiBSZXNldCBpbnRlcmZhY2UuICovCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSURTUl9UQkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBUeCBGSUZPIGlzIGZ1bGwuICovCi0jZGVmaW5lIE1JRFNSX1JCRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIFJ4IEZJRk8gaXMgZW1wdHkuICovCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHdyaXRlIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgTUlEV1BfTVdEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgTUlEV1BfTVdEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgcmVhZCBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIE1JRFJQX01SRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIE1JRFJQX01SRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBHUElPIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTSU9fREFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTSU9fREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTSU9fREJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEpTSU9fREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEpTSU9fQVhPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEpTSU9fQVlPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEpTSU9fQlhPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEpTSU9fQllPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBtYXN0ZXIgYXN5bmMvc3luYyBzZXJpYWwKLSAqICBwb3J0IGVuYWJsZSByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQVNFUl9NQVNURVJfTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBDRkdJX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDRkdJX0RPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDRkdJX0RJTl9FRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBDRkdJX0VFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc3Vic3lzdGVtIElEIGFuZCB2ZW5kb3IgSUQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTU1ZJRF9WSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBTU1ZJRF9TSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBTU1ZJRF9WSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTU1ZJRF9TSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEdQSU8gcGluIGludGVyZmFjZSByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBHUElPUl9WT0xETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBHUElPUl9WT0xVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBHUElPUl9TSTJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBHUElPUl9TSTJPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW4gZGlyZWN0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPRFJfR1BPRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPRFJfR1BPRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPRFJfR1BPRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPRFJfR1BPRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPRFJfR1BPRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIHBvbGFyaXR5LwotICogIHR5cGUgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQwICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQyICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPUFRSX0dQUFQzICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPUFRSX0dQUFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIHN0aWNreQotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT1RSX0dQUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT1RSX0dQUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT1RSX0dQUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT1RSX0dQUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT1RSX0dQUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT1RSX0dQUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT1RSX0dQUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT1RSX0dQUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT1RSX0dQUzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbmcgd2FrZXVwCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPV1JfR1BXMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPV1JfR1BXMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPV1JfR1BXMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPV1JfR1BXMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPV1JfR1BXNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPV1JfR1BXNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPV1JfR1BXNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPV1JfR1BXNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPV1JfR1BXOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIHN0YXR1cwotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT1NSX0dQUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT1NSX0dQUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT1NSX0dQUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT1NSX0dQUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT1NSX0dQUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT1NSX0dQUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT1NSX0dQUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT1NSX0dQUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT1NSX0dQUzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA2IGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgU0VSQzZfQVNETzJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNyBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNFUkM3X0FTREkyRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkM3X1BPU0lMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUkM3X1NJUE9MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUkM3X1NPU0lMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNFUkM3X1NJU09MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IEFDIGxpbmsKLSAqICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTRVJBQ0NfQ09ERUNfVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJBQ0NfQ09ERUNfVFlQRV8xXzAzICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJBQ0NfQ09ERUNfVFlQRV8yXzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJBQ0NfVFdPX0NPREVDUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJBQ0NfTURNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJBQ0NfSFNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDVEwyX1JTVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNDVEwyX0VTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNDVEwyX1ZGUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNDVEwyX0RDViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNDVEwyX0NSVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNDVEwyX0FTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNTVFMyX0NSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNTVFMyX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBvdXRwdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDT1NWMl9TTFYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDT1NWMl9TTFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDT1NWMl9TTFY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDT1NWMl9TTFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDT1NWMl9TTFY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDT1NWMl9TTFY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDT1NWMl9TTFY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDT1NWMl9TTFYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDT1NWMl9TTFYxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDT1NWMl9TTFYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDQUQyX0NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgQUNDQUQyX0NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGRhdGEgcmVnaXN0ZXIKLSAqICAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ0NEQTJfQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBBQ0NEQTJfQ0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgaW5wdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDSVNWMl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDSVNWMl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDSVNWMl9JU1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDSVNWMl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDSVNWMl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDSVNWMl9JU1Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDSVNWMl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDSVNWMl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDSVNWMl9JU1YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDSVNWMl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKLSAqICByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ1NBRDJfU0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBBQ1NBRDJfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDU0RBMl9TRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEFDU0RBMl9TRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGFkZHJlc3MgYW5kIGNvbnRyb2wKLSAqICByZWdpc3RlcnMgKGFsbCAxMikuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVEFDX1NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIElPVEFDX01TS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDAwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfMTZfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfMTBfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfMTJfQklUICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIElPVEFDX1dTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIElPVEFDX1JTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1dTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1NBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElPVEFDX01TS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBmYXN0IHJlYWQgcmVnaXN0ZXJzCi0gKiAgKGFsbCA4KS4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9URlJfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSU9URlJfQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgSU9URlJfUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEYwMDAwMDAKLSNkZWZpbmUgSU9URlJfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSU9URlJfVkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSU9URlJfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSU9URlJfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIElPVEZSX1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBGSUZPIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RGSUZPX0JBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgotI2RlZmluZSBJT1RGSUZPX1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAotI2RlZmluZSBJT1RGSUZPX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJT1RGSUZPX1NQSU9GICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBJT1RGSUZPX0JBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJT1RGSUZPX1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgcmV0cnkgcmVhZCBkYXRhCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVFJSRF9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIElPVFJSRF9SRFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIElPVFJSRF9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIEZJRk8gcG9pbnRlcgotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RGUF9DQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgotI2RlZmluZSBJT1RGUF9QQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkZGMDAwMAotI2RlZmluZSBJT1RGUF9DQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJT1RGUF9QQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9UQ1JfSVREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSU9UQ1JfSFJWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSU9UQ1JfU1JWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSU9UQ1JfRFRJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSU9UQ1JfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSU9UQ1JfRERQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSU9UQ1JfSlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSU9UQ1JfUFBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGlyZWN0IFBDSSBkYXRhIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBEUENJRF9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBEUENJRF9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkaXJlY3QgUENJIGFkZHJlc3MgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIERQQ0lBX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIERQQ0lBX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRpcmVjdCBQQ0kgY29tbWFuZCByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRFBDSUNfQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgRFBDSUNfQ19JT1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRFBDSUNfQ19JT1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgRFBDSUNfQkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIHJlcXVlc3QgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFBDUENJUl9SRENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIFBDUENJUl9DX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3MDAwCi0jZGVmaW5lIFBDUENJUl9SRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFBDUENJUl9SRENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBDUENJUl9DX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgZ3JhbnQgcmVnaXN0ZXIuCi0gKi8gCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQQ1BDSUdfR0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2RlZmluZSBQQ1BDSUdfVkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBQQ1BDSUdfR0RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgbWFzdGVyIGVuYWJsZQotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQQ1BDSUVOX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBQQ0kgcG93ZXIKLSAqICBtYW5hZ2VtZW50IGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVQQ0lQTUNfR1dVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVQQ0lQTUNfRlNQQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZW5kaWYgCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNQQ1JfUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNQQ1JfU1RQRlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNQQ1JfUlVORlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNQQ1JfVElDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNQQ1JfRFJRRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFNQQ1JfUlNUU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNQQ1JfT1JFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTUENSX1BDSUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBTUENSX09JTlREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBTUENSX0NSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkZWJ1ZyBpbmRleCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBEUkVHX1JFR0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBEUkVHX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBEUkVHX1JHQktfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwMAotI2RlZmluZSBEUkVHX1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCi0jZGVmaW5lIERSRUdfVFJBUFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBEUkVHX1JFR0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBEUkVHX1JHQktfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBEUkVHX1JHQktfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc3RgotI2RlZmluZSBEUkVHX1JFR0lEX1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBEUkVHX1JFR0lEX1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMQotI2RlZmluZSBEUkVHX1JFR0lEX1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMgotI2RlZmluZSBEUkVHX1JFR0lEX1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMwotI2RlZmluZSBEUkVHX1JFR0lEX1I0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNAotI2RlZmluZSBEUkVHX1JFR0lEX1I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNQotI2RlZmluZSBEUkVHX1JFR0lEX1I2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNgotI2RlZmluZSBEUkVHX1JFR0lEX1I3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNwotI2RlZmluZSBEUkVHX1JFR0lEX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBEUkVHX1JFR0lEX1I5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOQotI2RlZmluZSBEUkVHX1JFR0lEX1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQQotI2RlZmluZSBEUkVHX1JFR0lEX1JCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQgotI2RlZmluZSBEUkVHX1JFR0lEX1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBEUkVHX1JFR0lEX1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRAotI2RlZmluZSBEUkVHX1JFR0lEX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRQotI2RlZmluZSBEUkVHX1JFR0lEX1JGICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBEUkVHX1JFR0lEX1JBX0JVU19MT1cgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBEUkVHX1JFR0lEX1JBX0JVU19ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBEUkVHX1JFR0lEX1lCVVNfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA1MAotI2RlZmluZSBEUkVHX1JFR0lEX1lCVVNfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA1OAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNwotI2RlZmluZSBEUkVHX1JFR0lEX0lORElSRUNUX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAwMDEwRQotI2RlZmluZSBEUkVHX1JFR0lEX1RPUF9PRl9TVEFDSyAgICAgICAgICAgICAgICAgMHgwMDAwMDEwRgotI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF84ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF85ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTExCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEyCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEzCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE0Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE1Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE2Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE3Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE5Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xOCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFBCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xOSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFCCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFECi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFFCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFGCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTBfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMQotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTFfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMgotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTFfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMwotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNAotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNQotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTBfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNgotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNwotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOAotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOQotI2RlZmluZSBEUkVHX1JFR0lEX1NBR1VTVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwQQotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMDFfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDIwQgotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMDFfSElHSCAgICAgICAgICAgICAgMHgwMDAwMDIwQwotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMjNfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDIwRAotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMjNfSElHSCAgICAgICAgICAgICAgMHgwMDAwMDIwRQotI2RlZmluZSBEUkVHX1JFR0lEX1JTRE1BMDFFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwRgotI2RlZmluZSBEUkVHX1JFR0lEX1JTRE1BMjNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMAotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDBfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMQotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMgotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDFfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMwotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDFfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNAotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDJfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNQotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNgotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDNfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNwotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDNfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxOAotI2RlZmluZSBEUkVHX1JFR0lEX1NSQVJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQQotI2RlZmluZSBEUkVHX1JFR0lEX1NSQVJfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQgotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQwotI2RlZmluZSBEUkVHX1JFR0lEX0NVUlJFTlRfRE1BX1NUUkVBTSAgICAgICAgICAgMHgwMDAwMDIxRAotI2RlZmluZSBEUkVHX1JFR0lEX05FWFRfRE1BX1NUUkVBTSAgICAgICAgICAgICAgMHgwMDAwMDIxRQotI2RlZmluZSBEUkVHX1JFR0lEX0NQVV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBEUkVHX1JFR0lEX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMQotI2RlZmluZSBEUkVHX1JFR0lEX1NUQUNLX0FORF9SRVBFQVQgICAgICAgICAgICAgMHgwMDAwMDMwMgotI2RlZmluZSBEUkVHX1JFR0lEX0lOREVYMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNAotI2RlZmluZSBEUkVHX1JFR0lEX0lOREVYMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNQotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8wXzMgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80XzcgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84XzExICAgICAgICAgICAgICAgMHgwMDAwMDQwOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8xMl8xNSAgICAgICAgICAgICAgMHgwMDAwMDQwQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8xNl8xOSAgICAgICAgICAgICAgMHgwMDAwMDQxMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yMF8yMyAgICAgICAgICAgICAgMHgwMDAwMDQxNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yNF8yNyAgICAgICAgICAgICAgMHgwMDAwMDQxOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yOF8zMSAgICAgICAgICAgICAgMHgwMDAwMDQxQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8zMl8zNSAgICAgICAgICAgICAgMHgwMDAwMDQyMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8zNl8zOSAgICAgICAgICAgICAgMHgwMDAwMDQyNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80MF80MyAgICAgICAgICAgICAgMHgwMDAwMDQyOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80NF80NyAgICAgICAgICAgICAgMHgwMDAwMDQyQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80OF81MSAgICAgICAgICAgICAgMHgwMDAwMDQzMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV81Ml81NSAgICAgICAgICAgICAgMHgwMDAwMDQzNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV81Nl81OSAgICAgICAgICAgICAgMHgwMDAwMDQzOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82MF82MyAgICAgICAgICAgICAgMHgwMDAwMDQzQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82NF82NyAgICAgICAgICAgICAgMHgwMDAwMDQ0MAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82OF83MSAgICAgICAgICAgICAgMHgwMDAwMDQ0NAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV83Ml83NSAgICAgICAgICAgICAgMHgwMDAwMDQ0OAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV83Nl83OSAgICAgICAgICAgICAgMHgwMDAwMDQ0QwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84MF84MyAgICAgICAgICAgICAgMHgwMDAwMDQ1MAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84NF84NyAgICAgICAgICAgICAgMHgwMDAwMDQ1NAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84OF85MSAgICAgICAgICAgICAgMHgwMDAwMDQ1OAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV85Ml85NSAgICAgICAgICAgICAgMHgwMDAwMDQ1QwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMiAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMyAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNSAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNiAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNyAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNwotI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV84ICAgICAgICAgICAgICAgICAweDAwMDAwNTEwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV85ICAgICAgICAgICAgICAgICAweDAwMDAwNTExCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMCAgICAgICAgICAgICAgICAweDAwMDAwNTEyCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMSAgICAgICAgICAgICAgICAweDAwMDAwNTEzCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMiAgICAgICAgICAgICAgICAweDAwMDAwNTE0Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMyAgICAgICAgICAgICAgICAweDAwMDAwNTE1Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNCAgICAgICAgICAgICAgICAweDAwMDAwNTE2Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNSAgICAgICAgICAgICAgICAweDAwMDAwNTE3Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNiAgICAgICAgICAgICAgICAweDAwMDAwNTE4Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNyAgICAgICAgICAgICAgICAweDAwMDAwNTE5Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xOCAgICAgICAgICAgICAgICAweDAwMDAwNTFBCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xOSAgICAgICAgICAgICAgICAweDAwMDAwNTFCCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMCAgICAgICAgICAgICAgICAweDAwMDAwNTFDCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMSAgICAgICAgICAgICAgICAweDAwMDAwNTFECi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMiAgICAgICAgICAgICAgICAweDAwMDAwNTFFCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMyAgICAgICAgICAgICAgICAweDAwMDAwNTFGCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwOAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwOQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwRAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwRQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwRgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNwotI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9MT1cgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYyMAotI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9NSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYyOAotI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDYzMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgRE1BIHN0cmVhbSByZXF1ZXN0b3Igd3JpdGUKLSAqLwotI2RlZmluZSBEU1JXUF9EU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBEU1JXUF9EU1JfQkdfUlEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBEU1JXUF9EU1JfUlFfUEVORElORyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgdHJhcCB3cml0ZSBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFRXUFJfVFdfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIFRXUFJfVFdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzdGFjayBwb2ludGVyIHdyaXRlCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1BXUl9TVEtQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgU1BXUl9TVEtQX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNQIGludGVycnVwdCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTUElSX0ZSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTUElSX0RPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTUElSX0dQSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTUElSX0dQSTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBTUElSX0lQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBTUElSX0lQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTUElSX0lQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBTUElSX0lQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnVuY3Rpb25hbCBncm91cCAxIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZHUjFfRjFTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEZHUjFfRjFTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBjbG9jayBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1BDU19GUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU1BDU19ET0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU1BDU19HUEkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU1BDU19HUEkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgU1BDU19JUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgU1BDU19JUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgU1BDU19JUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgU1BDU19JUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgU1BDU19TUFJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgU1BDU19TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgU1BDU19GRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgU1BDU19PUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgU1BDU19JUlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgU1BDU19GR05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEUwMDAKLSNkZWZpbmUgU1BDU19GR05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBETUEgcmVxdWVzdG9yIHN0YXR1cwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNEU1JfRENTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIFNEU1JfRENTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNEU1JfRENTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmcmFtZSB0aW1lciByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGUk1UX0ZUVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBGUk1UX0ZUVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgY3VycmVudCBjb3VudAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZSQ0NfRkNDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEZSQ0NfRkNDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmcmFtZSB0aW1lciBzYXZlIGNvdW50Ci0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRlJTQ19GQ1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRlJTQ19GQ1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgdmFyaW91cyBmbGFncyBzdG9yZWQgaW4gdGhlIHNjYXR0ZXIvZ2F0aGVyCi0gKiAgZGVzY3JpcHRvcnMuCi0gKi8KLSNkZWZpbmUgRE1BX1NHX05FWFRfRU5UUllfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDBGRjgKLSNkZWZpbmUgRE1BX1NHX1NBTVBMRV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKLSNkZWZpbmUgRE1BX1NHX1NBTVBMRV9FTkRfRkxBRyAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX0xPT1BfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX1NJR05BTF9FTkRfRkxBRyAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX1NJR05BTF9QQUdFX0ZMQUcgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX05FWFRfRU5UUllfU0hJRlQgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgRE1BX1NHX1NBTVBMRV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIGZpZWxkcyB3aXRoaW4gdGhlIG9uLWNoaXAgZ2VuZXJpYwotICogIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX0NPTlRST0wxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0NPTlRST0wyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRE1BX1JRX1NPVVJDRV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRE1BX1JRX0RFU1RJTkFUSU9OX0FERFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKLSNkZWZpbmUgRE1BX1JRX05FWFRfUEFHRV9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRE1BX1JRX05FWFRfUEFHRV9TR0RFU0MgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKLSNkZWZpbmUgRE1BX1JRX0xPT1BfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKLSNkZWZpbmUgRE1BX1JRX1BPU1RfTE9PUF9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKLSNkZWZpbmUgRE1BX1JRX1BBR0VfTUFQX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZpcnN0IGNvbnRyb2wgd29yZCBvZiB0aGUKLSAqICBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfQzFfQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGRgotI2RlZmluZSBETUFfUlFfQzFfREVTVElOQVRJT05fU0NBVFRFUiAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX0dBVEhFUiAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBETUFfUlFfQzFfRE9ORV9GTEFHICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBETUFfUlFfQzFfT1BUSU1JWkVfU1RBVEUgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBETUFfUlFfQzFfU0FNUExFX0VORF9TVEFURV9NQVNLICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBETUFfUlFfQzFfRlVMTF9QQUdFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQkVGT1JFX1NBTVBMRV9FTkQgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUEFHRV9NQVBfRVJST1IgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQVRfU0FNUExFX0VORCAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBETUFfUlFfQzFfTE9PUF9FTkRfU1RBVEVfTUFTSyAgICAgICAgICAgMHgwMDBDMDAwMAotI2RlZmluZSBETUFfUlFfQzFfTk9UX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQkVGT1JFX0xPT1BfRU5EICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBETUFfUlFfQzFfMlBBR0VfTE9PUF9CRUdJTiAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBETUFfUlFfQzFfTE9PUF9CRUdJTiAgICAgICAgICAgICAgICAgICAgMHgwMDBDMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUEFHRV9NQVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDMwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fTk9ORV9QRU5ESU5HICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fTkVYVF9QRU5ESU5HICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fTE9PUF9ORVhUX1BFTkRJTkcgICAgICAgICAgMHgwMDMwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfV1JJVEVCQUNLX0RFU1RfRkxBRyAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfV1JJVEVCQUNLX1NSQ19GTEFHICAgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9TSVpFX01BU0sgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9MSU5FQVIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QxNiAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QzMiAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0Q2NCAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QxMjggICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QyNTYgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0Q1MTIgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QxMDI0ICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9PTl9IT1NUICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX1NJWkVfTUFTSyAgICAgICAgICAgICAgMHg3MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX0xJTkVBUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDE2ICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDMyICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDY0ICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDEyOCAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDI1NiAgICAgICAgICAgICAgICAgMHg1MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDUxMiAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDEwMjQgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX09OX0hPU1QgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQ09VTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2Vjb25kIGNvbnRyb2wgd29yZCBvZiB0aGUKLSAqICBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfQzJfVklSVFVBTF9DSEFOTkVMX01BU0sgICAgICAgICAgMHgwMDAwMDAzRgotI2RlZmluZSBETUFfUlFfQzJfVklSVFVBTF9TSUdOQUxfTUFTSyAgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBETUFfUlFfQzJfTk9fVklSVFVBTF9TSUdOQUwgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX0VWRVJZX0RNQSAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX1NPVVJDRV9QSU5HUE9ORyAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX0RFU1RfUElOR1BPTkcgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBETUFfUlFfQzJfQVVESU9fQ09OVkVSVF9NQVNLICAgICAgICAgICAgMHgwMDAwRjAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfTU9OT19UT19TVEVSRU8gICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfRU5ESUFOX0NPTlZFUlQgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBETUFfUlFfQzJfTE9PUF9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHgwRkZGMDAwMAotI2RlZmluZSBETUFfUlFfQzJfTE9PUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfTk9fTE9PUCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfT05FX1BBR0VfTE9PUCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfVFdPX1BBR0VfTE9PUCAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfTVVMVElfUEFHRV9MT09QICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX0xPT1BfQkFDSyAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX1BPU1RfQkVHSU5fUEFHRSAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfVklSVFVBTF9DSEFOTkVMX1NISUZUICAgICAgICAgMAotI2RlZmluZSBETUFfUlFfQzJfTE9PUF9FTkRfU0hJRlQgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gd29yZHMKLSAqICBvZiB0aGUgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX1NEX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRE1BX1JRX1NEX01FTU9SWV9JRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX1BBUkFNX0FERFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX1NBTVBMRV9BRERSICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX1BST0dSQU1fQUREUiAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX0RFQlVHX0FERFIgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX09NTklNRU1fQUREUiAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX0VORF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX0VSUk9SX0ZMQUcgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX0FERFJFU1NfU0hJRlQgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBhZ2UgbWFwIGFkZHJlc3Mgd29yZCBvZiB0aGUKLSAqICBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfUE1BX0xPT1BfVEhJUkRfUEFHRV9FTlRSWV9NQVNLICAgMHgwMDAwMEZGOAotI2RlZmluZSBETUFfUlFfUE1BX1BBR0VfVEFCTEVfTUFTSyAgICAgICAgICAgICAgMHhGRkZGRjAwMAotI2RlZmluZSBETUFfUlFfUE1BX0xPT1BfVEhJUkRfUEFHRV9FTlRSWV9TSElGVCAgMwotI2RlZmluZSBETUFfUlFfUE1BX1BBR0VfVEFCTEVfU0hJRlQgICAgICAgICAgICAgMTIKLQotI2RlZmluZSBCQTFfVkFSSURFQ19CVUZfMSAgICAgICAweDAwMAotCi0jZGVmaW5lIEJBMV9QRFRDICAgICAgICAgICAgICAgIDB4MGMwICAgIC8qIEJBMV9QTEFZX0RNQV9UUkFOU0FDVElPTl9DT1VOVF9SRUcgKi8KLSNkZWZpbmUgQkExX1BGSUUgICAgICAgICAgICAgICAgMHgwYzQgICAgLyogQkExX1BMQVlfRk9STUFUXyZfSU5URVJSVVBUX0VOQUJMRV9SRUcgKi8KLSNkZWZpbmUgQkExX1BCQSAgICAgICAgICAgICAgICAgMHgwYzggICAgLyogQkExX1BMQVlfQlVGRkVSX0FERFJFU1MgKi8KLSNkZWZpbmUgQkExX1BWT0wgICAgICAgICAgICAgICAgMHgwZjggICAgLyogQkExX1BMQVlfVk9MVU1FX1JFRyAqLwotI2RlZmluZSBCQTFfUFNSQyAgICAgICAgICAgICAgICAweDI4OCAgICAvKiBCQTFfUExBWV9TQU1QTEVfUkFURV9DT1JSRUNUSU9OX1JFRyAqLwotI2RlZmluZSBCQTFfUENUTCAgICAgICAgICAgICAgICAweDJhNCAgICAvKiBCQTFfUExBWV9DT05UUk9MX1JFRyAqLwotI2RlZmluZSBCQTFfUFBJICAgICAgICAgICAgICAgICAweDJiNCAgICAvKiBCQTFfUExBWV9QSEFTRV9JTkNSRU1FTlRfUkVHICovCi0KLSNkZWZpbmUgQkExX0NDVEwgICAgICAgICAgICAgICAgMHgwNjQgICAgLyogQkExX0NBUFRVUkVfQ09OVFJPTF9SRUcgKi8KLSNkZWZpbmUgQkExX0NJRSAgICAgICAgICAgICAgICAgMHgxMDQgICAgLyogQkExX0NBUFRVUkVfSU5URVJSVVBUX0VOQUJMRV9SRUcgKi8KLSNkZWZpbmUgQkExX0NCQSAgICAgICAgICAgICAgICAgMHgxMGMgICAgLyogQkExX0NBUFRVUkVfQlVGRkVSX0FERFJFU1MgKi8KLSNkZWZpbmUgQkExX0NTUkMgICAgICAgICAgICAgICAgMHgyYzggICAgLyogQkExX0NBUFRVUkVfU0FNUExFX1JBVEVfQ09SUkVDVElPTl9SRUcgKi8KLSNkZWZpbmUgQkExX0NDSSAgICAgICAgICAgICAgICAgMHgyZDggICAgLyogQkExX0NBUFRVUkVfQ09FRkZJQ0lFTlRfSU5DUkVNRU5UX1JFRyAqLwotI2RlZmluZSBCQTFfQ0QgICAgICAgICAgICAgICAgICAweDJlMCAgICAvKiBCQTFfQ0FQVFVSRV9ERUxBWV9SRUcgKi8KLSNkZWZpbmUgQkExX0NQSSAgICAgICAgICAgICAgICAgMHgyZjQgICAgLyogQkExX0NBUFRVUkVfUEhBU0VfSU5DUkVNRU5UX1JFRyAqLwotI2RlZmluZSBCQTFfQ1ZPTCAgICAgICAgICAgICAgICAweDJmOCAgICAvKiBCQTFfQ0FQVFVSRV9WT0xVTUVfUkVHICovCi0KLSNkZWZpbmUgQkExX0NGRzEgICAgICAgICAgICAgICAgMHgxMzQgICAgLyogQkExX0NBUFRVUkVfRlJBTUVfR1JPVVBfMV9SRUcgKi8KLSNkZWZpbmUgQkExX0NGRzIgICAgICAgICAgICAgICAgMHgxMzggICAgLyogQkExX0NBUFRVUkVfRlJBTUVfR1JPVVBfMl9SRUcgKi8KLSNkZWZpbmUgQkExX0NDU1QgICAgICAgICAgICAgICAgMHgxM2MgICAgLyogQkExX0NBUFRVUkVfQ09OU1RBTlRfUkVHICovCi0jZGVmaW5lIEJBMV9DU1BCICAgICAgICAgICAgICAgIDB4MzQwICAgIC8qIEJBMV9DQVBUVVJFX1NQQl9BRERSRVNTICovCi0KLS8qCi0gKgotICovCi0KLSNkZWZpbmUgQ1M0NjFYX01PREVfT1VUUFVUCSgxPDwwKQkgLyogTUlESSBVQVJUIC0gb3V0cHV0ICovIAotI2RlZmluZSBDUzQ2MVhfTU9ERV9JTlBVVAkoMTw8MSkJIC8qIE1JREkgVUFSVCAtIGlucHV0ICovCi0KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8KLS8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSBBQzk3IHNoYWRvdyByZWdpc3RlcnMsIHdoaWNoIGFwcGVhcgotLy8gYXMgYSB2aXJ0dWFsIGV4dGVuc2lvbiB0byB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHplcm8gbWVtb3J5IHJhbmdlLgotLy8KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSBBQzk3X1JFR19PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RUwKLSNkZWZpbmUgQUM5N19DT0RFQ19OVU1CRVJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDMwMDBMCi0KLSNkZWZpbmUgQkEwX0FDOTdfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDBMCi0jZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUUgICAgICAgICAgICAgICAgICAweDAwMDAxMDAyTAotI2RlZmluZSBCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FICAgICAgICAgICAgICAgMHgwMDAwMTAwNEwKLSNkZWZpbmUgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PICAgICAgICAgICAgIDB4MDAwMDEwMDZMCi0jZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9UT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDA4TAotI2RlZmluZSBCQTBfQUM5N19QQ19CRUVQX1ZPTFVNRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwQUwKLSNkZWZpbmUgQkEwX0FDOTdfUEhPTkVfVk9MVU1FICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMENMCi0jZGVmaW5lIEJBMF9BQzk3X01JQ19WT0xVTUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBFTAotI2RlZmluZSBCQTBfQUM5N19MSU5FX0lOX1ZPTFVNRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAxMEwKLSNkZWZpbmUgQkEwX0FDOTdfQ0RfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTJMCi0jZGVmaW5lIEJBMF9BQzk3X1ZJREVPX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDE0TAotI2RlZmluZSBCQTBfQUM5N19BVVhfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNkwKLSNkZWZpbmUgQkEwX0FDOTdfUENNX09VVF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMThMCi0jZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9TRUxFQ1QgICAgICAgICAgICAgICAgICAweDAwMDAxMDFBTAotI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfR0FJTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQ0wKLSNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU5fTUlDICAgICAgICAgICAgICAgIDB4MDAwMDEwMUVMCi0jZGVmaW5lIEJBMF9BQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAgICAgICAgICAgICAweDAwMDAxMDIwTAotI2RlZmluZSBCQTBfQUM5N18zRF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyMkwKLSNkZWZpbmUgQkEwX0FDOTdfTU9ERU1fUkFURSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjRMCi0jZGVmaW5lIEJBMF9BQzk3X1BPV0VSRE9XTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI2TAotI2RlZmluZSBCQTBfQUM5N19FWFRfQVVESU9fSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyOEwKLSNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX1BPV0VSICAgICAgICAgICAgICAgIDB4MDAwMDEwMkFMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9GUk9OVF9EQUNfUkFURSAgICAgICAgICAgICAweDAwMDAxMDJDTAotI2RlZmluZSBCQTBfQUM5N19QQ01fU1VSUl9EQUNfUkFURSAgICAgICAgICAgICAgMHgwMDAwMTAyRUwKLSNkZWZpbmUgQkEwX0FDOTdfUENNX0xGRV9EQUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwMzBMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9MUl9BRENfUkFURSAgICAgICAgICAgICAgICAweDAwMDAxMDMyTAotI2RlZmluZSBCQTBfQUM5N19NSUNfQURDX1JBVEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAzNEwKLSNkZWZpbmUgQkEwX0FDOTdfNkNIX1ZPTF9DX0xGRSAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzZMCi0jZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfU1VSUk9VTkQgICAgICAgICAgICAgICAweDAwMDAxMDM4TAotI2RlZmluZSBCQTBfQUM5N19SRVNFUlZFRF8zQSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAzQUwKLSNkZWZpbmUgQkEwX0FDOTdfRVhUX01PREVNX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0NMCi0jZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDNFTAotI2RlZmluZSBCQTBfQUM5N19MSU5FMV9DT0RFQ19SQVRFICAgICAgICAgICAgICAgMHgwMDAwMTA0MEwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTJfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDJMCi0jZGVmaW5lIEJBMF9BQzk3X0hBTkRTRVRfQ09ERUNfUkFURSAgICAgICAgICAgICAweDAwMDAxMDQ0TAotI2RlZmluZSBCQTBfQUM5N19MSU5FMV9DT0RFQ19MRVZFTCAgICAgICAgICAgICAgMHgwMDAwMTA0NkwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTJfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDhMCi0jZGVmaW5lIEJBMF9BQzk3X0hBTkRTRVRfQ09ERUNfTEVWRUwgICAgICAgICAgICAweDAwMDAxMDRBTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9DT05GSUcgICAgICAgICAgICAgICAgMHgwMDAwMTA0Q0wKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fVFlQRSAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNEVMCi0jZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUSUNLWSAgICAgICAgICAgICAgICAweDAwMDAxMDUwTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9XQUtFVVAgICAgICAgICAgICAgICAgMHgwMDAwMTA1MkwKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fU1RBVFVTICAgICAgICAgICAgICAgIDB4MDAwMDEwNTRMCi0jZGVmaW5lIEJBMF9BQzk3X01JU0NfTU9ERU1fQUZFX1NUQVQgICAgICAgICAgICAweDAwMDAxMDU2TAotI2RlZmluZSBCQTBfQUM5N19SRVNFUlZFRF81OCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA1OEwKLSNkZWZpbmUgQkEwX0FDOTdfQ1JZU1RBTF9SRVZfTl9GQUJfSUQgICAgICAgICAgIDB4MDAwMDEwNUFMCi0jZGVmaW5lIEJBMF9BQzk3X1RFU1RfQU5EX01JU0NfQ1RSTCAgICAgICAgICAgICAweDAwMDAxMDVDTAotI2RlZmluZSBCQTBfQUM5N19BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA1RUwKLSNkZWZpbmUgQkEwX0FDOTdfTUlTQ19DUllTVEFMX0NPTlRST0wgICAgICAgICAgIDB4MDAwMDEwNjBMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkUxX0hZUFJJRF9DVFJMICAgICAgICAgICAgICAweDAwMDAxMDYyTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNjQgICAgICAgICAgICAgMHgwMDAwMTA2NEwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY2ICAgICAgICAgICAgIDB4MDAwMDEwNjZMCi0jZGVmaW5lIEJBMF9BQzk3X1NQRElGX0NPTlRST0wgICAgICAgICAgICAgICAgICAweDAwMDAxMDY4TAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkEgICAgICAgICAgICAgMHgwMDAwMTA2QUwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZDICAgICAgICAgICAgIDB4MDAwMDEwNkNMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82RSAgICAgICAgICAgICAweDAwMDAxMDZFTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzAgICAgICAgICAgICAgMHgwMDAwMTA3MEwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcyICAgICAgICAgICAgIDB4MDAwMDEwNzJMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83NCAgICAgICAgICAgICAweDAwMDAxMDc0TAotI2RlZmluZSBCQTBfQUM5N19DQUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA3NkwKLSNkZWZpbmUgQkEwX0FDOTdfQ0FMX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzhMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83QSAgICAgICAgICAgICAweDAwMDAxMDdBTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfSUQxICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA3Q0wKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0VMCi0jZW5kaWYJCQkJLyogX19DUzQ2MVhfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oIGIvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM1YTQ2Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIkNXQ0lNQUdFLkgiLS0gRm9yIENTNDZYWC4gVmVyIDEuMDQKLSAqICAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSAoYykgQ2lycnVzIExvZ2ljIENvcnAuCi0gKiAgICAgIFZlcnNpb24gMS4wNAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2lmbmRlZiBfX0NTX0lNQUdFX0gKLSNkZWZpbmUgX19DU19JTUFHRV9ICi0KLSNkZWZpbmUgQ0xFQVJfX0NPVU5UICAgICAzCi0jZGVmaW5lIEZJTExfX0NPVU5UICAgICAgNAotI2RlZmluZSBCQTFfX0RXT1JEX1NJWkUgIDEzKjEwMjQrNTEyCi0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgICAgICAgdW5zaWduZWQgQkExX19EZXN0Qnl0ZU9mZnNldDsKLSAgICAgICAgdW5zaWduZWQgQkExX19Tb3VyY2VTaXplOwotfSBDbHJTdGF0W0NMRUFSX19DT1VOVF0gPXsgezB4MDAwMDAwMDAsIDB4MDAwMDMwMDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDEwMDAwLCAweDAwMDAzODAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAyMDAwMCwgMHgwMDAwNzAwMCB9IH07Ci0KLXN0YXRpYyB1MzIgRmlsbEFycmF5MVtdPXsKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDIwMDA0MCwweDAwMDA4MDEwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4ODAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDYwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDA5MDAwODAsMHgwMDAwMDE3MywweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDEwLDB4MDA4MDAwMDAsMHgwMDkwMDAwMCwKLTB4ZjJjMDAwMGYsMHgwMDAwMDIwMCwweDAwMDAwMDAwLDB4MDAwMTA2MDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgzMzAzMDBjMiwKLTB4MDYwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCi0weDNmYzAwMDBmLDB4MDAwMDAzMDEsMHgwMDAxMDQwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMGIwMDAwMCwweDAwZDA4MDZkLDB4MzMwNDgwYzMsCi0weDA0ODAwMDAwLDB4MDAwMDAwMDEsMHgwMDgwMDAwMSwweDAwMDBmZmZmLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDA2NmEwNjAwLDB4MDYzNTAwNzAsMHgwMDAwOTI5ZCwweDkyOWQ5MjlkLAotMHgwMDAwMDAwMCwweDAwMDA3MzVhLDB4MDAwMDA2MDAsMHgwMDAwMDAwMCwKLTB4OTI5ZDczNWEsMHgwMDAwMDAwMCwweDAwMDEwMDAwLDB4NzM1YTczNWEsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA0ZiwweDAwMDAwMGMzLAotMHgwNTAwMDAwMCwweDAwYTAwMDEwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwNzAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDA4MCwweDAwYTAwMDAwLDB4MDAwMDgwOWEsMHgwMDAwMDBjMiwKLTB4MDc0MDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCi0weDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDEwN2EwLAotMHgwMGM4MDAyOCwweDAwMDAwMGMyLDB4MDY4MDAwMDAsMHgwMDAwMDAwMCwKLTB4MDZlMDAwODAsMHgwMDMwMDAwMCwweDAwMDA4MGJiLDB4MDAwMDAwYzksCi0weDA3YTAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotMHgwMGM4MDAyOCwweDAwMDA1NTU1LDB4MDAwMDAwMDAsMHgwMDAwMDc4MCwKLTB4MDBjODAwMjgsMHgwMDAwMDBjNSwweGZmODAwMDAwLDB4MDAwMDAwMDAsCi0weDAwNjQwMDgwLDB4MDBjMDAwMDAsMHgwMDAwODE5NywweDAwMDAwMGM5LAotMHgwNzgwMDAwMCwweDA0MDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDgwNWUsMHgwMDAwMDBjMSwKLTB4MDAwMDAwMDAsMHgwMDgwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCi0weDAwMDIwMDAwLDB4MDAwMGZmZmYsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKLQotc3RhdGljIHUzMiBGaWxsQXJyYXkyW109ewotMHg5MjlkMDYwMCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkMDAwMCwKLTB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAotMHgwMDAwMDAwMSwweDAwN2EwMDAyLDB4MDAwMDAwMDAsMHgwNjZlMDYxMCwKLTB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHg3MzVhMDA1MSwKLTB4MDAwMDAwMDAsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4MDAwMDAwMDAsMHgwNjQwMDEzNiwKLTB4MDAwMDI3MGYsMHgwMDAxMDAwMCwweDAwN2EwMDAwLDB4MDAwMDAwMDAsCi0weDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKLQotc3RhdGljIHUzMiBGaWxsQXJyYXkzW109ewotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMDAwNH07Ci0KLXN0YXRpYyB1MzIgRmlsbEFycmF5NFtdPXsKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDAxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMDk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDE5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMjE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDMxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMzk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDA5YzczMCwweDAwMDAxMDAzLAotMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDA5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMTE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDIxNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMjk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDM5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDAwYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKLTB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCi0weDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAotMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGY2MTljLDB4MDAwMDEwMDMsCi0weDAwMDdmODAxLDB4MDAwYzAwMDAsMHgwMDAwMDAzNywweDAwMDAxMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwZWUxOWMsMHgwMDAwMTAwMywweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAyNzNjLDB4MDAwMDEwMDAsCi0weDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDBlNjc5ZSwweDAwMDAxMDAzLAotMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKLTB4MDAwODdmYzEsMHgwMDBjM2JlMCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNzMwLDB4MDAwMDEwMDMsCi0weDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAotMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAotMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKLTB4MDAwNGE3MzAsMHgwMDAwMTAwMywweDAwMDAwZjQxLDB4MDAwOTcxNDAsCi0weDAwMDBhODQxLDB4MDAwOWIyNDAsMHgwMDAwYTBjMSwweDAwMDlmMDQwLAotMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDFiZjA1LDB4MDAwM2ZjNDAsCi0weDAwMDAyNzI1LDB4MDAwYWE0MDAsMHgwMDAxMzcwNSwweDAwMDkzYTAwLAotMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMzg2MzAsMHgwMDAwMTAwNCwKLTB4MDAwNGVmMGEsMHgwMDBlYjc4NSwweDAwMDNmYzhhLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwYzcwZTAsMHgwMDA3ZDE4MiwweDAwMDJjNjQwLAotMHgwMDAwMDYzMCwweDAwMDAxMDA0LDB4MDAwNzk5YjgsMHgwMDAyYzZjMCwKLTB4MDAwMzE3MDUsMHgwMDA5MjI0MCwweDAwMDM5ZjA1LDB4MDAwOTMyYzAsCi0weDAwMDM1MjBhLDB4MDAwMDAwMDAsMHgwMDA0MDczMSwweDAwMDAxMDBiLAotMHgwMDAxMDcwNSwweDAwMGIyMGMwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKLTB4MDAwMzIxMDgsMHgwMDBjNjBjNCwweDAwMDY1MjA4LDB4MDAwYzI5MTcsCi0weDAwMDQwNmIwLDB4MDAwMDEwMDcsMHgwMDAxMmYwNSwweDAwMDM2ODgwLAotMHgwMDAyODE4ZSwweDAwMGMwMDAwLDB4MDAwNDQxMGEsMHgwMDAwMDAwMCwKLTB4MDAwNDA2MzAsMHgwMDAwMTAwNywweDAwMDI5NzA1LDB4MDAwYzAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDNmYzQwLAotMHgwMDAwMzdjMSwweDAwMDkxYjQwLDB4MDAwMDNmYzEsMHgwMDA5MTFjMCwKLTB4MDAwMDM3YzEsMHgwMDA5NTdjMCwweDAwMDAzZmMxLDB4MDAwOTUxYzAsCi0weDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDk5MWMwLAotMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5ZDFjMCwKLTB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDFjY2MxLDB4MDAwOTE1YzAsCi0weDAwMDFjNDQxLDB4MDAwOWQ4MDAsMHgwMDA5Y2RjMSwweDAwMDkxMjQwLAotMHgwMDAxYzU0MSwweDAwMDkxZDAwLDB4MDAwOWNmYzEsMHgwMDA5NTI0MCwKLTB4MDAwMWM3NDEsMHgwMDA5NWM4MCwweDAwMGU4Y2E5LDB4MDAwOTkyNDAsCi0weDAwMGU4NWFkLDB4MDAwOTU2NDAsMHgwMDA2OWNhOSwweDAwMDk5ZDgwLAotMHgwMDBlOTUyZCwweDAwMDk5NjQwLDB4MDAwZWFjYTksMHgwMDA5ZDZjMCwKLTB4MDAwZWE1YWQsMHgwMDA5MWE0MCwweDAwMDZiY2E5LDB4MDAwOWRlODAsCi0weDAwMGViNTJkLDB4MDAwOTVhNDAsMHgwMDBlY2NhOSwweDAwMDk5YWMwLAotMHgwMDBlYzVhZCwweDAwMDlkYTQwLDB4MDAwZWRjYTksMHgwMDA5ZDMwMCwKLTB4MDAwYTZlMGEsMHgwMDAwMTAwMCwweDAwMGVkNTJkLDB4MDAwOTFlNDAsCi0weDAwMGVlY2E5LDB4MDAwOTVlYzAsMHgwMDBlZTVhZCwweDAwMDk5ZTQwLAotMHgwMDA2ZmNhOSwweDAwMDAyNTAwLDB4MDAwZmIyMDgsMHgwMDBjNTlhMCwKLTB4MDAwZWY1MmQsMHgwMDA5ZGU0MCwweDAwMDY4Y2E5LDB4MDAwOTEyYzEsCi0weDAwMDY4M2FkLDB4MDAwOTUyNDEsMHgwMDAyMGYwNSwweDAwMDk5MWMxLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwODZmODgsMHgwMDAwMTAwMCwKLTB4MDAwOWNmODEsMHgwMDBiNTM0MCwweDAwMDljNzAxLDB4MDAwYjkyYzAsCi0weDAwMDlkZTgxLDB4MDAwYmQzMDAsMHgwMDA5ZDYwMSwweDAwMGIxNzAwLAotMHgwMDAxZmQ4MSwweDAwMGI5ZDgwLDB4MDAwOWY1MDEsMHgwMDBiNTdjMCwKLTB4MDAwYTBmODEsMHgwMDBiZDc0MCwweDAwMDIwNzAxLDB4MDAwYjVjODAsCi0weDAwMGExNjgxLDB4MDAwYjk3YzAsMHgwMDAyMTYwMSwweDAwMDAyNTAwLAotMHgwMDBhMDcwMSwweDAwMGI5YjQwLDB4MDAwYTBmODEsMHgwMDBiMWJjMCwKLTB4MDAwMjE2ODEsMHgwMDAwMmQwMCwweDAwMDIwZjgxLDB4MDAwYmQ4MDAsCi0weDAwMGEwNzAxLDB4MDAwYjViYzAsMHgwMDAyMTYwMSwweDAwMDAzNTAwLAotMHgwMDBhMGY4MSwweDAwMGI1ZjQwLDB4MDAwYTA3MDEsMHgwMDBiZGJjMCwKLTB4MDAwMjE2ODEsMHgwMDAwM2QwMCwweDAwMDIwZjgxLDB4MDAwYjFkMDAsCi0weDAwMGEwNzAxLDB4MDAwYjFmYzAsMHgwMDAyMTYwMSwweDAwMDIwNTAwLAotMHgwMDAyMGY4MSwweDAwMGIxMzQxLDB4MDAwYTA3MDEsMHgwMDBiOWZjMCwKLTB4MDAwMjE2ODEsMHgwMDAyMGQwMCwweDAwMDIwZjgxLDB4MDAwYmRlODAsCi0weDAwMGEwNzAxLDB4MDAwYmRmYzAsMHgwMDAyMTYwMSwweDAwMDIxNTAwLAotMHgwMDAyMGY4MSwweDAwMGI5MzQxLDB4MDAwMjA3MDEsMHgwMDBiNTNjMSwKLTB4MDAwMjE2ODEsMHgwMDAyMWQwMCwweDAwMGEwZjgxLDB4MDAwZDAzODAsCi0weDAwMDBiNjAxLDB4MDAwYjE1YzAsMHgwMDAwN2IwMSwweDAwMDAwMDAwLAotMHgwMDAwN2I4MSwweDAwMGJkMWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKLTB4MDAwMDdiODEsMHgwMDBiOTFjMCwweDAwMDA3YjAxLDB4MDAwYjU3YzAsCi0weDAwMDA3YjgxLDB4MDAwYjUxYzAsMHgwMDAwN2IwMSwweDAwMGIxYjQwLAotMHgwMDAwN2I4MSwweDAwMGIxMWMwLDB4MDAwODdiMDEsMHgwMDBjM2RjMCwKLTB4MDAwN2U0ODgsMHgwMDBkN2U0NSwweDAwMDAwMDAwLDB4MDAwZDdhNDQsCi0weDAwMDdlNDhhLDB4MDAwMDAwMDAsMHgwMDAxMWYwNSwweDAwMDg0MDgwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDE3MDUsMHgwMDBiMzU0MCwKLTB4MDAwMDhhMDEsMHgwMDBiZjA0MCwweDAwMDA3MDgxLDB4MDAwYmI1YzAsCi0weDAwMDU1NDg4LDB4MDAwMDAwMDAsMHgwMDAwZDQ4MiwweDAwMDNmYzQwLAotMHgwMDAzZmM4OCwweDAwMDAwMDAwLDB4MDAwMWU0MDEsMHgwMDBiM2EwMCwKLTB4MDAwMWVjODEsMHgwMDBiZDZjMCwweDAwMDRlZjA4LDB4MDAwZWI3ODQsCi0weDAwMGM4NmIwLDB4MDAwMDEwMDcsMHgwMDAwODI4MSwweDAwMGJiMjQwLAotMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKLTB4MDAwMDA3M2MsMHgwMDAwMTAwMCwweDAwMDdmMTg4LDB4MDAwYzAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA1NTI4OCwweDAwMGM1NTVjLAotMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKLTB4MDAwMGZhODgsMHgwMDAwMDAwMCwweDAwMDAwMDMyLDB4MDAwMDEwMDAsCi0weDAwMDAwNzNkLDB4MDAwMDEwMDAsMHgwMDA3ZjE4OCwweDAwMGMwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKLTB4MDAwMDI3MDUsMHgwMDAwMTAwOCwweDAwMDhiMjAxLDB4MDAwYzEzOTIsCi0weDAwMDBiYTAxLDB4MDAwMDAwMDAsMHgwMDAwODczMSwweDAwMDAxNDAwLAotMHgwMDA0YzEwOCwweDAwMGZlMGM0LDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwKLTB4MDAwYTYzODgsMHgwMDAwMTAwMSwweDAwMDhiMzM0LDB4MDAwYmMxNDEsCi0weDAwMDMwMjBlLDB4MDAwMDAwMDAsMHgwMDA4ODZiMCwweDAwMDAxMDA4LAotMHgwMDAwMzYyNSwweDAwMGM1ZGZhLDB4MDAwYTYzOGEsMHgwMDAwMTAwMSwKLTB4MDAwODAyMGUsMHgwMDAwMTAwMiwweDAwMDhhNmIwLDB4MDAwMDEwMDgsCi0weDAwMDdmMzAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMjcyNSwweDAwMGE4YzQwLDB4MDAwMDAwYWUsMHgwMDAwMDAwMCwKLTB4MDAwZDg2MzAsMHgwMDAwMTAwOCwweDAwMDAwMDAwLDB4MDAwYzc0ZTAsCi0weDAwMDdkMTgyLDB4MDAwMmQ2NDAsMHgwMDBhODYzMCwweDAwMDAxMDA4LAotMHgwMDA3OTliOCwweDAwMDJkNmMwLDB4MDAwMDc0OGEsMHgwMDBjM2VjNSwKLTB4MDAwNzQyMGEsMHgwMDBjMDAwMCwweDAwMDYyMjA4LDB4MDAwYzQxMTcsCi0weDAwMDcwNjMwLDB4MDAwMDEwMDksMHgwMDAwMDAwMCwweDAwMGMwMDAwLAotMHgwMDAxMDIyZSwweDAwMDAwMDAwLDB4MDAwM2E2MzAsMHgwMDAwMTAwOSwKLTB4MDAwMDAwMDAsMHgwMDBjMDAwMCwweDAwMDAwMDM2LDB4MDAwMDEwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMmE3MzAsMHgwMDAwMTAwOCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDJhNzMwLDB4MDAwMDEwMDgsCi0weDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDAyYTcwNSwweDAwMDAxMDA4LAotMHgwMDAwN2EwMSwweDAwMGMwMDAwLDB4MDAwZTYyODgsMHgwMDBkNTUwYSwKLTB4MDAwNjQyOGEsMHgwMDAwMDAwMCwweDAwMDYwNzMwLDB4MDAwMDEwMGEsCi0weDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDA3YWFiMCwweDAwMDM0ODgwLDB4MDAwNzhmYjAsMHgwMDAwMTAwYiwKLTB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCi0weDAwMDE4M2FlLDB4MDAwMDAwMDAsMHgwMDA3ODZiMCwweDAwMDAxMDBiLAotMHgwMDAyMmYwNSwweDAwMGMzNTQ1LDB4MDAwMGViOGEsMHgwMDAwMDAwMCwKLTB4MDAwNDI3MzEsMHgwMDAwMTAwMywweDAwMDdhYWIwLDB4MDAwMzQ4ODAsCi0weDAwMDQ4ZmIwLDB4MDAwMDEwMGEsMHgwMDA1NzQ4OCwweDAwMDAwMDAwLAotMHgwMDAzM2I5NCwweDAwMDgxMTQwLDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwKLTB4MDAwODA2YjAsMHgwMDAwMTAwYiwweDAwMDIyZjA1LDB4MDAwMDAwMDAsCi0weDAwMDA3NDAxLDB4MDAwOTExNDAsMHgwMDA0OGYwNSwweDAwMDk1MWMwLAotMHgwMDA0MjczMSwweDAwMDAxMDAzLDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwKLTB4MDAwZjE5YjAsMHgwMDBiYmM0NywweDAwMDgwMDAwLDB4MDAwYmZmYzcsCi0weDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKLTB4MDAwMDBmNDEsMHgwMDA5NzE0MCwweDAwMDBhODQxLDB4MDAwOWIyNDAsCi0weDAwMDBhMGMxLDB4MDAwOWYwNDAsMHgwMDAxYzY0MSwweDAwMDkzNTQwLAotMHgwMDAxY2VjMSwweDAwMDliNWMwLDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwKLTB4MDAwNTUyMDgsMHgwMDAwMDAwMCwweDAwMDEwNzA1LDB4MDAwYTI4ODAsCi0weDAwMDBhMjNhLDB4MDAwOTNhMDAsMHgwMDAzZmM4YSwweDAwMGRmNmM1LAotMHgwMDA0ZWYwYSwweDAwMGMwMDAwLDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKLTB4MDAwNjUzMDgsMHgwMDBjMjk5NywweDAwMGQ4NmIwLDB4MDAwMDEwMGEsCi0weDAwMDQ0MTBhLDB4MDAwZDQwYzcsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDA4MDczMCwweDAwMDAxMDA0LDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA0NzNkLDB4MDAwMDEwMDAsCi0weDAwMGYxOWIwLDB4MDAwYmJjNDcsMHgwMDA4MDAwMCwweDAwMGJmZmM3LAotMHgwMDAwMjczZCwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKLTB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCi0weDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAotMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwMDAwMDAsMHgwMDBlNTA4NCwKLTB4MDAwMDAwMDAsMHgwMDBlYmE0NCwweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCi0weDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAotMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwKLTB4MDAwN2U3MjEsMHgwMDBiZWQ0MCwweDAwMDA1ZjI1LDB4MDAwYmFkYzAsCi0weDAwMDNiYTk3LDB4MDAwYmViODAsMHgwMDA2NTU5MCwweDAwMGIyZTAwLAotMHgwMDAzMzIxNywweDAwMDAzZWMwLDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwKLTB4MDAwM2VkODAsMHgwMDA0OTFjMCwweDAwMDczZmIwLDB4MDAwNzRjODAsCi0weDAwMDI4M2EwLDB4MDAwMDEwMGMsMHgwMDBlZTM4OCwweDAwMDQyOTcwLAotMHgwMDAwODMwMSwweDAwMDIxZWYyLDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwKLTB4MDAwYzRkOGQsMHgwMDAwMDAxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCi0weDAwMDAzMmFjLDB4MDAwYzM5MTYsMHgwMDA0ZWRjMiwweDAwMDc0YzgwLAotMHgwMDA3ODg5OCwweDAwMDAxMDAwLDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwKLTB4MDAwYzRkOGQsMHgwMDA5MmUxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCi0weDAwMDRlZGMyLDB4MDAwYzE5NTYsMHgwMDAwNzIyYywweDAwMDM0YTAwLAotMHgwMDA0MTcwNSwweDAwMDllZDQwLDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwKLTB4MDAwZDc0ODgsMHgwMDBjM2EwMCwweDAwMDQ4ZjA1LDB4MDAwMDAwMDB9OwotCi1zdGF0aWMgc3RydWN0Ci17ICAgdTMyIE9mZnNldDsKLSAgICB1MzIgU2l6ZTsKLSAgICB1MzIgKnBGaWxsOwotfSBGaWxsU3RhdFtGSUxMX19DT1VOVF0gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDAwMDAsIHNpemVvZihGaWxsQXJyYXkxKSwgRmlsbEFycmF5MX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDE4MDAsIHNpemVvZihGaWxsQXJyYXkyKSwgRmlsbEFycmF5Mn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMTM3ZjAsIHNpemVvZihGaWxsQXJyYXkzKSwgRmlsbEFycmF5M30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMjAwMDAsIHNpemVvZihGaWxsQXJyYXk0KSwgRmlsbEFycmF5NH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHguYyBiL3NvdW5kL29zcy9jczQ2eHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZjBkOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0Nnh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQ0ICswLDAgQEAKLS8qCi0gKglDcnlzdGFsIFNvdW5kRnVzaW9uIENTNDZ4eCBkcml2ZXIKLSAqCi0gKglDb3B5cmlnaHQgMTk5OC0yMDAxIENpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiA8cGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKgkJCQkJCTx0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAqCUNvcHlyaWdodCAxOTk5LTIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgotICoJQ29weXJpZ2h0IDIwMDAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KLSAqCi0gKglUaGUgY29yZSBvZiB0aGlzIGNvZGUgaXMgdGFrZW4gZnJvbSB0aGUgQUxTQSBwcm9qZWN0IGRyaXZlciBieSAKLSAqCUphcm9zbGF2LiBQbGVhc2Ugc2VuZCBKYXJvc2xhdiB0aGUgY3JlZGl0IGZvciB0aGUgZHJpdmVyIGFuZCAKLSAqCXJlcG9ydCBidWdzIGluIHRoaXMgcG9ydCB0byA8YWxhbkByZWRoYXQuY29tPgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoJQ3VycmVudCBtYWludGFpbmVyczoKLSAqCQlDaXJydXMgTG9naWMgQ29ycG9yYXRpb24sIFRob21hcyBXb2xsZXIgKHR3KQotICoJCQk8dHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKgkJTmlscyBGYWVyYmVyIChuZikKLSAqCQkJPG5pbHNAa2VybmVsY29uY2VwdHMuZGU+Ci0gKgkJVGhhbmtzIHRvIERhdmlkIFBvbGxhcmQgZm9yIHRlc3RpbmcuCi0gKgotICoJQ2hhbmdlczoKLSAqCTIwMDAwOTA5LW5mCUNoYW5nZWQgY3NfcmVhZCwgY3Nfd3JpdGUgYW5kIGRyYWluX2RhYwotICoJMjAwMDEwMjUtdHcJU2VwYXJhdGUgUGxheWJhY2svQ2FwdHVyZSBzdHJ1Y3RzIGFuZCBidWZmZXJzLgotICoJCQlBZGRlZCBTY2F0dGVyL0dhdGhlciBzdXBwb3J0IGZvciBQbGF5YmFjay4KLSAqCQkJQWRkZWQgQ2FwdHVyZS4KLSAqCTIwMDAxMDI3LW5mCVBvcnQgdG8ga2VybmVsIDIuNC4wLXRlc3Q5LCBzb21lIGNsZWFuLXVwcwotICoJCQlTdGFydCBvZiBwb3dlcm1hbmFnZW1lbnQgc3VwcG9ydCAoQ1M0NlhYX1BNKS4KLSAqCTIwMDAxMTI4LXR3CUFkZCBtb2R1bGUgcGFybSBmb3IgZGVmYXVsdCBidWZmZXIgb3JkZXIuCi0gKgkJCWFkZGVkIERNQV9HRlAgZmxhZyB0byBrbWFsbG9jIGRtYSBidWZmZXIgYWxsb2NzLgotICoJCQliYWNrZmlsbCBzaWxlbmNlIHRvIGVsaW1pbmF0ZSBzdHV0dGVyaW5nIG9uCi0gKgkJCXVuZGVycnVucy4KLSAqCTIwMDAxMjAxLXR3CWFkZCByZXN5bmNpbmcgb2Ygc3dwdHIgb24gdW5kZXJydW5zLgotICoJMjAwMDEyMDUtdHctbmYJZml4ZWQgR0VUT1NQQUNFIGlvY3RsKCkgYWZ0ZXIgb3BlbigpCi0gKgkyMDAxMDExMy10dwlwYXRjaCBmcm9tIEhhbnMgR3JvYmxlciBnZW5lcmFsIGNsZWFudXAuCi0gKgkyMDAxMDExNy10dwkyLjQuMCBwY2kgY2xlYW51cCwgd3JhcHBlciBjb2RlIGZvciAyLjIuMTYtMi40LjAKLSAqCTIwMDEwMTE4LXR3CWJhc2ljIFBNIHN1cHBvcnQgZm9yIDIuMi4xNisgYW5kIDIuNC4wLzIuNC4yLgotICoJMjAwMTAyMjgtZGgJcGF0Y2ggZnJvbSBEYXZpZCBIdWdnaW5zIC0gY3NfdXBkYXRlX3B0ciByZWN1cnNpb24uCi0gKgkyMDAxMDQwOS10dwlhZGQgaGVyY3VsZXMgZ2FtZSB0aGVhdHJlIFhQIGFtcCBjb2RlLgotICoJMjAwMTA0MjAtdHcJY2xlYW51cCBwb3dlcmRvd24vdXAgY29kZS4KLSAqCTIwMDEwNTIxLXR3CWVsaW1pbmF0ZSBwb3BzLCBhbmQgZml4ZXMgZm9yIHBvd2VyZG93bi4KLSAqCTIwMDEwNTI1LXR3CWFkZGVkIGZpeGVzIGZvciB0aGlua3BhZHMgd2l0aCBwb3dlcmRvd24gbG9naWMuCi0gKgkyMDAxMDcyMy1zaCAgICAgcGF0Y2ggZnJvbSBIb3JtcyAoU2ltb24gSG9ybWFuKSAtCi0gKgkgICAgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfQklUUyByZXR1cm5zIGJpdHMgYXMgc2V0IGluIGRyaXZlcgotICoJICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGEgbG9naWNhbCBvciBvZiB0aGUgcG9zc2libGUgdmFsdWVzLgotICoJICAgICAgICAgICAgICAgIFZhcmlvdXMgaW9jdGxzIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZGV2aWNlCi0gKgkgICAgICAgICAgICAgICAgaXMgb3BlbiBmb3IgcmVhZGluZyBvciB3cml0aW5nIGJ1dCBub3QgYm90aCBiZXR0ZXIuCi0gKgotICoJU3RhdHVzOgotICoJUGxheWJhY2svQ2FwdHVyZSBzdXBwb3J0ZWQgZnJvbSA4ay00OGsuCi0gKgkxNkJpdCBTaWduZWQgTEUgJiA4Qml0IFVuc2lnbmVkLCB3aXRoIE1vbm8gb3IgU3RlcmVvIHN1cHBvcnRlZC4KLSAqCi0gKglBUE0vUE0gLSAyLjIueCBBUE0gaXMgZW5hYmxlZCBhbmQgZnVuY3Rpb25pbmcgZmluZS4gQVBNIGNhbiBhbHNvCi0gKgliZSBlbmFibGVkIGZvciAyLjQueCBieSBtb2RpZnlpbmcgdGhlIENTNDZYWF9BQ1BJX1NVUFBPUlQgbWFjcm8KLSAqCWRlZmluaXRpb24uCi0gKgotICogICAgICBIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAgLSB0aGUgRUdQSU8yIHBpbiBjb250cm9scyB0aGUgZXh0ZXJuYWwgQW1wLAotICoJc28sIHVzZSB0aGUgZHJhaW4vcG9sYXJpdHkgdG8gZW5hYmxlLiAgCi0gKgloZXJjdWxlc19lZ3Bpb19kaXNhYmxlIHNldCB0byAxLCB3aWxsIGZvcmNlIGEgMCB0byBFR1BJT0RSLgotICoKLSAqCVZUQiBTYW50YSBDcnV6IC0gdGhlIEdQSU83L0dQSU84IG9uIHRoZSBTZWNvbmRhcnkgQ29kZWMgY29udHJvbAotICoJdGhlIGV4dGVybmFsIGFtcGxpZmllciBmb3IgdGhlICJiYWNrIiBzcGVha2Vycywgc2luY2Ugd2UgZG8gbm90Ci0gKglzdXBwb3J0IHRoZSBzZWNvbmRhcnkgY29kZWMgdGhlbiB0aGlzIGV4dGVybmFsIGFtcCBpcyBhbHNvIG5vdAotICoJdHVybmVkIG9uLgotICovCi0gCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgImNzNDZ4eHBtLmgiCi0jaW5jbHVkZSAiY3M0Nnh4X3dyYXBwZXItMjQuaCIKLSNpbmNsdWRlICJjczQ2MXguaCIKLQotLyogTUlESSBidWZmZXIgc2l6ZXMgKi8KLSNkZWZpbmUgQ1NfTUlESUlOQlVGICA1MDAKLSNkZWZpbmUgQ1NfTUlESU9VVEJVRiA1MDAKLQotI2RlZmluZSBBRENfUlVOTklORwkxCi0jZGVmaW5lIERBQ19SVU5OSU5HCTIKLQotI2RlZmluZSBDU19GTVRfMTZCSVQJMQkJLyogVGhlc2UgYXJlIGZpeGVkIGluIGZhY3QgKi8KLSNkZWZpbmUgQ1NfRk1UX1NURVJFTwkyCi0jZGVmaW5lIENTX0ZNVF9NQVNLCTMKLQotI2RlZmluZSBDU19UWVBFX0FEQwkxCi0jZGVmaW5lIENTX1RZUEVfREFDCTIKLQotI2RlZmluZSBDU19UUlVFIAkxCi0jZGVmaW5lIENTX0ZBTFNFIAkwCi0KLSNkZWZpbmUgQ1NfSU5DX1VTRV9DT1VOVChtKSAoYXRvbWljX2luYyhtKSkKLSNkZWZpbmUgQ1NfREVDX1VTRV9DT1VOVChtKSAoYXRvbWljX2RlYyhtKSkKLSNkZWZpbmUgQ1NfREVDX0FORF9URVNUKG0pIChhdG9taWNfZGVjX2FuZF90ZXN0KG0pKQotI2RlZmluZSBDU19JTl9VU0UobSkgKGF0b21pY19yZWFkKG0pICE9IDApCi0KLSNkZWZpbmUgQ1NfREJHQlJFQUtQT0lOVCB7X19hc21fXygiSU5UICQzIik7fQotLyoKLSAqCUNTNDYxeCBkZWZpbml0aW9ucwotICovCi0gCi0jZGVmaW5lIENTNDYxWF9CQTBfU0laRQkJMHgyMDAwCi0jZGVmaW5lIENTNDYxWF9CQTFfREFUQTBfU0laRQkweDMwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9EQVRBMV9TSVpFCTB4MzgwMAotI2RlZmluZSBDUzQ2MVhfQkExX1BSR19TSVpFCTB4NzAwMAotI2RlZmluZSBDUzQ2MVhfQkExX1JFR19TSVpFCTB4MDEwMAotCi0jZGVmaW5lIEdPRl9QRVJfU0VDCTIwMAotCi0jZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKLSNkZWZpbmUgQ1NERUJVRyAxCi0vKgotICogVHVybiBvbi9vZmYgZGVidWdnaW5nIGNvbXBpbGF0aW9uIGJ5IHVzaW5nIDEvMCByZXNwZWN0aXZlbHkgZm9yIENTREVCVUcKLSAqCi0gKgotICogQ1NERUJVRyBpcyB1c3VhbCBtb2RlIGlzIHNldCB0byAxLCB0aGVuIHVzZSB0aGUKLSAqIGNzX2RlYnVnbGV2ZWwgYW5kIGNzX2RlYnVnbWFzayB0byB0dXJuIG9uIG9yIG9mZiBkZWJ1Z2dpbmcuCi0gKiBEZWJ1ZyBsZXZlbCBvZiAxIGhhcyBiZWVuIGRlZmluZWQgdG8gYmUga2VybmVsIGVycm9ycyBhbmQgaW5mbwotICogdGhhdCBzaG91bGQgYmUgcHJpbnRlZCBvbiBhbnkgcmVsZWFzZWQgZHJpdmVyLgotICovCi0jaWYgQ1NERUJVRwotI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSBpZiAoKGNzX2RlYnVnbGV2ZWwgPj0gKGxldmVsKSkgJiYgKChtYXNrKSAmIGNzX2RlYnVnbWFzaykpIHt4O30KLSNlbHNlCi0jZGVmaW5lIENTX0RCR09VVChtYXNrLGxldmVsLHgpIAotI2VuZGlmCi0vKgotICogY3NfZGVidWdtYXNrIGFyZWFzCi0gKi8KLSNkZWZpbmUgQ1NfSU5JVAkgCTB4MDAwMDAwMDEJCS8qIGluaXRpYWxpemF0aW9uIGFuZCBwcm9iZSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ1NfRVJST1IgCTB4MDAwMDAwMDIJCS8qIHRtcCBkZWJ1Z2dpbmcgYml0IHBsYWNlaG9sZGVyICovCi0jZGVmaW5lIENTX0lOVEVSUlVQVAkweDAwMDAwMDA0CQkvKiBpbnRlcnJ1cHQgaGFuZGxlciAoc2VwYXJhdGUgZnJvbSBhbGwgb3RoZXIpICovCi0jZGVmaW5lIENTX0ZVTkNUSU9OIAkweDAwMDAwMDA4CQkvKiBlbnRlci9sZWF2ZSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ1NfV0FWRV9XUklURSAJMHgwMDAwMDAxMAkJLyogd3JpdGUgaW5mb3JtYXRpb24gZm9yIHdhdmUgKi8KLSNkZWZpbmUgQ1NfV0FWRV9SRUFEIAkweDAwMDAwMDIwCQkvKiByZWFkIGluZm9ybWF0aW9uIGZvciB3YXZlICovCi0jZGVmaW5lIENTX01JRElfV1JJVEUgCTB4MDAwMDAwNDAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciBtaWRpICovCi0jZGVmaW5lIENTX01JRElfUkVBRCAJMHgwMDAwMDA4MAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3IgbWlkaSAqLwotI2RlZmluZSBDU19NUFU0MDFfV1JJVEUgMHgwMDAwMDEwMAkJLyogd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1wdTQwMSAqLwotI2RlZmluZSBDU19NUFU0MDFfUkVBRCAJMHgwMDAwMDIwMAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3IgbXB1NDAxICovCi0jZGVmaW5lIENTX09QRU4JCTB4MDAwMDA0MDAJCS8qIGFsbCBvcGVuIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyICovCi0jZGVmaW5lIENTX1JFTEVBU0UJMHgwMDAwMDgwMAkJLyogYWxsIHJlbGVhc2UgZnVuY3Rpb25zIGluIHRoZSBkcml2ZXIgKi8KLSNkZWZpbmUgQ1NfUEFSTVMJMHgwMDAwMTAwMAkJLyogZnVuY3Rpb25hbCBhbmQgb3BlcmF0aW9uYWwgcGFyYW1ldGVycyAqLwotI2RlZmluZSBDU19JT0NUTAkweDAwMDAyMDAwCQkvKiBpb2N0bCAobm9uLW1peGVyKSAqLwotI2RlZmluZSBDU19QTQkJMHgwMDAwNDAwMAkJLyogUE0gKi8KLSNkZWZpbmUgQ1NfVE1QCQkweDEwMDAwMDAwCQkvKiB0bXAgZGVidWcgbWFzayBiaXQgKi8KLQotI2RlZmluZSBDU19JT0NUTF9DTURfU1VTUEVORAkweDEJLy8gc3VzcGVuZAotI2RlZmluZSBDU19JT0NUTF9DTURfUkVTVU1FCTB4MgkvLyByZXN1bWUKLQotI2lmIENTREVCVUcKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbGV2ZWwgPSAxOwkJCS8qIGxldmVscyByYW5nZSBmcm9tIDEtOSAqLwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbGV2ZWwsIHVsb25nLCAwNjQ0KTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbWFzayA9IENTX0lOSVQgfCBDU19FUlJPUjsJLyogdXNlIENTX0RCR09VVCB3aXRoIHZhcmlvdXMgbWFzayB2YWx1ZXMgKi8KLW1vZHVsZV9wYXJhbShjc19kZWJ1Z21hc2ssIHVsb25nLCAwNjQ0KTsKLSNlbmRpZgotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVyY3VsZXNfZWdwaW9fZGlzYWJsZTsgIC8qIGlmIG5vbi16ZXJvIHNldCBhbGwgRUdQSU8gdG8gMCAqLwotbW9kdWxlX3BhcmFtKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUsIHVsb25nLCAwKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluaXRkZWxheSA9IDcwMDsgIC8qIFBNIGRlbGF5IGluIG1pbGxpc2VjcyAqLwotbW9kdWxlX3BhcmFtKGluaXRkZWxheSwgdWxvbmcsIDApOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG93ZXJkb3duID0gLTE7ICAvKiB0dXJuIG9uL29mZiBwb3dlcmRvd24gcHJvY2Vzc2luZyBpbiBkcml2ZXIgKi8KLW1vZHVsZV9wYXJhbShwb3dlcmRvd24sIHVsb25nLCAwKTsKLSNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAzCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOwotbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOwotCi1zdGF0aWMgaW50IGV4dGVybmFsX2FtcDsKLW1vZHVsZV9wYXJhbShleHRlcm5hbF9hbXAsIGJvb2wsIDApOwotc3RhdGljIGludCB0aGlua3BhZDsKLW1vZHVsZV9wYXJhbSh0aGlua3BhZCwgYm9vbCwgMCk7Ci0KLS8qCi0qIHNldCB0aGUgcG93ZXJkb3duIG1vZHVsZSBwYXJtIHRvIDAgdG8gZGlzYWJsZSBhbGwgCi0qIHBvd2VyZG93bi4gYWxzbyBzZXQgdGhpbmtwYWQgdG8gMSB0byBkaXNhYmxlIHBvd2VyZG93biwgCi0qIGJ1dCBhbHNvIHRvIGVuYWJsZSB0aGUgY2xrcnVuIGZ1bmN0aW9uYWxpdHkuCi0qLwotc3RhdGljIHVuc2lnbmVkIGNzX3Bvd2VyZG93biA9IDE7Ci1zdGF0aWMgdW5zaWduZWQgY3NfbGFwdG9wX3dhaXQgPSAxOwotCi0vKiBBbiBpbnN0YW5jZSBvZiB0aGUgNDYxMCBjaGFubmVsICovCi1zdHJ1Y3QgY3NfY2hhbm5lbCAKLXsKLQlpbnQgdXNlZDsKLQlpbnQgbnVtOwotCXZvaWQgKnN0YXRlOwotfTsKLQotI2RlZmluZSBDUzQ2WFhfTUFKT1JfVkVSU0lPTiAiMSIKLSNkZWZpbmUgQ1M0NlhYX01JTk9SX1ZFUlNJT04gIjI4IgotCi0jaWZkZWYgX19pYTY0X18KLSNkZWZpbmUgQ1M0NlhYX0FSQ0gJICAgICAJIjY0IgkvL2FyY2hpdGVjdHVyZSBrZXkKLSNlbHNlCi0jZGVmaW5lIENTNDZYWF9BUkNICSAgICAgCSIzMiIJLy9hcmNoaXRlY3R1cmUga2V5Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgY3M0Nnh4X2RldnMgPSB7ICZjczQ2eHhfZGV2cywgJmNzNDZ4eF9kZXZzIH07Ci0KLS8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIENTX0NBUkRfTUFHSUMJCTB4NDM1MjU1NTMgLyogIkNSVVMiICovCi0jZGVmaW5lIENTX1NUQVRFX01BR0lDCQkweDRjNGY0NzQ5IC8qICJMT0dJIiAqLwotI2RlZmluZSBOUl9IV19DSAkJMwotCi0vKiBtYXhpbnVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCAqLwotI2RlZmluZSBOUl9BQzk3CQkyCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKLQotLyogInNvZnR3YXJlIiBvciB2aXJ0dWFsIGNoYW5uZWwsIGFuIGluc3RhbmNlIG9mIG9wZW5lZCAvZGV2L2RzcCAqLwotc3RydWN0IGNzX3N0YXRlIHsKLQl1bnNpZ25lZCBpbnQgbWFnaWM7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLwotCi0JLyogc2luZ2xlIG9wZW4gbG9jayBtZWNoYW5pc20sIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nICovCi0Jc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwotCi0JLyogZmlsZSBtb2RlICovCi0JbW9kZV90IG9wZW5fbW9kZTsKLQotCS8qIHZpcnR1YWwgY2hhbm5lbCBudW1iZXIgKi8KLQlpbnQgdmlydDsKLQkKLQlzdHJ1Y3QgZG1hYnVmIHsKLQkJLyogd2F2ZSBzYW1wbGUgc3R1ZmYgKi8KLQkJdW5zaWduZWQgaW50IHJhdGU7Ci0JCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7Ci0KLQkJLyogaGFyZHdhcmUgY2hhbm5lbCAqLwotCQlzdHJ1Y3QgY3NfY2hhbm5lbCAqY2hhbm5lbDsKLQkJaW50IHByaW5nYnVmOwkJLyogU29mdHdhcmUgcmluZyBzbG90ICovCi0JCXZvaWQgKnBidWY7CQkvKiA0SyBoYXJkd2FyZSBETUEgYnVmZmVyICovCi0KLQkJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCi0JCXZvaWQgKnJhd2J1ZjsKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwotCQl1bnNpZ25lZCBidWZvcmRlcjsKLQkJdW5zaWduZWQgbnVtZnJhZzsKLQkJdW5zaWduZWQgZnJhZ3NoaWZ0OwotCQl1bnNpZ25lZCBkaXZpc29yOwotCQl1bnNpZ25lZCB0eXBlOwotCQl2b2lkICp0bXBidWZmOwkJCS8qIHRtcCBidWZmZXIgZm9yIHNhbXBsZSBjb252ZXJzaW9ucyAqLwotCQlkbWFfYWRkcl90IGRtYWFkZHI7Ci0JCWRtYV9hZGRyX3QgZG1hYWRkcl90bXBidWZmOwotCQl1bnNpZ25lZCBidWZvcmRlcl90bXBidWZmOwkvKiBMb2cgYmFzZSAyIG9mIHNpemUgaW4gYnl0ZXMuLiAqLwotCi0JCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLwotCQl1bnNpZ25lZCBod3B0cjsJCS8qIHdoZXJlIGRtYSBsYXN0IHN0YXJ0ZWQsIHVwZGF0ZWQgYnkgdXBkYXRlX3B0ciAqLwotCQl1bnNpZ25lZCBzd3B0cjsJCS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCwgdXBkYXRlZCBieSByZWFkL3dyaXRlICovCi0JCWludCBjb3VudDsJCS8qIGJ5dGVzIHRvIGJlIGNvbXN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCi0JCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBkbWFlZCBieSBoYXJkd2FyZSAqLwotCQl1bnNpZ25lZCBibG9ja3M7CS8qIHRvdGFsIGJsb2NrcyAqLwotCi0JCXVuc2lnbmVkIGVycm9yOwkJLyogbnVtYmVyIG9mIG92ZXIvdW5kZXJydW5zICovCi0JCXVuc2lnbmVkIHVuZGVycnVuOwkvKiB1bmRlcnJ1biBwZW5kaW5nIGJlZm9yZSBuZXh0IHdyaXRlIGhhcyBvY2N1cnJlZCAqLwotCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkvKiBwdXQgcHJvY2VzcyBvbiB3YWl0IHF1ZXVlIHdoZW4gbm8gbW9yZSBzcGFjZSBpbiBidWZmZXIgKi8KLQotCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCi0JCXVuc2lnbmVkIGZyYWdzaXplOwotCQl1bnNpZ25lZCBkbWFzaXplOwotCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKLQotCQkvKiBPU1Mgc3R1ZmYgKi8KLQkJdW5zaWduZWQgbWFwcGVkOjE7Ci0JCXVuc2lnbmVkIHJlYWR5OjE7Ci0JCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKLQkJdW5zaWduZWQgU0dvazoxOwotCQl1bnNpZ25lZCB1cGRhdGVfZmxhZzsKLQkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OwotCQlpbnQgb3NzbWF4ZnJhZ3M7Ci0JCXVuc2lnbmVkIHN1YmRpdmlzaW9uOwotCX0gZG1hYnVmOwotCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCi0Jc3RydWN0IG11dGV4IHNlbTsKLX07Ci0KLXN0cnVjdCBjc19jYXJkIHsKLQlzdHJ1Y3QgY3NfY2hhbm5lbCBjaGFubmVsWzJdOwotCXVuc2lnbmVkIGludCBtYWdpYzsKLQotCS8qIFdlIGtlZXAgY3M0NjF4IGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KLQlzdHJ1Y3QgY3NfY2FyZCAqbmV4dDsKLQotCS8qIFRoZSBjczQ2MXggaGFzIGEgY2VydGFpbiBhbW91bnQgb2YgY3Jvc3MgY2hhbm5lbCBpbnRlcmFjdGlvbgotCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCQotCS8qIEtlZXAgQUM5NyBzYW5lICovCi0Jc3BpbmxvY2tfdCBhYzk3X2xvY2s7Ci0KLQkvKiBtaXhlciB1c2UgY291bnQgKi8KLQlhdG9taWNfdCBtaXhlcl91c2VfY250OwotCi0JLyogUENJIGRldmljZSBzdHVmZiAqLwotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXVuc2lnbmVkIGludCBwY3RsLCBjY3RsOwkvKiBIYXJkd2FyZSBETUEgZmxhZyBzZXRzICovCi0KLQkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KLQlpbnQgZGV2X2F1ZGlvOwotCWludCBkZXZfbWlkaTsKLQotCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgYmFua3MgYW5kIGNoYW5uZWxzKi8KLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlc1syXTsKLQotCXUxNiBhYzk3X2ZlYXR1cmVzOwotCQotCWludCBhbXBsaWZpZXI7CQkJLyogQW1wbGlmaWVyIGNvbnRyb2wgKi8KLQl2b2lkICgqYW1wbGlmaWVyX2N0cmwpKHN0cnVjdCBjc19jYXJkICosIGludCk7Ci0Jdm9pZCAoKmFtcF9pbml0KShzdHJ1Y3QgY3NfY2FyZCAqKTsKLQkKLQlpbnQgYWN0aXZlOwkJCS8qIEFjdGl2ZSBjbG9ja2luZyAqLwotCXZvaWQgKCphY3RpdmVfY3RybCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKLQkKLQkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KLQl1bnNpZ25lZCBsb25nIGJhMF9hZGRyOwotCXVuc2lnbmVkIGxvbmcgYmExX2FkZHI7Ci0JdTMyIGlycTsKLQkKLQkvKiBtYXBwaW5ncyAqLwotCXZvaWQgX19pb21lbSAqYmEwOwotCXVuaW9uCi0JewotCQlzdHJ1Y3QKLQkJewotCQkJdTggX19pb21lbSAqZGF0YTA7Ci0JCQl1OCBfX2lvbWVtICpkYXRhMTsKLQkJCXU4IF9faW9tZW0gKnBtZW07Ci0JCQl1OCBfX2lvbWVtICpyZWc7Ci0JCX0gbmFtZTsKLQkJdTggX19pb21lbSAqaWR4WzRdOwotCX0gYmExOwotCQotCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KLQlzdHJ1Y3QgY3NfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKik7Ci0Jc3RydWN0IGNzX2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKShzdHJ1Y3QgY3NfY2FyZCAqKTsKLQl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKiwgaW50IGNoYW4pOwotCi0JLyogL2Rldi9taWRpIHN0dWZmICovCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7Ci0JCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OwotCQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7Ci0JCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OwotCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQl1bnNpZ25lZCBjaGFyIGlidWZbQ1NfTUlESUlOQlVGXTsKLQkJdW5zaWduZWQgY2hhciBvYnVmW0NTX01JRElPVVRCVUZdOwotCQltb2RlX3Qgb3Blbl9tb2RlOwotCQlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKLQl9IG1pZGk7Ci0Jc3RydWN0IGNzNDZ4eF9wbSBwbTsKLX07Ci0KLXN0YXRpYyBpbnQgY3Nfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBjc19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGNzX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQgY3NfaGFyZHdhcmVfaW5pdChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7Ci1zdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSk7Ci1zdGF0aWMgaW50IGNzNDYxeF9wb3dlcmRvd24oc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlLCBpbnQgc3VzcGVuZGZsYWcpOwotc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpOwotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZF90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZV90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldik7Ci0jZW5kaWYKLQotI2lmIENTREVCVUcKLQotLyogREVCVUcgUk9VVElORVMgKi8KLQotI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjAsIGludCkKLSNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIxLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0sgCV9TSU9XUignTScsMTIyLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0sgCV9TSU9XUignTScsMTIzLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX0FQTQkgCV9TSU9XUignTScsMTI0LCBpbnQpCi0KLXN0YXRpYyB2b2lkIHByaW50aW9jdGwodW5zaWduZWQgaW50IHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciB2aWR4OwotCS8qIHRoZXNlIHZhbHVlcyBhcmUgaW5jb3JyZWN0IGZvciB0aGUgYWM5NyBkcml2ZXIsIGZpeC4KLSAgICAgICAgICogSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKLSAgICAgICAgICogYW5kIG11c3QgYmUgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTLgotICAgICAgICAgKiBWYWx1ZSBvZiBhcnJheSBtZW1iZXIgaXMgaW5kZXggaW50byBzLT5taXgudm9sW10KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0gewotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9QQ01dICAgICA9IDEsICAgLyogdm9pY2UgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORTFdICAgPSAyLCAgIC8qIEFVWCAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9DRF0gICAgICA9IDMsICAgLyogQ0QgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORV0gICAgPSA0LCAgIC8qIExpbmUgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1lOVEhdICAgPSA1LCAgIC8qIEZNICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX01JQ10gICAgID0gNiwgICAvKiBNaWMgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA3LCAgIC8qIFNwZWFrZXIgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfUkVDTEVWXSAgPSA4LCAgIC8qIFJlY29yZGluZyBsZXZlbCAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9WT0xVTUVdICA9IDkgICAgLyogTWFzdGVyIFZvbHVtZSAqLwotICAgICAgICB9OwotICAgICAgICAKLSAgICBzd2l0Y2ggKHgpIHsKLQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOiAiKSApOwotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6ICIpICk7Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6ICIpICk7Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJPU1NfR0VUVkVSU0lPTjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TWU5DOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VURFVQTEVYOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVENBUFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1JFU0VUOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TUEVFRDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFTzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfQ0hBTk5FTFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VURk1UUzogCi0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURk1UOiAKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VURk1UOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1BPU1Q6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUVFJJR0dFUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRUUklHR0VSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUSVNQQUNFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9OT05CTE9DSzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJUFRSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9QVFI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQkxLU0laRTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VURlJBR01FTlQ6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TVUJESVZJREU6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfQklUUzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9XUklURV9GSUxURVI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRTWU5DUk86ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0ZJTFRFUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTE6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTU6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfSU5GTzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0lORk86ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86ICIpICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXN3aXRjaCAoX0lPQ19OUih4KSkgewotCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1ZPTFVNRTogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfU1BFQUtFUjogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNMRVY6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX01JQzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfTUlDOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfU1lOVEg6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogCi0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1JFQ1NSQzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfREVWTUFTSzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUkVDTUFTSzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogCi0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NURVJFT0RFVlM6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NBUFM6IikgKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaSA9IF9JT0NfTlIoeCk7Ci0JCQkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKLQkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZCAiLHgsaSkgKTsKLQkJCQl9IGVsc2UgewotCQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfSU9DVEwgQUM5eDogMHglLjh4IE5SPSVkICIsCi0JCQkJCQkJeCxpKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0gICAgfQotICAgIENTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJjb21tYW5kID0gMHgleCBJT0NfTlI9JWRcbiIseCwgX0lPQ19OUih4KSkgKTsKLX0KLSNlbmRpZgotCi0vKgotICogIGNvbW1vbiBJL08gcm91dGluZXMKLSAqLwotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcG9rZShzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCXdyaXRlbCh2YWwsIGNvZGVjLT5iYTEuaWR4WyhyZWcgPj4gMTYpICYgM10gKyAocmVnICYgMHhmZmZmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWsoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZykKLXsKLQlyZXR1cm4gcmVhZGwoY29kZWMtPmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXSArIChyZWcgJiAweGZmZmYpKTsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Bva2VCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQl3cml0ZWwodmFsLCBjb2RlYy0+YmEwICsgcmVnKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjczQ2MXhfcGVla0JBMChzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnKQotewotCXJldHVybiByZWFkbChjb2RlYy0+YmEwICsgcmVnKTsKLX0KLQotCi1zdGF0aWMgdTE2IGNzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZyk7Ci1zdGF0aWMgdm9pZCBjc19hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKTsKLQotc3RhdGljIHN0cnVjdCBjc19jaGFubmVsICpjc19hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpZiAoY2FyZC0+Y2hhbm5lbFsxXS51c2VkID09IDEpCi0JCXJldHVybiBOVUxMOwotCWNhcmQtPmNoYW5uZWxbMV0udXNlZCA9IDE7Ci0JY2FyZC0+Y2hhbm5lbFsxXS5udW0gPSAxOwotCXJldHVybiAmY2FyZC0+Y2hhbm5lbFsxXTsKLX0KLQotc3RhdGljIHN0cnVjdCBjc19jaGFubmVsICpjc19hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaWYgKGNhcmQtPmNoYW5uZWxbMF0udXNlZCA9PSAxKQotCQlyZXR1cm4gTlVMTDsKLQljYXJkLT5jaGFubmVsWzBdLnVzZWQgPSAxOwotCWNhcmQtPmNoYW5uZWxbMF0ubnVtID0gMDsKLQlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMF07Ci19Ci0KLXN0YXRpYyB2b2lkIGNzX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFubmVsKQotewotCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0uc3RhdGUgPSBOVUxMOwotCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0udXNlZCA9IDA7Ci19Ci0KLS8qCi0gKiBzZXR1cCBhIGRpdmlzb3IgdmFsdWUgdG8gaGVscCB3aXRoIGNvbnZlcnNpb24gZnJvbQotICogMTZiaXQgU3RlcmVvLCBkb3duIHRvIDhiaXQgc3RlcmVvL21vbm8gb3IgMTZiaXQgbW9uby4KLSAqIGFzc2lnbiBhIGRpdmlzb3Igb2YgMSBpZiB1c2luZyAxNmJpdCBTdGVyZW8gYXMgdGhhdCBpcwotICogdGhlIG9ubHkgZm9ybWF0IHRoYXQgdGhlIHN0YXRpYyBpbWFnZSB3aWxsIGNhcHR1cmUuCi0gKi8KLXN0YXRpYyB2b2lkIGNzX3NldF9kaXZpc29yKHN0cnVjdCBkbWFidWYgKmRtYWJ1ZikKLXsKLQlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQotCQlkbWFidWYtPmRpdmlzb3IgPSAxOwotCWVsc2UgaWYgKCEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJgotCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQotCQlkbWFidWYtPmRpdmlzb3IgPSAyOwotCWVsc2UgaWYgKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmCi0JICAgICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQotCQlkbWFidWYtPmRpdmlzb3IgPSAyOwotCWVsc2UgaWYgKCEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJgotCSAgICAhKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKLQkJZG1hYnVmLT5kaXZpc29yID0gNDsKLQllbHNlCi0JCWRtYWJ1Zi0+ZGl2aXNvciA9IDE7Ci0KLQlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgcHJpbnRrKAotCQkiY3M0Nnh4OiBjc19zZXRfZGl2aXNvcigpLSAlcyAlZFxuIiwKLQkJCShkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9BREMpID8gIkFEQyIgOiAiREFDIiwgCi0JCQlkbWFidWYtPmRpdmlzb3IpICk7Ci19Ci0KLS8qCi0qIG11dGUgc29tZSBvZiB0aGUgbW9yZSBwcmV2YWxlbnQgcmVnaXN0ZXJzIHRvIGF2b2lkIHBvcHBpbmcuCi0qLwotc3RhdGljIHZvaWQgY3NfbXV0ZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHN0YXRlKSAKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2ID0gY2FyZC0+YWM5N19jb2RlY1swXTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19tdXRlKCkrICVzXG4iLAotCQkoc3RhdGUgPT0gQ1NfVFJVRSkgPyAiTXV0aW5nIiA6ICJVbk11dGluZyIpKTsKLQotCWlmIChzdGF0ZSA9PSBDU19UUlVFKSB7Ci0JLyoKLQkqIGZpeCBwb3BzIHdoZW4gcG93ZXJpbmcgdXAgb24gdGhpbmtwYWRzCi0JKi8KLQkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldCggZGV2LCAKLQkJCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSk7IAotCQljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkJKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUpOyAKLQkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAotCQljYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJCSh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSk7Ci0JCQkKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAweDgwMDApOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKLQl9IGVsc2UgewotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUpOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUpOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIGNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIGNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUpOwotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfbXV0ZSgpLVxuIikpOwotfQotCi0vKiBzZXQgcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3Nfc2V0X2RhY19yYXRlKHN0cnVjdCBjc19zdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKLXsJCi0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JdW5zaWduZWQgaW50IHRtcDEsIHRtcDI7Ci0JdW5zaWduZWQgaW50IHBoaUluY3I7Ci0JdW5zaWduZWQgaW50IGNvcnJlY3Rpb25QZXJHT0YsIGNvcnJlY3Rpb25QZXJTZWM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9kYWNfcmF0ZSgpKyAlZFxuIixyYXRlKSApOwotCi0JLyoKLQkgKiAgQ29tcHV0ZSB0aGUgdmFsdWVzIHVzZWQgdG8gZHJpdmUgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLgotCSAqICBUaGUgZm9sbG93aW5nIGZvcm11bGFzIGFyZSBiZWluZyBjb21wdXRlZCwgdXNpbmcgaW5saW5lIGFzc2VtYmx5Ci0JICogIHNpbmNlIHdlIG5lZWQgdG8gdXNlIDY0IGJpdCBhcml0aG1ldGljIHRvIGNvbXB1dGUgdGhlIHZhbHVlczoKLQkgKgotCSAqICBwaGlJbmNyID0gZmxvb3IoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCi0JICogIGNvcnJlY3Rpb25QZXJHT0YgPSBmbG9vcigoRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jcikgLwotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMpCi0gICAgICAgICAqICB1bENvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC1NCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQyAqIGNvcnJlY3Rpb25QZXJHT0YKLQkgKgotCSAqICBpLmUuCi0JICoKLQkgKiAgcGhpSW5jcjpvdGhlciA9IGRpdmlkZW5kOnJlbWFpbmRlcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKLQkgKiAgY29ycmVjdGlvblBlckdPRjpjb3JyZWN0aW9uUGVyU2VjID0KLQkgKiAgICAgIGRpdmlkZW5kOnJlbWFpbmRlcih1bE90aGVyIC8gR09GX1BFUl9TRUMpCi0JICovCi0JdG1wMSA9IHJhdGUgPDwgMTY7Ci0JcGhpSW5jciA9IHRtcDEgLyA0ODAwMDsKLQl0bXAxIC09IHBoaUluY3IgKiA0ODAwMDsKLQl0bXAxIDw8PSAxMDsKLQlwaGlJbmNyIDw8PSAxMDsKLQl0bXAyID0gdG1wMSAvIDQ4MDAwOwotCXBoaUluY3IgKz0gdG1wMjsKLQl0bXAxIC09IHRtcDIgKiA0ODAwMDsKLQljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOwotCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOwotCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOwotCi0JLyoKLQkgKiAgRmlsbCBpbiB0aGUgU2FtcGxlUmF0ZUNvbnZlcnRlciBjb250cm9sIGJsb2NrLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUFNSQywKLQkgICgoY29ycmVjdGlvblBlclNlYyA8PCAxNikgJiAweEZGRkYwMDAwKSB8IChjb3JyZWN0aW9uUGVyR09GICYgMHhGRkZGKSk7Ci0JY3M0NjF4X3Bva2Uoc3RhdGUtPmNhcmQsIEJBMV9QUEksIHBoaUluY3IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JZG1hYnVmLT5yYXRlID0gcmF0ZTsKLQkKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfZGFjX3JhdGUoKS0gJWRcbiIscmF0ZSkgKTsKLQlyZXR1cm4gcmF0ZTsKLX0KLQotLyogc2V0IHJlY29yZGluZyBzYW1wbGUgcmF0ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjc19zZXRfYWRjX3JhdGUoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBpbnQgcGhpSW5jciwgY29lZmZJbmNyLCB0bXAxLCB0bXAyOwotCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjLCBpbml0aWFsRGVsYXk7Ci0JdW5zaWduZWQgaW50IGZyYW1lR3JvdXBMZW5ndGgsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9hZGNfcmF0ZSgpKyAlZFxuIixyYXRlKSApOwotCi0JLyoKLQkgKiAgV2UgY2FuIG9ubHkgZGVjaW1hdGUgYnkgdXAgdG8gYSBmYWN0b3Igb2YgMS85dGggdGhlIGhhcmR3YXJlIHJhdGUuCi0JICogIENvcnJlY3QgdGhlIHZhbHVlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCi0JICovCi0JaWYgKChyYXRlICogOSkgPCA0ODAwMCkKLQkJcmF0ZSA9IDQ4MDAwIC8gOTsKLQotCS8qCi0JICogIFdlIGNhbm5vdCBjYXB0dXJlIGF0IGF0IHJhdGUgZ3JlYXRlciB0aGFuIHRoZSBJbnB1dCBSYXRlICg0ODAwMCkuCi0JICogIFJldHVybiBhbiBlcnJvciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc3RyYXkgb3V0c2lkZSB0aGF0IGxpbWl0LgotCSAqLwotCWlmIChyYXRlID4gNDgwMDApCi0JCXJhdGUgPSA0ODAwMDsKLQotCS8qCi0JICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KLQkgKiAgVGhlIGZvbGxvd2luZyBmb3JtdWxhcyBhcmUgYmVpbmcgY29tcHV0ZWQsIHVzaW5nIGlubGluZSBhc3NlbWJseQotCSAqICBzaW5jZSB3ZSBuZWVkIHRvIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBjb21wdXRlIHRoZSB2YWx1ZXM6Ci0JICoKLQkgKiAgICAgY29lZmZJbmNyID0gLWZsb29yKChGcyxvdXQgKiAyXjIzKSAvIEZzLGluKQotCSAqICAgICBwaGlJbmNyID0gZmxvb3IoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCi0JICogICAgIGNvcnJlY3Rpb25QZXJHT0YgPSBmbG9vcigoRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jcikgLwotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQykKLQkgKiAgICAgY29ycmVjdGlvblBlclNlYyA9IEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IgLQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQyAqIGNvcnJlY3Rpb25QZXJHT0YKLQkgKiAgICAgaW5pdGlhbERlbGF5ID0gY2VpbCgoMjQgKiBGcyxpbikgLyBGcyxvdXQpCi0JICoKLQkgKiBpLmUuCi0JICoKLQkgKiAgICAgY29lZmZJbmNyID0gbmVnKGRpdmlkZW5kKChGcyxvdXQgKiAyXjIzKSAvIEZzLGluKSkKLQkgKiAgICAgcGhpSW5jcjp1bE90aGVyID0gZGl2aWRlbmQ6cmVtYWluZGVyKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQotCSAqICAgICBjb3JyZWN0aW9uUGVyR09GOmNvcnJlY3Rpb25QZXJTZWMgPQotCSAqIAkgICAgZGl2aWRlbmQ6cmVtYWluZGVyKHVsT3RoZXIgLyBHT0ZfUEVSX1NFQykKLQkgKiAgICAgaW5pdGlhbERlbGF5ID0gZGl2aWRlbmQoKCgyNCAqIEZzLGluKSArIEZzLG91dCAtIDEpIC8gRnMsb3V0KQotCSAqLwotCXRtcDEgPSByYXRlIDw8IDE2OwotCWNvZWZmSW5jciA9IHRtcDEgLyA0ODAwMDsKLQl0bXAxIC09IGNvZWZmSW5jciAqIDQ4MDAwOwotCXRtcDEgPDw9IDc7Ci0JY29lZmZJbmNyIDw8PSA3OwotCWNvZWZmSW5jciArPSB0bXAxIC8gNDgwMDA7Ci0JY29lZmZJbmNyIF49IDB4RkZGRkZGRkY7Ci0JY29lZmZJbmNyKys7Ci0JdG1wMSA9IDQ4MDAwIDw8IDE2OwotCXBoaUluY3IgPSB0bXAxIC8gcmF0ZTsKLQl0bXAxIC09IHBoaUluY3IgKiByYXRlOwotCXRtcDEgPDw9IDEwOwotCXBoaUluY3IgPDw9IDEwOwotCXRtcDIgPSB0bXAxIC8gcmF0ZTsKLQlwaGlJbmNyICs9IHRtcDI7Ci0JdG1wMSAtPSB0bXAyICogcmF0ZTsKLQljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOwotCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOwotCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOwotCWluaXRpYWxEZWxheSA9ICgoNDgwMDAgKiAyNCkgKyByYXRlIC0gMSkgLyByYXRlOwotCi0JLyoKLQkgKiAgRmlsbCBpbiB0aGUgVmFyaURlY2ltYXRlIGNvbnRyb2wgYmxvY2suCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NSQywKLQkJKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NJLCBjb2VmZkluY3IpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DRCwKLQkJKCgoQkExX1ZBUklERUNfQlVGXzEgKyAoaW5pdGlhbERlbGF5IDw8IDIpKSA8PCAxNikgJiAweEZGRkYwMDAwKSB8IDB4ODApOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DUEksIHBoaUluY3IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogIEZpZ3VyZSBvdXQgdGhlIGZyYW1lIGdyb3VwIGxlbmd0aCBmb3IgdGhlIHdyaXRlIGJhY2sgdGFzay4gIEJhc2ljYWxseSwKLQkgKiAgdGhpcyBpcyBqdXN0IHRoZSBmYWN0b3JzIG9mIDI0MDAwICgyXjYqMyo1XjMpIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluCi0JICogIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUuCi0JICovCi0JZnJhbWVHcm91cExlbmd0aCA9IDE7Ci0JZm9yIChjbnQgPSAyOyBjbnQgPD0gNjQ7IGNudCAqPSAyKSB7Ci0JCWlmICgoKHJhdGUgLyBjbnQpICogY250KSAhPSByYXRlKQotCQkJZnJhbWVHcm91cExlbmd0aCAqPSAyOwotCX0KLQlpZiAoKChyYXRlIC8gMykgKiAzKSAhPSByYXRlKSB7Ci0JCWZyYW1lR3JvdXBMZW5ndGggKj0gMzsKLQl9Ci0JZm9yIChjbnQgPSA1OyBjbnQgPD0gMTI1OyBjbnQgKj0gNSkgewotCQlpZiAoKChyYXRlIC8gY250KSAqIGNudCkgIT0gcmF0ZSkgCi0JCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDU7Ci0gICAgICAgIH0KLQotCS8qCi0JICogRmlsbCBpbiB0aGUgV3JpdGVCYWNrIGNvbnRyb2wgYmxvY2suCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0ZHMSwgZnJhbWVHcm91cExlbmd0aCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NGRzIsICgweDAwODAwMDAwIHwgZnJhbWVHcm91cExlbmd0aCkpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1NULCAweDAwMDBGRkZGKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NQQiwgKCg2NTUzNiAqIHJhdGUpIC8gMjQwMDApKTsKLQljczQ2MXhfcG9rZShjYXJkLCAoQkExX0NTUEIgKyA0KSwgMHgwMDAwRkZGRik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2FkY19yYXRlKCktICVkXG4iLHJhdGUpICk7Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KLS8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLyAKLXN0YXRpYyB2b2lkIGNzX3BsYXlfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotICAgICAgICB1bnNpZ25lZCBpbnQgdG1wLCBDb3VudCwgcGxheUZvcm1hdDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BsYXlfc2V0dXAoKStcbiIpICk7Ci0gICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QVk9MLCAweDgwMDA4MDAwKTsKLSAgICAgICAgaWYgKCFkbWFidWYtPlNHb2spCi0gICAgICAgICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEJBLCB2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpKTsKLSAgICAKLSAgICAgICAgQ291bnQgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcGxheUZvcm1hdD1jczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwbGF5Rm9ybWF0ICY9IH5ETUFfUlFfQzJfQUNfTU9OT19UT19TVEVSRU87ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDb3VudCAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcGxheUZvcm1hdCB8PSBETUFfUlFfQzJfQUNfTU9OT19UT19TVEVSRU87ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICgoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGxheUZvcm1hdCAmPSB+KERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IERNQV9SUV9DMl9BQ19TSUdORURfQ09OVkVSVCk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ291bnQgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gKERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgcGxheUZvcm1hdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUERUQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0bXAgJj0gMHhmZmZmZmUwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUERUQywgdG1wIHwgLS1Db3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcGxheV9zZXR1cCgpLVxuIikgKTsKLX0KLQotc3RhdGljIHN0cnVjdCBJbml0U3RydWN0Ci17Ci0gICAgdTMyIG9mZjsKLSAgICB1MzIgdmFsOwotfSBJbml0QXJyYXlbXSA9IHsgezB4MDAwMDAwNDAsIDB4M2ZjMDAwMGZ9LAotICAgICAgICAgICAgICAgICAgezB4MDAwMDAwNGMsIDB4MDQ4MDAwMDB9LAotCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBiMywgMHgwMDAwMDc4MH0sCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBiNywgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBiYywgMHgwNzgwMDAwMH0sCi0KLSAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGNkLCAweDAwODAwMDAwfSwKLSAgICAgICAgICAgICAgICB9OwotCi0vKgotICogIlNldENhcHR1cmVTUFZhbHVlcygpIiAtLSBJbml0aWFsaXplIHJlY29yZCB0YXNrIHZhbHVlcyBiZWZvcmUgZWFjaAotICogCWNhcHR1cmUgc3RhcnR1cC4gIAotICovCi1zdGF0aWMgdm9pZCBTZXRDYXB0dXJlU1BWYWx1ZXMoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JdW5zaWduZWQgaSwgb2Zmc2V0OwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKCJjczQ2eHg6IFNldENhcHR1cmVTUFZhbHVlcygpK1xuIikgKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEluaXRBcnJheSkgLyBzaXplb2Yoc3RydWN0IEluaXRTdHJ1Y3QpOyBpKyspIHsKLQkJb2Zmc2V0ID0gSW5pdEFycmF5W2ldLm9mZio0OyAvKiA4Yml0IHRvIDMyYml0IG9mZnNldCB2YWx1ZSAqLwotCQljczQ2MXhfcG9rZShjYXJkLCBvZmZzZXQsIEluaXRBcnJheVtpXS52YWwgKTsKLQl9Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCktXG4iKSApOwotfQotCi0vKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcmVjb3JkaW5nICovCi1zdGF0aWMgdm9pZCBjc19yZWNfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVjX3NldHVwKCkrXG4iKSk7Ci0JU2V0Q2FwdHVyZVNQVmFsdWVzKGNhcmQpOwotCi0JLyoKLQkgKiBzZXQgdGhlIGF0dGVudWF0aW9uIHRvIDBkQiAKLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1ZPTCwgMHg4MDAwODAwMCk7Ci0KLQkvKgotCSAqIHNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY2FwdHVyZSBidWZmZXIgaW50byB0aGUgU1AKLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0JBLCB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1ZikpOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVjX3NldHVwKCktXG4iKSApOwotfQotCi0KLS8qIGdldCBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyBkbWEgYnVmZmVyIHBvaW50ZXIgKGJ5dGUgb2Zmc2V0IGZyb20gTEJBKSwKLSAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCi0gICAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY3NfZ2V0X2RtYV9hZGRyKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JdTMyIG9mZnNldDsKLQkKLQlpZiAoICghKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpKSAmJgotCSAgICAgKCEoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgKSApCi0JewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50aygKLQkJCSJjczQ2eHg6IEVSUk9SIGNzX2dldF9kbWFfYWRkcigpOiBub3QgZW5hYmxlZCBcbiIpICk7Ci0JCXJldHVybiAwOwotCX0KLQkJCi0JLyoKLQkgKiBncmFudWxhcml0eSBpcyBieXRlIGJvdW5kYXJ5LCBnb29kIHBhcnQuCi0JICovCi0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCi0JCW9mZnNldCA9IGNzNDYxeF9wZWVrKHN0YXRlLT5jYXJkLCBCQTFfUEJBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JZWxzZSAvKiBBRENfUlVOTklORyBtdXN0IGJlIHNldCAqLwotCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX0NCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JQ1NfREJHT1VUKENTX1BBUk1TIHwgQ1NfRlVOQ1RJT04sIDksIAotCQlwcmludGsoImNzNDZ4eDogY3NfZ2V0X2RtYV9hZGRyKCkgJWRcbiIsb2Zmc2V0KSApOwotCW9mZnNldCA9ICh1MzIpYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSAtICh1MzIpZG1hYnVmLT5yYXdidWY7Ci0JQ1NfREJHT1VUKENTX1BBUk1TIHwgQ1NfRlVOQ1RJT04sIDgsIAotCQlwcmludGsoImNzNDZ4eDogY3NfZ2V0X2RtYV9hZGRyKCktICVkXG4iLG9mZnNldCkgKTsKLQlyZXR1cm4gb2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCByZXN5bmNfZG1hX3B0cnMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogcmVzeW5jX2RtYV9wdHJzKCkrIFxuIikgKTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCWRtYWJ1Zi0+aHdwdHI9ZG1hYnVmLT5zd3B0ciA9IDA7Ci0JCWRtYWJ1Zi0+cHJpbmdidWYgPSAwOwotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKS0gXG4iKSApOwotfQotCQotLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfYWRjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCQotCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKLQkKLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JdG1wICY9IDB4RkZGRjAwMDA7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCApOwotfQotCi1zdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpKyBcbiIpICk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JX19zdG9wX2FkYyhzdGF0ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpLSBcbiIpICk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSAmJiAKLQkgICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplKSAKLQkgICAgICAgJiYgZG1hYnVmLT5yZWFkeSkgJiYgCi0JICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCi0JICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKLQl7Ci0JCWRtYWJ1Zi0+ZW5hYmxlIHw9IEFEQ19SVU5OSU5HOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JCXRtcCAmPSAweEZGRkYwMDAwOwotCQl0bXAgfD0gY2FyZC0+Y2N0bDsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoCi0JCQkiY3M0Nnh4OiBzdGFydF9hZGMoKSBwb2tlIDB4JXggXG4iLHRtcCkgKTsKLQkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogc3RvcCBwbGF5YmFjayAobG9jayBoZWxkKSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7Ci0JCi0JdG1wPWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQl0bXAmPTB4RkZGRjsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKLX0KLQotc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKSsgXG4iKSApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCV9fc3RvcF9kYWMoc3RhdGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKS0gXG4iKSApOwotfQkKLQotc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdGFydF9kYWMoKSsgXG4iKSApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCEoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgJiYgCi0JICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA+IDApICYmIGRtYWJ1Zi0+cmVhZHkpICYmCi0JICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCi0JICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKLQl7Ci0JCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOwotCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JCXRtcCAmPSAweEZGRkY7Ci0JCXRtcCB8PSBjYXJkLT5wY3RsOwotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDYsIHByaW50aygKLQkJICAgICJjczQ2eHg6IHN0YXJ0X2RhYygpIHBva2UgY2FyZD0lcCB0bXA9MHglLjA4eCBhZGRyPSVwIFxuIiwKLQkJICAgIGNhcmQsICh1bnNpZ25lZCl0bXAsIAotCQkgICAgY2FyZC0+YmExLmlkeFsoQkExX1BDVEwgPj4gMTYpICYgM10rKEJBMV9QQ1RMJjB4ZmZmZikgKSApOwotCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0YXJ0X2RhYygpLSBcbiIpICk7Ci19Ci0KLSNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKLQotLyoKLSAqIGFsbG9jYXRlIERNQSBidWZmZXIsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgYnVmZmVycyBhcmUgc2VwYXJhdGUuCi0gKi8KLXN0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0KLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQl2b2lkICpyYXdidWYgPSBOVUxMOwotCXZvaWQgKnRtcGJ1ZmYgPSBOVUxMOwotCWludCBvcmRlcjsKLQlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOwotCXVuc2lnbmVkIGxvbmcgZGY7Ci0JCi0JZG1hYnVmLT5yZWFkeSAgPSBkbWFidWYtPm1hcHBlZCA9IDA7Ci0JZG1hYnVmLT5TR29rID0gMDsKLS8qCi0qIGNoZWNrIGZvciBvcmRlciB3aXRoaW4gbGltaXRzLCBidXQgZG8gbm90IG92ZXJ3cml0ZSB2YWx1ZS4KLSovCi0JaWYgKChkZWZhdWx0b3JkZXIgPiAxKSAmJiAoZGVmYXVsdG9yZGVyIDwgMTIpKQotCQlkZiA9IGRlZmF1bHRvcmRlcjsKLQllbHNlCi0JCWRmID0gMjsJCi0KLQlmb3IgKG9yZGVyID0gZGY7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKLQkJaWYgKChyYXdidWYgPSAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KAotCQkJY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZG1hYnVmLT5kbWFhZGRyKSkpCi0JCQkgICAgYnJlYWs7Ci0JaWYgKCFyYXdidWYpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJCSJjczQ2eHg6IGFsbG9jX2RtYWJ1ZigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcmF3YnVmXG4iKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7Ci0JZG1hYnVmLT5yYXdidWYgPSByYXdidWY7Ci0JLy8gTm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgdGhlIAotCS8vIHJlbWFwX3Bmbl9yYW5nZSgpIGluIGNzNDZ4eF9tbWFwIGRvZXNuJ3Qgd29yay4KLQkvLyAxLiBnZXQgaW5kZXggdG8gbGFzdCBwYWdlIGluIG1lbV9tYXAgYXJyYXkgZm9yIHJhd2J1Zi4KLQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAKLQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOwotCi0JLy8gMi4gbWFyayBlYWNoIHBoeXNpY2FsIHBhZ2UgaW4gcmFuZ2UgYXMgJ3Jlc2VydmVkJy4KLQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQotCQljczR4X21lbV9tYXBfcmVzZXJ2ZShtYXApOwotCi0JQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoImNzNDZ4eDogYWxsb2NfZG1hYnVmKCk6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAotCSAgICAgICBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpICk7Ci0KLS8qCi0qICBvbmx5IGFsbG9jYXRlIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciBmb3IgdGhlIEFEQwotKi8KLQlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKSB7Ci0JCWRtYWJ1Zi0+dG1wYnVmZiA9IE5VTEw7Ci0JCWRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZiA9IDA7Ci0JCXJldHVybiAwOwotCX0KLS8qCi0gKiBub3cgdGhlIHRlbXAgYnVmZmVyIGZvciAxNi84IGNvbnZlcnNpb25zCi0gKi8KLQotCXRtcGJ1ZmYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKLQkJY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZG1hYnVmLT5kbWFhZGRyX3RtcGJ1ZmYpOwotCi0JaWYgKCF0bXBidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlDU19EQkdPVVQoQ1NfUEFSTVMsIDksIHByaW50aygiY3M0Nnh4OiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKLQkgICAgICAgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgdG1wYnVmZikgKTsKLQotCWRtYWJ1Zi0+dG1wYnVmZiA9IHRtcGJ1ZmY7Ci0JZG1hYnVmLT5idWZvcmRlcl90bXBidWZmID0gb3JkZXI7Ci0JCi0JLy8gTm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgdGhlIAotCS8vIHJlbWFwX3Bmbl9yYW5nZSgpIGluIGNzNDZ4eF9tbWFwIGRvZXNuJ3Qgd29yay4KLQkvLyAxLiBnZXQgaW5kZXggdG8gbGFzdCBwYWdlIGluIG1lbV9tYXAgYXJyYXkgZm9yIHJhd2J1Zi4KLQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmICsgCi0JCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcl90bXBidWZmKSAtIDEpOwotCi0JLy8gMi4gbWFyayBlYWNoIHBoeXNpY2FsIHBhZ2UgaW4gcmFuZ2UgYXMgJ3Jlc2VydmVkJy4KLQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKLQkJY3M0eF9tZW1fbWFwX3Jlc2VydmUobWFwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogZnJlZSBETUEgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBwYWdlICptYXAsICptYXBlbmQ7Ci0KLQlpZiAoZG1hYnVmLT5yYXdidWYpIHsKLQkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCi0JCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIAotCQkJCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKLQkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKLQkJCWNzNHhfbWVtX21hcF91bnJlc2VydmUobWFwKTsKLQkJZnJlZV9kbWFidWYoc3RhdGUtPmNhcmQsIGRtYWJ1Zik7Ci0JfQotCi0JaWYgKGRtYWJ1Zi0+dG1wYnVmZikgewotCQkvLyBVbmRvIHByb2dfZG1hYnVmKCkncyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAKLQkJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZiArCi0JCQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpIC0gMSk7Ci0JCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQotCQkJY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShtYXApOwotCQlmcmVlX2RtYWJ1ZjIoc3RhdGUtPmNhcmQsIGRtYWJ1Zik7Ci0JfQotCi0JZG1hYnVmLT5yYXdidWYgPSBOVUxMOwotCWRtYWJ1Zi0+dG1wYnVmZiA9IE5VTEw7Ci0JZG1hYnVmLT5tYXBwZWQgPSBkbWFidWYtPnJlYWR5ID0gMDsKLQlkbWFidWYtPlNHb2sgPSAwOwotfQotCi1zdGF0aWMgaW50IF9fcHJvZ19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLSAgICAgICAgc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWxsb2NhdGVkX3BhZ2VzLCBhbGxvY2F0ZWRfYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMiwgZm10PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB1bnNpZ25lZCBsb25nICpwdG1wID0gKHVuc2lnbmVkIGxvbmcgKikgZG1hYnVmLT5wYnVmOyAgICAgICAgICAgICAgIAotICAgICAgICB1bnNpZ25lZCBsb25nIFNHYXJyYXlbOV0sIG5TR3BhZ2VzPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgcmV0OwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKSsgXG4iKSk7Ci0vKgotICogY2hlY2sgZm9yIENBUFRVUkUgYW5kIHVzZSBvbmx5IG5vbi1zZyBmb3IgaW5pdGlhbCByZWxlYXNlCi0gKi8KLQlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfQURDKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgQURDXG4iKSk7Ci0JCS8qIAotCQkgKiBhZGQgaW4gbm9uLXNnIHN1cHBvcnQgZm9yIGNhcHR1cmUuCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkvKiBhZGQgY29kZSB0byByZXNldCB0aGUgcmF3YnVmIG1lbW9yeS4gVFJXICovCi0JCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSBkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gZG1hYnVmLT51bmRlcnJ1biA9IDA7Ci0KLQkJZG1hYnVmLT5TR29rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KLQkJaWYgKCFkbWFidWYtPnJhd2J1ZiB8fCAhZG1hYnVmLT50bXBidWZmKQotCQkJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKLQkJCQlyZXR1cm4gcmV0OyAKLQkvKgotCSAqIHN0YXRpYyBpbWFnZSBvbmx5IHN1cHBvcnRzIDE2Qml0IHNpZ25lZCwgc3RlcmVvIC0gaGFyZCBjb2RlIGZtdAotCSAqLwotCQlmbXQgPSBDU19GTVRfMTZCSVQgfCBDU19GTVRfU1RFUkVPOwotCi0JCWRtYWJ1Zi0+bnVtZnJhZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlkbWFidWYtPmZyYWdzaXplID0gMjA0ODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2ZtdF07ICAgIAotCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLAotCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKLSAgICAgICAgCW1lbXNldChkbWFidWYtPnRtcGJ1ZmYsIChmbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAotCQkJUEFHRV9TSVpFPDxkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpOyAgICAgIAotCi0JCS8qCi0JCSAqICAgICAgTm93IHNldCB1cCB0aGUgcmluZwotCQkgKi8KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJY3NfcmVjX3NldHVwKHN0YXRlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCi0JCWRtYWJ1Zi0+cmVhZHkgPSAxOwotCi0JCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogQ0FQVFVSRSByYXRlPSVkIGZtdD0weCV4IG51bWZyYWc9JWQgIgotCQkJImZyYWdzaXplPSVkIGRtYXNpemU9JWRcbiIsCi0JCQkgICAgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAotCQkJICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSkgKTsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSAwIFxuIikpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0RBQykgewotCS8qCi0JICogTXVzdCBiZSBEQUMKLQkgKi8KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKSBEQUNcbiIpKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSBkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gZG1hYnVmLT51bmRlcnJ1biA9IDA7Ci0KLQkJZG1hYnVmLT5TR29rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KLQkJaWYgKCFkbWFidWYtPnJhd2J1ZikKLQkJCWlmICgocmV0ID0gYWxsb2NfZG1hYnVmKHN0YXRlKSkpCi0JCQkJcmV0dXJuIHJldDsKLQotCQlhbGxvY2F0ZWRfcGFnZXMgPSAxIDw8IGRtYWJ1Zi0+YnVmb3JkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlhbGxvY2F0ZWRfYnl0ZXMgPSBhbGxvY2F0ZWRfcGFnZXMqUEFHRV9TSVpFOyAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkJCSAgICAKLQkJaWYgKGFsbG9jYXRlZF9wYWdlcyA8IDIpIHsKLQkJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IHByb2dfZG1hYnVmKCkgRXJyb3I6IGFsbG9jYXRlZF9wYWdlcyB0b28gc21hbGwgKCVkKVxuIiwKLQkJCQkodW5zaWduZWQpYWxsb2NhdGVkX3BhZ2VzKSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQkJCQkJCQkJCSAgICAKLQkJLyogVXNlIGFsbCB0aGUgcGFnZXMgYWxsb2NhdGVkLCBmcmFnc2l6ZSA0ay4gKi8KLQkJLyogVXNlICdwYnVmJyBmb3IgUy9HIHBhZ2UgbWFwIHRhYmxlLiAqLwotCQlkbWFidWYtPlNHb2sgPSAxOyAgICAgICAgICAgLyogVXNlIFMvRy4gKi8KLQotCQluU0dwYWdlcyA9IGFsbG9jYXRlZF9ieXRlcy80MDk2OyAgICAvKiBTL0cgcGFnZXMgYWx3YXlzIDRrLiAqLwotCQkJCQkJCQkJCSAgICAKLQkJICAgICAvKiBTZXQgdXAgUy9HIHZhcmlhYmxlcy4gKi8KLQkJKnB0bXAgPSB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJKihwdG1wICsgMSkgPSAweDAwMDAwMDA4OwotCQlmb3IgKHRtcDEgPSAxOyB0bXAxIDwgblNHcGFnZXM7IHRtcDErKykgewotCQkJKihwdG1wICsgMiAqIHRtcDEpID0gdmlydF90b19idXMoKGRtYWJ1Zi0+cmF3YnVmKSArIDQwOTYgKiB0bXAxKTsKLQkJCWlmICh0bXAxID09IG5TR3BhZ2VzIC0gMSkKLQkJCQl0bXAyID0gMHhiZmZmMDAwMDsKLQkJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCXRtcDIgPSAweDgwMDAwMDAwICsgOCAqICh0bXAxICsgMSk7Ci0JCQkqKHB0bXAgKyAyICogdG1wMSArIDEpID0gdG1wMjsKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVswXSA9IDB4ODJjMDIwMGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVsxXSA9IDB4ZmZmZjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVsyXSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs0XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs1XSA9IDB4ODAwMDAwMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs2XSA9ICpwdG1wOwotCQlTR2FycmF5WzddID0gKihwdG1wKzIpOwotCQlTR2FycmF5WzhdID0gKHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cGJ1ZikgJiAweGZmZmYwMDApIHwgMHgxMDsKLQotCQlpZiAoZG1hYnVmLT5TR29rKSB7Ci0JCQlkbWFidWYtPm51bWZyYWcgPSBuU0dwYWdlczsKLQkJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSA0MDk2OwotCQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDQwOTYgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKLQkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTI7Ci0JCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgKiA0MDk2OwotCQl9IGVsc2UgewotCQkJU0dhcnJheVswXSA9IDB4ZjJjMDAwMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlTR2FycmF5WzFdID0gMHgwMDAwMDIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNHYXJyYXlbMl0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlTR2FycmF5WzRdPVNHYXJyYXlbNV09U0dhcnJheVs2XT1TR2FycmF5WzddPVNHYXJyYXlbOF0gPSAwOyAKLQkJCWRtYWJ1Zi0+bnVtZnJhZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJZG1hYnVmLT5mcmFnc2l6ZSA9IDIwNDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gMjA0OCA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOyAgICAKLQkJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCX0KLQkJZm9yICh0bXAxID0gMDsgdG1wMSA8IHNpemVvZihTR2FycmF5KSAvIDQ7IHRtcDErKykKLQkJCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUERUQyt0bXAxICogNCwgU0dhcnJheVt0bXAxXSk7Ci0KLQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCi0JCSAgICAgICBkbWFidWYtPmRtYXNpemUpOwotCi0JCS8qCi0JCSAqICAgICAgTm93IHNldCB1cCB0aGUgcmluZwotCQkgKi8KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJY3NfcGxheV9zZXR1cChzdGF0ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLwotCQlkbWFidWYtPnJlYWR5ID0gMTsKLQotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCSJjczQ2eHg6IHByb2dfZG1hYnVmKCk6IFBMQVlCQUNLIHJhdGU9JWQgZm10PTB4JXggbnVtZnJhZz0lZCAiCi0JCQkiZnJhZ3NpemU9JWQgZG1hc2l6ZT0lZFxuIiwKLQkJCSAgICBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCi0JCQkgICAgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5kbWFzaXplKSApOwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCktIFxuIikpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSBJbnZhbGlkIFR5cGUgJWRcbiIsCi0JCQlkbWFidWYtPnR5cGUpKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlpbnQgcmV0OwotCQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCXJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpOwotCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY3NfY2xlYXJfdGFpbChzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotfQotCi1zdGF0aWMgaW50IGRyYWluX2RhYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlLCBpbnQgbm9uYmxvY2spCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ9c3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHRtbzsKLQlpbnQgY291bnQ7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKSsgXG4iKSk7Ci0JaWYgKGRtYWJ1Zi0+bWFwcGVkIHx8ICFkbWFidWYtPnJlYWR5KQotCXsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIDAsIG5vdCByZWFkeVxuIikpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7Ci0JZm9yICg7OykgewotCQkvKiBJdCBzZWVtcyB0aGF0IHdlIGhhdmUgdG8gc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvIFRBU0tfSU5URVJSVVBUSUJMRQotCQkgICBldmVyeSB0aW1lIHRvIG1ha2UgdGhlIHByb2Nlc3MgcmVhbGx5IGdvIHRvIHNsZWVwICovCi0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQljb3VudCA9IGRtYWJ1Zi0+Y291bnQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGNvdW50IDw9IDApCi0JCQlicmVhazsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQotCQlpZiAobm9uYmxvY2spIHsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyBkbWFidWYtPnJhdGU7Ci0JCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKLQkJdG1vICs9ICgyMDQ4KkhaKS9kbWFidWYtPnJhdGU7Ci0JCQotCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gdG1vIDogMSkgJiYgdG1vKXsKLQkJCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBkcmFpbl9kYWMsIGRtYSB0aW1lb3V0PyAlZFxuIiwgY291bnQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKS0gLUVSRVNUQVJUU1lTXG4iKSk7Ci0JCS8qCi0JCSogc2V0IHRvIHNpbGVuY2UgYW5kIGxldCB0aGF0IGNsZWFyIHRoZSBmaWZvcy4KLQkJKi8KLQkJY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhjYXJkLCBDU19UWVBFX0RBQyk7Ci0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JfQotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIDBcbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCBkbWFidWYtPmNvdW50IGFuZCBkbWFidWYtPmh3cHRyICovCi1zdGF0aWMgdm9pZCBjc191cGRhdGVfcHRyKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgd2FrZSkKLXsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQl1bnNpZ25lZCBod3B0cjsKLQlpbnQgZGlmZjsKLQotCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKLQkJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCi0JCQlod3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7Ci0KLQkJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IGNzX3VwZGF0ZV9wdHIoKSsgQURDIGh3cHRyPSVkIGRpZmY9JWRcbiIsIAotCQkJCWh3cHRyLGRpZmYpICk7Ci0JCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7Ci0JCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7Ci0JCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7Ci0JCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKLQkJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwotCi0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA+IDApCi0JCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLS8qCi0gKiBOb3cgdGhlIERBQwotICovCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JaWYgKHN0YXRlKSB7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KLQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKLQkJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCi0JCQlod3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7Ci0KLQkJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IGNzX3VwZGF0ZV9wdHIoKSsgREFDIGh3cHRyPSVkIGRpZmY9JWRcbiIsIAotCQkJCWh3cHRyLGRpZmYpICk7Ci0JCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7Ci0JCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCQkJLyoKLQkJCQkgKiBvdGhlciBkcml2ZXJzIHVzZSBmcmFnc2l6ZSwgYnV0IGRvbid0IHNlZSBhbnkgc2Vuc2UKLQkJCQkgKiBpbiB0aGF0LCBzaW5jZSBkbWFzaXplIGlzIHRoZSBidWZmZXIgYXNrZWQgZm9yCi0JCQkJICogdmlhIG1tYXAuCi0JCQkJICovCi0JCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCQkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5kbWFzaXplLTE7Ci0JCQl9IGVsc2UgewotCQkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKLQkJCQkvKgotCQkJCSAqIGJhY2tmaWxsIHdpdGggc2lsZW5jZSBhbmQgY2xlYXIgb3V0IHRoZSBsYXN0IAotCQkJCSAqICJkaWZmIiBudW1iZXIgb2YgYnl0ZXMuCi0JCQkJICovCi0JCQkJaWYgKGh3cHRyID49IGRpZmYpIHsKLQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgaHdwdHIgLSBkaWZmLCAKLQkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgZGlmZik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAKLQkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKLQkJCQkJCSh1bnNpZ25lZClod3B0cik7Ci0JCQkJCW1lbXNldCgoY2hhciAqKWRtYWJ1Zi0+cmF3YnVmICsgCi0JCQkJCQkJZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkaWZmLAotCQkJCQkJKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLCAKLQkJCQkJCWRpZmYgLSBod3B0cik7IAotCQkJCX0KLQotCQkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCBkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7Ci0JCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkJCQkgICJjczQ2eHg6IEVSUk9SIERBQyBjb3VudDwwIG9yIGNvdW50ID4gZG1hc2l6ZSAoJWQpXG4iLAotCQkJCQkgIAlkbWFidWYtPmNvdW50KSk7Ci0JCQkJCS8qIAotCQkJCQkqIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgcmVzZXQgdGhlCi0JCQkJCSogY291bnQgb2YgYnl0ZXMgd3JpdHRlbiBiYWNrIHRvIDAuCi0JCQkJCSovCi0JCQkJCWlmIChkbWFidWYtPmNvdW50IDwgMCkKLQkJCQkJCWRtYWJ1Zi0+dW5kZXJydW4gPSAxOwotCQkJCQlkbWFidWYtPmNvdW50ID0gMDsKLQkJCQkJZG1hYnVmLT5lcnJvcisrOwotCQkJCX0KLQkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50IDwgKHNpZ25lZClkbWFidWYtPmRtYXNpemUgLyAyKQotCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLS8qIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchICovCi1zdGF0aWMgdm9pZCBjc19oYW5kbGVfbWlkaShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjaDsKLSAgICAgICAgaW50IHdha2U7Ci0gICAgICAgIHVuc2lnbmVkIHRlbXAxOwotCi0gICAgICAgIHdha2UgPSAwOwotICAgICAgICB3aGlsZSAoIShjczQ2MXhfcGVla0JBMChjYXJkLCAgQkEwX01JRFNSKSAmIE1JRFNSX1JCRSkpIHsKLSAgICAgICAgICAgICAgICBjaCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9NSURSUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA8IENTX01JRElJTkJVRikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pYnVmW2NhcmQtPm1pZGkuaXdyXSA9IGNoOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pd3IgPSAoY2FyZC0+bWlkaS5pd3IgKyAxKSAlIENTX01JRElJTkJVRjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaWNudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3YWtlID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2FrZSkKLSAgICAgICAgICAgICAgICB3YWtlX3VwKCZjYXJkLT5taWRpLml3YWl0KTsKLSAgICAgICAgd2FrZSA9IDA7Ci0gICAgICAgIHdoaWxlICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsICBCQTBfTUlEU1IpICYgTUlEU1JfVEJGKSAmJiBjYXJkLT5taWRpLm9jbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGVtcDEgPSAoIGNhcmQtPm1pZGkub2J1ZltjYXJkLT5taWRpLm9yZF0gKSAmIDB4MDAwMDAwZmY7Ci0gICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX01JRFdQLHRlbXAxKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IChjYXJkLT5taWRpLm9yZCArIDEpICUgQ1NfTUlESU9VVEJVRjsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9jbnQtLTsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5vY250IDwgQ1NfTUlESU9VVEJVRi0xNikKLSAgICAgICAgICAgICAgICAgICAgICAgIHdha2UgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3YWtlKQotICAgICAgICAgICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkub3dhaXQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgY3NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWRldl9pZDsKLQkvKiBTaW5nbGUgY2hhbm5lbCBjYXJkICovCi0Jc3RydWN0IGNzX3N0YXRlICpyZWNzdGF0ZSA9IGNhcmQtPmNoYW5uZWxbMF0uc3RhdGU7Ci0Jc3RydWN0IGNzX3N0YXRlICpwbGF5c3RhdGUgPSBjYXJkLT5jaGFubmVsWzFdLnN0YXRlOwotCXUzMiBzdGF0dXM7Ci0KLQlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCkrIFxuIikpOwotCi0Jc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKLQotCXN0YXR1cyA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9ISVNSKTsKLQkKLQlpZiAoKHN0YXR1cyAmIDB4N2ZmZmZmZmYpID09IDApIHsKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfQ0hHTXxISUNSX0lFVik7Ci0JCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwkvKiBNaWdodCBiZSBJUlFfTk9ORS4uICovCi0JfQotCQotCS8qCi0JICogY2hlY2sgZm9yIHBsYXliYWNrIG9yIGNhcHR1cmUgaW50ZXJydXB0IG9ubHkKLQkgKi8KLQlpZiAoKChzdGF0dXMgJiBISVNSX1ZDMCkgJiYgcGxheXN0YXRlICYmIHBsYXlzdGF0ZS0+ZG1hYnVmLnJlYWR5KSB8fAotCSAgICAoKChzdGF0dXMgJiBISVNSX1ZDMSkgJiYgcmVjc3RhdGUgJiYgcmVjc3RhdGUtPmRtYWJ1Zi5yZWFkeSkpKSB7Ci0JCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDgsIHByaW50aygKLQkJCSJjczQ2eHg6IGNzX2ludGVycnVwdCgpIGludGVycnVwdCBiaXQocykgc2V0ICgweCV4KVxuIixzdGF0dXMpKTsKLQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQl9Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAmIEhJU1JfTUlESSkKLSAgICAgICAgICAgICAgICBjc19oYW5kbGVfbWlkaShjYXJkKTsKLQkKLSAJLyogY2xlYXIgJ2VtICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfQ0hHTXxISUNSX0lFVik7Ci0Jc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwotCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDksIHByaW50aygiY3M0Nnh4OiBjc19pbnRlcnJ1cHQoKS0gXG4iKSk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3NpemVfdCBjc19taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgc3NpemVfdCByZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIHB0cjsKLSAgICAgICAgaW50IGNudDsKLQotICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICByZXQgPSAwOwotICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBwdHIgPSBjYXJkLT5taWRpLmlyZDsKLSAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJSU5CVUYgLSBwdHI7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA8IGNudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IGNhcmQtPm1pZGkuaWNudDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA+IGNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5pd2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGNhcmQtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHB0ciA9IChwdHIgKyBjbnQpICUgQ1NfTUlESUlOQlVGOwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBwdHI7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pY250IC09IGNudDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY291bnQgLT0gY250OwotICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjbnQ7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IGNudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGNzX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgc3NpemVfdCByZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIHB0cjsKLSAgICAgICAgaW50IGNudDsKLQotICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIHB0ciA9IGNhcmQtPm1pZGkub3dyOwotICAgICAgICAgICAgICAgIGNudCA9IENTX01JRElPVVRCVUYgLSBwdHI7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkub2NudCArIGNudCA+IENTX01JRElPVVRCVUYpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJT1VUQlVGIC0gY2FyZC0+bWlkaS5vY250OwotICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzX2hhbmRsZV9taWRpKGNhcmQpOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoY250ID4gY291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBjb3VudDsKLSAgICAgICAgICAgICAgICBpZiAoY250IDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5taWRpLm93YWl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoY2FyZC0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBwdHIgPSAocHRyICsgY250KSAlIENTX01JRElPVVRCVUY7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm93ciA9IHB0cjsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9jbnQgKz0gY250OwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjb3VudCAtPSBjbnQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyICs9IGNudDsKLSAgICAgICAgICAgICAgICByZXQgKz0gY250OwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjc19taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKQotICAgICAgICAgICAgICAgIHBvbGxfd2FpdChmaWxlLCAmY2FyZC0+bWlkaS5vd2FpdCwgd2FpdCk7Ci0gICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfUkVBRCkKLSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNhcmQtPm1pZGkuaXdhaXQsIHdhaXQpOwotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5pY250ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkub2NudCA8IENTX01JRElPVVRCVUYpCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotICAgICAgICB9Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgcmV0dXJuIG1hc2s7Ci19Ci0KLQotc3RhdGljIGludCBjc19taWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQlpZiAoY2FyZC0+ZGV2X21pZGkgPT0gbWlub3IpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZW50cnkgPT0gJmNzNDZ4eF9kZXZzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkJImNzNDZ4eDogY3M0Nnh4X21pZGlfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGNhcmQgc3RydWN0XG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotICAgICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotICAgICAgICAvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KLSAgICAgICAgbXV0ZXhfbG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgd2hpbGUgKGNhcmQtPm1pZGkub3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOwotICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7Ci0gICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgfQotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7Ci0gICAgICAgIGlmICghKGNhcmQtPm1pZGkub3Blbl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpKSB7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vcmQgPSBjYXJkLT5taWRpLm93ciA9IGNhcmQtPm1pZGkub2NudCA9IDA7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7Ci0gICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX01JRENSLCAweDAwMDAwMDBmKTsgICAgICAgICAgICAvKiBFbmFibGUgeG1pdCwgcmN2LiAqLwotICAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0lFViB8IEhJQ1JfQ0hHTSk7ICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKLSAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3JkID0gY2FyZC0+bWlkaS5vd3IgPSBjYXJkLT5taWRpLm9jbnQgPSAwOwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKLSAgICAgICAgY2FyZC0+bWlkaS5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKTsKLSAgICAgICAgbXV0ZXhfdW5sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNzX21pZGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBjb3VudCwgdG1vOwotCi0gICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotICAgICAgICAgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZjYXJkLT5taWRpLm93YWl0LCAmd2FpdCk7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPm1pZGkubG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjYXJkLT5taWRpLm9jbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0gICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bW8gPSAoY291bnQgKiBIWikgLyAzMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiY3M0Nnh4OiBtaWRpIHRpbWVkIG91dD8/XG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmNhcmQtPm1pZGkub3dhaXQsICZ3YWl0KTsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICAgICAgfQotICAgICAgICBtdXRleF9sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICBjYXJkLT5taWRpLm9wZW5fbW9kZSAmPSAofihmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpOwotICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgIE1pZGkgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KLSAqLwotc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzX21pZGlfZm9wcyA9IHsKLQlDU19PV05FUglDU19USElTX01PRFVMRQotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGNzX21pZGlfcmVhZCwKLQkud3JpdGUJCT0gY3NfbWlkaV93cml0ZSwKLQkucG9sbAkJPSBjc19taWRpX3BvbGwsCi0JLm9wZW4JCT0gY3NfbWlkaV9vcGVuLAotCS5yZWxlYXNlCT0gY3NfbWlkaV9yZWxlYXNlLAotfTsKLQotLyoKLSAqCi0gKiBDb3B5U2FtcGxlcyBjb3BpZXMgMTYtYml0IHN0ZXJlbyBzaWduZWQgc2FtcGxlcyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlCi0gKiBkZXN0aW5hdGlvbiwgcG9zc2libHkgY29udmVydGluZyBkb3duIHRvIHVuc2lnbmVkIDgtYml0IGFuZC9vciBtb25vLgotICogY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIHRvIHdyaXRlLgotICoKLSAqICBBcmd1bWVudHM6Ci0gKgotICogIGRzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSBkZXN0aW5hdGlvbiBidWZmZXIuCi0gKiAgc3JjICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIHNvdXJjZSBidWZmZXIKLSAqICBjb3VudCAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgotICogIGZtdCAgICAgICAgICAgICAtIENTX0ZNVF8xNkJJVCBhbmQvb3IgQ1NfRk1UX1NURVJFTyBiaXRzCi0gKiAgZG1hYnVmICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZG1hIGJ1ZmZlciBzdHJ1Y3R1cmUKLSAqCi0gKiBOT1RFUzogb25seSBjYWxsIHRoaXMgcm91dGluZSBpZiB0aGUgb3V0cHV0IGRlc2lyZWQgaXMgbm90IDE2IFNpZ25lZCBTdGVyZW8KLSAqIAkKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIENvcHlTYW1wbGVzKGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgY291bnQsIHVuc2lnbmVkIGZtdCwgCi0JCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZikKLXsKLSAgICBzMzIgczMyQXVkaW9TYW1wbGU7Ci0gICAgczE2ICpwc1NyYyA9IChzMTYgKilzcmM7Ci0gICAgczE2ICpwc0RzdCA9IChzMTYgKilkc3Q7Ci0gICAgdTggKnB1Y0RzdCA9ICh1OCAqKWRzdDsKLQotICAgIENTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBDb3B5U2FtcGxlcygpKyAiKSApOwotICAgIENTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8KLQkiIGRzdD0lcCBzcmM9JXAgY291bnQ9JWQgZm10PTB4JXhcbiIsCi0JZHN0LHNyYyxjb3VudCxmbXQpICk7Ci0KLSAgICAvKgotICAgICAqIFNlZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgb3V0cHV0IGFzIDgtYml0IHVuc2lnbmVkIHN0ZXJlby4KLSAgICAgKi8KLSAgICBpZiAoKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmICEoZm10ICYgQ1NfRk1UXzE2QklUKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDgtYml0IHVuc2lnbmVkIAotCSAqIHN0ZXJlbyB1c2luZyByb3VuZGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKLQljb3VudCA9IGNvdW50IC8gMjsKLSAgICAgICAgd2hpbGUgKGNvdW50LS0pCi0gICAgICAgICAgICAqKHB1Y0RzdCsrKSA9ICh1OCkoKChzMTYpKCpwc1NyYysrKSArIChzMTYpMHg4MDAwKSA+PiA4KTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCA4LWJpdCB1bnNpZ25lZCBtb25vLgotICAgICAqLwotICAgIGVsc2UgaWYgKCEoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgIShmbXQgJiBDU19GTVRfMTZCSVQpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCi0JICogbW9ubyB1c2luZyBhdmVyYWdpbmcgYW5kIHJvdW5kaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOwotCWNvdW50ID0gY291bnQgLyAyOwotICAgICAgICB3aGlsZSAoY291bnQtLSkgewotCSAgICBzMzJBdWRpb1NhbXBsZSA9ICgoKnBzU3JjKSArICgqKHBzU3JjICsgMSkpKSAvIDIgKyAoczMyKTB4ODA7Ci0JICAgIGlmIChzMzJBdWRpb1NhbXBsZSA+IDB4N2ZmZikKLQkgICAgCXMzMkF1ZGlvU2FtcGxlID0gMHg3ZmZmOwotICAgICAgICAgICAgKihwdWNEc3QrKykgPSAodTgpKCgoczE2KXMzMkF1ZGlvU2FtcGxlICsgKHMxNikweDgwMDApID4+IDgpOwotCSAgICBwc1NyYyArPSAyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgMTYtYml0IHNpZ25lZCBtb25vLgotICAgICAqLwotICAgIGVsc2UgaWYgKCEoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgKGZtdCAmIENTX0ZNVF8xNkJJVCkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCBlYWNoIDE2LWJpdCBzaWduZWQgc3RlcmVvIHNhbXBsZSB0byAxNi1iaXQgc2lnbmVkIAotCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOwotCWNvdW50ID0gY291bnQgLyAyOwotICAgICAgICB3aGlsZSAoY291bnQtLSkgewotICAgICAgICAgICAgKihwc0RzdCsrKSA9IChzMTYpKCgqcHNTcmMpICsgKCoocHNTcmMgKyAxKSkpIC8gMjsKLQkgICAgcHNTcmMgKz0gMjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAqIGNzX2NvcHlfdG9fdXNlcigpCi0gKiByZXBsYWNlbWVudCBmb3IgdGhlIHN0YW5kYXJkIGNvcHlfdG9fdXNlciwgdG8gYWxsb3cgZm9yIGEgY29udmVyc2lvbiBmcm9tCi0gKiAxNiBiaXQgdG8gOCBiaXQgYW5kIGZyb20gc3RlcmVvIHRvIG1vbm8sIGlmIHRoZSByZWNvcmQgY29udmVyc2lvbiBpcyBhY3RpdmUuICAKLSAqIFRoZSBjdXJyZW50IENTNDZ4eC9DUzQyODAgc3RhdGljIGltYWdlIG9ubHkgcmVjb3JkcyBpbiAxNmJpdCB1bnNpZ25lZCBTdGVyZW8sIAotICogc28gd2UgY29udmVydCBmcm9tIGFueSBvZiB0aGUgb3RoZXIgZm9ybWF0IGNvbWJpbmF0aW9ucy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGNzX2NvcHlfdG9fdXNlcigKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnMsIAotCXZvaWQgX191c2VyICpkZXN0LCAKLQl2b2lkICpod3NyYywgCi0JdW5zaWduZWQgY250LCAKLQl1bnNpZ25lZCAqY29waWVkKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzLT5kbWFidWY7Ci0Jdm9pZCAqc3JjID0gaHdzcmM7ICAvKiBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBidWZmZXIgYWRkciAqLwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA2LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3NfY29weV90b191c2VyKCkrIGZtdD0weCV4IGNudD0lZCBkZXN0PSVwXG4iLAotCQlkbWFidWYtPmZtdCwodW5zaWduZWQpY250LGRlc3QpICk7Ci0KLQlpZiAoY250ID4gZG1hYnVmLT5kbWFzaXplKQotCQljbnQgPSBkbWFidWYtPmRtYXNpemU7Ci0JaWYgKCFjbnQpIHsKLQkJKmNvcGllZCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZG1hYnVmLT5kaXZpc29yICE9IDEpIHsKLQkJaWYgKCFkbWFidWYtPnRtcGJ1ZmYpIHsKLQkJCSpjb3BpZWQgPSBjbnQgLyBkbWFidWYtPmRpdmlzb3I7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCUNvcHlTYW1wbGVzKChjaGFyICopZG1hYnVmLT50bXBidWZmLCAoY2hhciAqKWh3c3JjLCBjbnQsIAotCQkJZG1hYnVmLT5mbXQsIGRtYWJ1Zik7Ci0JCXNyYyA9IGRtYWJ1Zi0+dG1wYnVmZjsKLQkJY250ID0gY250L2RtYWJ1Zi0+ZGl2aXNvcjsKLQl9Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIoZGVzdCwgc3JjLCBjbnQpKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fRVJSIAotCQkJImNzNDZ4eDogY3NfY29weV90b191c2VyKCktIGZhdWx0IGRlc3Q9JXAgc3JjPSVwIGNudD0lZFxuIiwKLQkJCQlkZXN0LHNyYyxjbnQpKTsKLQkJKmNvcGllZCA9IDA7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQkqY29waWVkID0gY250OwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3NfY29weV90b191c2VyKCktIGNvcGllZCBieXRlcyBpcyAlZCBcbiIsY250KSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGNvcGllZCB0bwotICAgdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KLXN0YXRpYyBzc2l6ZV90IGNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXNzaXplX3QgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHN3cHRyOwotCWludCBjbnQ7Ci0JdW5zaWduZWQgY29waWVkID0gMDsKLQotCUNTX0RCR09VVChDU19XQVZFX1JFQUQgfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50aygiY3M0Nnh4OiBjc19yZWFkKCkrICV6ZFxuIixjb3VudCkgKTsKLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQlpZiAoIXN0YXRlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQotCWlmIChkbWFidWYtPm1hcHBlZCkKLQkJcmV0dXJuIC1FTlhJTzsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQkKLQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJZ290byBvdXQyOwotCi0JYWRkX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJd2hpbGUgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpIHsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7Ci0JCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwotCQlpZiAoZG1hYnVmLT5jb3VudCA8IGNudCkKLQkJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7Ci0JCWlmIChjbnQgPD0gMCkKLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY250ID4gKGNvdW50ICogZG1hYnVmLT5kaXZpc29yKSkKLQkJCWNudCA9IGNvdW50ICogZG1hYnVmLT5kaXZpc29yOwotCQlpZiAoY250IDw9IDApIHsKLQkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCB3YWl0IGZvciBkYXRhIHRvIGJlCi0JCQkgICByZWNvcmRlZCAqLwotCQkJc3RhcnRfYWRjKHN0YXRlKTsKLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWdvdG8gb3V0OwotIAkJCX0KLQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FTlhJTzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLSAJCQljb250aW51ZTsKLQkJfQotCi0JCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiX3JlYWQoKSBjb3B5X3RvIGNudD0lZCBjb3VudD0lemQgIiwgY250LGNvdW50KSApOwotCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPIAotCQkJIiAuZG1hc2l6ZT0lZCAuY291bnQ9JWQgYnVmZmVyPSVwIHJldD0lemRcbiIsCi0JCQlkbWFidWYtPmRtYXNpemUsZG1hYnVmLT5jb3VudCxidWZmZXIscmV0KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3NfY29weV90b191c2VyKHN0YXRlLCBidWZmZXIsIAotCQkJKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKSB7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLSAgICAgICAgICAgICAgICBzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBkbWFidWYtPnN3cHRyID0gc3dwdHI7Ci0gICAgICAgICAgICAgICAgZG1hYnVmLT5jb3VudCAtPSBjbnQ7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNvdW50IC09IGNvcGllZDsKLSAgICAgICAgICAgICAgICBidWZmZXIgKz0gY29waWVkOwotICAgICAgICAgICAgICAgIHJldCArPSBjb3BpZWQ7Ci0gICAgICAgICAgICAgICAgc3RhcnRfYWRjKHN0YXRlKTsKLQl9Ci1vdXQ6Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotb3V0MjoKLQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKS0gJXpkXG4iLHJldCkgKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KLSAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KLXN0YXRpYyBzc2l6ZV90IGNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlzc2l6ZV90IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHN3cHRyOwotCWludCBjbnQ7Ci0KLQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0ZVTkNUSU9OLCA0LAotCQlwcmludGsoImNzNDZ4eDogY3Nfd3JpdGUgY2FsbGVkLCBjb3VudCA9ICV6ZFxuIiwgY291bnQpICk7Ci0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JaWYgKCFzdGF0ZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQlnb3RvIG91dDsKLQlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci0JcmV0ID0gMDsKLS8qCi0qIFN0YXJ0IHRoZSBsb29wIHRvIHJlYWQgZnJvbSB0aGUgdXNlcidzIGJ1ZmZlciBhbmQgd3JpdGUgdG8gdGhlIGRtYSBidWZmZXIuCi0qIGNoZWNrIGZvciBQTSBldmVudHMgYW5kIHVuZGVycnVuL292ZXJydW4gaW4gdGhlIGxvb3AuCi0qLwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJd2hpbGUgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpIHsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKLQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSBzbGVlcF9vbl90aW1lb3V0LAotCQkJICAgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciAqLwotCQkJZG1hYnVmLT5jb3VudCA9IDA7Ci0JCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKLQkJfQotCQlpZiAoZG1hYnVmLT51bmRlcnJ1bikgewotCQkJZG1hYnVmLT51bmRlcnJ1biA9IDA7Ci0JCQlkbWFidWYtPmh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKLQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwotCQl9Ci0KLQkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwotCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgKyBjbnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwotCQlpZiAoY250IDw9IDApCi0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGNudCA+IGNvdW50KQotCQkJY250ID0gY291bnQ7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJLyogYnVmZmVyIGlzIGZ1bGwsIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgd2FpdCBmb3IgZGF0YSB0byBiZQotCQkJICAgcGxheWVkICovCi0JCQlzdGFydF9kYWMoc3RhdGUpOwotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FQUdBSU47Ci0JCQkJZ290byBvdXQ7Ci0gCQkJfQotCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCXNjaGVkdWxlKCk7Ci0gCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIG91dDsKLSAJCQl9Ci0JCQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRU5YSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0gCQkJY29udGludWU7Ci0gCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKLQkJCWlmICghcmV0KQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOwotCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7Ci0JCWRtYWJ1Zi0+Y291bnQgKz0gY250OwotCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewotCQkJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19FUlJPUiwgMiwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IGNzX3dyaXRlKCkgZC0+Y291bnQgPiBkbWFzaXplIC0gcmVzZXR0aW5nXG4iKSk7Ci0JCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwotCQl9Ci0JCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDA7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJY291bnQgLT0gY250OwotCQlidWZmZXIgKz0gY250OwotCQlyZXQgKz0gY250OwotCQlzdGFydF9kYWMoc3RhdGUpOwotCX0KLW91dDoKLQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19GVU5DVElPTiwgMiwgCi0JCXByaW50aygiY3M0Nnh4OiBjc193cml0ZSgpLSByZXQ9JXpkXG4iLCByZXQpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BvbGwoKSsgXG4iKSk7Ci0JaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JCX0KLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfRkFMU0UpOwotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQotCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJfQotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoc2lnbmVkKWRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50IAotCQkJCQkrIChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQkgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCktICgweCV4KSBcbiIsCi0JCW1hc2spKTsKLQlyZXR1cm4gbWFzazsKLX0KLQotLyoKLSAqCVdlIGxldCB1c2VycyBtbWFwIHRoZSByaW5nIGJ1ZmZlci4gSXRzIG5vdCB0aGUgcmVhbCBETUEgYnVmZmVyIGJ1dAotICoJdGhhdCBzaWRlIG9mIHRoZSBjb2RlIGlzIGhpZGRlbiBpbiB0aGUgSVJRIGhhbmRsaW5nLiBXZSBkbyBhIHNvZnR3YXJlCi0gKgllbXVsYXRpb24gb2YgRE1BIGZyb20gYSA2NEsgb3Igc28gYnVmZmVyIGludG8gYSAySyBGSUZPLiAKLSAqCSh0aGUgaGFyZHdhcmUgcHJvYmFibHkgZGVzZXJ2ZXMgYSBtb2FuIGhlcmUgYnV0IENyeXN0YWwgc2VuZCBtZSBuaWNlCi0gKgl0b3lzIDspKS4KLSAqLwotIAotc3RhdGljIGludCBjc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19QQVJNUywgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKSsgZmlsZT0lcCAlcyAlc1xuIiwgCi0JCWZpbGUsIHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSA/ICJWTV9XUklURSIgOiAiIiwKLQkJdm1hLT52bV9mbGFncyAmIFZNX1JFQUQgPyAiVk1fUkVBRCIgOiAiIikgKTsKLQotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygKLQkJCSAgImNzNDZ4eDogY3NfbW1hcCgpIFZNX1dSSVRFIC0gc3RhdGUgVFJVRSBwcm9nX2RtYWJ1ZiBEQUNcbiIpICk7Ci0JCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkgIT0gMCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKAotCQkJICAiY3M0Nnh4OiBjc19tbWFwKCkgVk1fUkVBRCAtIHN0YXRlIFRSVUUgcHJvZ19kbWFidWYgQURDXG4iKSApOwotCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKAotCQkgICJjczQ2eHg6IGNzX21tYXAoKSByZXR1cm4gLUVJTlZBTFxuIikgKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0vKgotICogRm9yIG5vdyBPTkxZIHN1cHBvcnQgcGxheWJhY2ssIGJ1dCBzZWVtcyBsaWtlIHRoZSBvbmx5IHdheSB0byB1c2UKLSAqIG1tYXAoKSBpcyB0byBvcGVuIGFuIEZEIHdpdGggUkRXUiwganVzdCByZWFkIG9yIGp1c3Qgd3JpdGUgYWNjZXNzCi0gKiBkb2VzIG5vdCBmdW5jdGlvbiwgZ2V0IGFuIGVycm9yIGJhY2sgZnJvbSB0aGUga2VybmVsLgotICogQWxzbywgUXVha2VJSUkgb3BlbnMgd2l0aCBSRFdSISAgU28sIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nCi0gKiB0byBuZWVkaW5nIHJlYWQvd3JpdGUgYWNjZXNzIG1hcHBpbmcuICBTbywgYWxsb3cgcmVhZC93cml0ZSBidXQgCi0gKiB1c2UgdGhlIERBQyBvbmx5LgotICovCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07ICAKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCWlmIChjczR4X3Bnb2ZmKHZtYSkgIT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0Jc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQotCUNTX0RCR09VVChDU19QQVJNUywgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKTogc2l6ZT0lZFxuIiwodW5zaWduZWQpc2l6ZSkgKTsKLQotCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCi0JCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKLQkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0OwotCX0KLQlkbWFidWYtPm1hcHBlZCA9IDE7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCktXG4iKSApOwotb3V0OgotCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JcmV0dXJuIHJldDsJCi19Ci0KLXN0YXRpYyBpbnQgY3NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKLQljb3VudF9pbmZvIGNpbmZvOwotCWludCB2YWwsIHZhbHNhdmUsIHJldDsKLQlpbnQgbWFwcGVkID0gMDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgX191c2VyICpwID0gYXJncDsKLQotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJbWFwcGVkID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+bWFwcGVkOwotCX0KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCW1hcHBlZCB8PSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+bWFwcGVkOwotCX0KLQkJCi0jaWYgQ1NERUJVRwotCXByaW50aW9jdGwoY21kKTsKLSNlbmRpZgotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgotCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1JFU0VUOgotCQkvKiBGSVhNRTogc3Bpbl9sb2NrID8gKi8KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQlzeW5jaHJvbml6ZV9pcnEoY2FyZC0+aXJxKTsKLQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOwotCQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKLQkJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7Ci0JCQkJZG1hYnVmLT5ibG9ja3MgPSAwOwotCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOwotCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOwotCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKLQkJCQlkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCX0KLQkJfQotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfUkVTRVQoKS1cbiIpICk7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQlyZXR1cm4gZHJhaW5fZGFjKHN0YXRlLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDogLyogc2V0IHNhbXBsZSByYXRlICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2YWwgPj0gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKLQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWNzX3NldF9kYWNfcmF0ZShzdGF0ZSwgdmFsKTsKLQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IGNzX2lvY3RsKCkgRFNQX1NQRUVEICVzICVzICVkXG4iLAotCQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkRBQyIgOiAiIiwKLQkJCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEID8gIkFEQyIgOiAiIiwKLQkJCQlkbWFidWYtPnJhdGUgKSApOwotCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IC8qIHNldCBzdGVyZW8gb3IgbW9ubyBjaGFubmVsICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQlpZiAodmFsKQotCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOwotCQkJCWVsc2UKLQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJCSAgICAiY3M0Nnh4OiBEU1BfU1RFUkVPKCkgREFDICVzXG4iLAotCQkJCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSA/Ci0JCQkJCSJTVEVSRU8iOiJNT05PIikgKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQlpZiAodmFsKQotCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOwotCQkJCWVsc2UKLQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJCSAgICAiY3M0Nnh4OiBEU1BfU1RFUkVPKCkgQURDICVzXG4iLAotCQkJCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSA/Ci0JCQkJCSJTVEVSRU8iOiJNT05PIikgKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmICgodmFsID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5mcmFnc2l6ZSwgcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQlyZXR1cm4gdmFsOwotCQkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplL2RtYWJ1Zi0+ZGl2aXNvciwgCi0JCQkJCQlwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0Ki8KLQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VOCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0IHNhbXBsZSBmb3JtYXQgKi8KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJICAgICJjczQ2eHg6IGNzX2lvY3RsKCkgRFNQX1NFVEZNVCAlcyAlcyAlcyAlc1xuIiwKLQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkRBQyIgOiAiIiwKLQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAotCQkJdmFsID09IEFGTVRfUzE2X0xFID8gIjE2Qml0IFNpZ25lZCIgOiAiIiwKLQkJCXZhbCA9PSBBRk1UX1U4ID8gIjhCaXQgVW5zaWduZWQiIDogIiIpICk7Ci0JCXZhbHNhdmUgPSB2YWw7Ci0JCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgewotCQkJaWYgKHZhbD09QUZNVF9TMTZfTEUgfHwgdmFsPT1BRk1UX1U4KSB7Ci0JCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKLQkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKLQkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCQl2YWwgPSB2YWxzYXZlOwotCQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCi0JCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UXzE2QklUOwotCQkJCQkJZWxzZQotCQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfMTZCSVQ7Ci0JCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX0VSUk9SLCAyLCBwcmludGsoCi0JCQkJICAgICJjczQ2eHg6IERTUF9TRVRGTVQoKSBVbnN1cHBvcnRlZCBmb3JtYXQgKDB4JXgpXG4iLAotCQkJCQl2YWxzYXZlKSApOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYgKHN0YXRlKQotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCX0gZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJCWlmIChzdGF0ZSkKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRtYWJ1ZikgewotCQkJaWYgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKQotCQkJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIHApOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQlpZiAodmFsID4gMSkKLQkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87Ci0JCQkJCWVsc2UKLQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOwotCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQlpZiAocHJvZ19kbWFidWYoc3RhdGUpKQotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWlmICh2YWwgPiAxKQotCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKLQkJCQkJZWxzZQotCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJCWlmIChwcm9nX2RtYWJ1ZihzdGF0ZSkpCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8gMiA6IDEsCi0JCQkJcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCS8qCi0JCSAqIFRoZXJlIHdpbGwgYmUgYSBsb25nZXIgdGhhbiBub3JtYWwgcGF1c2UgaW4gdGhlIGRhdGEuCi0JCSAqIHNvLi4uIGRvIG5vdGhpbmcsIGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyB0aGF0IHdlIGNhbiBkby4KLQkJICovCi0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoZG1hYnVmLT5zdWJkaXZpc2lvbikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoZG1hYnVmLT5zdWJkaXZpc2lvbikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKLQkJCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7Ci0JCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7Ci0JCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKLQkJLyoKLQkJICogZm9yIG1tYXAgd2UgYWx3YXlzIGhhdmUgdG90YWwgc3BhY2UgYXZhaWxhYmxlCi0JCSAqLwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQotCQkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJCWVsc2UKLQkJCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwotCi0JCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplL2RtYWJ1Zi0+ZGl2aXNvcjsKLQkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yOwotCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7Ci0JCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRXxEU1BfQ0FQX1RSSUdHRVJ8RFNQX0NBUF9NTUFQLAotCQkJICAgIHApOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCQl2YWwgPSAwOwotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpK1xuIikgKTsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQotCQkJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCi0JCQkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKLQkJCX0KLQkJfQotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpLSB2YWw9MHgleFxuIix2YWwpICk7Ci0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewotCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQlyZXR1cm4gcmV0OwotCQkJCQlzdGFydF9hZGMoc3RhdGUpOwotCQkJCX0gZWxzZQotCQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQlyZXR1cm4gcmV0OwotCQkJCQlzdGFydF9kYWMoc3RhdGUpOwotCQkJCX0gZWxzZQotCQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzL2RtYWJ1Zi0+ZGl2aXNvcjsKLQkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0ci9kbWFidWYtPmRpdmlzb3I7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWNpbmZvLmJsb2NrcyA9IChjaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdCkgCi0JCQkJCQkJLSBkbWFidWYtPmJsb2NrczsKLQkJCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIAotCQkJCQlwcmludGsoInRvdGFsX2J5dGVzPSVkIGJsb2Nrcz0lZCBkbWFidWYtPmJsb2Nrcz0lZFxuIiwgCi0JCQkJCWNpbmZvLmJ5dGVzLGNpbmZvLmJsb2NrcyxkbWFidWYtPmJsb2NrcykgKTsKLQkJCQlkbWFidWYtPmJsb2NrcyA9IGNpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJfSBlbHNlIHsKLQkJCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJfQotCQkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0cjsKLQotCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkgICAgImNzNDZ4eDogR0VUT1BUUiBieXRlcz0lZCBibG9ja3M9JWQgcHRyPSVkXG4iLAotCQkJCWNpbmZvLmJ5dGVzLGNpbmZvLmJsb2NrcyxjaW5mby5wdHIpICk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJdmFsID0gZG1hYnVmLT5jb3VudDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZQotCQkJdmFsID0gMDsKLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQllbHNlIAotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJZWxzZSAKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8gMiA6IDEsCi0JCQkJcCk7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJZWxzZSAKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAKLQkJCSAgCUFGTVRfUzE2X0xFIDogQUZNVF9VOCwgcCk7Ci0KLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgotCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6Ci0JY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKLQljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotCi0vKgotICoJQU1QIGNvbnRyb2wgLSBudWxsIEFNUAotICovCi0gCi1zdGF0aWMgdm9pZCBhbXBfbm9uZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKLXsJCi19Ci0KLS8qCi0gKglDcnlzdGFsIEVBUEQgbW9kZQotICovCi0gCi1zdGF0aWMgdm9pZCBhbXBfdm95ZXRyYShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKLXsKLQkvKiBNYW5hZ2UgdGhlIEVBUEQgYml0IG9uIHRoZSBDcnlzdGFsIDQyOTcgCi0JICAgYW5kIHRoZSBBbmFsb2cgQUQxODg1ICovCi0JICAgCi0JaW50IG9sZCA9IGNhcmQtPmFtcGxpZmllcjsKLQkKLQljYXJkLT5hbXBsaWZpZXIrPWNoYW5nZTsKLQlpZiAoY2FyZC0+YW1wbGlmaWVyICYmICFvbGQpIHsKLQkJLyogVHVybiB0aGUgRUFQRCBhbXAgb24gKi8KLQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCi0JCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpIHwKLQkJCQkweDgwMDApOwotCX0gZWxzZSBpZihvbGQgJiYgIWNhcmQtPmFtcGxpZmllcikgewotCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvZmYgKi8KLQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCi0JCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYKLQkJCQl+MHg4MDAwKTsKLQl9Ci19Ci0KLQkJICAgICAgIAotLyoKLSAqCUdhbWUgVGhlYXRyZSBYUCBjYXJkIC0gRUdQSU9bMl0gaXMgdXNlZCB0byBlbmFibGUgdGhlIGV4dGVybmFsIGFtcC4KLSAqLwotIAotc3RhdGljIHZvaWQgYW1wX2hlcmN1bGVzKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQotewotCWludCBvbGQgPSBjYXJkLT5hbXBsaWZpZXI7Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6ZWQuXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JY2FyZC0+YW1wbGlmaWVyKz1jaGFuZ2U7Ci0JaWYgKChjYXJkLT5hbXBsaWZpZXIgJiYgIW9sZCkgJiYgIShoZXJjdWxlc19lZ3Bpb19kaXNhYmxlKSkgewotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBhbXBfaGVyY3VsZXMoKSBleHRlcm5hbCBhbXAgZW5hYmxlZFxuIikpOwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9EUiwgCi0JCQlFR1BJT0RSX0dQT0UyKTsgICAgIC8qIGVuYWJsZSBFR1BJTzIgb3V0cHV0ICovCi0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT1BUUiwgCi0JCQlFR1BJT1BUUl9HUFBUMik7ICAgLyogb3Blbi1kcmFpbiBvbiBvdXRwdXQgKi8KLQl9IGVsc2UgaWYgKG9sZCAmJiAhY2FyZC0+YW1wbGlmaWVyKSB7Ci0JCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGV4dGVybmFsIGFtcCBkaXNhYmxlZFxuIikpOwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9EUiwgMCk7IC8qIGRpc2FibGUgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPUFRSLCAwKTsgLyogZGlzYWJsZSAqLwotCX0KLX0KLQotLyoKLSAqCUhhbmRsZSB0aGUgQ0xLUlVOIG9uIGEgdGhpbmtwYWQuIFdlIG11c3QgZGlzYWJsZSBDTEtSVU4gc3VwcG9ydAotICoJd2hlbmV2ZXIgd2UgbmVlZCB0byBiZWF0IG9uIHRoZSBjaGlwLgotICoKLSAqCVRoZSBvcmlnaW5hbCBpZGVhIGFuZCBjb2RlIGZvciB0aGlzIGhhY2sgY29tZXMgZnJvbSBEYXZpZCBLYWlzZXIgYXQKLSAqCUxpbnV4Y2FyZS4gUGVyaGFwcyBvbmUgZGF5IENyeXN0YWwgd2lsbCBkb2N1bWVudCB0aGVpciBjaGlwcyB3ZWxsCi0gKgllbm91Z2ggdG8gbWFrZSB0aGVtIHVzZWZ1bC4KLSAqLwotIAotc3RhdGljIHZvaWQgY2xrcnVuX2hhY2soc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFuZ2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmFjcGlfZGV2OwotCXUxNiBjb250cm9sOwotCXU4IHBwOwotCXVuc2lnbmVkIGxvbmcgcG9ydDsKLQlpbnQgb2xkID0gY2FyZC0+YWN0aXZlOwotCQotCWNhcmQtPmFjdGl2ZSs9Y2hhbmdlOwotCQotCWFjcGlfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOwotCWlmIChhY3BpX2RldiA9PSBOVUxMKQotCQlyZXR1cm47CQkvKiBOb3QgYSB0aGlua3BhZCB0aGF0cyBmb3Igc3VyZSAqLwotCi0JLyogRmluZCB0aGUgY29udHJvbCBwb3J0ICovCQkKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShhY3BpX2RldiwgMHg0MSwgJnBwKTsKLQlwb3J0ID0gcHAgPDwgODsKLQotCS8qIFJlYWQgQUNQSSBwb3J0ICovCQotCWNvbnRyb2wgPSBpbncocG9ydCArIDB4MTApOwotCi0JLyogRmxpcCBDTEtSVU4gb2ZmIHdoaWxlIHJ1bm5pbmcgKi8KLQlpZiAoIWNhcmQtPmFjdGl2ZSAmJiBvbGQpIHsKLQkJQ1NfREJHT1VUKENTX1BBUk1TICwgOSwgcHJpbnRrKCBLRVJOX0lORk8KLQkJCSJjczQ2eHg6IGNsa3J1bigpIGVuYWJsZSBjbGtydW4gLSBjaGFuZ2U9JWQgYWN0aXZlPSVkXG4iLAotCQkJCWNoYW5nZSxjYXJkLT5hY3RpdmUpKTsKLQkJb3V0dyhjb250cm9sfDB4MjAwMCwgcG9ydCsweDEwKTsKLQl9IGVsc2UgewotCS8qCi0JKiBzb21ldGltZXMgb24gYSByZXN1bWUgdGhlIGJpdCBpcyBzZXQsIHNvIGFsd2F5cyByZXNldCB0aGUgYml0LgotCSovCi0JCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCi0JCQkiY3M0Nnh4OiBjbGtydW4oKSBkaXNhYmxlIGNsa3J1biAtIGNoYW5nZT0lZCBhY3RpdmU9JWRcbiIsCi0JCQkJY2hhbmdlLGNhcmQtPmFjdGl2ZSkpOwotCQlvdXR3KGNvbnRyb2wmfjB4MjAwMCwgcG9ydCsweDEwKTsKLQl9Ci0JcGNpX2Rldl9wdXQoYWNwaV9kZXYpOwotfQotCi0JCi1zdGF0aWMgaW50IGNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLSAgICAgICAgdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX09QRU4gfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSsgZmlsZT0lcCAlcyAlc1xuIiwKLQkJZmlsZSwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiRk1PREVfV1JJVEUiIDogIiIsCi0JCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiRk1PREVfUkVBRCIgOiAiIikgKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCi0JCWlmICghKChjYXJkLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZW50cnkgPT0gJmNzNDZ4eF9kZXZzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkJImNzNDZ4eDogY3Nfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGF1ZGlvIGNhcmQgc3RydWN0XG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qCi0JICogaGFyZGNvZGUgc3RhdGVbMF0gZm9yIGNhcHR1cmUsIFsxXSBmb3IgcGxheWJhY2sKLQkgKi8KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpIEZNT0RFX1JFQURcbiIpICk7Ci0JCWlmIChjYXJkLT5zdGF0ZXNbMF0gPT0gTlVMTCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF0gPQotCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc19zdGF0ZSksIEdGUF9LRVJORUwpOwotCQkJaWYgKHN0YXRlID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJZG1hYnVmLT5wYnVmID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQkJaWYgKGRtYWJ1Zi0+cGJ1ZiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoc3RhdGUpOwotCQkJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKLQkJCQotCQlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKLQkJCWtmcmVlKGNhcmQtPnN0YXRlc1swXSk7Ci0JCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCXN0YXRlLT5jYXJkID0gY2FyZDsKLQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQkJCi0JCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfQURDKSkpIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAgb2YgQURDIGZhaWxlZCAoMHgleClcbiIsIHRtcCkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlkbWFidWYtPmNoYW5uZWwtPnN0YXRlID0gc3RhdGU7Ci0JCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLwotCQlzdGF0ZS0+dmlydCA9IDA7Ci0JCXN0YXRlLT5tYWdpYyA9IENTX1NUQVRFX01BR0lDOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOwotCQltdXRleF9pbml0KCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0KLQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCi0JCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlICAvZGV2L2RzcAotCQkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKLQkJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCi0KLQkJLyogRGVmYXVsdCBpbnB1dCBpcyA4Yml0IG1vbm8gKi8KLQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9NQVNLOwotCQlkbWFidWYtPnR5cGUgPSBDU19UWVBFX0FEQzsKLQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOwotCQlkbWFidWYtPm9zc21heGZyYWdzICA9IDA7Ci0JCWRtYWJ1Zi0+c3ViZGl2aXNpb24gID0gMDsKLQkJY3Nfc2V0X2FkY19yYXRlKHN0YXRlLCA4MDAwKTsKLQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQotCQlzdGF0ZS0+b3Blbl9tb2RlIHw9IEZNT0RFX1JFQUQ7Ci0JCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCkgRk1PREVfV1JJVEVcbiIpICk7Ci0JCWlmIChjYXJkLT5zdGF0ZXNbMV0gPT0gTlVMTCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV0gPQotCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc19zdGF0ZSksIEdGUF9LRVJORUwpOwotCQkJaWYgKHN0YXRlID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJZG1hYnVmLT5wYnVmID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQkJaWYgKGRtYWJ1Zi0+cGJ1ZiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoc3RhdGUpOwotCQkJCWNhcmQtPnN0YXRlc1sxXSA9IE5VTEw7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKLQkJCQotCQlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKLQkJCWtmcmVlKGNhcmQtPnN0YXRlc1sxXSk7Ci0JCQljYXJkLT5zdGF0ZXNbMV0gPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCXN0YXRlLT5jYXJkID0gY2FyZDsKLQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQotCQlpZiAoKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0RBQykpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwIG9mIERBQyBmYWlsZWQgKDB4JXgpXG4iLCB0bXApKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCQotCQlkbWFidWYtPmNoYW5uZWwtPnN0YXRlID0gc3RhdGU7Ci0JCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLwotCQlzdGF0ZS0+dmlydCA9IDE7Ci0JCXN0YXRlLT5tYWdpYyA9IENTX1NUQVRFX01BR0lDOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOwotCQltdXRleF9pbml0KCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0KLQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCi0JCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlICAvZGV2L2RzcAotCQkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKLQkJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCi0KLQkJLyogRGVmYXVsdCBvdXRwdXQgaXMgOGJpdCBtb25vLiAqLwotCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX01BU0s7Ci0JCWRtYWJ1Zi0+dHlwZSA9IENTX1RZUEVfREFDOwotCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDA7Ci0JCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgID0gMDsKLQkJZG1hYnVmLT5zdWJkaXZpc2lvbiAgPSAwOwotCQljc19zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCi0JCXN0YXRlLT5vcGVuX21vZGUgfD0gRk1PREVfV1JJVEU7Ci0JCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpLSAwXG4iKSk7Ci0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGNzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlDU19EQkdPVVQoQ1NfUkVMRUFTRSB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpKyBmaWxlPSVwICVzICVzXG4iLAotCQlmaWxlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJGTU9ERV9XUklURSIgOiAiIiwKLQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJGTU9ERV9SRUFEIiA6ICIiKSk7Ci0KLQlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmIChzdGF0ZSkgewotCQlpZiAoKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9XUklURSkgJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9XUklURVxuIikpOwotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQljc19jbGVhcl90YWlsKHN0YXRlKTsKLQkJCWRyYWluX2RhYyhzdGF0ZSwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCQkJLyogc3RvcCBETUEgc3RhdGUgbWFjaGluZSBhbmQgZnJlZSBETUEgYnVmZmVycy9jaGFubmVscyAqLwotCQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJZGVhbGxvY19kbWFidWYoc3RhdGUpOwotCQkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylzdGF0ZS0+ZG1hYnVmLnBidWYpOwotCi0JCQkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX211dGV4ICovCi0JCQltdXRleF91bmxvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJCXN0YXRlLT5jYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKLQkJCXN0YXRlLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwotCi0JCQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDLCBDU19GQUxTRSkpKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBEQUMgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCQkJfQotCi0JCQkvKiBOb3cgdHVybiBvZmYgZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLwotCQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7Ci0JCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKLQkJCWtmcmVlKHN0YXRlKTsKLQkJfQotCX0KLQotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmIChzdGF0ZSkgewotCQlpZiAoKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQkJQ1NfREJHT1VUKENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCkgRk1PREVfUkVBRFxuIikpOwotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQltdXRleF9sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7Ci0JCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXN0YXRlLT5kbWFidWYucGJ1Zik7Ci0KLQkJCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fbXV0ZXggKi8KLQkJCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQkJc3RhdGUtPmNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOwotCQkJc3RhdGUtPm9wZW5fbW9kZSAmPSAofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7Ci0KLQkJCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9BREMsIENTX0ZBTFNFKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIEFEQyBmYWlsdXJlICgweCV4KVxuIix0bXApICk7Ci0JCQl9Ci0KLQkJCS8qIE5vdyB0dXJuIG9mZiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKLQkJCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCQkJa2ZyZWUoc3RhdGUpOwotCQl9Ci0JfQotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKS0gMFxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmludHBtKHN0cnVjdCBjc19jYXJkICpzKQotewotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJwbSBzdHJ1Y3Q6XG4iKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImZsYWdzOjB4JXggdTMyQ0xLQ1IxX1NBVkU6IDAleCB1MzJTU1BNVmFsdWU6IDB4JXhcbiIsCi0JCSh1bnNpZ25lZClzLT5wbS5mbGFncyxzLT5wbS51MzJDTEtDUjFfU0FWRSxzLT5wbS51MzJTU1BNVmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyUFBMVkN2YWx1ZTogMHgleCB1MzJQUFJWQ3ZhbHVlOiAweCV4XG4iLAotCQlzLT5wbS51MzJQUExWQ3ZhbHVlLHMtPnBtLnUzMlBQUlZDdmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRk1MVkN2YWx1ZTogMHgleCB1MzJGTVJWQ3ZhbHVlOiAweCV4XG4iLAotCQlzLT5wbS51MzJGTUxWQ3ZhbHVlLHMtPnBtLnUzMkZNUlZDdmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyR1BJT1J2YWx1ZTogMHgleCB1MzJKU0NUTHZhbHVlOiAweCV4XG4iLAotCQlzLT5wbS51MzJHUElPUnZhbHVlLHMtPnBtLnUzMkpTQ1RMdmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyU1NDUjogMHgleCB1MzJTUkNTQTogMHgleFxuIiwKLQkJcy0+cG0udTMyU1NDUixzLT5wbS51MzJTUkNTQSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEYWNBU1I6IDB4JXggdTMyQWRjQVNSOiAweCV4XG4iLAotCQlzLT5wbS51MzJEYWNBU1Iscy0+cG0udTMyQWRjQVNSKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY1NSOiAweCV4IHUzMkFkY1NSOiAweCV4XG4iLAotCQlzLT5wbS51MzJEYWNTUixzLT5wbS51MzJBZGNTUikpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJNSURDUl9TYXZlOiAweCV4XG4iLAotCQlzLT5wbS51MzJNSURDUl9TYXZlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfcG93ZXJkb3duOiAweCV4IF9nZW5lcmFsX3B1cnBvc2UgMHgleFxuIiwKLQkJcy0+cG0udTMyQUM5N19wb3dlcmRvd24scy0+cG0udTMyQUM5N19nZW5lcmFsX3B1cnBvc2UpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19tYXN0ZXJfdm9sdW1lOiAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lOiAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm86IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfcGNtX291dF92b2x1bWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiZG1hYnVmX3N3cHRyX3BsYXk6IDB4JXggZG1hYnVmX2NvdW50X3BsYXk6ICVkXG4iLAotCQlzLT5wbS5kbWFidWZfc3dwdHJfcGxheSxzLT5wbS5kbWFidWZfY291bnRfcGxheSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJkbWFidWZfc3dwdHJfY2FwdHVyZTogMHgleCBkbWFidWZfY291bnRfY2FwdHVyZTogJWRcbiIsCi0JCXMtPnBtLmRtYWJ1Zl9zd3B0cl9jYXB0dXJlLHMtPnBtLmRtYWJ1Zl9jb3VudF9jYXB0dXJlKSk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogIFN1c3BlbmQgLSBzYXZlIHRoZSBhYzk3IHJlZ3MsIG11dGUgdGhlIG91dHB1dHMgYW5kIHBvd2VyIGRvd24gdGhlIHBhcnQuICAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjczQ2eHhfYWM5N19zdXNwZW5kKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBDb3VudCxpOwotCXN0cnVjdCBhYzk3X2NvZGVjICpkZXY9Y2FyZC0+YWM5N19jb2RlY1swXTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpK1xuIikpOwotCi0JaWYgKGNhcmQtPnN0YXRlc1sxXSkgewotCQlzdG9wX2RhYyhjYXJkLT5zdGF0ZXNbMV0pOwotCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKLQl9Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkgewotCQlzdG9wX2FkYyhjYXJkLT5zdGF0ZXNbMF0pOwotCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzBdKTsKLQl9Ci0KLQlmb3IgKENvdW50ID0gMHgyLCBpID0gMDsgKENvdW50IDw9IENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUpCi0JCQkmJiAoaSA8IENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MpOwotCQkJQ291bnQgKz0gMiwgaSsrKSB7Ci0JCWNhcmQtPnBtLmFjOTdbaV0gPSBjc19hYzk3X2dldChkZXYsIEJBMF9BQzk3X1JFU0VUICsgQ291bnQpOwotCX0KLS8qCi0qIFNhdmUgdGhlIGFjOTcgdm9sdW1lIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBvd2VyZG93biBzdGF0ZS4KLSogTm93LCBtdXRlIHRoZSBhbGwgdGhlIG91dHB1dHMgKG1hc3RlciwgaGVhZHBob25lLCBhbmQgbW9ubyksIGFzIHdlbGwKLSogYXMgdGhlIFBDTSB2b2x1bWUsIGluIHByZXBhcmF0aW9uIGZvciBwb3dlcmluZyBkb3duIHRoZSBlbnRpcmUgcGFydC4KLQljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KCBkZXYsIAotCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUpOyAKLQljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSk7IAotCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAotCWNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUpOwotKi8gCi0vKgotKiBtdXRlIHRoZSBvdXRwdXRzCi0qLwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUsIDB4ODAwMCk7Ci0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIDB4ODAwMCk7Ci0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIDB4ODAwMCk7Ci0KLS8qCi0qIHNhdmUgdGhlIHJlZ2lzdGVycyB0aGF0IGNhdXNlIHBvcHMKLSovCi0JY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgKHU4KUFDOTdfUE9XRVJfQ09OVFJPTCk7IAotCWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlID0gKHUzMiljc19hYzk3X2dldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UpOyAKLS8qCi0qIEFuZCBwb3dlciBkb3duIGV2ZXJ5dGhpbmcgb24gdGhlIEFDOTcgY29kZWMuCi0qIHdlbGwsIGZvciBub3csIG9ubHkgcG93ZXIgZG93biB0aGUgREFDL0FEQyBhbmQgTUlYRVIgVlJFRk9OIGNvbXBvbmVudHMuIAotKiB0cm91YmxlIHdpdGggcmVtb3ZpbmcgVlJFRi4KLSovCi0JaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8Ci0JCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUpKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkpOwotCX0KLQotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKS1cbiIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogIFJlc3VtZSAtIHBvd2VyIHVwIHRoZSBwYXJ0IGFuZCByZXN0b3JlIGl0cyByZWdpc3RlcnMuLiAgCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY3M0Nnh4X2FjOTdfcmVzdW1lKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBDb3VudCxpOwotCXN0cnVjdCBhYzk3X2NvZGVjICpkZXY9Y2FyZC0+YWM5N19jb2RlY1swXTsKLQotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3Jlc3VtZSgpK1xuIikpOwotCi0vKgotKiBGaXJzdCwgd2UgcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gIFRoaXMKLSogY29udGFpbnMgdGhlIG1pYyBzZWxlY3QgKG1pYzEgb3IgbWljMikgYW5kIGlmIHdlIHJlc3RvcmUgdGhpcyBhZnRlcgotKiB3ZSByZXN0b3JlIHRoZSBtaWMgdm9sdW1lL2Jvb3N0IHN0YXRlIGFuZCBtaWMyIHdhcyBzZWxlY3RlZCBhdAotKiBzdXNwZW5kIHRpbWUsIHdlIHdpbGwgZW5kIHVwIHdpdGggYSBicmllZiBwZXJpb2Qgb2YgdGltZSB3aGVyZSBtaWMxCi0qIGlzIHNlbGVjdGVkIHdpdGggdGhlIHZvbHVtZS9ib29zdCBzZXR0aW5ncyBmb3IgbWljMiwgY2F1c2luZwotKiBhY291c3RpYyBmZWVkYmFjay4gIFNvIHdlIHJlc3RvcmUgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcgotKiBmaXJzdCwgdGhlcmVieSBnZXR0aW5nIHRoZSBjb3JyZWN0IG1pYyBzZWxlY3RlZCBiZWZvcmUgd2UgcmVzdG9yZQotKiB0aGUgbWljIHZvbHVtZS9ib29zdC4KLSovCi0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLCAKLQkJKHUxNiljYXJkLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSk7Ci0vKgotKiBOb3csIHdoaWxlIHRoZSBvdXRwdXRzIGFyZSBzdGlsbCBtdXRlZCwgcmVzdG9yZSB0aGUgc3RhdGUgb2YgcG93ZXIKLSogb24gdGhlIEFDOTcgcGFydC4KLSovCi0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUE9XRVJET1dOLCAodTE2KWNhcmQtPnBtLnUzMkFDOTdfcG93ZXJkb3duKTsKLQltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsKLS8qCi0qIFJlc3RvcmUganVzdCB0aGUgZmlyc3Qgc2V0IG9mIHJlZ2lzdGVycywgZnJvbSByZWdpc3RlciBudW1iZXIKLSogMHgwMiB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyIHRoYXQgdWxIaWdoZXN0UmVnVG9SZXN0b3JlIHNwZWNpZmllcy4KLSovCi0JZm9yIChDb3VudCA9IDB4MiwgaT0wOyAoQ291bnQgPD0gQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSkgJiYKLQkJCShpIDwgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyk7IENvdW50ICs9IDIsIGkrKykgewotCQljc19hYzk3X3NldChkZXYsICh1OCkoQkEwX0FDOTdfUkVTRVQgKyBDb3VudCksICh1MTYpY2FyZC0+cG0uYWM5N1tpXSk7Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBpbml0IHRoZSBhbXBsaWZpZXIgKi8KLQlpZiAoY2FyZC0+YW1wX2luaXQpCi0JCWNhcmQtPmFtcF9pbml0KGNhcmQpOwotICAgICAgICAKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19yZXN1bWUoKS1cbiIpKTsKLX0KLQotCi1zdGF0aWMgaW50IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKStcbiIpKTsKLQlpZiAoY2FyZC0+c3RhdGVzWzFdKSB7Ci0JCWRtYWJ1ZiA9ICZjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1ZjsKLQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMV0pOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQlpZiAoX19wcm9nX2RtYWJ1ZihjYXJkLT5zdGF0ZXNbMV0pKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgCi0JCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS0gKC0xKSBwcm9nX2RtYWJ1ZigpIGRhYyBlcnJvclxuIikpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWNzX3NldF9kYWNfcmF0ZShjYXJkLT5zdGF0ZXNbMV0sIGRtYWJ1Zi0+cmF0ZSk7Ci0JfQotCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKLQkJZG1hYnVmID0gJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmOwotCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7Ci0JCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCWlmIChfX3Byb2dfZG1hYnVmKGNhcmQtPnN0YXRlc1swXSkpIHsKLQkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCAKLQkJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLSAoLTEpIHByb2dfZG1hYnVmKCkgYWRjIGVycm9yXG4iKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJY3Nfc2V0X2FkY19yYXRlKGNhcmQtPnN0YXRlc1swXSwgZG1hYnVmLT5yYXRlKTsKLQl9Ci0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1JFU1VNRUQ7Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkKLQkJc3RhcnRfYWRjKGNhcmQtPnN0YXRlc1swXSk7Ci0JaWYgKGNhcmQtPnN0YXRlc1sxXSkKLQkJc3RhcnRfZGFjKGNhcmQtPnN0YXRlc1sxXSk7Ci0KLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fSURMRTsKLQljYXJkLT5wbS5mbGFncyAmPSB+KENTNDZYWF9QTV9TVVNQRU5ESU5HIHwgQ1M0NlhYX1BNX1NVU1BFTkRFRCAKLQkJCXwgQ1M0NlhYX1BNX1JFU1VNSU5HIHwgQ1M0NlhYX1BNX1JFU1VNRUQpOwotCWlmIChjYXJkLT5zdGF0ZXNbMF0pCi0JCXdha2VfdXAoJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmLndhaXQpOwotCWlmIChjYXJkLT5zdGF0ZXNbMV0pCi0JCXdha2VfdXAoJmNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLndhaXQpOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS1cbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Jlc2V0KHN0cnVjdCBjc19jYXJkICpjYXJkKTsKLXN0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0b3Aoc3RydWN0IGNzX2NhcmQgKmNhcmQpOwotc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpKyBmbGFncz0weCV4IHM9JXBcbiIsCi0JCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MsY2FyZCkpOwotLyoKLSogY2hlY2sgdGhlIGN1cnJlbnQgc3RhdGUsIG9ubHkgc3VzcGVuZCBpZiBJRExFCi0qLwotCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAyLCAKLQkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpIHVuYWJsZSB0byBzdXNwZW5kLCBub3QgSURMRVxuIikpOwotCQlyZXR1cm4gMTsKLQl9Ci0JY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9JRExFOwotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9TVVNQRU5ESU5HOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKLQkKLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7Ci0JdG1wICY9IH4weDAwMDBmMDNmOwotCXRtcCB8PSAgMHgwMDAwMDAxMDsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOwotCXRtcCAmPSB+MHgwMDAwMDAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMTE7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7Ci0KLQkvKgotICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOwotCi0JaWYgKGNhcmQtPnN0YXRlc1sxXSkgewotCQljYXJkLT5wbS5kbWFidWZfc3dwdHJfcGxheSA9IGNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLnN3cHRyOwotCQljYXJkLT5wbS5kbWFidWZfY291bnRfcGxheSA9IGNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLmNvdW50OwotCX0KLQlpZiAoY2FyZC0+c3RhdGVzWzBdKSB7Ci0JCWNhcmQtPnBtLmRtYWJ1Zl9zd3B0cl9jYXB0dXJlID0gY2FyZC0+c3RhdGVzWzBdLT5kbWFidWYuc3dwdHI7Ci0JCWNhcmQtPnBtLmRtYWJ1Zl9jb3VudF9jYXB0dXJlID0gY2FyZC0+c3RhdGVzWzBdLT5kbWFidWYuY291bnQ7Ci0JfQotCi0JY3M0Nnh4X2FjOTdfc3VzcGVuZChjYXJkKTsKLQotCS8qCi0gICAgICAgICAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgotICAgICAgICAgKi8KLQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0KLQljczQ2MXhfcHJvY19zdG9wKGNhcmQpOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biB0aGUgREFDIGFuZCBBREMuICBGb3Igbm93IGxlYXZlIHRoZSBvdGhlciBhcmVhcyBvbi4KLQkgKi8KLQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIDB4MDMwMCk7Ci0KLQkvKgotCSAqICBQb3dlciBkb3duIHRoZSBQTEwuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgMCk7Ci0KLQkvKgotCSAqICBUdXJuIG9mZiB0aGUgUHJvY2Vzc29yIGJ5IHR1cm5pbmcgb2ZmIHRoZSBzb2Z0d2FyZSBjbG9jayBlbmFibGUgZmxhZyBpbiAKLQkgKiAgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkgJiB+Q0xLQ1IxX1NXQ0U7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsLTEpOwotCi0JY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9TVVNQRU5ESU5HOwotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9TVVNQRU5ERUQ7Ci0KLQlwcmludHBtKGNhcmQpOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmQoKS0gZmxhZ3M9MHgleFxuIiwKLQkJCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNzNDZ4eF9yZXN1bWUoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IGk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50ayggImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpKyBmbGFncz0weCV4XG4iLAotCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7Ci0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fU1VTUEVOREVEKSkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMiwgCi0JCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpIHVuYWJsZSB0byByZXN1bWUsIG5vdCBTVVNQRU5ERURcbiIpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9SRVNVTUlORzsKLQljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRFRDsKLQlwcmludHBtKGNhcmQpOwotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIDEpOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgNCwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKS0gRVJST1IgaW4gY3NfaGFyZHdhcmVfaW5pdCgpXG4iKSk7Ci0JCQltZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JaWYgKGkgPj0gNCkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAotCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBjc19oYXJkd2FyZV9pbml0KCkgZmFpbGVkLCByZXRyaWVkICVkIHRpbWVzLlxuIixpKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjczQ2eHhfcmVzdGFydF9wYXJ0KGNhcmQpKSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCA0LCBwcmludGsoCi0JCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCk6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKSByZXR1cm5lZCBlcnJvclxuIikpOwotCX0KLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBmbGFncz0weCV4XG4iLAotCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDYxeF9mb3BzID0gewotCUNTX09XTkVSCUNTX1RISVNfTU9EVUxFCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWQJCT0gY3NfcmVhZCwKLQkud3JpdGUJCT0gY3Nfd3JpdGUsCi0JLnBvbGwJCT0gY3NfcG9sbCwKLQkuaW9jdGwJCT0gY3NfaW9jdGwsCi0JLm1tYXAJCT0gY3NfbW1hcCwKLQkub3BlbgkJPSBjc19vcGVuLAotCS5yZWxlYXNlCT0gY3NfcmVsZWFzZSwKLX07Ci0KLS8qIFdyaXRlIEFDOTcgY29kZWMgcmVnaXN0ZXJzICovCi0KLQotc3RhdGljIHUxNiBfY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7Ci0JaW50IGNvdW50LGxvb3BjbnQ7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQl1MTYgcmV0OwotCQotCS8qCi0JICogIDEuIFdyaXRlIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaCBmb3IgQUM5NyByZWdpc3RlciBhZGRyZXNzCi0JICogIDIuIFdyaXRlIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaCAgICBmb3IgZGF0YSB0byB3cml0ZSB0byBBQzk3IAotCSAqICAzLiBXcml0ZSBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoIGZvciBpbml0aWF0aW5nIHRoZSB3cml0ZQotCSAqICA0LiBSZWFkIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAxN2gKLQkgKiAgNS4gaWYgRENWIG5vdCBjbGVhcmVkLCBicmVhayBhbmQgcmV0dXJuIGVycm9yCi0JICogIDYuIFJlYWQgQUNTVFMgPSBTdGF0dXMgUmVnaXN0ZXIgPSA0NjRoLCBjaGVjayBWU1RTIGJpdAotCSAqLwotCi0JY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKTsKLQotCS8qCi0JICogIFNldHVwIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBDUzQ2MXggdG8gc2VuZCB0aGUKLQkgKiAgYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgotCSAqICBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKLQkgKiAgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoCi0JICogIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKLQkgKiAgc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAotCSAqICBzZXQgQ1JXIC0gUmVhZCBjb21tYW5kCi0JICogIHNldCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAotCSAqICBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAotCSAqICBzZXQgUlNUTiAtIEFSU1QjIGluYWN0aXZlLCBBQzk3IGNvZGVjIG5vdCByZXNldAotCSAqLwotCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ0FELCByZWcpOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NEQSwgMCk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCBBQ0NUTF9EQ1YgfCBBQ0NUTF9DUlcgfAotCQkJCQkgICAgIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwKLQkJCQkJICAgICBBQ0NUTF9SU1ROKTsKLQotCi0JLyoKLQkgKiAgV2FpdCBmb3IgdGhlIHJlYWQgdG8gb2NjdXIuCi0JICovCi0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCi0JCWxvb3BjbnQgPSAyMDAwOwotCWVsc2UKLQkJbG9vcGNudCA9IDUwMCAqIGNzX2xhcHRvcF93YWl0OwotIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKLQkJLyoKLQkJICogIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KLQkgCSAqLwotCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCS8qCi0JCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVhZCBoYXMgY29tcGxldGVkLgotCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAotCQkgKi8KLQkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCi0JCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqICBNYWtlIHN1cmUgdGhlIHJlYWQgY29tcGxldGVkLgotCSAqLwotCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleCByZXR1cm5pbmcgMHhmZmZmXG4iLCByZWcpKTsKLQkJcmV0dXJuIDB4ZmZmZjsKLQl9Ci0KLQkvKgotCSAqICBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCi0JICovCi0KLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKLQkJbG9vcGNudCA9IDIwMDA7Ci0JZWxzZQotCQlsb29wY250ID0gMTAwMDsKLSAJbG9vcGNudCAqPSBjc19sYXB0b3Bfd2FpdDsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wY250OyBjb3VudCsrKSB7Ci0JCS8qCi0JCSAqICBSZWFkIHRoZSBBQzk3IHN0YXR1cyByZWdpc3Rlci4KLQkJICogIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aAotCQkgKiAgVlNUUyAtIFZhbGlkIFN0YXR1cwotCQkgKi8KLQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19WU1RTKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKLQl9Ci0JCi0JLyoKLQkgKiAgTWFrZSBzdXJlIHdlIGdvdCB2YWxpZCBzdGF0dXMuCi0JICovCi0JaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykpICYgQUNTVFNfVlNUUykpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJImNzNDZ4eDogQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgcmVnID0gMHgleCB2YWw9MHgleCAweGZmZmYgXG4iLCAKLQkJCQlyZWcsIHRtcCkpOwotCQlyZXR1cm4gMHhmZmZmOwotCX0KLQotCS8qCi0JICogIFJlYWQgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgQUM5NyByZWdpc3Rlci4KLQkgKiAgQUNTREEgPSBTdGF0dXMgRGF0YSBSZWdpc3RlciA9IDQ3NGgKLQkgKi8KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDksIHByaW50ayhLRVJOX0lORk8KLQkJImNzNDZ4eDogY3NfYWM5N19nZXQoKSByZWcgPSAweCV4LCB2YWwgPSAweCV4LCBCQTBfQUNDQUQgPSAweCV4XG4iLCAKLQkJCXJlZywgY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKSwKLQkJCWNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NBRCkpKTsKLQlyZXQgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTREEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1MTYgY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQotewotCXUxNiByZXQ7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKLQkKLQlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7Ci0JcmV0ID0gX2NzX2FjOTdfZ2V0KGRldiwgcmVnKTsKLQlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjc19hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiB2YWwpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKLQlpbnQgY291bnQ7Ci0JaW50IHZhbDIgPSAwOwotCQotCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKLQkKLQlpZiAocmVnID09IEFDOTdfQ0RfVk9MKQotCQl2YWwyID0gX2NzX2FjOTdfZ2V0KGRldiwgQUM5N19DRF9WT0wpOwotCi0JLyoKLQkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKLQkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcKLQkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKLQkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMDdoCi0JICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgotCSAqLwotCi0JLyoKLQkgKiAgU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDYxeCB0byBzZW5kIHRoZQotCSAqICBhcHByb3ByaWF0ZSBjb21tYW5kIHRvIHRoZSBBQzk3IHRvIHBlcmZvcm0gdGhlIHJlYWQuCi0JICogIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAotCSAqICBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKLQkgKiAgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaAotCSAqICBzZXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCi0JICogIHJlc2V0IENSVyAtIFdyaXRlIGNvbW1hbmQKLQkgKiAgc2V0IFZGUk0gLSB2YWxpZCBmcmFtZSBlbmFibGVkCi0JICogIHNldCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCi0JICogIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0Ci0gICAgICAgICAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIHZhbCk7Ci0JY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDAgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfVkZSTSB8Ci0JCQkJICAgICAgICAgICAgIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDAwOyBjb3VudCsrKSB7Ci0JCS8qCi0JCSAqICBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCi0JCSAqLwotCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCS8qCi0JCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgd3JpdGUgaGFzIGNvbXBsZXRlZC4KLQkJICogIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKLQkJICovCi0JCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpKQotCQkJYnJlYWs7Ci0JfQotCS8qCi0JICogIE1ha2Ugc3VyZSB0aGUgd3JpdGUgY29tcGxldGVkLgotCSAqLwotCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCSJjczQ2eHg6IEFDJzk3IHdyaXRlIHByb2JsZW0sIHJlZyA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHJlZywgdmFsKSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7Ci0KLQkvKgotCSAqCUFkanVzdCBwb3dlciBpZiB0aGUgbWl4ZXIgaXMgc2VsZWN0ZWQvZGVzZWxlY3RlZCBhY2NvcmRpbmcKLQkgKgl0byB0aGUgQ0QuCi0JICoKLQkgKglJRiB0aGUgQ0QgaXMgYSB2YWxpZCBpbnB1dCBzb3VyY2UgKG1peGVyIG9yIGRpcmVjdCkgQU5ECi0JICoJCXRoZSBDRCBpcyBub3QgbXV0ZWQgVEhFTiBwb3dlciBpcyBuZWVkZWQKLQkgKgotCSAqCVdlIGRvIHR3byB0aGluZ3MuIFdoZW4gcmVjb3JkIHNlbGVjdCBjaGFuZ2VzIHRoZSBpbnB1dCB0bwotCSAqCWFkZC9yZW1vdmUgdGhlIENEIHdlIGFkanVzdCB0aGUgcG93ZXIgY291bnQgaWYgdGhlIENEIGlzCi0JICoJdW5tdXRlZC4KLQkgKgotCSAqCVdoZW4gdGhlIENEIG11dGUgY2hhbmdlcyB3ZSBhZGp1c3QgdGhlIHBvd2VyIGxldmVsIGlmIHRoZQotCSAqCUNEIHdhcyBhIHZhbGlkIGlucHV0LgotCSAqCi0JICogICAgICBXZSBhbHNvIGNoZWNrIGZvciBDRCB2b2x1bWUgIT0gMCwgYXMgdGhlIENEIG11dGUgaXNuJ3QKLQkgKiAgICAgIG5vcm1hbGx5IHR3ZWFrZWQgZnJvbSB1c2Vyc3BhY2UuCi0JICovCi0JIAotCS8qIENEIG11dGUgY2hhbmdlID8gKi8KLQkKLQlpZiAocmVnID09IEFDOTdfQ0RfVk9MKSB7Ci0JCS8qIE11dGUgYml0IGNoYW5nZSA/ICovCi0JCWlmICgodmFsMl52YWwpICYgMHg4MDAwIHx8Ci0JCSAgICAoKHZhbDIgPT0gMHgxZjFmIHx8IHZhbCA9PSAweDFmMWYpICYmIHZhbDIgIT0gdmFsKSkgewotCQkJLyogVGhpcyBpcyBhIGhhY2sgYnV0IGl0cyBjbGVhbmVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KLQkJCSAgIFJpZ2h0IG5vdyBjYXJkLT5hYzk3X2NvZGVjWzBdIG1pZ2h0IGJlIE5VTEwgYXMgd2UgYXJlCi0JCQkgICBzdGlsbCBkb2luZyBjb2RlYyBzZXR1cC4gVGhpcyBkb2VzIGFuIGVhcmx5IGFzc2lnbm1lbnQKLQkJCSAgIHRvIGF2b2lkIHRoZSBwcm9ibGVtIGlmIGl0IG9jY3VycyAqLwotCQkJICAgCi0JCQlpZiAoY2FyZC0+YWM5N19jb2RlY1swXSA9PSBOVUxMKQotCQkJCWNhcmQtPmFjOTdfY29kZWNbMF0gPSBkZXY7Ci0JCQkJCi0JCQkvKiBNdXRlIG9uICovCi0JCQlpZiAodmFsICYgMHg4MDAwIHx8IHZhbCA9PSAweDFmMWYpCi0JCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCQkJZWxzZSB7IC8qIE11dGUgb2ZmIHBvd2VyIG9uICovCi0JCQkJaWYgKGNhcmQtPmFtcF9pbml0KQotCQkJCQljYXJkLT5hbXBfaW5pdChjYXJkKTsKLQkJCQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLwotCi1zdGF0aWMgaW50IGNzX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBpID0gMDsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCkrXG4iKSk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKLQkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYKLQkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCi0JCQkJZ290byBtYXRjaDsKLQl9Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotIG1hdGNoOgotCWlmICghY2FyZC0+YWM5N19jb2RlY1tpXSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZC0+YWM5N19jb2RlY1tpXTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsMSk7Ci0JaWYgKCFDU19JTl9VU0UoJmNhcmQtPm1peGVyX3VzZV9jbnQpKSB7Ci0JCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfTUlYVk9OKSkpIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKSBwb3dlcnVwIGZhaWx1cmUgKDB4JXgpXG4iLCB0bXApKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIDEpOwotCUNTX0lOQ19VU0VfQ09VTlQoJmNhcmQtPm1peGVyX3VzZV9jbnQpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19vcGVuX21peGRldigpLSAwXG4iKSk7Ci0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCWludCBpOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKStcbiIpKTsKLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpCi0JewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQotCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgotCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikKLQkJCQlnb3RvIG1hdGNoOwotCX0KLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiB8IENTX0VSUk9SLCAyLAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfb3Blbl9taXhkZXYoKS0gLUVOT0RFVlxuIikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci1tYXRjaDoKLQlpZiAoIUNTX0RFQ19BTkRfVEVTVCgmY2FyZC0+bWl4ZXJfdXNlX2NudCkpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgNCwKLQkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpLSBubyBwb3dlcmRvd24sIHVzZWNudD4wXG4iKSk7Ci0JCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCQlyZXR1cm4gMDsKLQl9Ci0vKgotKiBvaywgbm8gb3V0c3RhbmRpbmcgbWl4ZXIgb3BlbnMsIHNvIHBvd2VyZG93bi4KLSovCi0JaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UpKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gTUlYVk9OIGZhaWx1cmUgKDB4JXgpXG4iLCB0bXApKTsKLQkJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOwotCQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAtMSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7Ci0JY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDQsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpLSAwXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIF9fdXNlciAqcCA9IChsb25nIF9fdXNlciAqKWFyZzsKLSNpZiBDU0RFQlVHX0lOVEVSRkFDRQotICAgICAgICBpbnQgdmFsOwotCi0JaWYgKAkoY21kID09IFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0spIHx8Ci0JCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSykgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCkgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCkgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19BUE0pKSB7Ci0JCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKLQkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z21hc2ssIHApOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOgotCQkJcmV0dXJuIHB1dF91c2VyKGNzX2RlYnVnbGV2ZWwsIHApOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6Ci0JCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWNzX2RlYnVnbWFzayA9IHZhbDsKLQkJCXJldHVybiAwOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgotCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQljc19kZWJ1Z2xldmVsID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfQVBNOgotCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAodmFsID09IENTX0lPQ1RMX0NNRF9TVVNQRU5EKSB7Ci0JCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7Ci0JCQkJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0JCQkJCWNzNDZ4eF9zdXNwZW5kKGNhcmQsIFBNU0dfT04pOwotCQkJCX0KLQotCQkJfSBlbHNlIGlmICh2YWwgPT0gQ1NfSU9DVExfQ01EX1JFU1VNRSkgewotCQkJCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQkJCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQkJCQljczQ2eHhfcmVzdW1lKGNhcmQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCi0JCQkJICAgICJjczQ2eHg6IG1peGVyX2lvY3RsKCk6IGludmFsaWQgQVBNIGNtZCAoJWQpXG4iLAotCQkJCQl2YWwpKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IG1peGVyX2lvY3RsKCk6IEVSUk9SIHVua25vd24gZGVidWcgY21kXG4iKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLSNlbmRpZgotCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKLX0KLQotc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzX21peGVyX2ZvcHMgPSB7Ci0JQ1NfT1dORVIJQ1NfVEhJU19NT0RVTEUKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkuaW9jdGwJCT0gY3NfaW9jdGxfbWl4ZGV2LAotCS5vcGVuCQk9IGNzX29wZW5fbWl4ZGV2LAotCS5yZWxlYXNlCT0gY3NfcmVsZWFzZV9taXhkZXYsCi19OwotCi0vKiBBQzk3IGNvZGVjIGluaXRpYWxpc2F0aW9uLiAqLwotc3RhdGljIGludCBfX2luaXQgY3NfYWM5N19pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBudW1fYWM5NyA9IDA7Ci0JaW50IHJlYWR5XzJuZCA9IDA7Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOwotCXUxNiBlaWQ7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKStcbiIpICk7Ci0KLQlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7Ci0JCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyB3aWxsIGJlIGZpbGxlZAotCQkgICBpbiBhYzk3X3Byb2JlX2NvZGVjICovCi0JCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKLQotCQljb2RlYy0+Y29kZWNfcmVhZCA9IGNzX2FjOTdfZ2V0OwotCQljb2RlYy0+Y29kZWNfd3JpdGUgPSBjc19hYzk3X3NldDsKLQkKLQkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApIHsKLQkJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktIGNvZGVjIG51bWJlciAlZCBub3QgZm91bmRcbiIsCi0JCQkJCW51bV9hYzk3KSApOwotCQkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGZvdW5kIGNvZGVjICVkXG4iLG51bV9hYzk3KSk7Ci0KLQkJZWlkID0gY3NfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfSUQpOwotCQkKLQkJaWYgKGVpZCA9PSAweEZGRkYpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogY29kZWMgJWQgbm90IHByZXNlbnRcbiIsbnVtX2FjOTcpOwotCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCQotCQljYXJkLT5hYzk3X2ZlYXR1cmVzID0gZWlkOwotCQkJCi0JCWlmICgoY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZjc19taXhlcl9mb3BzLCAtMSkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGNvdWxkbid0IHJlZ2lzdGVyIG1peGVyIVxuIik7Ci0JCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgYWM5N19jb2RlY1slZF0gc2V0IHRvICVwXG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpbnVtX2FjOTcsCi0JCQkJY29kZWMpKTsKLQkJLyogaWYgdGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNvZGVjIGF0IGFsbCwgZG9uJ3QgcHJvYmUgYW55IG1vcmUgKi8KLQkJaWYgKCFyZWFkeV8ybmQpCi0JCXsKLQkJCW51bV9hYzk3ICs9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKS0gJWRcbiIsICh1bnNpZ25lZCBpbnQpbnVtX2FjOTcpKTsKLQlyZXR1cm4gbnVtX2FjOTc7Ci19Ci0KLS8qCi0gKiBsb2FkIHRoZSBzdGF0aWMgaW1hZ2UgaW50byB0aGUgRFNQCi0gKi8KLSNpbmNsdWRlICJjczQ2MXhfaW1hZ2UuaCIKLXN0YXRpYyB2b2lkIGNzNDYxeF9kb3dubG9hZF9pbWFnZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLSAgICB1bnNpZ25lZCBpLCBqLCB0ZW1wMSwgdGVtcDIsIG9mZnNldCwgY291bnQ7Ci0gICAgdW5zaWduZWQgY2hhciBfX2lvbWVtICpwQkExID0gaW9yZW1hcChjYXJkLT5iYTFfYWRkciwgMHg0MDAwMCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENMRUFSX19DT1VOVDsgaSsrKSB7Ci0gICAgICAgIG9mZnNldCA9IENsclN0YXRbaV0uQkExX19EZXN0Qnl0ZU9mZnNldDsKLSAgICAgICAgY291bnQgID0gQ2xyU3RhdFtpXS5CQTFfX1NvdXJjZVNpemU7Ci0gICAgICAgIGZvciAodGVtcDEgPSBvZmZzZXQ7IHRlbXAxIDwgKG9mZnNldCArIGNvdW50KTsgdGVtcDEgKz0gNCkKLSAgICAgICAgICAgICAgd3JpdGVsKDAsIHBCQTErdGVtcDEpOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGSUxMX19DT1VOVDsgaSsrKSB7Ci0gICAgICAgIHRlbXAyID0gRmlsbFN0YXRbaV0uT2Zmc2V0OwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEZpbGxTdGF0W2ldLlNpemUpIC8gNDsgaisrKSB7Ci0gICAgICAgICAgICB0ZW1wMSA9IChGaWxsU3RhdFtpXSkucEZpbGxbal07Ci0gICAgICAgICAgICB3cml0ZWwodGVtcDEsIHBCQTErdGVtcDIgKyBqICogNCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW91bm1hcChwQkExKTsKLX0KLQotLyoKLSAqICBDaGlwIHJlc2V0Ci0gKi8KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Jlc2V0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBpZHg7Ci0KLQkvKgotCSAqICBXcml0ZSB0aGUgcmVzZXQgYml0IG9mIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX1JTVFNQKTsKLQotCS8qCi0JICogIFdyaXRlIHRoZSBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX0RSUUVOKTsKLQotCS8qCi0JICogIENsZWFyIHRoZSB0cmFwIHJlZ2lzdGVycy4KLQkgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDg7IGlkeCsrKSB7Ci0JCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCBEUkVHX1JFR0lEX1RSQVBfU0VMRUNUICsgaWR4KTsKLQkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1RXUFIsIDB4RkZGRik7Ci0JfQotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCAwKTsKLQotCS8qCi0JICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpCi17Ci0JaW50IGlkeCwgbG9vcCwgc3RhcnRmaWZvPTAsIGVuZGZpZm89MCwgcG93ZXJkb3duMSA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCS8qCi0JICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdAotCSAqICBvciB0aGV5IHdpbGwgbm90IHJlc3BvbmQuCi0JICovCi0JaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpKSAmIENMS0NSMV9TV0NFKSkgewotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXAgfCBDTEtDUjFfU1dDRSk7Ci0JCXBvd2VyZG93bjEgPSAxOwotCX0KLQotCS8qCi0JICogIFdlIHdhbnQgdG8gY2xlYXIgb3V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPcyBzbyB3ZSBkb24ndCBlbmQgdXAgcGxheWluZwotCSAqICB3aGF0ZXZlciByYW5kb20gZ2FyYmFnZSBoYXBwZW5zIHRvIGJlIGluIHRoZW0uICBXZSBmaWxsIHRoZSBzYW1wbGUgRklGT1MKLQkgKiAgd2l0aCB6ZXJvIChzaWxlbmNlKS4KLSAgICAgICAgICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJXUCwgMCk7Ci0KLQkvKgotCSogQ2hlY2sgZm9yIHdoaWNoIEZJRk8gbG9jYXRpb25zIHRvIGNsZWFyLCBpZiB3ZSBhcmUgY3VycmVudGx5Ci0JKiBwbGF5aW5nIG9yIGNhcHR1cmluZyB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcHV0IGluIDEyOCBieXRlcyBvZgotCSogIm5vaXNlIi4KLQkgKi8KLQlpZiAodHlwZSAmIENTX1RZUEVfREFDKSB7Ci0JCXN0YXJ0ZmlmbyA9IDEyODsKLQkJZW5kZmlmbyA9IDI1NjsKLQl9Ci0JaWYgKHR5cGUgJiBDU19UWVBFX0FEQykgewotCQlzdGFydGZpZm8gPSAwOwotCQlpZiAoIWVuZGZpZm8pCi0JCQllbmRmaWZvID0gMTI4OwotCX0KLQkvKgotCSAqICBGaWxsIHNhbXBsZSBGSUZPIGxvY2F0aW9ucyAoMjU2IGxvY2F0aW9ucyB0b3RhbCkuCi0JICovCi0JZm9yIChpZHggPSBzdGFydGZpZm87IGlkeCA8IGVuZGZpZm87IGlkeCsrKSB7Ci0JCS8qCi0JCSAqICBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIEZJRk8gd3JpdGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCi0JCSAqLwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNTsgbG9vcCsrKSB7Ci0JCQl1ZGVsYXkoNTApOwotCQkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX1NFUkJTVCkgJiBTRVJCU1RfV0JTWSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9TRVJCU1QpICYgU0VSQlNUX1dCU1kpIHsKLQkJCWlmIChwb3dlcmRvd24xKQotCQkJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Ci0JCX0KLQkJLyoKLQkJICogIFdyaXRlIHRoZSBzZXJpYWwgcG9ydCBGSUZPIGluZGV4LgotCQkgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJBRCwgaWR4KTsKLQkJLyoKLQkJICogIFRlbGwgdGhlIHNlcmlhbCBwb3J0IHRvIGxvYWQgdGhlIG5ldyB2YWx1ZSBpbnRvIHRoZSBGSUZPIGxvY2F0aW9uLgotCQkgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJDTSwgU0VSQkNNX1dSQyk7Ci0JfQotCS8qCi0JICogIE5vdywgaWYgd2UgcG93ZXJlZCB1cCB0aGUgZGV2aWNlcywgdGhlbiBwb3dlciB0aGVtIGJhY2sgZG93biBhZ2Fpbi4KLQkgKiAgVGhpcyBpcyBraW5kYSB1Z2x5LCBidXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQkgKi8KLQlpZiAocG93ZXJkb3duMSkKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLX0KLQotCi1zdGF0aWMgaW50IGNzNDYxeF9wb3dlcmRvd24oc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlLCBpbnQgc3VzcGVuZGZsYWcpCi17Ci0JaW50IGNvdW50OwotCXVuc2lnbmVkIGludCB0bXA9MCxtdXRlZD0wOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIHR5cGU9MHgleFxuIix0eXBlKSk7Ci0JaWYgKCFjc19wb3dlcmRvd24gJiYgIXN1c3BlbmRmbGFnKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBESVNBQkxFRCBleGl0aW5nXG4iKSk7Ci0JCXJldHVybiAwOwotCX0KLQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIHBvd2VyZG93biByZWc9MHgleFxuIix0bXApKTsKLS8qCi0qIGlmIHBvd2VyaW5nIGRvd24gb25seSB0aGUgVlJFRiwgYW5kIG5vdCBwb3dlcmluZyBkb3duIHRoZSBEQUMvQURDLAotKiB0aGVuIGRvIG5vdCBwb3dlciBkb3duIHRoZSBWUkVGLCBVTkxFU1MgYm90aCB0aGUgREFDIGFuZCBBREMgYXJlIG5vdAotKiBjdXJyZW50bHkgcG93ZXJlZCBkb3duLiAgSWYgcG93ZXJpbmcgZG93biBEQUMgYW5kIEFEQywgdGhlbgotKiBpdCBpcyBwb3NzaWJsZSB0byBwb3dlciBkb3duIHRoZSBWUkVGIChPTikuCi0qLwotCWlmICgoKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pICYmCi0JCSAoISh0eXBlICYgQ1NfUE9XRVJfQURDKSB8fCAoISh0eXBlICYgQ1NfUE9XRVJfREFDKSkpKQotCSAgICAgICYmIAotCQkoKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHx8Ci0JCSAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCAgdW5hYmxlIHRvIHBvd2VyZG93bi4gdG1wPTB4JXhcbiIsdG1wKSk7Ci0JCXJldHVybiAwOwotCX0KLS8qCi0qIGZvciBub3csIGFsd2F5cyBrZWVwIHBvd2VyIHRvIHRoZSBtaXhlciBibG9jay4KLSogbm90IHN1cmUgd2h5IGl0J3MgYSBwcm9ibGVtIGJ1dCBpdCBzZWVtcyB0byBiZSBpZiB3ZSBwb3dlciBvZmYuCi0qLwotCXR5cGUgJj0gfkNTX1BPV0VSX01JWFZPTjsKLQl0eXBlICY9IH5DU19QT1dFUl9NSVhWT0ZGOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biBpbmRpY2F0ZWQgYXJlYXMuCi0JICovCi0JaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT0ZGKSB7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBNSVhWT0ZGXG4iKSk7Ci0JCS8qCi0JCSAqICBQb3dlciBkb3duIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkY7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPRkYgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pIHsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIE1JWFZPTlxuIikpOwotCQkvKgotCQkgKiAgUG93ZXIgZG93biB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTjsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gTUlYVk9OIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlICYgQ1NfUE9XRVJfQURDKSB7Ci0JCS8qCi0JCSAqICBQb3dlciBkb3duIHRoZSBBREMgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgQURDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wKTsKLQotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VyZG93biBBREMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9EQUMpIHsKLQkJLyoKLQkJICogIFBvd2VyIGRvd24gdGhlIERBQyBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgREFDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gREFDIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JaWYgKG11dGVkKQotCQljc19tdXRlKGNhcmQsIENTX0ZBTFNFKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCB0bXA9MHgleFxuIix0bXApKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjczQ2eHhfcG93ZXJ1cChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHR5cGUpCi17Ci0JaW50IGNvdW50OwotCXVuc2lnbmVkIGludCB0bXAgPSAwLCBtdXRlZCA9IDA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIHR5cGU9MHgleFxuIix0eXBlKSk7Ci0JLyoKLQkqIGNoZWNrIGZvciBWUkVGIGFuZCBwb3dlcnVwIGlmIG5lZWQgdG8uCi0JKi8KLQlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPTikKLQkJdHlwZSB8PSBDU19QT1dFUl9NSVhWT0ZGOwotCWlmICh0eXBlICYgKENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQykpCi0JCXR5cGUgfD0gQ1NfUE9XRVJfTUlYVk9OIHwgQ1NfUE9XRVJfTUlYVk9GRjsKLQotCS8qCi0JICogIFBvd2VyIHVwIGluZGljYXRlZCBhcmVhcy4KLQkgKi8KLQlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpIHsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBNSVhWT0ZGXG4iKSk7Ci0JCS8qCi0JCSAqICBQb3dlciB1cCB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSkgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIE1JWFZPRkYgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYodHlwZSAmIENTX1BPV0VSX01JWFZPTikgewotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPTlxuIikpOwotCQkvKgotCQkgKiAgUG93ZXIgdXAgdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIE1JWFZPTiBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZSAmIENTX1BPV0VSX0FEQykgewotCQkvKgotCQkgKiAgUG93ZXIgdXAgdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgQURDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREM7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCi0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJ1cCBBREMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9EQUMpIHsKLQkJLyoKLQkJICogIFBvd2VyIHVwIHRoZSBEQUMgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBEQUNcbiIpKTsKLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJ1cCBEQUMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQlpZiAobXV0ZWQpCi0JCWNzX211dGUoY2FyZCwgQ1NfRkFMU0UpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKS0gMCB0bXA9MHgleFxuIix0bXApKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Byb2Nfc3RhcnQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IGNudDsKLQotCS8qCi0JICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKLQkvKgotCSAqICBUdXJuIG9uIHRoZSBydW4sIHJ1biBhdCBmcmFtZSwgYW5kIERNQSBlbmFibGUgYml0cyBpbiB0aGUgbG9jYWwgY29weSBvZgotCSAqICB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgU1BDUl9SVU4gfCBTUENSX1JVTkZSIHwgU1BDUl9EUlFFTik7Ci0JLyoKLQkgKiAgV2FpdCB1bnRpbCB0aGUgcnVuIGF0IGZyYW1lIGJpdCByZXNldHMgaXRzZWxmIGluIHRoZSBTUCBjb250cm9sCi0JICogIHJlZ2lzdGVyLgotCSAqLwotCWZvciAoY250ID0gMDsgY250IDwgMjU7IGNudCsrKSB7Ci0JCXVkZWxheSg1MCk7Ci0JCWlmICghKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0b3Aoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JLyoKLQkgKiAgVHVybiBvZmYgdGhlIHJ1biwgcnVuIGF0IGZyYW1lLCBhbmQgRE1BIGVuYWJsZSBiaXRzIGluIHRoZSBsb2NhbCBjb3B5IG9mCi0JICogIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCAwKTsKLX0KLQotc3RhdGljIGludCBjc19oYXJkd2FyZV9pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7Ci0JdW5zaWduZWQgaW50IHRtcCxjb3VudDsKLQkKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19oYXJkd2FyZV9pbml0KCkrXG4iKSApOwotCS8qIAotCSAqICBGaXJzdCwgYmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZSBQTEwgc3RhcnRzCi0gICAgICAgICAqICBvdXQgaW4gYSBrbm93biBzdGF0ZSwgYW5kIGJsYXN0IHRoZSBtYXN0ZXIgc2VyaWFsIHBvcnQgY29udHJvbCByZWdpc3RlcgotICAgICAgICAgKiAgdG8gemVybyBzbyB0aGF0IHRoZSBzZXJpYWwgcG9ydHMgYWxzbyBzdGFydCBvdXQgaW4gYSBrbm93biBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIDApOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCAwKTsKLQotCS8qCi0JICogIElmIHdlIGFyZSBpbiBBQzk3IG1vZGUsIHRoZW4gd2UgbXVzdCBzZXQgdGhlIHBhcnQgdG8gYSBob3N0IGNvbnRyb2xsZWQKLSAgICAgICAgICogIEFDLWxpbmsuICBPdGhlcndpc2UsIHdlIHdvbid0IGJlIGFibGUgdG8gYnJpbmcgdXAgdGhlIGxpbmsuCi0gICAgICAgICAqLyAgICAgICAgCi0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8xXzAzKTsJLyogMS4wMyBjYXJkICovCi0gICAgICAgIC8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8yXzApOyAqLyAvKiAyLjAwIGNhcmQgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiAgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4gdGhlIEFDOTcKLSAgICAgICAgICogIHNwZWMpIGFuZCB0aGVuIGRyaXZlIGl0IGhpZ2guICBUaGlzIGlzIGRvbmUgZm9yIG5vbiBBQzk3IG1vZGVzIHNpbmNlCi0gICAgICAgICAqICB0aGVyZSBtaWdodCBiZSBsb2dpYyBleHRlcm5hbCB0byB0aGUgQ1M0NjF4IHRoYXQgdXNlcyB0aGUgQVJTVCMgbGluZQotICAgICAgICAgKiAgZm9yIGEgcmVzZXQuCi0gICAgICAgICAqLwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDEpOwotICAgICAgICB1ZGVsYXkoNTApOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDApOwotICAgICAgICB1ZGVsYXkoNTApOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1JTVE4pOwotCi0JLyoKLQkgKiAgVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGhlcmUgaXMgdG8gZW5hYmxlIHN5bmMgZ2VuZXJhdGlvbi4gIEFzIHNvb24KLQkgKiAgYXMgd2Ugc3RhcnQgcmVjZWl2aW5nIGJpdCBjbG9jaywgd2UnbGwgc3RhcnQgcHJvZHVjaW5nIHRoZSBTWU5DCi0JICogIHNpZ25hbC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKLQotCS8qCi0JICogIE5vdyB3YWl0IGZvciBhIHNob3J0IHdoaWxlIHRvIGFsbG93IHRoZSBBQzk3IHBhcnQgdG8gc3RhcnQKLQkgKiAgZ2VuZXJhdGluZyBiaXQgY2xvY2sgKHNvIHdlIGRvbid0IHRyeSB0byBzdGFydCB0aGUgUExMIHdpdGhvdXQgYW4KLQkgKiAgaW5wdXQgY2xvY2spLgotCSAqLwotCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogMSBzaG91bGQgYmUgZW5vdWdoID8/IChhbmQgcGlncyBtaWdodCBmbHkpICovCi0KLQkvKgotCSAqICBTZXQgdGhlIHNlcmlhbCBwb3J0IHRpbWluZyBjb25maWd1cmF0aW9uLCBzbyB0aGF0Ci0JICogIHRoZSBjbG9jayBjb250cm9sIGNpcmN1aXQgZ2V0cyBpdHMgY2xvY2sgZnJvbSB0aGUgY29ycmVjdCBwbGFjZS4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcpOwotCi0JLyoKLQkqIFRoZSBwYXJ0IHNlZW1zIHRvIG5vdCBiZSByZWFkeSBmb3IgYSB3aGlsZSBhZnRlciBhIHJlc3VtZS4KLQkqIHNvLCBpZiB3ZSBhcmUgcmVzdW1pbmcsIHRoZW4gd2FpdCBmb3IgNzAwIG1pbHMuICBOb3RlIHRoYXQgNjAwIG1pbHMKLQkqIGlzIG5vdCBlbm91Z2ggZm9yIHNvbWUgcGxhdGZvcm1zISB0ZXN0ZWQgb24gYW4gSUJNIFRoaW5rcGFkcyBhbmQgCi0JKiByZWZlcmVuY2UgY2FyZHMuCi0JKi8KLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKLQkJbWRlbGF5KGluaXRkZWxheSk7Ci0JLyoKLQkgKiAgV3JpdGUgdGhlIHNlbGVjdGVkIGNsb2NrIGNvbnRyb2wgc2V0dXAgdG8gdGhlIGhhcmR3YXJlLiAgRG8gbm90IHR1cm4gb24KLQkgKiAgU1dDRSB5ZXQgKGlmIHJlcXVlc3RlZCksIHNvIHRoYXQgdGhlIGRldmljZXMgY2xvY2tlZCBieSB0aGUgb3V0cHV0IG9mCi0JICogIFBMTCBhcmUgbm90IGNsb2NrZWQgdW50aWwgdGhlIFBMTCBpcyBzdGFibGUuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1BMTENDLCBQTExDQ19MUEZfMTA1MF8yNzgwX0tIWiB8IFBMTENDX0NEUl83M18xMDRfTUhaKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfUExMTSwgMHgzYSk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMiwgQ0xLQ1IyX1BESVZTXzgpOwotCi0JLyoKLQkgKiAgUG93ZXIgdXAgdGhlIFBMTC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCBDTEtDUjFfUExMUCk7Ci0KLQkvKgotICAgICAgICAgKiAgV2FpdCB1bnRpbCB0aGUgUExMIGhhcyBzdGFiaWxpemVkLgotCSAqLwotCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogQWdhaW4gMSBzaG91bGQgYmUgZW5vdWdoID8/ICovCi0KLQkvKgotCSAqICBUdXJuIG9uIGNsb2NraW5nIG9mIHRoZSBjb3JlIHNvIHRoYXQgd2UgY2FuIHNldHVwIHRoZSBzZXJpYWwgcG9ydHMuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkgfCBDTEtDUjFfU1dDRTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotCi0JLyoKLQkgKiAgRmlsbCB0aGUgc2VyaWFsIHBvcnQgRklGT3Mgd2l0aCBzaWxlbmNlLgotCSAqLwotCWNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3MoY2FyZCxDU19UWVBFX0RBQyB8IENTX1RZUEVfQURDKTsKLQotCS8qCi0JICogIFNldCB0aGUgc2VyaWFsIHBvcnQgRklGTyBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gdGhlIEZJRk8uCi0JICovCi0JLyogY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJTUCwgMCk7ICovCi0KLQkvKgotCSAqICBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbiB0byB0aGUgcGFydC4gIFRoZSBtYXN0ZXIKLQkgKiAgZW5hYmxlIGJpdCBpcyBub3Qgc2V0IHVudGlsIGFsbCBvdGhlciB2YWx1ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkMxLCBTRVJDMV9TTzFGX0FDOTcgfCBTRVJDMV9TTzFFTik7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkMyLCBTRVJDMl9TSTFGX0FDOTcgfCBTRVJDMV9TTzFFTik7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUk1DMSwgU0VSTUMxX1BUQ19BQzk3IHwgU0VSTUMxX01TUEUpOwotCi0KLQltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsJCS8qIFNob3VsZG50IGJlIG5lZWRlZCA/PyAqLwotCQotLyoKLSogSWYgd2UgYXJlIHJlc3VtaW5nIHVuZGVyIDIuMi54IHRoZW4gd2UgY2Fubm90IHNjaGVkdWxlIGEgdGltZW91dCwKLSogc28ganVzdCBzcGluIHRoZSBDUFUuCi0qLwotCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7Ci0JLyoKLQkgKiBXYWl0IGZvciB0aGUgY2FyZCByZWFkeSBzaWduYWwgZnJvbSB0aGUgQUM5NyBjYXJkLgotCSAqLwotCQllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaID4+IDIpOwotCQlkbyB7Ci0JCS8qCi0JCSAqICBSZWFkIHRoZSBBQzk3IHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgd2UndmUgc2VlbiBhIENPREVDIFJFQURZCi0JCSAqICBzaWduYWwgZnJvbSB0aGUgQUM5NyBjYXJkLgotCQkgKi8KLQkJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkKLQkJCQlicmVhazsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOwotCX0gZWxzZSB7Ci0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykgewotCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCi0JCQl1ZGVsYXkoMjUgKiBjc19sYXB0b3Bfd2FpdCk7Ci0KLQkJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qCi0JICogIE1ha2Ugc3VyZSBDT0RFQyBpcyBSRUFEWS4KLQkgKi8KLQlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAgCi0JCQkiY3M0Nnh4OiBjcmVhdGUgLSBuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBBQyc5N1xuIikpOwotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKLQkJCSJjczQ2eHg6IHByb2JhYmx5IG5vdCBhIGJ1ZywgdHJ5IHVzaW5nIHRoZSBDUzQyMzIgZHJpdmVyLFxuIikpOwotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKLQkJCSJjczQ2eHg6IG9yIHR1cm4gb2ZmIGFueSBhdXRvbWF0aWMgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGluIHRoZSBCSU9TLlxuIikpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqICBBc3NlcnQgdGhlIHZhaWQgZnJhbWUgc2lnbmFsIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHNlbmRpbmcgY29tbWFuZHMKLQkgKiAgdG8gdGhlIEFDOTcgY2FyZC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7Ci0KLQlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewotCS8qCi0JICogIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzIGFuZCA0IGFzIHZhbGlkLCBtZWFuaW5nIHRoYXQKLQkgKiAgdGhlIGNhcmQgaXMgcHVtcGluZyBBREMgZGF0YSBhY3Jvc3MgdGhlIEFDLWxpbmsuCi0JICovCi0JCWVuZF90aW1lID0gamlmZmllcyArIDMgKiAoSFogPj4gMik7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiAgUmVhZCB0aGUgaW5wdXQgc2xvdCB2YWxpZCByZWdpc3RlciBhbmQgc2VlIGlmIGlucHV0IHNsb3RzIDMgYW5kCi0JCQkgKiAgNCBhcmUgdmFsaWQgeWV0LgotCQkJICovCi0JCQlpZiAoKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSA9PSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQotCQkJCWJyZWFrOwotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7Ci0JCS8vIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KLQkJCXVkZWxheSgyNSAqIGNzX2xhcHRvcF93YWl0KTsKLQotCQkJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkKLQkJCQlicmVhazsKLQkJfQotCX0KLQkvKgotCSAqICBNYWtlIHN1cmUgaW5wdXQgc2xvdHMgMyBhbmQgNCBhcmUgdmFsaWQuICBJZiBub3QsIHRoZW4gcmV0dXJuCi0JICogIGFuIGVycm9yLgotCSAqLwotCWlmICgoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDSVNWKSAmIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpICE9IChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M0Nnh4OiBjcmVhdGUgLSBuZXZlciByZWFkIElTVjMgJiBJU1Y0IGZyb20gQUMnOTdcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqICBOb3csIGFzc2VydCB2YWxpZCBmcmFtZSBhbmQgdGhlIHNsb3QgMyBhbmQgNCB2YWxpZCBiaXRzLiAgVGhpcyB3aWxsCi0JICogIGNvbW1lbnNlIHRoZSB0cmFuc2ZlciBvZiBkaWdpdGFsIGF1ZGlvIGRhdGEgdG8gdGhlIEFDOTcgY2FyZC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNPU1YsIEFDT1NWX1NMVjMgfCBBQ09TVl9TTFY0KTsKLQotCS8qCi0JICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAotCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQkvKiB0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsgKi8KLQkvKiBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOyAqLwotCi0JLyoKLSAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCi0gICAgICAgICAqLwotCWNzNDYxeF9yZXNldChjYXJkKTsKLQotCS8qCi0gICAgICAgICAqICBEb3dubG9hZCB0aGUgaW1hZ2UgdG8gdGhlIHByb2Nlc3Nvci4KLQkgKi8KLQkKLQljczQ2MXhfZG93bmxvYWRfaW1hZ2UoY2FyZCk7Ci0KLQkvKgotICAgICAgICAgKiAgU3RvcCBwbGF5YmFjayBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BDVEwpOwotCWNhcmQtPnBjdGwgPSB0bXAgJiAweGZmZmYwMDAwOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQ1RMLCB0bXAgJiAweDAwMDBmZmZmKTsKLQotCS8qCi0gICAgICAgICAqICBTdG9wIGNhcHR1cmUgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DQ1RMKTsKLQljYXJkLT5jY3RsID0gdG1wICYgMHgwMDAwZmZmZjsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wICYgMHhmZmZmMDAwMCk7Ci0KLQkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KLQlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewotCQlpZiAoY3NfYWM5N19pbml0KGNhcmQpIDw9IDApIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZmFpbHVyZVxuIikpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9IGVsc2UgewotCQljczQ2eHhfYWM5N19yZXN1bWUoY2FyZCk7Ci0JfQotCQotCWNzNDYxeF9wcm9jX3N0YXJ0KGNhcmQpOwotCi0JLyoKLQkgKiAgRW5hYmxlIGludGVycnVwdHMgb24gdGhlIHBhcnQuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfSUVWIHwgSElDUl9DSEdNKTsKLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsKLQl0bXAgJj0gfjB4MDAwMGYwM2Y7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BGSUUsIHRtcCk7CS8qIHBsYXliYWNrIGludGVycnVwdCBlbmFibGUgKi8KLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOwotCXRtcCAmPSB+MHgwMDAwMDAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMDE7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZW5hYmxlICovCQotCi0JLyoKLQkgKiAgSWYgSURMRSB0aGVuIFBvd2VyIGRvd24gdGhlIHBhcnQuICBXZSB3aWxsIHBvd2VyIGNvbXBvbmVudHMgdXAgCi0JICogIHdoZW4gd2UgbmVlZCB0aGVtLiAgCi0JICovCi0JaWYgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHsKLQkJaWYgKCFjc19wb3dlcmRvd24pIHsKLQkJCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCQkJQ1NfUE9XRVJfTUlYVk9OKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJ1cCgpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJCQlDU19QT1dFUl9NSVhWT04sIENTX0ZBTFNFKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQl9Ci0JfQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzX2hhcmR3YXJlX2luaXQoKS0gMFxuIikpOwotCXJldHVybiAwOwotfQotCi0vKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyIG5vdywgdGhleSBhcmUgZGVmZXJlZCAKLSAgIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8KLSAgIAotLyoKLSAqCUNhcmQgc3ViaWQgdGFibGUKLSAqLwotIAotc3RydWN0IGNzX2NhcmRfdHlwZQotewotCXUxNiB2ZW5kb3I7Ci0JdTE2IGlkOwotCWNoYXIgKm5hbWU7Ci0Jdm9pZCAoKmFtcCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKLQl2b2lkICgqYW1wX2luaXQpKHN0cnVjdCBjc19jYXJkICopOwotCXZvaWQgKCphY3RpdmUpKHN0cnVjdCBjc19jYXJkICosIGludCk7Ci19OwotCi1zdGF0aWMgc3RydWN0IGNzX2NhcmRfdHlwZSBjYXJkc1tdID0gewotCXsKLQkJLnZlbmRvcgk9IDB4MTQ4OSwKLQkJLmlkCT0gMHg3MDAxLAotCQkubmFtZQk9ICJHZW5pdXMgU291bmRtYWtlciAxMjggdmFsdWUiLAotCQkuYW1wCT0gYW1wX25vbmUsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDUwNTMsCi0JCS5pZAk9IDB4MzM1NywKLQkJLm5hbWUJPSAiVm95ZXRyYSIsCi0JCS5hbXAJPSBhbXBfdm95ZXRyYSwKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTA3MSwKLQkJLmlkCT0gMHg2MDAzLAotCQkubmFtZQk9ICJNaXRhYyBNSTYwMjAvMjEiLAotCQkuYW1wCT0gYW1wX3ZveWV0cmEsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE0QUYsCi0JCS5pZAk9IDB4MDA1MCwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDUwLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTEsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4MDA1MiwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDUzLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTQsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4YTAxMCwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgRm9ydGlzc2ltbyBJSSIsCi0JCS5hbXAJPSBhbXBfbm9uZSwKLQl9LAotCS8qIE5vdCBzdXJlIGlmIHRoZSA1NzAgbmVlZHMgdGhlIGNsa3J1biBoYWNrICovCi0JewotCQkudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9JQk0sCi0JCS5pZAk9IDB4MDEzMiwKLQkJLm5hbWUJPSAiVGhpbmtwYWQgNTcwIiwKLQkJLmFtcAk9IGFtcF9ub25lLAotCQkuYWN0aXZlCT0gY2xrcnVuX2hhY2ssCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX0lCTSwKLQkJLmlkCT0gMHgwMTUzLAotCQkubmFtZQk9ICJUaGlua3BhZCA2MDBYL0EyMC9UMjAiLAotCQkuYW1wCT0gYW1wX25vbmUsCi0JCS5hY3RpdmUJPSBjbGtydW5faGFjaywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfSUJNLAotCQkuaWQJPSAweDEwMTAsCi0JCS5uYW1lCT0gIlRoaW5rcGFkIDYwMEUgKHVuc3VwcG9ydGVkKSIsCi0JfSwKLQl7Ci0JCS5uYW1lCT0gIkNhcmQgd2l0aG91dCBTU0lEIHNldCIsCi0JfSwKLQl7IDAsIH0sCi19OwotCi1NT0RVTEVfQVVUSE9SKCJBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgSmFyb3NsYXYgS3lzZWxhLCA8cGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNyeXN0YWwgU291bmRGdXNpb24gQXVkaW8gU3VwcG9ydCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgY29uc3QgY2hhciBjczQ2eHhfYmFubmVyW10gPSBLRVJOX0lORk8gIkNyeXN0YWwgNDI4MC80Nnh4ICsgQUM5NyBBdWRpbywgdmVyc2lvbiAiIENTNDZYWF9NQUpPUl9WRVJTSU9OICIuIiBDUzQ2WFhfTUlOT1JfVkVSU0lPTiAiLiIgQ1M0NlhYX0FSQ0ggIiwgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKLXN0YXRpYyBjb25zdCBjaGFyIGZuZG1zZ1tdID0gS0VSTl9JTkZPICJjczQ2eHg6IEZvdW5kICVkIGF1ZGlvIGRldmljZShzKS5cbiI7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGNzNDZ4eF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKLXsKLQlpbnQgaSwgajsKLQl1MTYgc3NfY2FyZCwgc3NfdmVuZG9yOwotCXN0cnVjdCBjc19jYXJkICpjYXJkOwotCWRtYV9hZGRyX3QgZG1hX21hc2s7Ci0Jc3RydWN0IGNzX2NhcmRfdHlwZSAqY3AgPSAmY2FyZHNbMF07Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogcHJvYmUoKStcbiIpKTsKLQotCWRtYV9tYXNrID0gMHhmZmZmZmZmZjsJLyogdGhpcyBlbmFibGVzIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgKi8KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKLQkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCQkgImNzNDZ4eDogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVJTUkNJU01FTU9SWVJFR0lPTihwY2lfZGV2LCAwKSB8fAotCSAgICAhUlNSQ0lTTUVNT1JZUkVHSU9OKHBjaV9kZXYsIDEpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCQkgImNzNDZ4eDogcHJvYmUoKS0gTWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocGNpX2Rldi0+aXJxID09IDApIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJCSAiY3M0Nnh4OiBwcm9iZSgpIElSUSBub3QgYXNzaWduZWRcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaV9kZXYsIDB4ZmZmZmZmZmYpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICJjczQ2eHg6IHByb2JlKCkgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnNzX3ZlbmRvcik7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNzX2NhcmQpOwotCi0JaWYgKChjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNzX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQljYXJkLT5iYTBfYWRkciA9IFJTUkNBRERSRVNTKHBjaV9kZXYsIDApOwotCWNhcmQtPmJhMV9hZGRyID0gUlNSQ0FERFJFU1MocGNpX2RldiwgMSk7Ci0JY2FyZC0+cGNpX2RldiA9IHBjaV9kZXY7Ci0JY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOwotCWNhcmQtPm1hZ2ljID0gQ1NfQ0FSRF9NQUdJQzsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmFjOTdfbG9jayk7Ci0KLQlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKLQotCXByaW50ayhjczQ2eHhfYmFubmVyKTsKLQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENhcmQgZm91bmQgYXQgMHglMDhseCBhbmQgMHglMDhseCwgSVJRICVkXG4iLAotCSAgICAgICBjYXJkLT5iYTBfYWRkciwgY2FyZC0+YmExX2FkZHIsIGNhcmQtPmlycSk7Ci0KLQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGNzX2FsbG9jX3BjbV9jaGFubmVsOwotCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGNzX2FsbG9jX3JlY19wY21fY2hhbm5lbDsKLQljYXJkLT5mcmVlX3BjbV9jaGFubmVsID0gY3NfZnJlZV9wY21fY2hhbm5lbDsKLQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF9ub25lOwotCWNhcmQtPmFjdGl2ZV9jdHJsID0gYW1wX25vbmU7Ci0KLQl3aGlsZSAoY3AtPm5hbWUpCi0JewotCQlpZiAoY3AtPnZlbmRvciA9PSBzc192ZW5kb3IgJiYgY3AtPmlkID09IHNzX2NhcmQpIHsKLQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gY3AtPmFtcDsKLQkJCWlmIChjcC0+YWN0aXZlKQotCQkJCWNhcmQtPmFjdGl2ZV9jdHJsID0gY3AtPmFjdGl2ZTsKLQkJCWlmIChjcC0+YW1wX2luaXQpCi0JCQkJY2FyZC0+YW1wX2luaXQgPSBjcC0+YW1wX2luaXQ7Ci0JCQlicmVhazsKLQkJfQotCQljcCsrOwotCX0KLQlpZiAoY3AtPm5hbWUgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IFVua25vd24gY2FyZCAoJTA0WDolMDRYKSBhdCAweCUwOGx4LzB4JTA4bHgsIElSUSAlZFxuIiwKLQkJCXNzX3ZlbmRvciwgc3NfY2FyZCwgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCAgY2FyZC0+aXJxKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6ICVzICglMDRYOiUwNFgpIGF0IDB4JTA4bHgvMHglMDhseCwgSVJRICVkXG4iLAotCQkJY3AtPm5hbWUsIHNzX3ZlbmRvciwgc3NfY2FyZCwgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCBjYXJkLT5pcnEpOwotCX0KLQkKLQlpZiAoY2FyZC0+YW1wbGlmaWVyX2N0cmwgPT0gTlVMTCkgewotCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF9ub25lOwotCQljYXJkLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOwotCX0JCQotCi0JaWYgKGV4dGVybmFsX2FtcCA9PSAxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQ3J5c3RhbCBFQVBEIHN1cHBvcnQgZm9yY2VkIG9uLlxuIik7Ci0JCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX3ZveWV0cmE7Ci0JfQotCi0JaWYgKHRoaW5rcGFkID09IDEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOwotCQljYXJkLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOwotCX0KLS8qCi0qIFRoZSB0aGlua3BhZHMgZG9uJ3Qgd29yayB3ZWxsIHdpdGhvdXQgcnVudGltZSB1cGRhdGluZyBvbiB0aGVpciBrZXJuZWwgCi0qIGRlbGF5IHZhbHVlcyAob3IgYW55IGxhcHRvcCB3aXRoIHZhcmlhYmxlIENQVSBzcGVlZHMgcmVhbGx5KS4KLSogc28sIGp1c3QgdG8gYmUgc2FmZSBzZXQgdGhlIGluaXQgZGVsYXkgdG8gMjEwMC4gIEVsaW1pbmF0ZXMKLSogZmFpbHVyZXMgb24gVDIxIFRoaW5rcGFkcy4gIHJlbW92ZSB0aGlzIGNvZGUgd2hlbiB0aGUgdWRlbGF5Ci0qIGFuZCBtZGVsYXkga2VybmVsIGNvZGUgaXMgcmVwbGFjZWQgYnkgYSBwbSB0aW1lciwgb3IgdGhlIGRlbGF5cwotKiB3b3JrIHdlbGwgZm9yIGJhdHRlcnkgYW5kL29yIEFDIHBvd2VyIGJvdGguCi0qLwotCWlmIChjYXJkLT5hY3RpdmVfY3RybCA9PSBjbGtydW5faGFjaykgewotCQlpbml0ZGVsYXkgPSAyMTAwOwotCQljc19sYXB0b3Bfd2FpdCA9IDU7Ci0JfQotCWlmICgoY2FyZC0+YWN0aXZlX2N0cmwgPT0gY2xrcnVuX2hhY2spICYmICEocG93ZXJkb3duID09IDEpKSB7Ci0vKgotKiBmb3Igc29tZSBjdXJyZW50bHkgdW5rbm93biByZWFzb24sIHBvd2VyaW5nIGRvd24gdGhlIERBQyBhbmQgQURDIGNvbXBvbmVudAotKiBibG9ja3Mgb24gdGhpbmtwYWRzIGNhdXNlcyBzb21lIGZ1bmt5IGJlaGF2aW9yLi4uIGRpc3Rvb3JycnRpb24gYW5kIGFjOTcgCi0qIGNvZGVjIGFjY2VzcyBwcm9ibGVtcy4gIHByb2JhYmx5IHRoZSBzZXJpYWwgY2xvY2sgYmVjb21lcyB1bnN5bmNlZC4gCi0qIGFkZGVkIGNvZGUgdG8gc3luYyB0aGUgY2hpcHMgYmFjayB1cCwgYnV0IG9ubHkgaGVscGVkIGFib3V0IDcwJSB0aGUgdGltZS4KLSovCi0JCWNzX3Bvd2VyZG93biA9IDA7Ci0JfQotCWlmIChwb3dlcmRvd24gPT0gMCkKLQkJY3NfcG93ZXJkb3duID0gMDsKLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAxKTsKLQotCS8qIGNsYWltIG91ciBpb3NwYWNlIGFuZCBpcnEgKi8KLQkKLQljYXJkLT5iYTAgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmEwX2FkZHIsIENTNDYxWF9CQTBfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUuZGF0YTAgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfRE1FTTAsIENTNDYxWF9CQTFfREFUQTBfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUuZGF0YTEgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfRE1FTTEsIENTNDYxWF9CQTFfREFUQTFfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUucG1lbSA9IGlvcmVtYXBfbm9jYWNoZShjYXJkLT5iYTFfYWRkciArIEJBMV9TUF9QTUVNLCBDUzQ2MVhfQkExX1BSR19TSVpFKTsKLQljYXJkLT5iYTEubmFtZS5yZWcgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfUkVHLCBDUzQ2MVhfQkExX1JFR19TSVpFKTsKLQkKLQlDU19EQkdPVVQoQ1NfSU5JVCwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY2FyZD0lcCBjYXJkLT5iYTA9JXBcbiIsY2FyZCxjYXJkLT5iYTApICk7Ci0JQ1NfREJHT1VUKENTX0lOSVQsIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNhcmQtPmJhMT0lcCAlcCAlcCAlcFxuIiwKLQkJCWNhcmQtPmJhMS5uYW1lLmRhdGEwLAotCQkJY2FyZC0+YmExLm5hbWUuZGF0YTEsCi0JCQljYXJkLT5iYTEubmFtZS5wbWVtLAotCQkJY2FyZC0+YmExLm5hbWUucmVnKSApOwotCi0JaWYgKGNhcmQtPmJhMCA9PSAwIHx8IGNhcmQtPmJhMS5uYW1lLmRhdGEwID09IDAgfHwKLQkJY2FyZC0+YmExLm5hbWUuZGF0YTEgPT0gMCB8fCBjYXJkLT5iYTEubmFtZS5wbWVtID09IDAgfHwKLQkJY2FyZC0+YmExLm5hbWUucmVnID09IDApCi0JCWdvdG8gZmFpbDI7Ci0JCQotCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZjc19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiY3M0Nnh4IiwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIGNhcmQtPmlycSk7Ci0JCWdvdG8gZmFpbDI7Ci0JfQotCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCi0JaWYgKChjYXJkLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmNzNDYxeF9mb3BzLCAtMSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRzcFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLSAgICAgICAgLyogcmVnaXN0ZXIgL2Rldi9taWRpICovCi0gICAgICAgIGlmICgoY2FyZC0+ZGV2X21pZGkgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZjc19taWRpX2ZvcHMsIC0xKSkgPCAwKQotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiB1bmFibGUgdG8gcmVnaXN0ZXIgbWlkaVxuIik7Ci0gICAgICAgICAgICAgICAgCi0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX0lETEU7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IsIDQsIHByaW50aygKLQkJCQkiY3M0Nnh4OiBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KCkuLi4gcmV0cnlpbmdcbiIpKTsKLQkJCWZvciAoaiA9IDA7IGogPCBOUl9BQzk3OyBqKyspCi0JCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbal0gIT0gTlVMTCkgewotCQkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbal0tPmRldl9taXhlcik7Ci0JCQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2pdKTsKLQkJCQl9Ci0JCQltZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JaWYoaSA+PSA0KSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCBwcmludGsoCi0JCQkiY3M0Nnh4OiBjczQ2eHhfcHJvYmUoKS0gY3NfaGFyZHdhcmVfaW5pdCgpIGZhaWxlZCwgcmV0cmllZCAlZCB0aW1lcy5cbiIsaSkpOwotICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPmRldl9taWRpKQotICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9taWRpKGNhcmQtPmRldl9taWRpKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKLSAgICAgICAgbXV0ZXhfaW5pdCgmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5pd2FpdCk7Ci0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkub3dhaXQpOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIE1JRENSX01SU1QpOyAgIAotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDApOyAgIAotCi0JLyogCi0JKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciwgYnV0IHByb2JhYmx5IGFscmVhZHkgZG9uZQotCSogc2luY2UgdGhlIENEIGxvZ2ljIGluIHRoZSBhYzk3IGluaXQgY29kZSB3aWxsIHR1cm4gb24gdGhlIGV4dCBhbXAuCi0JKi8KLQlpZiAoY3AtPmFtcF9pbml0KQotCQljcC0+YW1wX2luaXQoY2FyZCk7Ci0gICAgICAgIGNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQotCVBDSV9TRVRfRFJJVkVSX0RBVEEocGNpX2RldiwgY2FyZCk7Ci0JUENJX1NFVF9ETUFfTUFTSyhwY2lfZGV2LCBkbWFfbWFzayk7Ci0JbGlzdF9hZGQoJmNhcmQtPmxpc3QsICZjczQ2eHhfZGV2cyk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogcG0uZmxhZ3M9MHgleCBjYXJkPSVwXG4iLAotCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MsY2FyZCkpOwotCi0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkiY3M0Nnh4OiBwcm9iZSgpLSBkZXZpY2UgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseVxuIikpOwotICAgICAgICByZXR1cm4gMDsKLQotZmFpbDoKLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotZmFpbDI6Ci0JaWYgKGNhcmQtPmJhMCkKLQkJaW91bm1hcChjYXJkLT5iYTApOwotCWlmIChjYXJkLT5iYTEubmFtZS5kYXRhMCkKLQkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMCk7Ci0JaWYgKGNhcmQtPmJhMS5uYW1lLmRhdGExKQotCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGExKTsKLQlpZiAoY2FyZC0+YmExLm5hbWUucG1lbSkKLQkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5wbWVtKTsKLQlpZiAoY2FyZC0+YmExLm5hbWUucmVnKQotCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLnJlZyk7Ci0Ja2ZyZWUoY2FyZCk7Ci0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTwotCQkiY3M0Nnh4OiBwcm9iZSgpLSBubyBkZXZpY2UgYWxsb2NhdGVkXG4iKSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19IC8vIHByb2JlX2NzNDZ4eAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCi0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjczQ2eHhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lfZGV2KTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCQotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KLQkJICJjczQ2eHg6IGNzNDZ4eF9yZW1vdmUoKStcbiIpKTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsMSk7Ci0JCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOwotCXRtcCAmPSB+MHgwMDAwZjAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMTA7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BGSUUsIHRtcCk7CS8qIHBsYXliYWNrIGludGVycnVwdCBkaXNhYmxlICovCi0KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0lFKTsKLQl0bXAgJj0gfjB4MDAwMDAwM2Y7Ci0JdG1wIHw9ICAweDAwMDAwMDExOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DSUUsIHRtcCk7CS8qIGNhcHR1cmUgaW50ZXJydXB0IGRpc2FibGUgKi8KLQotCS8qCi0gICAgICAgICAqICBTdG9wIHBsYXliYWNrIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCAmIDB4MDAwMGZmZmYpOwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgY2FwdHVyZSBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKLQotCS8qCi0gICAgICAgICAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgotICAgICAgICAgKi8KLQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0KLQljczQ2MXhfcHJvY19zdG9wKGNhcmQpOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biB0aGUgREFDIGFuZCBBREMuICBXZSB3aWxsIHBvd2VyIHRoZW0gdXAgKGlmKSB3aGVuIHdlIG5lZWQKLQkgKiAgdGhlbS4KLQkgKi8KLQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCUNTX1BPV0VSX01JWFZPTiwgQ1NfVFJVRSkpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCX0KLQotCS8qCi0JICogIFBvd2VyIGRvd24gdGhlIFBMTC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKLQotCS8qCi0JICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAotCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7Ci0KLQkvKiBmcmVlIGhhcmR3YXJlIHJlc291cmNlcyAqLwotCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JaW91bm1hcChjYXJkLT5iYTApOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTApOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTEpOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucG1lbSk7Ci0JaW91bm1hcChjYXJkLT5iYTEubmFtZS5yZWcpOwotCQotCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCi0JCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKLQkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKLQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKLQkJfQotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Ci0gICAgICAgIGlmIChjYXJkLT5kZXZfbWlkaSkKLSAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+ZGV2X21pZGkpOwotCWxpc3RfZGVsKCZjYXJkLT5saXN0KTsKLQlrZnJlZShjYXJkKTsKLQlQQ0lfU0VUX0RSSVZFUl9EQVRBKHBjaV9kZXYsTlVMTCk7Ci0KLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCSAiY3M0Nnh4OiBjczQ2eHhfcmVtb3ZlKCktOiByZW1vdmUgc3VjY2Vzc2Z1bFxuIikpOwotfQotCi1lbnVtIHsKLQlDUzQ2WFhfNDYxMCA9IDAsCi0JQ1M0NlhYXzQ2MTIsICAJLyogc2FtZSBhcyA0NjMwICovCi0JQ1M0NlhYXzQ2MTUsICAJLyogc2FtZSBhcyA0NjI0ICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3M0Nnh4X3BjaV90YmxbXSA9IHsKLQl7Ci0JCS52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAotCQkuZGV2aWNlCSAgICAgPSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEwLAotCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBDUzQ2WFhfNDYxMCwKLQl9LAotCXsKLQkJLnZlbmRvcgkgICAgID0gUENJX1ZFTkRPUl9JRF9DSVJSVVMsCi0JCS5kZXZpY2UJICAgICA9IFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIsCi0JCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IENTNDZYWF80NjEyLAotCX0sCi0JewotCQkudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0lEX0NJUlJVUywKLQkJLmRldmljZQkgICAgID0gUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNSwKLQkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gQ1M0NlhYXzQ2MTUsCi0JfSwKLQl7IDAsIH0sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3M0Nnh4X3BjaV90YmwpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3M0Nnh4X3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJICA9ICJjczQ2eHgiLAotCS5pZF90YWJsZSA9IGNzNDZ4eF9wY2lfdGJsLAotCS5wcm9iZQkgID0gY3M0Nnh4X3Byb2JlLAotCS5yZW1vdmUJICA9IF9fZGV2ZXhpdF9wKGNzNDZ4eF9yZW1vdmUpLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kICA9IGNzNDZ4eF9zdXNwZW5kX3RibCwKLQkucmVzdW1lCSAgPSBjczQ2eHhfcmVzdW1lX3RibCwKLSNlbmRpZgotfTsKLQotc3RhdGljIGludCBfX2luaXQgY3M0Nnh4X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IHJ0biA9IDA7Ci0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0Nnh4X2luaXRfbW9kdWxlKCkrIFxuIikpOwotCXJ0biA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNzNDZ4eF9wY2lfZHJpdmVyKTsKLQotCWlmIChydG4gPT0gLUVOT0RFVikgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoIAotCQkJImNzNDZ4eDogVW5hYmxlIHRvIGRldGVjdCB2YWxpZCBjczQ2eHggZGV2aWNlXG4iKSk7Ci0JfQotCi0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9pbml0X21vZHVsZSgpLSAoJWQpXG4iLHJ0bikpOwotCXJldHVybiBydG47Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjczQ2eHhfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDZ4eF9wY2lfZHJpdmVyKTsKLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY2xlYW51cF9jczQ2eHgoKSBmaW5pc2hlZFxuIikpOwotfQotCi1tb2R1bGVfaW5pdChjczQ2eHhfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoY3M0Nnh4X2NsZWFudXBfbW9kdWxlKTsKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZF90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBjc19jYXJkICpzID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lkZXYpOwotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCAyLCAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZF90YmwgcmVxdWVzdFxuIikpOwotCWNzNDZ4eF9zdXNwZW5kKHMsIHN0YXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjczQ2eHhfcmVzdW1lX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQotewotCXN0cnVjdCBjc19jYXJkICpzID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lkZXYpOwotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCAyLCAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lX3RibCByZXF1ZXN0XG4iKSk7Ci0JY3M0Nnh4X3Jlc3VtZShzKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmggYi9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4ZTAxMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgImNzNDZ4eF93cmFwcGVyLmMiIC0tICBDaXJydXMgTG9naWMtQ3J5c3RhbCBDUzQ2WFggbGludXggYXVkaW8gZHJpdmVyLgotKgotKiAgICAgIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBDaXJydXMgTG9naWMgQ29ycC4gIAotKiAgICAgICAgICAgIC0tIHRvbSB3b2xsZXIgKHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tKSBvcgotKiAgICAgICAgICAgICAgIChwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCi0qCi0qICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0qICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLSogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKgotKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSoKLSogMDEvMTEvMjAwMSB0cncgLSBuZXcgZmlsZSBmcm9tIGNzNDI4MSB3cmFwcGVyIGNvZGUuIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19DUzQ2WFhfV1JBUFBFUjI0X0gKLSNkZWZpbmUgX19DUzQ2WFhfV1JBUFBFUjI0X0gKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNkZWZpbmUgQ1NfT1dORVIgLm93bmVyID0KLSNkZWZpbmUgQ1NfVEhJU19NT0RVTEUgVEhJU19NT0RVTEUsCi1zdGF0aWMgaW5saW5lIHZvaWQgY3M0Nnh4X251bGwoc3RydWN0IHBjaV9kZXYgKnBjaWRldikgeyByZXR1cm47IH0KLSNkZWZpbmUgY3M0eF9tZW1fbWFwX3Jlc2VydmUocGFnZSkgU2V0UGFnZVJlc2VydmVkKHBhZ2UpCi0jZGVmaW5lIGNzNHhfbWVtX21hcF91bnJlc2VydmUocGFnZSkgQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSkKLQotI2RlZmluZSBmcmVlX2RtYWJ1ZihjYXJkLCBkbWFidWYpIFwKLQlwY2lfZnJlZV9jb25zaXN0ZW50KChjYXJkKS0+cGNpX2RldiwgXAotCQkJICAgIFBBR0VfU0laRSA8PCAoZG1hYnVmKS0+YnVmb3JkZXIsIFwKLQkJCSAgICAoZG1hYnVmKS0+cmF3YnVmLCAoZG1hYnVmKS0+ZG1hYWRkcik7Ci0jZGVmaW5lIGZyZWVfZG1hYnVmMihjYXJkLCBkbWFidWYpIFwKLQlwY2lfZnJlZV9jb25zaXN0ZW50KChjYXJkKS0+cGNpX2RldiwgXAotCQkJCSAgICBQQUdFX1NJWkUgPDwgKGRtYWJ1ZiktPmJ1Zm9yZGVyX3RtcGJ1ZmYsIFwKLQkJCQkgICAgKGRtYWJ1ZiktPnRtcGJ1ZmYsIChkbWFidWYpLT5kbWFhZGRyX3RtcGJ1ZmYpOwotI2RlZmluZSBjczR4X3Bnb2ZmKHZtYSkgKCh2bWEpLT52bV9wZ29mZikKLQotI2RlZmluZSBSU1JDSVNJT1JFR0lPTihkZXYsbnVtKSAoKGRldiktPnJlc291cmNlWyhudW0pXS5zdGFydCAhPSAwICYmIFwKLQkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKQotI2RlZmluZSBSU1JDSVNNRU1PUllSRUdJT04oZGV2LG51bSkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uc3RhcnQgIT0gMCAmJiBcCi0JICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLmZsYWdzICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkpCi0jZGVmaW5lIFJTUkNBRERSRVNTKGRldixudW0pICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLnN0YXJ0KQotI2RlZmluZSBQQ0lfR0VUX0RSSVZFUl9EQVRBIHBjaV9nZXRfZHJ2ZGF0YQotI2RlZmluZSBQQ0lfU0VUX0RSSVZFUl9EQVRBIHBjaV9zZXRfZHJ2ZGF0YQotI2RlZmluZSBQQ0lfU0VUX0RNQV9NQVNLKHBjaWRldixtYXNrKSBwY2lkZXYtPmRtYV9tYXNrID0gbWFzawotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHhwbS5oIGIvc291bmQvb3NzL2NzNDZ4eHBtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzJiNmUuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2NzNDZ4eHBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICJjczQ2eHhwbS5oIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0NlhYIGxpbnV4IGF1ZGlvIGRyaXZlci4KLSoKLSogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKLSogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKLSogICAgICAgICAgICAgICAocGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20pLgotKgotKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0qICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0qICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0qICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSoKLSogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qCi0qIDEyLzIyLzAwIHRydyAtIG5ldyBmaWxlLiAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fQ1M0NlhYUE1fSAotI2RlZmluZSBfX0NTNDZYWFBNX0gKLQotI2RlZmluZSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFIDB4MjYKLSNkZWZpbmUgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyAoQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRS8yLTEpCi0KLS8qIFBNIHN0YXRlIGRlZmludGlvbnMgKi8KLSNkZWZpbmUgQ1M0NlhYX1BNX05PVF9SRUdJU1RFUkVECTB4MTAwMAotI2RlZmluZSBDUzQ2WFhfUE1fSURMRQkJCTB4MDAwMQotI2RlZmluZSBDUzQ2WFhfUE1fU1VTUEVORElORwkJMHgwMDAyCi0jZGVmaW5lIENTNDZYWF9QTV9TVVNQRU5ERUQJCTB4MDAwNAotI2RlZmluZSBDUzQ2WFhfUE1fUkVTVU1JTkcJCTB4MDAwOAotI2RlZmluZSBDUzQ2WFhfUE1fUkVTVU1FRAkJMHgwMDEwCi0KLSNkZWZpbmUgQ1NfUE9XRVJfREFDCQkJMHgwMDAxCi0jZGVmaW5lIENTX1BPV0VSX0FEQwkJCTB4MDAwMgotI2RlZmluZSBDU19QT1dFUl9NSVhWT04JCQkweDAwMDQKLSNkZWZpbmUgQ1NfUE9XRVJfTUlYVk9GRgkJMHgwMDA4Ci0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9PTgkweGYwMDAgIC8qIGFsd2F5cyBvbiBiaXRzIChpbnZlcnRlZCkgKi8KLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQwkweDAxMDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQwkweDAyMDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTgkweDA0MDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkYJMHgwODAwCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04JMHgwMDAxCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04JMHgwMDAyCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04JMHgwMDA0Ci0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OIDB4MDAwOAotCi1zdHJ1Y3QgY3M0Nnh4X3BtIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB1MzJDTEtDUjFfU0FWRSx1MzJTU1BNVmFsdWUsdTMyUFBMVkN2YWx1ZSx1MzJQUFJWQ3ZhbHVlOwotCXUzMiB1MzJGTUxWQ3ZhbHVlLHUzMkZNUlZDdmFsdWUsdTMyR1BJT1J2YWx1ZSx1MzJKU0NUTHZhbHVlLHUzMlNTQ1I7Ci0JdTMyIHUzMlNSQ1NBLHUzMkRhY0FTUix1MzJBZGNBU1IsdTMyRGFjU1IsdTMyQWRjU1IsdTMyTUlEQ1JfU2F2ZTsKLQl1MzIgdTMyU1NQTV9CSVRTOwotCXUzMiBhYzk3W0NTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1NdOwotCXUzMiB1MzJBQzk3X21hc3Rlcl92b2x1bWUsIHUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSwgdTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm87Ci0JdTMyIHUzMkFDOTdfcGNtX291dF92b2x1bWUsIHUzMkFDOTdfcG93ZXJkb3duLCB1MzJBQzk3X2dlbmVyYWxfcHVycG9zZTsKLQl1MzIgdTMyaHdwdHJfcGxheWJhY2ssdTMyaHdwdHJfY2FwdHVyZTsKLQl1bnNpZ25lZCBkbWFidWZfc3dwdHJfcGxheTsKLQlpbnQgZG1hYnVmX2NvdW50X3BsYXk7Ci0JdW5zaWduZWQgZG1hYnVmX3N3cHRyX2NhcHR1cmU7Ci0JaW50IGRtYWJ1Zl9jb3VudF9jYXB0dXJlOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS84MDEwLmggYi9zb3VuZC9vc3MvZW11MTBrMS84MDEwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzZjNDIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvODAxMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzM3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIDgwMTAuaAotICogICAgIENvcHlyaWdodCAxOTk5LTIwMDEgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUJCSAgICBBdXRob3IJICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0JCSAgICAtLS0tLS0JICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294CSAgICBDbGVhbmVkIG9mIDhiaXQgY2hhcnMsIERPUwotICoJCQkJCSAgICBsaW5lIGVuZGluZ3MKLSAqICAgICBEZWNlbWJlciA4LCAxOTk5ICAgICBKb24gVGF5bG9yCSAgICBBZGRlZCBsb3RzIG9mIG5ldyByZWdpc3RlciBpbmZvCi0gKiAgICAgTWF5IDE2LCAyMDAxICAgICAgICAgRGFuaWVsIEJlcnRyYW5kIEFkZGVkIHVub2ZmaWNpYWwgREJHIHJlZ2lzdGVyIGluZm8KLSAqICAgICBPY3QtTm92IDIwMDEgICAgICAgICBELkIuICAgICAgICAgICAgQWRkZWQgdW5vZmZpY2lhbCBBdWRpZ3kgcmVnaXN0ZXJzIAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfODAxMF9ICi0jZGVmaW5lIF84MDEwX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLS8vIERyaXZlciB2ZXJzaW9uOgotI2RlZmluZSBNQUpPUl9WRVIgMAotI2RlZmluZSBNSU5PUl9WRVIgMjAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMjBhIgotCi0KLS8vIEF1ZGlneSBzcGVjaWZ5IHJlZ2lzdGVycyBhcmUgcHJlZml4ZWQgd2l0aCAnQV8nCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQQ0kgZnVuY3Rpb24gMCByZWdpc3RlcnMsIGFkZHJlc3MgPSA8dmFsPiArIFBDSUJBU0UwCQkJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUFRSCQkJMHgwMAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgcG9pbnRlciByZWdpc3RlcgkqLwotCQkJCQkJLyogTk9URTogVGhlIENIQU5ORUxOVU0gYW5kIEFERFJFU1Mgd29yZHMgY2FuCSovCi0JCQkJCQkvKiBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IG9mIGVhY2ggb3RoZXIuCSovCi0jZGVmaW5lIFBUUl9DSEFOTkVMTlVNX01BU0sJMHgwMDAwMDAzZgkvKiBGb3IgZWFjaCBwZXItY2hhbm5lbCByZWdpc3RlciwgaW5kaWNhdGVzIHRoZQkqLwotCQkJCQkJLyogY2hhbm5lbCBudW1iZXIgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlCQkqLwotCQkJCQkJLyogYWNjZXNzZWQuICBGb3Igbm9uIHBlci1jaGFubmVsIHJlZ2lzdGVycyB0aGUJKi8KLQkJCQkJCS8qIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gemVyby4JCQkqLwotI2RlZmluZSBQVFJfQUREUkVTU19NQVNLCTB4MDdmZjAwMDAJLyogUmVnaXN0ZXIgaW5kZXgJCQkJKi8KLQotI2RlZmluZSBEQVRBCQkJMHgwNAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlcgkJKi8KLQotI2RlZmluZSBJUFIJCQkweDA4CQkvKiBHbG9iYWwgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIJCSovCi0JCQkJCQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgYnkgd3JpdGluZyBhIDEgdG8JKi8KLQkJCQkJCS8qIHRoZSByZWxldmFudCBiaXRzIGFuZCB6ZXJvIHRvIHRoZSBvdGhlciBiaXRzCSovCi0KLS8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IERyaXZlIChBX01QVTEpCQkJKi8KLSNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkyCTB4MTAwMDAwMDAJLyogTUlESSBVQVJUIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTIJMHgwODAwMDAwMAkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCi0KLSNkZWZpbmUgSVBSX1NBTVBMRVJBVEVUUkFDS0VSCTB4MDEwMDAwMDAJLyogU2FtcGxlIHJhdGUgdHJhY2tlciBsb2NrIHN0YXR1cyBjaGFuZ2UJKi8KLSNkZWZpbmUgSVBSX0ZYRFNQCQkweDAwODAwMDAwCS8qIEVuYWJsZSBGWCBEU1AgaW50ZXJydXB0cwkJCSovCi0jZGVmaW5lIElQUl9GT1JDRUlOVAkJMHgwMDQwMDAwMAkvKiBGb3JjZSBTb3VuZCBCbGFzdGVyIGludGVycnVwdAkJKi8KLSNkZWZpbmUgSVBSX1BDSUVSUk9SCQkweDAwMjAwMDAwCS8qIFBDSSBidXMgZXJyb3IJCQkJKi8KLSNkZWZpbmUgSVBSX1ZPTElOQ1IJCTB4MDAxMDAwMDAJLyogVm9sdW1lIGluY3JlbWVudCBidXR0b24gcHJlc3NlZAkJKi8KLSNkZWZpbmUgSVBSX1ZPTERFQ1IJCTB4MDAwODAwMDAJLyogVm9sdW1lIGRlY3JlbWVudCBidXR0b24gcHJlc3NlZAkJKi8KLSNkZWZpbmUgSVBSX01VVEUJCTB4MDAwNDAwMDAJLyogTXV0ZSBidXR0b24gcHJlc3NlZAkJCQkqLwotI2RlZmluZSBJUFJfTUlDQlVGRlVMTAkJMHgwMDAyMDAwMAkvKiBNaWNyb3Bob25lIGJ1ZmZlciBmdWxsCQkJKi8KLSNkZWZpbmUgSVBSX01JQ0JVRkhBTEZGVUxMCTB4MDAwMTAwMDAJLyogTWljcm9waG9uZSBidWZmZXIgaGFsZiBmdWxsCQkJKi8KLSNkZWZpbmUgSVBSX0FEQ0JVRkZVTEwJCTB4MDAwMDgwMDAJLyogQURDIGJ1ZmZlciBmdWxsCQkJCSovCi0jZGVmaW5lIElQUl9BRENCVUZIQUxGRlVMTAkweDAwMDA0MDAwCS8qIEFEQyBidWZmZXIgaGFsZiBmdWxsCQkJCSovCi0jZGVmaW5lIElQUl9FRlhCVUZGVUxMCQkweDAwMDAyMDAwCS8qIEVmZmVjdHMgYnVmZmVyIGZ1bGwJCQkJKi8KLSNkZWZpbmUgSVBSX0VGWEJVRkhBTEZGVUxMCTB4MDAwMDEwMDAJLyogRWZmZWN0cyBidWZmZXIgaGFsZiBmdWxsCQkJKi8KLSNkZWZpbmUgSVBSX0dQU1BESUZTVEFUVVNDSEFOR0UJMHgwMDAwMDgwMAkvKiBHUFNQRElGIGNoYW5uZWwgc3RhdHVzIGNoYW5nZQkJKi8KLSNkZWZpbmUgSVBSX0NEUk9NU1RBVFVTQ0hBTkdFCTB4MDAwMDA0MDAJLyogQ0QtUk9NIGNoYW5uZWwgc3RhdHVzIGNoYW5nZQkJCSovCi0jZGVmaW5lIElQUl9JTlRFUlZBTFRJTUVSCTB4MDAwMDAyMDAJLyogSW50ZXJ2YWwgdGltZXIgdGVybWluYWwgY291bnQJCSovCi0jZGVmaW5lIElQUl9NSURJVFJBTlNCVUZFTVBUWQkweDAwMDAwMTAwCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCi0jZGVmaW5lIElQUl9NSURJUkVDVkJVRkVNUFRZCTB4MDAwMDAwODAJLyogTUlESSBVQVJUIHJlY2VpdmUgYnVmZmVyIGVtcHR5CQkqLwotI2RlZmluZSBJUFJfQ0hBTk5FTExPT1AJCTB4MDAwMDAwNDAJLyogT25lIG9yIG1vcmUgY2hhbm5lbCBsb29wIGludGVycnVwdHMgcGVuZGluZwkqLwotI2RlZmluZSBJUFJfQ0hBTk5FTE5VTUJFUk1BU0sJMHgwMDAwMDAzZgkvKiBXaGVuIElQUl9DSEFOTkVMTE9PUCBpcyBzZXQsIGluZGljYXRlcyB0aGUJKi8KLQkJCQkJCS8qIEhpZ2hlc3Qgc2V0IGNoYW5uZWwgaW4gQ0xJUEwgb3IgQ0xJUEguICBXaGVuCSovCi0JCQkJCQkvKiBJUCBpcyB3cml0dGVuIHdpdGggQ0wgc2V0LCB0aGUgYml0IGluIENMSVBMCSovCi0JCQkJCQkvKiBvciBDTElQSCBjb3JyZXNwb25kaW5nIHRvIHRoZSBDSU4gdmFsdWUgCSovCi0JCQkJCQkvKiB3cml0dGVuIHdpbGwgYmUgY2xlYXJlZC4JCQkqLwotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTEJSVBSX01JRElUUkFOU0JVRkVNUFRZCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCi0jZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkxCUlQUl9NSURJUkVDVkJVRkVNUFRZCS8qIE1JREkgVUFSVCByZWNlaXZlIGJ1ZmZlciBlbXB0eQkJKi8KLQotCi0KLSNkZWZpbmUgSU5URQkJCTB4MGMJCS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl9NQVNLCTB4YzAwMDAwMDAJLyogVmlydHVhbCBTb3VuZGJsYXN0ZXIgSS9PIHBvcnQgY2FwdHVyZQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yMjAJMHgwMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyMjAtMHgyMmYJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjQwCTB4NDAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjQwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yNjAJMHg4MDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyNjAJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTFNCXzI4MAkweGMwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDI4MAkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVX01BU0sJMHgzMDAwMDAwMAkvKiBWaXJ0dWFsIE1QVSBJL08gcG9ydCBjYXB0dXJlCQkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMwMAkweDAwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMwMC0weDMwMQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzEwCTB4MTAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzEwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzIwCTB4MjAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzIwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzMwCTB4MzAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzMwCQkqLwotI2RlZmluZSBJTlRFX01BU1RFUkRNQUVOQUJMRQkweDA4MDAwMDAwCS8qIE1hc3RlciBETUEgZW11bGF0aW9uIGF0IDB4MDAwLTB4MDBmCQkqLwotI2RlZmluZSBJTlRFX1NMQVZFRE1BRU5BQkxFCTB4MDQwMDAwMDAJLyogU2xhdmUgRE1BIGVtdWxhdGlvbiBhdCAweDBjMC0weDBkZgkJKi8KLSNkZWZpbmUgSU5URV9NQVNURVJQSUNFTkFCTEUJMHgwMjAwMDAwMAkvKiBNYXN0ZXIgUElDIGVtdWxhdGlvbiBhdCAweDAyMC0weDAyMQkJKi8KLSNkZWZpbmUgSU5URV9TTEFWRVBJQ0VOQUJMRQkweDAxMDAwMDAwCS8qIFNsYXZlIFBJQyBlbXVsYXRpb24gYXQgMHgwYTAtMHgwYTEJCSovCi0jZGVmaW5lIElOVEVfVlNCRU5BQkxFCQkweDAwODAwMDAwCS8qIEVuYWJsZSB2aXJ0dWFsIFNvdW5kYmxhc3RlcgkJCSovCi0jZGVmaW5lIElOVEVfQURMSUJFTkFCTEUJMHgwMDQwMDAwMAkvKiBFbmFibGUgQWRMaWIgZW11bGF0aW9uIGF0IDB4Mzg4LTB4MzhiCSovCi0jZGVmaW5lIElOVEVfTVBVRU5BQkxFCQkweDAwMjAwMDAwCS8qIEVuYWJsZSB2aXJ0dWFsIE1QVQkJCQkqLwotI2RlZmluZSBJTlRFX0ZPUkNFSU5UCQkweDAwMTAwMDAwCS8qIENvbnRpbnVvdXNseSBhc3NlcnQgSU5UQU4JCQkqLwotCi0jZGVmaW5lIElOVEVfTVJIQU5ERU5BQkxFCTB4MDAwODAwMDAJLyogRW5hYmxlIHRoZSAiTXIuIEhhbmQiIGxvZ2ljCQkJKi8KLQkJCQkJCS8qIE5PVEU6IFRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2UgdGhpcyB1bmRlcgkqLwotCQkJCQkJLyogTGludXgsIGFuZCBpdCB3aWxsIGNhdXNlIG9kZCBoYXJkd2FyZSAJKi8KLQkJCQkJCS8qIGJlaGF2aW9yIGFuZCBwb3NzaWJseSByYW5kb20gc2VnZmF1bHRzIGFuZAkqLwotCQkJCQkJLyogbG9ja3VwcyBpZiBlbmFibGVkLgkJCQkqLwotCi0vKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAoQV9NUFUxKQkJCSovCi0jZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUyCTB4MDAwMjAwMDAJLyogRW5hYmxlIE1JREkgdHJhbnNtaXQtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KLSNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRTIJMHgwMDAxMDAwMAkvKiBFbmFibGUgTUlESSByZWNlaXZlLWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCi0KLQotI2RlZmluZSBJTlRFX1NBTVBMRVJBVEVUUkFDS0VSCTB4MDAwMDIwMDAJLyogRW5hYmxlIHNhbXBsZSByYXRlIHRyYWNrZXIgaW50ZXJydXB0cwkqLwotCQkJCQkJLyogTk9URTogVGhpcyBiaXQgbXVzdCBhbHdheXMgYmUgZW5hYmxlZCAgICAgICAJKi8KLSNkZWZpbmUgSU5URV9GWERTUEVOQUJMRQkweDAwMDAxMDAwCS8qIEVuYWJsZSBGWCBEU1AgaW50ZXJydXB0cwkJCSovCi0jZGVmaW5lIElOVEVfUENJRVJST1JFTkFCTEUJMHgwMDAwMDgwMAkvKiBFbmFibGUgUENJIGJ1cyBlcnJvciBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX1ZPTElOQ1JFTkFCTEUJMHgwMDAwMDQwMAkvKiBFbmFibGUgdm9sdW1lIGluY3JlbWVudCBidXR0b24gaW50ZXJydXB0cwkqLwotI2RlZmluZSBJTlRFX1ZPTERFQ1JFTkFCTEUJMHgwMDAwMDIwMAkvKiBFbmFibGUgdm9sdW1lIGRlY3JlbWVudCBidXR0b24gaW50ZXJydXB0cwkqLwotI2RlZmluZSBJTlRFX01VVEVFTkFCTEUJCTB4MDAwMDAxMDAJLyogRW5hYmxlIG11dGUgYnV0dG9uIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfTUlDQlVGRU5BQkxFCTB4MDAwMDAwODAJLyogRW5hYmxlIG1pY3JvcGhvbmUgYnVmZmVyIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfQURDQlVGRU5BQkxFCTB4MDAwMDAwNDAJLyogRW5hYmxlIEFEQyBidWZmZXIgaW50ZXJydXB0cwkJCSovCi0jZGVmaW5lIElOVEVfRUZYQlVGRU5BQkxFCTB4MDAwMDAwMjAJLyogRW5hYmxlIEVmZmVjdHMgYnVmZmVyIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfR1BTUERJRkVOQUJMRQkweDAwMDAwMDEwCS8qIEVuYWJsZSBHUFNQRElGIHN0YXR1cyBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX0NEU1BESUZFTkFCTEUJMHgwMDAwMDAwOAkvKiBFbmFibGUgQ0RTUERJRiBzdGF0dXMgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9JTlRFUlZBTFRJTUVSRU5CCTB4MDAwMDAwMDQJLyogRW5hYmxlIGludGVydmFsIHRpbWVyIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfTUlESVRYRU5BQkxFCTB4MDAwMDAwMDIJLyogRW5hYmxlIE1JREkgdHJhbnNtaXQtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KLSNkZWZpbmUgSU5URV9NSURJUlhFTkFCTEUJMHgwMDAwMDAwMQkvKiBFbmFibGUgTUlESSByZWNlaXZlLWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCi0KLS8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IChBX01QVTIpCSovCi0jZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUxICAJSU5URV9NSURJVFhFTkFCTEUKLSNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRTEJSU5URV9NSURJUlhFTkFCTEUKLQotI2RlZmluZSBXQwkJCTB4MTAJCS8qIFdhbGwgQ2xvY2sgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgV0NfU0FNUExFQ09VTlRFUl9NQVNLCTB4MDNGRkZGQzAJLyogU2FtcGxlIHBlcmlvZHMgZWxhcHNlZCBzaW5jZSByZXNldAkJKi8KLSNkZWZpbmUgV0NfU0FNUExFQ09VTlRFUgkweDE0MDYwMDEwCi0jZGVmaW5lIFdDX0NVUlJFTlRDSEFOTkVMCTB4MDAwMDAwM0YJLyogQ2hhbm5lbCBbMC4uNjNdIGN1cnJlbnRseSBiZWluZyBzZXJ2aWNlZAkqLwotCQkJCQkJLyogTk9URTogRWFjaCBjaGFubmVsIHRha2VzIDEvNjR0aCBvZiBhIHNhbXBsZQkqLwotCQkJCQkJLyogcGVyaW9kIHRvIGJlIHNlcnZpY2VkLgkJCSovCi0KLSNkZWZpbmUgSENGRwkJCTB4MTQJCS8qIEhhcmR3YXJlIGNvbmZpZyByZWdpc3RlcgkJCSovCi0JCQkJCQkvKiBOT1RFOiBUaGVyZSBpcyBubyByZWFzb24gdG8gdXNlIHRoZSBsZWdhY3kJKi8KLQkJCQkJCS8qIFNvdW5kQmxhc3RlciBlbXVsYXRpb24gc3R1ZmYgZGVzY3JpYmVkIGJlbG93CSovCi0JCQkJCQkvKiB1bmRlciBMaW51eCwgYW5kIGFsbCBraW5kcyBvZiB3ZWlyZCBoYXJkd2FyZQkqLwotCQkJCQkJLyogYmVoYXZpb3IgY2FuIHJlc3VsdCBpZiB5b3UgdHJ5LiAgRG9uJ3QuCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19NQVNLCTB4ZTAwMDAwMDAJLyogTGVnYWN5IGZ1bmN0aW9uIG51bWJlciAJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTVBVCTB4MDAwMDAwMDAJLyogTGVnYWN5IE1QVQkgCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19TQgkweDQwMDAwMDAwCS8qIExlZ2FjeSBTQgkJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX0FECTB4NjAwMDAwMDAJLyogTGVnYWN5IEFECQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTVBJQwkweDgwMDAwMDAwCS8qIExlZ2FjeSBNUElDCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTURNQQkweGEwMDAwMDAwCS8qIExlZ2FjeSBNRE1BCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU1BDSQkweGMwMDAwMDAwCS8qIExlZ2FjeSBTUENJCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU0RNQQkweGUwMDAwMDAwCS8qIExlZ2FjeSBTRE1BCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0lPQ0FQVFVSRUFERFIJMHgxZjAwMDAwMAkvKiBUaGUgNCBMU0JzIG9mIHRoZSBjYXB0dXJlZCBJL08gYWRkcmVzcy4JKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lXUklURQkweDAwODAwMDAwCS8qIDEgPSB3cml0ZSwgMCA9IHJlYWQgCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZV09SRAkJMHgwMDQwMDAwMAkvKiAxID0gd29yZCwgMCA9IGJ5dGUgCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZSU5UCQkweDAwMjAwMDAwCS8qIDEgPSBsZWdhY3kgZXZlbnQgY2FwdHVyZWQuIFdyaXRlIDEgdG8gY2xlYXIuCSovCi0JCQkJCQkvKiBOT1RFOiBUaGUgcmVzdCBvZiB0aGUgYml0cyBpbiB0aGlzIHJlZ2lzdGVyCSovCi0JCQkJCQkvKiBfYXJlXyByZWxldmFudCB1bmRlciBMaW51eC4JCQkqLwotI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX01BU0sJMHgwMDA3MDAwMAkvKiBDT0RFQyBmb3JtYXQJCQkJCSovCi0jZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfQUM5NwkweDAwMDAwMDAwCS8qIEFDOTcgQ09ERUMgZm9ybWF0IC0tIFByaW1hcnkgT3V0cHV0CQkqLwotI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0kyUwkweDAwMDEwMDAwCS8qIEkyUyBDT0RFQyBmb3JtYXQgLS0gU2Vjb25kYXJ5IChSZWFyKSBPdXRwdXQJKi8KLSNkZWZpbmUgSENGR19HUElOUFVUMAkJMHgwMDAwNDAwMAkvKiBFeHRlcm5hbCBwaW4xMTIJCQkJKi8KLSNkZWZpbmUgSENGR19HUElOUFVUMQkJMHgwMDAwMjAwMAkvKiBFeHRlcm5hbCBwaW4xMTAJCQkJKi8KLQotI2RlZmluZSBIQ0ZHX0dQT1VUUFVUX01BU0sJMHgwMDAwMWMwMAkvKiBFeHRlcm5hbCBwaW5zIHdoaWNoIG1heSBiZSBjb250cm9sbGVkCSovCi0jZGVmaW5lIEhDRkdfR1BPVVQwCQkweDAwMDAxMDAwCS8qIHNldCB0byBlbmFibGUgZGlnaXRhbCBvdXQgb24gNS4xIGNhcmRzCSovCi0KLSNkZWZpbmUgSENGR19KT1lFTkFCTEUgICAgICAJMHgwMDAwMDIwMAkvKiBJbnRlcm5hbCBqb3lzdGljayBlbmFibGUgICAgCQkJKi8KLSNkZWZpbmUgSENGR19QSEFTRVRSQUNLRU5BQkxFCTB4MDAwMDAxMDAJLyogUGhhc2UgdHJhY2tpbmcgZW5hYmxlCQkJKi8KLQkJCQkJCS8qIDEgPSBGb3JjZSBhbGwgMyBhc3luYyBkaWdpdGFsIGlucHV0cyB0byB1c2UJKi8KLQkJCQkJCS8qIHRoZSBzYW1lIGFzeW5jIHNhbXBsZSByYXRlIHRyYWNrZXIgKFpWSURFTykJKi8KLSNkZWZpbmUgSENGR19BQzNFTkFCTEVfTUFTSwkweDB4MDAwMGUwCS8qIEFDMyBhc3luYyBpbnB1dCBjb250cm9sIC0gTm90IGltcGxlbWVudGVkCSovCi0jZGVmaW5lIEhDRkdfQUMzRU5BQkxFX1pWSURFTwkweDAwMDAwMDgwCS8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBaVklERU8JCSovCi0jZGVmaW5lIEhDRkdfQUMzRU5BQkxFX0NEU1BESUYJMHgwMDAwMDA0MAkvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgQ0RTUERJRgkJKi8KLSNkZWZpbmUgSENGR19BQzNFTkFCTEVfR1BTUERJRiAgMHgwMDAwMDAyMCAgICAgIC8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBHUFNQRElGICAgICAgICAgICAgICovCi0jZGVmaW5lIEhDRkdfQVVUT01VVEUJCTB4MDAwMDAwMTAJLyogV2hlbiBzZXQsIHRoZSBhc3luYyBzYW1wbGUgcmF0ZSBjb252ZXJ0b3JzCSovCi0JCQkJCQkvKiB3aWxsIGF1dG9tYXRpY2FsbHkgbXV0ZSB0aGVpciBvdXRwdXQgd2hlbgkqLwotCQkJCQkJLyogdGhleSBhcmUgbm90IHJhdGUtbG9ja2VkIHRvIHRoZSBleHRlcm5hbAkqLwotCQkJCQkJLyogYXN5bmMgYXVkaW8gc291cmNlICAJCQkJKi8KLSNkZWZpbmUgSENGR19MT0NLU09VTkRDQUNIRQkweDAwMDAwMDA4CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byBzb3VuZGNhY2hlICovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgYmUgdXNlZC4gIAkqLwotI2RlZmluZSBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSwkweDAwMDAwMDA0CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byB0YW5rY2FjaGUJKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgc2hvdWxkIGdlbmVyYWxseSBuZXZlciBiZSB1c2VkLiAgCSovCi0jZGVmaW5lIEhDRkdfTE9DS1RBTktDQUNIRQkweDAxMDIwMDE0Ci0jZGVmaW5lIEhDRkdfTVVURUJVVFRPTkVOQUJMRQkweDAwMDAwMDAyCS8qIDEgPSBNYXN0ZXIgbXV0ZSBidXR0b24gc2V0cyBBVURJT0VOQUJMRSA9IDAuCSovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIGlzIGEgJ2NoZWFwJyB3YXkgdG8gaW1wbGVtZW50IGEJKi8KLQkJCQkJCS8qIG1hc3RlciBtdXRlIGZ1bmN0aW9uIG9uIHRoZSBtdXRlIGJ1dHRvbiwgYW5kCSovCi0JCQkJCQkvKiBpbiBnZW5lcmFsIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgYSBtb3JlCSovCi0JCQkJCQkvKiBzb3BoaXN0aWNhdGVkIG1hc3RlciBtdXRlIGZ1bmN0aW9uIGhhcyBub3QJKi8KLQkJCQkJCS8qIGJlZW4gd3JpdHRlbi4gICAgICAgCQkJCSovCi0jZGVmaW5lIEhDRkdfQVVESU9FTkFCTEUJMHgwMDAwMDAwMQkvKiAwID0gQ09ERUNzIHRyYW5zbWl0IHplcm8tdmFsdWVkIHNhbXBsZXMJKi8KLQkJCQkJCS8qIFNob3VsZCBiZSBzZXQgdG8gMSB3aGVuIHRoZSBFTVUxMEsxIGlzCSovCi0JCQkJCQkvKiBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgkJCSovCi0KLS8vRm9yIEF1ZGlneSwgTVBVIHBvcnQgbW92ZSB0byAweDcwLTB4NzQgcHRyIHJlZ2lzdGVyCi0KLSNkZWZpbmUgTVVEQVRBCQkJMHgxOAkJLyogTVBVNDAxIGRhdGEgcmVnaXN0ZXIgKDggYml0cykgICAgICAgCQkqLwotCi0jZGVmaW5lIE1VQ01ECQkJMHgxOQkJLyogTVBVNDAxIGNvbW1hbmQgcmVnaXN0ZXIgKDggYml0cykgICAgCQkqLwotI2RlZmluZSBNVUNNRF9SRVNFVAkJMHhmZgkJLyogUkVTRVQgY29tbWFuZAkJCQkqLwotI2RlZmluZSBNVUNNRF9FTlRFUlVBUlRNT0RFCTB4M2YJCS8qIEVudGVyX1VBUlRfbW9kZSBjb21tYW5kCQkJKi8KLQkJCQkJCS8qIE5PVEU6IEFsbCBvdGhlciBjb21tYW5kcyBhcmUgaWdub3JlZAkJKi8KLQotI2RlZmluZSBNVVNUQVQJCQlNVUNNRAkJLyogTVBVNDAxIHN0YXR1cyByZWdpc3RlciAoOCBiaXRzKSAgICAgCQkqLwotI2RlZmluZSBNVVNUQVRfSVJEWU4JCTB4ODAJCS8qIDAgPSBNSURJIGRhdGEgb3IgY29tbWFuZCBBQ0sJCQkqLwotI2RlZmluZSBNVVNUQVRfT1JEWU4JCTB4NDAJCS8qIDAgPSBNVURBVEEgY2FuIGFjY2VwdCBhIGNvbW1hbmQgb3IgZGF0YQkqLwotCi0jZGVmaW5lIEFfSU9DRkcJCQkweDE4CQkvKiBHUElPIG9uIEF1ZGlneSBjYXJkICgxNmJpdHMpCQkJKi8KLSNkZWZpbmUgQV9HUElOUFVUX01BU0sJCTB4ZmYwMAotI2RlZmluZSBBX0dQT1VUUFVUX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIFRJTUVSCQkJMHgxYQkJLyogVGltZXIgdGVybWluYWwgY291bnQgcmVnaXN0ZXIgKDE2LWJpdCkJKi8KLQkJCQkJCS8qIE5PVEU6IEFmdGVyIHRoZSByYXRlIGlzIGNoYW5nZWQsIGEgbWF4aW11bQkqLwotCQkJCQkJLyogb2YgMTAyNCBzYW1wbGUgcGVyaW9kcyBzaG91bGQgYmUgYWxsb3dlZAkqLwotCQkJCQkJLyogYmVmb3JlIHRoZSBuZXcgcmF0ZSBpcyBndWFyYW50ZWVkIGFjY3VyYXRlLgkqLwotI2RlZmluZSBUSU1FUl9SQVRFX01BU0sJCTB4MDNmZgkJLyogVGltZXIgaW50ZXJydXB0IHJhdGUgaW4gc2FtcGxlIHBlcmlvZHMJKi8KLQkJCQkJCS8qIDAgPT0gMTAyNCBwZXJpb2RzLCBbMS4uNF0gYXJlIG5vdCB1c2VmdWwJKi8KLQotI2RlZmluZSBBQzk3REFUQQkJMHgxYwkJLyogQUM5NyByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlciAoMTYgYml0KQkqLwotCi0jZGVmaW5lIEFDOTdBRERSRVNTCQkweDFlCQkvKiBBQzk3IHJlZ2lzdGVyIHNldCBhZGRyZXNzIHJlZ2lzdGVyICg4IGJpdCkJKi8KLSNkZWZpbmUgQUM5N0FERFJFU1NfUkVBRFkJMHg4MAkJLyogUmVhZC1vbmx5IGJpdCwgcmVmbGVjdHMgQ09ERUMgUkVBRFkgc2lnbmFsCSovCi0jZGVmaW5lIEFDOTdBRERSRVNTX0FERFJFU1MJMHg3ZgkJLyogQWRkcmVzcyBvZiBpbmRleGVkIEFDOTcgcmVnaXN0ZXIJCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVtdTEwazEgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LCBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBQVFIgYW5kIERBVEEgcmVnaXN0ZXJzCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDUEYJCQkweDAwCQkvKiBDdXJyZW50IHBpdGNoIGFuZCBmcmFjdGlvbiByZWdpc3RlcgkJCSovCi0jZGVmaW5lIENQRl9DVVJSRU5UUElUQ0hfTUFTSwkweGZmZmYwMDAwCS8qIEN1cnJlbnQgcGl0Y2ggKGxpbmVhciwgMHg0MDAwID09IHVuaXR5IHBpdGNoIHNoaWZ0KSAJKi8KLSNkZWZpbmUgQ1BGX0NVUlJFTlRQSVRDSAkweDEwMTAwMDAwCi0jZGVmaW5lIENQRl9TVEVSRU9fTUFTSwkJMHgwMDAwODAwMAkvKiAxID0gRXZlbiBjaGFubmVsIGludGVybGVhdmUsIG9kZCBjaGFubmVsIGxvY2tlZAkqLwotI2RlZmluZSBDUEZfU1RPUF9NQVNLCQkweDAwMDA0MDAwCS8qIDEgPSBDdXJyZW50IHBpdGNoIGZvcmNlZCB0byAwCQkJKi8KLSNkZWZpbmUgQ1BGX0ZSQUNBRERSRVNTX01BU0sJMHgwMDAwM2ZmZgkvKiBMaW5lYXIgZnJhY3Rpb25hbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwJKi8KLQotI2RlZmluZSBQVFJYCQkJMHgwMQkJLyogUGl0Y2ggdGFyZ2V0IGFuZCBzZW5kIEEvQiBhbW91bnRzIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBQVFJYX1BJVENIVEFSR0VUX01BU0sJMHhmZmZmMDAwMAkvKiBQaXRjaCB0YXJnZXQgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJCQkqLwotI2RlZmluZSBQVFJYX1BJVENIVEFSR0VUCTB4MTAxMDAwMDEKLSNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQV9NQVNLIDB4MDAwMGZmMDAJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQQkqLwotI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9BCTB4MDgwODAwMDEKLSNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQl9NQVNLIDB4MDAwMDAwZmYJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQgkqLwotI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9CCTB4MDgwMDAwMDEKLQotI2RlZmluZSBDVkNGCQkJMHgwMgkJLyogQ3VycmVudCB2b2x1bWUgYW5kIGZpbHRlciBjdXRvZmYgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIENWQ0ZfQ1VSUkVOVFZPTF9NQVNLCTB4ZmZmZjAwMDAJLyogQ3VycmVudCBsaW5lYXIgdm9sdW1lIG9mIHNwZWNpZmllZCBjaGFubmVsCQkqLwotI2RlZmluZSBDVkNGX0NVUlJFTlRWT0wJCTB4MTAxMDAwMDIKLSNkZWZpbmUgQ1ZDRl9DVVJSRU5URklMVEVSX01BU0sJMHgwMDAwZmZmZgkvKiBDdXJyZW50IGZpbHRlciBjdXRvZmYgZnJlcXVlbmN5IG9mIHNwZWNpZmllZCBjaGFubmVsCSovCi0jZGVmaW5lIENWQ0ZfQ1VSUkVOVEZJTFRFUgkweDEwMDAwMDAyCi0KLSNkZWZpbmUgVlRGVAkJCTB4MDMJCS8qIFZvbHVtZSB0YXJnZXQgYW5kIGZpbHRlciBjdXRvZmYgdGFyZ2V0IHJlZ2lzdGVyCSovCi0jZGVmaW5lIFZURlRfVk9MVU1FVEFSR0VUX01BU0sJMHhmZmZmMDAwMAkvKiBWb2x1bWUgdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkJKi8KLSNkZWZpbmUgVlRGVF9GSUxURVJUQVJHRVRfTUFTSwkweDAwMDBmZmZmCS8qIEZpbHRlciBjdXRvZmYgdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkqLwotCi0jZGVmaW5lIFoxCQkJMHgwNQkJLyogRmlsdGVyIGRlbGF5IG1lbW9yeSAxIHJlZ2lzdGVyCQkJKi8KLQotI2RlZmluZSBaMgkJCTB4MDQJCS8qIEZpbHRlciBkZWxheSBtZW1vcnkgMiByZWdpc3RlcgkJCSovCi0KLSNkZWZpbmUgUFNTVAkJCTB4MDYJCS8qIFNlbmQgQyBhbW91bnQgYW5kIGxvb3Agc3RhcnQgYWRkcmVzcyByZWdpc3RlcgkqLwotI2RlZmluZSBQU1NUX0ZYU0VOREFNT1VOVF9DX01BU0sgMHhmZjAwMDAwMAkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBDCSovCi0KLSNkZWZpbmUgUFNTVF9GWFNFTkRBTU9VTlRfQwkweDA4MTgwMDA2Ci0KLSNkZWZpbmUgUFNTVF9MT09QU1RBUlRBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBMb29wIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCQkqLwotI2RlZmluZSBQU1NUX0xPT1BTVEFSVEFERFIJMHgxODAwMDAwNgotCi0jZGVmaW5lIERTTAkJCTB4MDcJCS8qIFNlbmQgRCBhbW91bnQgYW5kIGxvb3Agc3RhcnQgYWRkcmVzcyByZWdpc3RlcgkqLwotI2RlZmluZSBEU0xfRlhTRU5EQU1PVU5UX0RfTUFTSwkweGZmMDAwMDAwCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEQJKi8KLQotI2RlZmluZSBEU0xfRlhTRU5EQU1PVU5UX0QJMHgwODE4MDAwNwotCi0jZGVmaW5lIERTTF9MT09QRU5EQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogTG9vcCBlbmQgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwJCSovCi0jZGVmaW5lIERTTF9MT09QRU5EQUREUgkJMHgxODAwMDAwNwotCi0jZGVmaW5lIENDQ0EJCQkweDA4CQkvKiBGaWx0ZXIgUSwgaW50ZXJwLiBST00sIGJ5dGUgc2l6ZSwgY3VyLiBhZGRyIHJlZ2lzdGVyICovCi0jZGVmaW5lIENDQ0FfUkVTT05BTkNFCQkweGYwMDAwMDAwCS8qIExvd3Bhc3MgZmlsdGVyIHJlc29uYW5jZSAoUSkgaGVpZ2h0CQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01NQVNLCTB4MGUwMDAwMDAJLyogU2VsZWN0cyBwYXNzYmFuZCBvZiBpbnRlcnBvbGF0aW9uIFJPTQkJKi8KLQkJCQkJCS8qIDEgPT0gZnVsbCBiYW5kLCA3ID09IGxvd3Bhc3MJCQkJKi8KLQkJCQkJCS8qIFJPTSAwIGlzIHVzZWQgd2hlbiBwaXRjaCBzaGlmdGluZyBkb3dud2FyZCBvciBsZXNzCSovCi0JCQkJCQkvKiB0aGVuIDMgc2VtaXRvbmVzIHVwd2FyZC4gIEluY3JlYXNpbmdseSBoaWdoZXIgUk9NCSovCi0JCQkJCQkvKiBudW1iZXJzIGFyZSB1c2VkLCB0eXBpY2FsbHkgaW4gc3RlcHMgb2YgMyBzZW1pdG9uZXMsCSovCi0JCQkJCQkvKiBhcyB1cHdhcmQgcGl0Y2ggc2hpZnRpbmcgaXMgcGVyZm9ybWVkLgkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMAkweDAwMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAwCQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzEJMHgwMjAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMQkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8yCTB4MDQwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDIJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMwkweDA2MDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAzCQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzQJMHgwODAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNAkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV81CTB4MGEwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDUJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNgkweDBjMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA2CQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzcJMHgwZTAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNwkJCQkqLwotI2RlZmluZSBDQ0NBXzhCSVRTRUxFQ1QJCTB4MDEwMDAwMDAJLyogMSA9IFNvdW5kIG1lbW9yeSBmb3IgdGhpcyBjaGFubmVsIHVzZXMgOC1iaXQgc2FtcGxlcwkqLwotI2RlZmluZSBDQ0NBX0NVUlJBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBDdXJyZW50IGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwJCSovCi0jZGVmaW5lIENDQ0FfQ1VSUkFERFIJCTB4MTgwMDAwMDgKLQotI2RlZmluZSBDQ1IJCQkweDA5CQkvKiBDYWNoZSBjb250cm9sIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFCTB4MDcxOTAwMDkKLSNkZWZpbmUgQ0NSX0NBQ0hFSU5WQUxJRFNJWkVfTUFTSwkweGZlMDAwMDAwCS8qIE51bWJlciBvZiBpbnZhbGlkIHNhbXBsZXMgY2FjaGUgZm9yIHRoaXMgY2hhbm5lbCAgICAJKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFTE9PUEZMQUcJMHgwMTAwMDAwMAkvKiAxID0gQ2FjaGUgaGFzIGEgbG9vcCBzZXJ2aWNlIHBlbmRpbmcJCQkqLwotI2RlZmluZSBDQ1JfSU5URVJMRUFWRURTQU1QTEVTCTB4MDA4MDAwMDAJLyogMSA9IEEgY2FjaGUgc2VydmljZSB3aWxsIGZldGNoIGludGVybGVhdmVkIHNhbXBsZXMJKi8KLSNkZWZpbmUgQ0NSX1dPUkRTSVpFRFNBTVBMRVMJMHgwMDQwMDAwMAkvKiAxID0gQSBjYWNoZSBzZXJ2aWNlIHdpbGwgZmV0Y2ggd29yZCBzaXplZCBzYW1wbGVzCSovCi0jZGVmaW5lIENDUl9SRUFEQUREUkVTUwkJMHgwNjEwMDAwOQotI2RlZmluZSBDQ1JfUkVBREFERFJFU1NfTUFTSwkweDAwM2YwMDAwCS8qIExvY2F0aW9uIG9mIGNhY2hlIGp1c3QgYmV5b25kIGN1cnJlbnQgY2FjaGUgc2VydmljZQkqLwotI2RlZmluZSBDQ1JfTE9PUElOVkFMU0laRQkweDAwMDBmZTAwCS8qIE51bWJlciBvZiBpbnZhbGlkIHNhbXBsZXMgaW4gY2FjaGUgcHJpb3IgdG8gbG9vcAkqLwotCQkJCQkJLyogTk9URTogVGhpcyBpcyB2YWxpZCBvbmx5IGlmIENBQ0hFTE9PUEZMQUcgaXMgc2V0CSovCi0jZGVmaW5lIENDUl9MT09QRkxBRwkJMHgwMDAwMDEwMAkvKiBTZXQgZm9yIGEgc2luZ2xlIHNhbXBsZSBwZXJpb2Qgd2hlbiBhIGxvb3Agb2NjdXJzCSovCi0jZGVmaW5lIENDUl9DQUNIRUxPT1BBRERSSEkJMHgwMDAwMDBmZgkvKiBEU0xfTE9PUFNUQVJUQUREUidzIGhpIGJ5dGUgaWYgQ0FDSEVMT09QRkxBRyBpcyBzZXQJKi8KLQotI2RlZmluZSBDTFAJCQkweDBhCQkvKiBDYWNoZSBsb29wIHJlZ2lzdGVyICh2YWxpZCBpZiBDQ1JfQ0FDSEVMT09QRkxBRyA9IDEpICovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIHJlZ2lzdGVyIGlzIG5vcm1hbGx5IG5vdCB1c2VkCQkqLwotI2RlZmluZSBDTFBfQ0FDSEVMT09QQUREUgkweDAwMDBmZmZmCS8qIENhY2hlIGxvb3AgYWRkcmVzcyAoRFNMX0xPT1BTVEFSVEFERFIgWzAuLjE1XSkJKi8KLQotI2RlZmluZSBGWFJUCQkJMHgwYgkJLyogRWZmZWN0cyBzZW5kIHJvdXRpbmcgcmVnaXN0ZXIJCQkqLwotCQkJCQkJLyogTk9URTogSXQgaXMgaWxsZWdhbCB0byBhc3NpZ24gdGhlIHNhbWUgcm91dGluZyB0bwkqLwotCQkJCQkJLyogdHdvIGVmZmVjdHMgc2VuZHMuCQkJCQkqLwotI2RlZmluZSBGWFJUX0NIQU5ORUxBCQkweDAwMGYwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEEJKi8KLSNkZWZpbmUgRlhSVF9DSEFOTkVMQgkJMHgwMGYwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBCCSovCi0jZGVmaW5lIEZYUlRfQ0hBTk5FTEMJCTB4MGYwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQwkqLwotI2RlZmluZSBGWFJUX0NIQU5ORUxECQkweGYwMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEQJKi8KLQotI2RlZmluZSBNQVBBCQkJMHgwYwkJLyogQ2FjaGUgbWFwIEEJCQkJCQkqLwotCi0jZGVmaW5lIE1BUEIJCQkweDBkCQkvKiBDYWNoZSBtYXAgQgkJCQkJCSovCi0KLSNkZWZpbmUgTUFQX1BURV9NQVNLCQkweGZmZmZlMDAwCS8qIFRoZSAxOSBNU0JzIG9mIHRoZSBQVEUgaW5kZXhlZCBieSB0aGUgUFRJCQkqLwotI2RlZmluZSBNQVBfUFRJX01BU0sJCTB4MDAwMDFmZmYJLyogVGhlIDEzIGJpdCBpbmRleCB0byBvbmUgb2YgdGhlIDgxOTIgUFRFIGR3b3JkcyAgICAgIAkqLwotCi0jZGVmaW5lIEVOVlZPTAkJCTB4MTAJCS8qIFZvbHVtZSBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBFTlZWT0xfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIHZvbHVtZSBlbnZlbG9wZSBzdGF0ZSB2YXJpYWJsZQkqLyAgCi0JCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CSAgICAgICAJCQkqLwotCi0jZGVmaW5lIEFUS0hMRFYgCQkweDExCQkvKiBWb2x1bWUgZW52ZWxvcGUgaG9sZCBhbmQgYXR0YWNrIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBVEtITERWX1BIQVNFMAkJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlCQkJCSovCi0jZGVmaW5lIEFUS0hMRFZfSE9MRFRJTUVfTUFTSwkweDAwMDA3ZjAwCS8qIEVudmVsb3BlIGhvbGQgdGltZSAoMTI3LW4gPT0gbio4OC4ybXNlYykJCSovCi0jZGVmaW5lIEFUS0hMRFZfQVRUQUNLVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogRW52ZWxvcGUgYXR0YWNrIHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KLQkJCQkJCS8qIDAgPSBpbmZpbml0ZSwgMSA9IDEwLjltc2VjLCAuLi4gMHg3ZiA9IDUuNW1zZWMJKi8KLQotI2RlZmluZSBEQ1lTVVNWIAkJMHgxMgkJLyogVm9sdW1lIGVudmVsb3BlIHN1c3RhaW4gYW5kIGRlY2F5IHJlZ2lzdGVyCQkqLwotI2RlZmluZSBEQ1lTVVNWX1BIQVNFMV9NQVNLCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZSwgMSA9IGJlZ2luIHJlbGVhc2UgcGhhc2UJKi8KLSNkZWZpbmUgRENZU1VTVl9TVVNUQUlOTEVWRUxfTUFTSyAweDAwMDA3ZjAwCS8qIDEyNyA9IGZ1bGwsIDAgPSBvZmYsIDAuNzVkQiBpbmNyZW1lbnRzCQkqLwotI2RlZmluZSBEQ1lTVVNWX0NIQU5ORUxFTkFCTEVfTUFTSyAweDAwMDAwMDgwCS8qIDEgPSBJbmhpYml0IGVudmVsb3BlIGVuZ2luZSBmcm9tIHdyaXRpbmcgdmFsdWVzIGluCSovCi0JCQkJCQkvKiB0aGlzIGNoYW5uZWwgYW5kIGZyb20gd3JpdGluZyB0byBwaXRjaCwgZmlsdGVyIGFuZAkqLwotCQkJCQkJLyogdm9sdW1lIHRhcmdldHMuCQkJCQkqLwotI2RlZmluZSBEQ1lTVVNWX0RFQ0FZVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogVm9sdW1lIGVudmVsb3BlIGRlY2F5IHRpbWUsIGxvZyBlbmNvZGVkICAgICAJCSovCi0JCQkJCQkvKiAwID0gNDMuN21zZWMsIDEgPSAyMS44bXNlYywgMHg3ZiA9IDIybXNlYwkJKi8KLQotI2RlZmluZSBMRk9WQUwxIAkJMHgxMwkJLyogTW9kdWxhdGlvbiBMRk8gdmFsdWUJCQkJCSovCi0jZGVmaW5lIExGT1ZBTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgbW9kdWxhdGlvbiBMRk8gc3RhdGUgdmFyaWFibGUJKi8KLQkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KLQotI2RlZmluZSBFTlZWQUwJCQkweDE0CQkvKiBNb2R1bGF0aW9uIGVudmVsb3BlIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEVOVlZBTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgbW9kdWxhdGlvbiBlbnZlbG9wZSBzdGF0ZSB2YXJpYWJsZSAJKi8KLQkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KLQotI2RlZmluZSBBVEtITERNCQkJMHgxNQkJLyogTW9kdWxhdGlvbiBlbnZlbG9wZSBob2xkIGFuZCBhdHRhY2sgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEFUS0hMRE1fUEhBU0UwCQkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UJCQkJKi8KLSNkZWZpbmUgQVRLSExETV9IT0xEVElNRQkweDAwMDA3ZjAwCS8qIEVudmVsb3BlIGhvbGQgdGltZSAoMTI3LW4gPT0gbio0Mm1zZWMpCQkqLwotI2RlZmluZSBBVEtITERNX0FUVEFDS1RJTUUJMHgwMDAwMDA3ZgkvKiBFbnZlbG9wZSBhdHRhY2sgdGltZSwgbG9nIGVuY29kZWQJCQkqLwotCQkJCQkJLyogMCA9IGluZmluaXRlLCAxID0gMTFtc2VjLCAuLi4gMHg3ZiA9IDUuNW1zZWMJCSovCi0KLSNkZWZpbmUgRENZU1VTTQkJCTB4MTYJCS8qIE1vZHVsYXRpb24gZW52ZWxvcGUgZGVjYXkgYW5kIHN1c3RhaW4gcmVnaXN0ZXIJKi8KLSNkZWZpbmUgRENZU1VTTV9QSEFTRTFfTUFTSwkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UsIDEgPSBiZWdpbiByZWxlYXNlIHBoYXNlCSovCi0jZGVmaW5lIERDWVNVU01fU1VTVEFJTkxFVkVMX01BU0sgMHgwMDAwN2YwMAkvKiAxMjcgPSBmdWxsLCAwID0gb2ZmLCAwLjc1ZEIgaW5jcmVtZW50cwkJKi8KLSNkZWZpbmUgRENZU1VTTV9ERUNBWVRJTUVfTUFTSwkweDAwMDAwMDdmCS8qIEVudmVsb3BlIGRlY2F5IHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KLQkJCQkJCS8qIDAgPSA0My43bXNlYywgMSA9IDIxLjhtc2VjLCAweDdmID0gMjJtc2VjCQkqLwotCi0jZGVmaW5lIExGT1ZBTDIgCQkweDE3CQkvKiBWaWJyYXRvIExGTyByZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTEZPVkFMMl9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgdmlicmF0byBMRk8gc3RhdGUgdmFyaWFibGUgCQkqLwotCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkJCQkqLwotCi0jZGVmaW5lIElQCQkJMHgxOAkJLyogSW5pdGlhbCBwaXRjaCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBJUF9NQVNLCQkJMHgwMDAwZmZmZgkvKiBFeHBvbmVudGlhbCBpbml0aWFsIHBpdGNoIHNoaWZ0CQkJKi8KLQkJCQkJCS8qIDQgYml0cyBvZiBvY3RhdmUsIDEyIGJpdHMgb2YgZnJhY3Rpb25hbCBvY3RhdmUJKi8KLSNkZWZpbmUgSVBfVU5JVFkJCTB4MDAwMGUwMDAJLyogVW5pdHkgcGl0Y2ggc2hpZnQJCQkJCSovCi0KLSNkZWZpbmUgSUZBVE4JCQkweDE5CQkvKiBJbml0aWFsIGZpbHRlciBjdXRvZmYgYW5kIGF0dGVudWF0aW9uIHJlZ2lzdGVyCSovCi0jZGVmaW5lIElGQVROX0ZJTFRFUkNVVE9GRl9NQVNLCTB4MDAwMGZmMDAJLyogSW5pdGlhbCBmaWx0ZXIgY3V0b2ZmIGZyZXF1ZW5jeSBpbiBleHBvbmVudGlhbCB1bml0cwkqLwotCQkJCQkJLyogNiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHNlbWl0b25lcwkJKi8KLQkJCQkJCS8qIDIgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgZnJhY3Rpb25zCQkqLwotI2RlZmluZSBJRkFUTl9GSUxURVJDVVRPRkYJMHgwODA4MDAxOQotI2RlZmluZSBJRkFUTl9BVFRFTlVBVElPTl9NQVNLCTB4MDAwMDAwZmYJLyogSW5pdGlhbCBhdHRlbnVhdGlvbiBpbiAwLjM3NWRCIHN0ZXBzCQkJKi8KLSNkZWZpbmUgSUZBVE5fQVRURU5VQVRJT04JMHgwODAwMDAxOQotCi0KLSNkZWZpbmUgUEVGRQkJCTB4MWEJCS8qIFBpdGNoIGVudmVsb3BlIGFuZCBmaWx0ZXIgZW52ZWxvcGUgYW1vdW50IHJlZ2lzdGVyCSovCi0jZGVmaW5lIFBFRkVfUElUQ0hBTU9VTlRfTUFTSwkweDAwMDBmZjAwCS8qIFBpdGNoIGVudmxvcGUgYW1vdW50CQkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBwZWFrIGV4dHJlbWVzCSovCi0jZGVmaW5lIFBFRkVfUElUQ0hBTU9VTlQJMHgwODA4MDAxYQotI2RlZmluZSBQRUZFX0ZJTFRFUkFNT1VOVF9NQVNLCTB4MDAwMDAwZmYJLyogRmlsdGVyIGVudmxvcGUgYW1vdW50CQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBzaXggb2N0YXZlcyBwZWFrIGV4dHJlbWVzICovCi0jZGVmaW5lIFBFRkVfRklMVEVSQU1PVU5UCTB4MDgwMDAwMWEKLSNkZWZpbmUgRk1NT0QJCQkweDFiCQkvKiBWaWJyYXRvL2ZpbHRlciBtb2R1bGF0aW9uIGZyb20gTEZPIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBGTU1PRF9NT0RWSUJSQVRPCTB4MDAwMGZmMDAJLyogVmlicmF0byBMRk8gbW9kdWxhdGlvbiBkZXB0aAkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBleHRyZW1lcwkqLwotI2RlZmluZSBGTU1PRF9NT0ZJTFRFUgkJMHgwMDAwMDBmZgkvKiBGaWx0ZXIgTEZPIG1vZHVsYXRpb24gZGVwdGgJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIHRocmVlIG9jdGF2ZSBleHRyZW1lcwkqLwotCi0KLSNkZWZpbmUgVFJFTUZSUSAJCTB4MWMJCS8qIFRyZW1vbG8gYW1vdW50IGFuZCBtb2R1bGF0aW9uIExGTyBmcmVxdWVuY3kgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgVFJFTUZSUV9ERVBUSAkJMHgwMDAwZmYwMAkvKiBUcmVtb2xvIGRlcHRoCQkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCB3aXRoICsvLSAxMmRCIGV4dHJlbWVzCSovCi0jZGVmaW5lIFRSRU1GUlFfRlJFUVVFTkNZCTB4MDAwMDAwZmYJLyogVHJlbW9sbyBMRk8gZnJlcXVlbmN5CQkJCSovCi0JCQkJCQkvKiA/P0h6IHN0ZXBzLCBtYXhpbXVtIG9mID8/IEh6LgkJCSovCi0KLSNkZWZpbmUgRk0yRlJRMiAJCTB4MWQJCS8qIFZpYnJhdG8gYW1vdW50IGFuZCB2aWJyYXRvIExGTyBmcmVxdWVuY3kgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgRk0yRlJRMl9ERVBUSAkJMHgwMDAwZmYwMAkvKiBWaWJyYXRvIExGTyB2aWJyYXRvIGRlcHRoCQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBvbmUgb2N0YXZlIGV4dHJlbWVzCSovCi0jZGVmaW5lIEZNMkZSUTJfRlJFUVVFTkNZCTB4MDAwMDAwZmYJLyogVmlicmF0byBMRk8gZnJlcXVlbmN5CQkJCSovCi0JCQkJCQkvKiAwLjAzOUh6IHN0ZXBzLCBtYXhpbXVtIG9mIDkuODUgSHouCQkJKi8KLQotI2RlZmluZSBURU1QRU5WIAkJMHgxZQkJLyogVGVtcG9yeSBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBURU1QRU5WX01BU0sJCTB4MDAwMGZmZmYJLyogMTYtYml0IHZhbHVlCQkJCQkJKi8KLQkJCQkJCS8qIE5PVEU6IEFsbCBjaGFubmVscyBjb250YWluIGludGVybmFsIHZhcmlhYmxlczsgZG8JKi8KLQkJCQkJCS8qIG5vdCB3cml0ZSB0byB0aGVzZSBsb2NhdGlvbnMuCQkJKi8KLQotI2RlZmluZSBDRDAJCQkweDIwCQkvKiBDYWNoZSBkYXRhIDAgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0QxCQkJMHgyMQkJLyogQ2FjaGUgZGF0YSAxIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEMgkJCTB4MjIJCS8qIENhY2hlIGRhdGEgMiByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDMJCQkweDIzCQkvKiBDYWNoZSBkYXRhIDMgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q0CQkJMHgyNAkJLyogQ2FjaGUgZGF0YSA0IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENENQkJCTB4MjUJCS8qIENhY2hlIGRhdGEgNSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDYJCQkweDI2CQkvKiBDYWNoZSBkYXRhIDYgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q3CQkJMHgyNwkJLyogQ2FjaGUgZGF0YSA3IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEOAkJCTB4MjgJCS8qIENhY2hlIGRhdGEgOCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDkJCQkweDI5CQkvKiBDYWNoZSBkYXRhIDkgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RBCQkJMHgyYQkJLyogQ2FjaGUgZGF0YSBBIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEQgkJCTB4MmIJCS8qIENhY2hlIGRhdGEgQiByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREMJCQkweDJjCQkvKiBDYWNoZSBkYXRhIEMgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RECQkJMHgyZAkJLyogQ2FjaGUgZGF0YSBEIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENERQkJCTB4MmUJCS8qIENhY2hlIGRhdGEgRSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREYJCQkweDJmCQkvKiBDYWNoZSBkYXRhIEYgcmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBQVEIJCQkweDQwCQkvKiBQYWdlIHRhYmxlIGJhc2UgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUFRCX01BU0sJCTB4ZmZmZmYwMDAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSB0YWJsZSBpbiBob3N0IG1lbW9yeQkqLwotCi0jZGVmaW5lIFRDQgkJCTB4NDEJCS8qIFRhbmsgY2FjaGUgYmFzZSByZWdpc3RlciAgICAJCQkJKi8KLSNkZWZpbmUgVENCX01BU0sJCTB4ZmZmZmYwMDAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYm90dG9tIG9mIGhvc3QgYmFzZWQgVFJBTQkqLwotCi0jZGVmaW5lIEFEQ0NSCQkJMHg0MgkJLyogQURDIHNhbXBsZSByYXRlL3N0ZXJlbyBjb250cm9sIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBRENDUl9SQ0hBTkVOQUJMRQkweDAwMDAwMDEwCS8qIEVuYWJsZXMgcmlnaHQgY2hhbm5lbCBmb3Igd3JpdGluZyB0byB0aGUgaG9zdCAgICAgICAJKi8KLSNkZWZpbmUgQURDQ1JfTENIQU5FTkFCTEUJMHgwMDAwMDAwOAkvKiBFbmFibGVzIGxlZnQgY2hhbm5lbCBmb3Igd3JpdGluZyB0byB0aGUgaG9zdAkJKi8KLQkJCQkJCS8qIE5PVEU6IFRvIGd1YXJhbnRlZSBwaGFzZSBjb2hlcmVuY3ksIGJvdGggY2hhbm5lbHMJKi8KLQkJCQkJCS8qIG11c3QgYmUgZGlzYWJsZWQgcHJpb3IgdG8gZW5hYmxpbmcgYm90aCBjaGFubmVscy4JKi8KLSNkZWZpbmUgQV9BRENDUl9SQ0hBTkVOQUJMRQkweDAwMDAwMDIwCi0jZGVmaW5lIEFfQURDQ1JfTENIQU5FTkFCTEUJMHgwMDAwMDAxMAotCi0jZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV9NQVNLIDB4MDAwMDAwMEYgICAgICAvKiBBdWRpZ3kgc2FtcGxlIHJhdGUgY29udmVydG9yIG91dHB1dCByYXRlCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFX01BU0sJMHgwMDAwMDAwNwkvKiBTYW1wbGUgcmF0ZSBjb252ZXJ0b3Igb3V0cHV0IHJhdGUJCQkqLwotCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfNDgJMHgwMDAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV80NAkweDAwMDAwMDAxCS8qIDQ0LjFrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMzIJMHgwMDAwMDAwMgkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8yNAkweDAwMDAwMDAzCS8qIDI0a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzIyCTB4MDAwMDAwMDQJLyogMjIuMDVrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMTYJMHgwMDAwMDAwNQkvKiAxNmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8xMQkweDAwMDAwMDA2CS8qIDExLjAyNWtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzgJMHgwMDAwMDAwNwkvKiA4a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotCi0jZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV8xMgkweDAwMDAwMDA2CS8qIDEya0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfMTEJMHgwMDAwMDAwNwkvKiAxMS4wMjVrSHogc2FtcGxlIHJhdGUJCQkJKi8KLSNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFXzgJMHgwMDAwMDAwOAkvKiA4a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotCi0jZGVmaW5lIEZYV0MJCQkweDQzCQkvKiBGWCBvdXRwdXQgd3JpdGUgY2hhbm5lbHMgcmVnaXN0ZXIJCQkqLwotCQkJCQkJLyogV2hlbiBzZXQsIGVhY2ggYml0IGVuYWJsZXMgdGhlIHdyaXRpbmcgb2YgdGhlCSovCi0JCQkJCQkvKiBjb3JyZXNwb25kaW5nIEZYIG91dHB1dCBjaGFubmVsIChpbnRlcm5hbCByZWdpc3RlcnMgICovCi0JCQkJCQkvKiAweDIwLTB4M2YpIGludG8gaG9zdCBtZW1vcnkuIFRoaXMgbW9kZSBvZiByZWNvcmRpbmcJKi8KLQkJCQkJCS8qIGlzIDE2Yml0LCA0OEtIeiBvbmx5LiBBbGwgMzIJY2hhbm5lbHMgY2FuIGJlIGVuYWJsZWQgKi8KLQkJCQkJCS8qIHNpbXVsdGFuZW91c2x5LgkJCQkJKi8KLSNkZWZpbmUgVENCUwkJCTB4NDQJCS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUQ0JTX01BU0sJCTB4MDAwMDAwMDcJLyogVGFuayBjYWNoZSBidWZmZXIgc2l6ZSBmaWVsZAkJCQkqLwotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzE2SwkweDAwMDAwMDAwCi0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMzJLCTB4MDAwMDAwMDEKLSNkZWZpbmUgVENCU19CVUZGU0laRV82NEsJMHgwMDAwMDAwMgotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzEyOEsJMHgwMDAwMDAwMwotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzI1NksJMHgwMDAwMDAwNAotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzUxMksJMHgwMDAwMDAwNQotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzEwMjRLCTB4MDAwMDAwMDYKLSNkZWZpbmUgVENCU19CVUZGU0laRV8yMDQ4SwkweDAwMDAwMDA3Ci0KLSNkZWZpbmUgTUlDQkEJCQkweDQ1CQkvKiBBQzk3IG1pY3JvcGhvbmUgYnVmZmVyIGFkZHJlc3MgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1JQ0JBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KLQotI2RlZmluZSBBRENCQQkJCTB4NDYJCS8qIEFEQyBidWZmZXIgYWRkcmVzcyByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBBRENCQV9NQVNLCQkweGZmZmZmMDAwCS8qIDIwIGJpdCBiYXNlIGFkZHJlc3MJCQkJCSovCi0KLSNkZWZpbmUgRlhCQQkJCTB4NDcJCS8qIEZYIEJ1ZmZlciBBZGRyZXNzICovCi0jZGVmaW5lIEZYQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLwotCi0jZGVmaW5lIE1JQ0JTCQkJMHg0OQkJLyogTWljcm9waG9uZSBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCSovCi0KLSNkZWZpbmUgQURDQlMJCQkweDRhCQkvKiBBREMgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBGWEJTCQkJMHg0YgkJLyogRlggYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkJKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYXNrIHZhbHVlcyBkZWZpbmUgdGhlIHNpemUgb2YgdGhlIEFEQywgTUlYIGFuZCBGWCBidWZmZXJzIGluIGJ5dGVzICovCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfTk9ORQkweDAwMDAwMDAwCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzg0CTB4MDAwMDAwMDEKLSNkZWZpbmUgQURDQlNfQlVGU0laRV80NDgJMHgwMDAwMDAwMgotI2RlZmluZSBBRENCU19CVUZTSVpFXzUxMgkweDAwMDAwMDAzCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjQwCTB4MDAwMDAwMDQKLSNkZWZpbmUgQURDQlNfQlVGU0laRV83NjgJMHgwMDAwMDAwNQotI2RlZmluZSBBRENCU19CVUZTSVpFXzg5NgkweDAwMDAwMDA2Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTAyNAkweDAwMDAwMDA3Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTI4MAkweDAwMDAwMDA4Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTUzNgkweDAwMDAwMDA5Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTc5MgkweDAwMDAwMDBhCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjA0OAkweDAwMDAwMDBiCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjU2MAkweDAwMDAwMDBjCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzA3MgkweDAwMDAwMDBkCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzU4NAkweDAwMDAwMDBlCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDA5NgkweDAwMDAwMDBmCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNTEyMAkweDAwMDAwMDEwCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjE0NAkweDAwMDAwMDExCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNzE2OAkweDAwMDAwMDEyCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfODE5MgkweDAwMDAwMDEzCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTAyNDAJMHgwMDAwMDAxNAotI2RlZmluZSBBRENCU19CVUZTSVpFXzEyMjg4CTB4MDAwMDAwMTUKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xNDM2NgkweDAwMDAwMDE2Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTYzODQJMHgwMDAwMDAxNwotI2RlZmluZSBBRENCU19CVUZTSVpFXzIwNDgwCTB4MDAwMDAwMTgKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8yNDU3NgkweDAwMDAwMDE5Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjg2NzIJMHgwMDAwMDAxYQotI2RlZmluZSBBRENCU19CVUZTSVpFXzMyNzY4CTB4MDAwMDAwMWIKLSNkZWZpbmUgQURDQlNfQlVGU0laRV80MDk2MAkweDAwMDAwMDFjCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDkxNTIJMHgwMDAwMDAxZAotI2RlZmluZSBBRENCU19CVUZTSVpFXzU3MzQ0CTB4MDAwMDAwMWUKLSNkZWZpbmUgQURDQlNfQlVGU0laRV82NTUzNgkweDAwMDAwMDFmCi0KLQotI2RlZmluZSBDRENTCQkJMHg1MAkJLyogQ0QtUk9NIGRpZ2l0YWwgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBHUFNDUwkJCTB4NTEJCS8qIEdlbmVyYWwgUHVycG9zZSBTUERJRiBjaGFubmVsIHN0YXR1cyByZWdpc3RlciovCi0KLSNkZWZpbmUgREJHCQkJMHg1MgkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCi0KLS8qIGRlZmluaXRpb25zIGZvciBkZWJ1ZyByZWdpc3RlciAtIHRha2VuIGZyb20gdGhlIGFsc2EgZHJpdmVycyAqLwotI2RlZmluZSBEQkdfWkMgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAgICAgLyogemVybyB0cmFtIGNvdW50ZXIgKi8KLSNkZWZpbmUgREJHX1NBVFVSQVRJT05fT0NDVVJFRCAgMHgwMjAwMDAwMCAgICAgIC8qIHNhdHVyYXRpb24gY29udHJvbCAqLwotI2RlZmluZSBEQkdfU0FUVVJBVElPTl9BRERSICAgICAweDAxZmYwMDAwICAgICAgLyogc2F0dXJhdGlvbiBhZGRyZXNzICovCi0jZGVmaW5lIERCR19TSU5HTEVfU1RFUCAgICAgICAgIDB4MDAwMDgwMDAgICAgICAvKiBzaW5nbGUgc3RlcCBtb2RlICovCi0jZGVmaW5lIERCR19TVEVQICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgICAgICAvKiBzdGFydCBzaW5nbGUgc3RlcCAqLwotI2RlZmluZSBEQkdfQ09ORElUSU9OX0NPREUgICAgICAweDAwMDAzZTAwICAgICAgLyogY29uZGl0aW9uIGNvZGUgKi8KLSNkZWZpbmUgREJHX1NJTkdMRV9TVEVQX0FERFIgICAgMHgwMDAwMDFmZiAgICAgIC8qIHNpbmdsZSBzdGVwIGFkZHJlc3MgKi8KLQotCi0jZGVmaW5lIFJFRzUzCQkJMHg1MwkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCi0KLSNkZWZpbmUgQV9EQkcJCQkgMHg1MwotI2RlZmluZSBBX0RCR19TSU5HTEVfU1RFUAkgMHgwMDAyMDAwMAkvKiBTZXQgdG8gemVybyB0byBzdGFydCBkc3AgKi8KLSNkZWZpbmUgQV9EQkdfWkMJCSAweDQwMDAwMDAwCS8qIHplcm8gdHJhbSBjb3VudGVyICovCi0jZGVmaW5lIEFfREJHX1NURVBfQUREUgkJIDB4MDAwMDAzZmYKLSNkZWZpbmUgQV9EQkdfU0FUVVJBVElPTl9PQ0NVUkVEIDB4MjAwMDAwMDAKLSNkZWZpbmUgQV9EQkdfU0FUVVJBVElPTl9BRERSCSAweDBmZmMwMDAwCi0KLSNkZWZpbmUgU1BDUzAJCQkweDU0CQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMCByZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNQQ1MxCQkJMHg1NQkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDEgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBTUENTMgkJCTB4NTYJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAyIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgU1BDU19DTEtBQ0NZTUFTSwkweDMwMDAwMDAwCS8qIENsb2NrIGFjY3VyYWN5CQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNCTB4MDAwMDAwMDAJLyogMTAwMCBwYXJ0cyBwZXIgbWlsbGlvbgkJCSovCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWV81MFBQTQkweDEwMDAwMDAwCS8qIDUwIHBhcnRzIHBlciBtaWxsaW9uCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWV9WQVJJQUJMRQkweDIwMDAwMDAwCS8qIFZhcmlhYmxlIGFjY3VyYWN5CQkJCSovCi0jZGVmaW5lIFNQQ1NfU0FNUExFUkFURU1BU0sJMHgwZjAwMDAwMAkvKiBTYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ0CTB4MDAwMDAwMDAJLyogNDQuMWtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfNDgJMHgwMjAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfMzIJMHgwMzAwMDAwMAkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBTUENTX0NIQU5ORUxOVU1NQVNLCTB4MDBmMDAwMDAJLyogQ2hhbm5lbCBudW1iZXIJCQkJKi8KLSNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX1VOU1BFQwkweDAwMDAwMDAwCS8qIFVuc3BlY2lmaWVkIGNoYW5uZWwgbnVtYmVyCQkJKi8KLSNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX0xFRlQJMHgwMDEwMDAwMAkvKiBMZWZ0IGNoYW5uZWwJCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9SSUdIVAkweDAwMjAwMDAwCS8qIFJpZ2h0IGNoYW5uZWwJCQkJKi8KLSNkZWZpbmUgU1BDU19TT1VSQ0VOVU1NQVNLCTB4MDAwZjAwMDAJLyogU291cmNlIG51bWJlcgkJCQkqLwotI2RlZmluZSBTUENTX1NPVVJDRU5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBzb3VyY2UgbnVtYmVyCQkJKi8KLSNkZWZpbmUgU1BDU19HRU5FUkFUSU9OU1RBVFVTCTB4MDAwMDgwMDAJLyogT3JpZ2luYWxpdHkgZmxhZyAoc2VlIElFQy05NTggc3BlYykJCSovCi0jZGVmaW5lIFNQQ1NfQ0FURUdPUllDT0RFTUFTSwkweDAwMDA3ZjAwCS8qIENhdGVnb3J5IGNvZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLwotI2RlZmluZSBTUENTX01PREVNQVNLCQkweDAwMDAwMGMwCS8qIE1vZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkJKi8KLSNkZWZpbmUgU1BDU19FTVBIQVNJU01BU0sJMHgwMDAwMDAzOAkvKiBFbXBoYXNpcwkJCQkJKi8KLSNkZWZpbmUgU1BDU19FTVBIQVNJU19OT05FCTB4MDAwMDAwMDAJLyogTm8gZW1waGFzaXMJCQkJCSovCi0jZGVmaW5lIFNQQ1NfRU1QSEFTSVNfNTBfMTUJMHgwMDAwMDAwOAkvKiA1MC8xNSB1c2VjIDIgY2hhbm5lbAkJCQkqLwotI2RlZmluZSBTUENTX0NPUFlSSUdIVAkJMHgwMDAwMDAwNAkvKiBDb3B5cmlnaHQgYXNzZXJ0ZWQgZmxhZyAtLSBkbyBub3QgbW9kaWZ5CSovCi0jZGVmaW5lIFNQQ1NfTk9UQVVESU9EQVRBCTB4MDAwMDAwMDIJLyogMCA9IERpZ2l0YWwgYXVkaW8sIDEgPSBub3QgYXVkaW8JCSovCi0jZGVmaW5lIFNQQ1NfUFJPRkVTU0lPTkFMCTB4MDAwMDAwMDEJLyogMCA9IENvbnN1bWVyIChJRUMtOTU4KSwgMSA9IHBybyAoQUVTMy0xOTkyKQkqLwotCi0vKiBUaGUgMzItYml0IENMSXggYW5kIFNPTHggcmVnaXN0ZXJzIGFsbCBoYXZlIG9uZSBiaXQgcGVyIGNoYW5uZWwgY29udHJvbC9zdGF0dXMgICAgICAJCSovCi0jZGVmaW5lIENMSUVMCQkJMHg1OAkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBlbmFibGUgbG93IHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgQ0xJRUgJCQkweDU5CQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IGVuYWJsZSBoaWdoIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgQ0xJUEwJCQkweDVhCQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IHBlbmRpbmcgbG93IHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgQ0xJUEgJCQkweDViCQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IHBlbmRpbmcgaGlnaCByZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNPTEVMCQkJMHg1YwkJLyogU3RvcCBvbiBsb29wIGVuYWJsZSBsb3cgcmVnaXN0ZXIJCSovCi0KLSNkZWZpbmUgU09MRUgJCQkweDVkCQkvKiBTdG9wIG9uIGxvb3AgZW5hYmxlIGhpZ2ggcmVnaXN0ZXIJCSovCi0KLSNkZWZpbmUgU1BCWVBBU1MJCTB4NWUJCS8qIFNQRElGIEJZUEFTUyBtb2RlIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BCWVBBU1NfRU5BQkxFCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBTUERJRiBieXBhc3MgbW9kZQkJCSovCi0KLSNkZWZpbmUgQUM5N1NMT1QJCTB4NWYJCS8qIGFkZGl0aW9uYWwgQUM5NyBzbG90cyBlbmFibGUgYml0cyAqLwotI2RlZmluZSBBQzk3U0xPVF9DTlRSCQkweDEwCQkvKiBDZW50ZXIgZW5hYmxlICovCi0jZGVmaW5lIEFDOTdTTE9UX0xGRQkJMHgyMAkJLyogTEZFIGVuYWJsZSAqLwotCi0jZGVmaW5lIENEU1JDUwkJCTB4NjAJCS8qIENELVJPTSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZXIgc3RhdHVzIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgR1BTUkNTCQkJMHg2MQkJLyogR2VuZXJhbCBQdXJwb3NlIFNQRElGIHNhbXBsZSByYXRlIGN2dCBzdGF0dXMgKi8KLQotI2RlZmluZSBaVlNSQ1MJCQkweDYyCQkvKiBaVmlkZW8gc2FtcGxlIHJhdGUgY29udmVydGVyIHN0YXR1cwkJKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgb25lIGhhcyBubyBTUERJRkxPQ0tFRCBmaWVsZAkqLwotCQkJCQkJLyogQXNzdW1lcyBzYW1wbGUgbG9jawkJCQkqLwotCi0vKiBUaGVzZSB0aHJlZSBiaXRmaWVsZHMgYXBwbHkgdG8gQ0RTUkNTLCBHUFNSQ1MsIGFuZCAoZXhjZXB0IGFzIG5vdGVkKSBaVlNSQ1MuCQkJKi8KLSNkZWZpbmUgU1JDU19TUERJRkxPQ0tFRAkweDAyMDAwMDAwCS8qIFNQRElGIHN0cmVhbSBsb2NrZWQJCQkJKi8KLSNkZWZpbmUgU1JDU19SQVRFTE9DS0VECQkweDAxMDAwMDAwCS8qIFNhbXBsZSByYXRlIGxvY2tlZAkJCQkqLwotI2RlZmluZSBTUkNTX0VTVFNBTVBMRVJBVEUJMHgwMDA3ZmZmZgkvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmllbGQuCQkJKi8KLQotCi0vKiBOb3RlIHRoYXQgdGhlc2UgdmFsdWVzIGNhbiB2YXJ5ICsvLSBieSBhIHNtYWxsIGFtb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTUkNTX1NQRElGUkFURV80NAkweDAwMDNhY2Q5Ci0jZGVmaW5lIFNSQ1NfU1BESUZSQVRFXzQ4CTB4MDAwNDAwMDAKLSNkZWZpbmUgU1JDU19TUERJRlJBVEVfOTYJMHgwMDA4MDAwMAotCi0jZGVmaW5lIE1JQ0lEWCAgICAgICAgICAgICAgICAgIDB4NjMgICAgICAgICAgICAvKiBNaWNyb3Bob25lIHJlY29yZGluZyBidWZmZXIgaW5kZXggcmVnaXN0ZXIgICAqLwotI2RlZmluZSBNSUNJRFhfTUFTSyAgICAgICAgICAgICAweDAwMDBmZmZmICAgICAgLyogMTYtYml0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlDSURYX0lEWAkJMHgxMDAwMDA2MwotCi0jZGVmaW5lIEFfQURDSURYCQkweDYzCi0jZGVmaW5lIEFfQURDSURYX0lEWAkJMHgxMDAwMDA2MwotCi0jZGVmaW5lIEFEQ0lEWAkJCTB4NjQJCS8qIEFEQyByZWNvcmRpbmcgYnVmZmVyIGluZGV4IHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBRENJRFhfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNiBiaXQgaW5kZXggZmllbGQJCQkJKi8KLSNkZWZpbmUgQURDSURYX0lEWAkJMHgxMDAwMDA2NAotCi0jZGVmaW5lIEZYSURYCQkJMHg2NQkJLyogRlggcmVjb3JkaW5nIGJ1ZmZlciBpbmRleCByZWdpc3RlcgkJKi8KLSNkZWZpbmUgRlhJRFhfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNi1iaXQgdmFsdWUJCQkJCSovCi0jZGVmaW5lIEZYSURYX0lEWAkJMHgxMDAwMDA2NQotCi0vKiBUaGlzIGlzIHRoZSBNUFUgcG9ydCBvbiB0aGUgY2FyZCAodmlhIHRoZSBnYW1lIHBvcnQpCQkJCQkJKi8KLSNkZWZpbmUgQV9NVURBVEExCQkweDcwCi0jZGVmaW5lIEFfTVVDTUQxCQkweDcxCi0jZGVmaW5lIEFfTVVTVEFUMQkJQV9NVUNNRDEKLQotLyogVGhpcyBpcyB0aGUgTVBVIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAJCQkJCQkJKi8KLSNkZWZpbmUgQV9NVURBVEEyCQkweDcyCi0jZGVmaW5lIEFfTVVDTUQyCQkweDczCi0jZGVmaW5lIEFfTVVTVEFUMgkJQV9NVUNNRDIJCi0KLS8qIFRoZSBuZXh0IHR3byBhcmUgdGhlIEF1ZGlneSBlcXVpdmFsZW50IG9mIEZYV0MJCQkJCQkqLwotLyogdGhlIEF1ZGlneSBjYW4gcmVjb3JkIGFueSBvdXRwdXQgKDE2Yml0LCA0OGtIeiwgdXAgdG8gNjQgY2hhbm5lbCBzaW11bHRhbmVvdXNseSkgCQkqLwotLyogRWFjaCBiaXQgc2VsZWN0cyBhIGNoYW5uZWwgZm9yIHJlY29yZGluZyAqLwotI2RlZmluZSBBX0ZYV0MxCQkJMHg3NCAgICAgICAgICAgIC8qIFNlbGVjdHMgMHg3Zi0weDYwIGZvciBGWCByZWNvcmRpbmcgICAgICAgICAgICovCi0jZGVmaW5lIEFfRlhXQzIJCQkweDc1CQkvKiBTZWxlY3RzIDB4OWYtMHg4MCBmb3IgRlggcmVjb3JkaW5nICAgICAgICAgICAqLwotCi0jZGVmaW5lIEFfU1BESUZfU0FNUExFUkFURQkweDc2CQkvKiBTZXQgdGhlIHNhbXBsZSByYXRlIG9mIFNQRElGIG91dHB1dAkJKi8KLSNkZWZpbmUgQV9TUERJRl80ODAwMAkJMHgwMDAwMDA4MAotI2RlZmluZSBBX1NQRElGXzQ0MTAwCQkweDAwMDAwMDAwCi0jZGVmaW5lIEFfU1BESUZfOTYwMDAJCTB4MDAwMDAwNDAKLQotI2RlZmluZSBBX0ZYUlQyCQkJMHg3YwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEUJCTB4MDAwMDAwM2YJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRQkqLwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEYJCTB4MDAwMDNmMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRgkqLwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEcJCTB4MDAzZjAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRwkqLwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEgJCTB4M2YwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgSAkqLwotCi0jZGVmaW5lIEFfU0VOREFNT1VOVFMJCTB4N2QKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfRV9NQVNLCTB4ZmYwMDAwMDAKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfRl9NQVNLCTB4MDBmZjAwMDAKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfR19NQVNLCTB4MDAwMGZmMDAKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfSF9NQVNLCTB4MDAwMDAwZmYKLQotLyogVGhlIHNlbmQgYW1vdW50cyBmb3IgdGhpcyBvbmUgYXJlIHRoZSBzYW1lIGFzIHVzZWQgd2l0aCB0aGUgZW11MTBrMSAqLwotI2RlZmluZSBBX0ZYUlQxCQkJMHg3ZQotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEEJCTB4MDAwMDAwM2YKLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxCCQkweDAwMDAzZjAwCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMQwkJMHgwMDNmMDAwMAotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEQJCTB4M2YwMDAwMDAKLQotCi0vKiBFYWNoIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpcyAzMiBiaXRzIGluIGxlbmd0aCwgYWxsIGJpdHMgYXJlIHVzZWQJCQkqLwotI2RlZmluZSBGWEdQUkVHQkFTRQkJMHgxMDAJCS8qIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYmFzZSAgICAgICAJKi8KLSNkZWZpbmUgQV9GWEdQUkVHQkFTRQkJMHg0MDAJCS8qIEF1ZGlneSBHUFJzLCAweDQwMCB0byAweDVmZgkJCSovCi0vKiBUYW5rIGF1ZGlvIGRhdGEgaXMgbG9nYXJpdGhtaWNhbGx5IGNvbXByZXNzZWQgZG93biB0byAxNiBiaXRzIGJlZm9yZSB3cml0aW5nIHRvIFRSQU0gYW5kIGlzCSovCi0vKiBkZWNvbXByZXNzZWQgYmFjayB0byAyMCBiaXRzIG9uIGEgcmVhZC4gIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDE2MCBsb2NhdGlvbnMsIHRoZSBsYXN0IDMyCSovCi0vKiBsb2NhdGlvbnMgYXJlIGZvciBleHRlcm5hbCBUUkFNLiAJCQkJCQkJCSovCi0jZGVmaW5lIFRBTktNRU1EQVRBUkVHQkFTRQkweDIwMAkJLyogVGFuayBtZW1vcnkgZGF0YSByZWdpc3RlcnMgYmFzZSAgICAgCQkqLwotI2RlZmluZSBUQU5LTUVNREFUQVJFR19NQVNLCTB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYXVkaW8gZGF0YSBmaWVsZAkJCSovCi0KLS8qIENvbWJpbmVkIGFkZHJlc3MgZmllbGQgYW5kIG1lbW9yeSBvcGNvZGUgb3IgZmxhZyBmaWVsZC4gIDE2MCBsb2NhdGlvbnMsIGxhc3QgMzIgYXJlIGV4dGVybmFsCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHQkFTRQkweDMwMAkJLyogVGFuayBtZW1vcnkgYWRkcmVzcyByZWdpc3RlcnMgYmFzZQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUREUl9NQVNLIDB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYWRkcmVzcyBmaWVsZAkJCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX0NMRUFSCTB4MDA4MDAwMDAJLyogQ2xlYXIgdGFuayBtZW1vcnkJCQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUxJR04JMHgwMDQwMDAwMAkvKiBBbGlnbiByZWFkIG9yIHdyaXRlIHJlbGF0aXZlIHRvIHRhbmsgYWNjZXNzCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX1dSSVRFCTB4MDAyMDAwMDAJLyogV3JpdGUgdG8gdGFuayBtZW1vcnkJCQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfUkVBRAkweDAwMTAwMDAwCS8qIFJlYWQgZnJvbSB0YW5rIG1lbW9yeQkJCSovCi0KLSNkZWZpbmUgTUlDUk9DT0RFQkFTRQkJMHg0MDAJCS8qIE1pY3JvY29kZSBkYXRhIGJhc2UgYWRkcmVzcwkJCSovCi0KLS8qIEVhY2ggRFNQIG1pY3JvY29kZSBpbnN0cnVjdGlvbiBpcyBtYXBwZWQgaW50byAyIGRvdWJsZXdvcmRzIAkJCQkJKi8KLS8qIE5PVEU6IFdoZW4gd3JpdGluZywgYWx3YXlzIHdyaXRlIHRoZSBMTyBkb3VibGV3b3JkIGZpcnN0LiAgUmVhZHMgY2FuIGJlIGluIGVpdGhlciBvcmRlci4JKi8KLSNkZWZpbmUgTE9XT1JEX09QWF9NQVNLCQkweDAwMGZmYzAwCS8qIEluc3RydWN0aW9uIG9wZXJhbmQgWAkJCSovCi0jZGVmaW5lIExPV09SRF9PUFlfTUFTSwkJMHgwMDAwMDNmZgkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIFkJCQkqLwotI2RlZmluZSBISVdPUkRfT1BDT0RFX01BU0sJMHgwMGYwMDAwMAkvKiBJbnN0cnVjdGlvbiBvcGNvZGUJCQkJKi8KLSNkZWZpbmUgSElXT1JEX1JFU1VMVF9NQVNLCTB4MDAwZmZjMDAJLyogSW5zdHJ1Y3Rpb24gcmVzdWx0CQkJCSovCi0jZGVmaW5lIEhJV09SRF9PUEFfTUFTSwkJMHgwMDAwMDNmZgkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIEEJCQkqLwotCi0KLS8qIEF1ZGlneSBTb3VuZGNhcmQgaGF2ZSBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBmb3JtYXQgKi8KLSNkZWZpbmUgQVVESUdZX0NPREVCQVNFCQkweDYwMAotI2RlZmluZSBBX0xPV09SRF9PUFlfTUFTSwkweDAwMDAwN2ZmCQkKLSNkZWZpbmUgQV9MT1dPUkRfT1BYX01BU0sJMHgwMDdmZjAwMAotI2RlZmluZSBBX0hJV09SRF9PUENPREVfTUFTSwkweDBmMDAwMDAwCi0jZGVmaW5lIEFfSElXT1JEX1JFU1VMVF9NQVNLCTB4MDA3ZmYwMDAKLSNkZWZpbmUgQV9ISVdPUkRfT1BBX01BU0sJMHgwMDAwMDdmZgotCi0KLSNlbmRpZiAvKiBfODAxMF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZSBiL3NvdW5kL29zcy9lbXUxMGsxL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FmOWNjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgQ3JlYXRpdmUgTGFicyBFTVUxMEsxIAotIwotIyAxMiBBcHIgMjAwMCBSdWkgU291c2EKLQotb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpICs9IGVtdTEwazEubwotCi1lbXUxMGsxLW9ianMgOj0gYXVkaW8ubyBjYXJkbWkubyBjYXJkbW8ubyBjYXJkd2kubyBjYXJkd28ubyBlY2FyZC5vIFwKLSAgICAgICAgICAgICAgICBlZnhtZ3IubyBlbXVhZHhtZy5vIGh3YWNjZXNzLm8gaXJxbWdyLm8gbWFpbi5vIG1pZGkubyBcCi0gICAgICAgICAgICAgICAgbWl4ZXIubyBwYXNzdGhyb3VnaC5vIHJlY21nci5vIHRpbWVyLm8gdm9pY2VtZ3IubwotCi1pZmRlZiBERUJVRwotICAgIEVYVFJBX0NGTEFHUyArPSAtREVNVTEwSzFfREVCVUcKLWVuZGlmCi0KLWlmZGVmIENPTkZJR19NSURJX0VNVTEwSzEKLSAgICBFWFRSQV9DRkxBR1MgKz0gLURFTVUxMEsxX1NFUVVFTkNFUgotZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlYTIxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGF1ZGlvLmMgLS0gL2Rldi9kc3AgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkJICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHR5cGVzL2xlYWtzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiY2FyZHdvLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vZnJhZyhzdHJ1Y3Qgd29pbnN0ICopOwotc3RhdGljIHZvaWQgY2FsY3VsYXRlX2lmcmFnKHN0cnVjdCB3aWluc3QgKik7Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpOwotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlaW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKTsKLQotLyogQXVkaW8gZmlsZSBvcGVyYXRpb25zICovCi1zdGF0aWMgc3NpemVfdCBlbXUxMGsxX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXNzaXplX3QgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBEKDMsICJlbXUxMGsxX2F1ZGlvX3JlYWQoKSwgYnVmZmVyPSVwLCBjb3VudD0lZFxuIiwgYnVmZmVyLCAodTMyKSBjb3VudCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh3aWluc3QtPm1tYXBwZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKLQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0KLQkJd2hpbGUgKGVtdTEwazFfd2F2ZWluX29wZW4od2F2ZV9kZXYpIDwgMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2F2ZV9kZXYtPmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJdTMyIGJ5dGVzdG9jb3B5OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpCi0JCQllbXUxMGsxX3dhdmVpbl9zdGFydCh3YXZlX2Rldik7Ci0KLQkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJRFBEKDMsICJieXRlc3RvY29weSAtLT4gJWRcbiIsIGJ5dGVzdG9jb3B5KTsKLQotCQlpZiAoKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCi0JCSAgICB8fCAoYnl0ZXN0b2NvcHkgPj0gY291bnQpKSB7Ci0JCQlpbnQgcmM7Ci0KLQkJCWJ5dGVzdG9jb3B5ID0gbWluX3QodTMyLCBieXRlc3RvY29weSwgY291bnQpOwotCi0JCQlyYyA9IGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHdpaW5zdCwKLQkJCQkJCSAgICAgKHU4IF9fdXNlciAqKWJ1ZmZlciwKLQkJCQkJCSAgICAgJmJ5dGVzdG9jb3B5KTsKLQkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWNvdW50IC09IGJ5dGVzdG9jb3B5OwotCQkJYnVmZmVyICs9IGJ5dGVzdG9jb3B5OwotCQkJcmV0ICs9IGJ5dGVzdG9jb3B5OwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCSAgICB8fCAoISh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKSkKLQkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FQUdBSU4pOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3aWluc3QtPndhaXRfcXVldWUpOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRVJFU1RBUlRTWVMpOwotCi0JCX0KLQl9Ci0KLQlEUEQoMywgImJ5dGVzIGNvcGllZCAtPiAlZFxuIiwgKHUzMikgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVtdTEwazFfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXNzaXplX3QgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEQoMywgImVtdTEwazFfYXVkaW9fd3JpdGUoKSwgYnVmZmVyPSVwLCBjb3VudD0lZFxuIiwgYnVmZmVyLCAodTMyKSBjb3VudCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHdvaW5zdC0+bW1hcHBlZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JLy8gVGhpcyBpcyBmb3IgZW11MTBrMSByZXZzIGxlc3MgdGhhbiA3LCB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdHJhbQotCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSB7Ci0JCWludCByOwotCQkKLQkJd29pbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gUFRfQkxPQ0tTSVpFX0xPRzI7Ci0JCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gUFRfQkxPQ0tDT1VOVDsKLQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0JCQotCQlyID0gZW11MTBrMV9wdF93cml0ZShmaWxlLCBidWZmZXIsIGNvdW50KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByOwotCX0KLQotCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKSB7Ci0JCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOwotCi0JCXdoaWxlIChlbXUxMGsxX3dhdmVvdXRfb3Blbih3YXZlX2RldikgPCAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJCXJldHVybiAtRUFHQUlOOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3YXZlX2Rldi0+Y2FyZC0+b3Blbl93YWl0KTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gMDsKLQlpZiAoY291bnQgJSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnNhbXBsZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotCWNvdW50IC89IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJdTMyIGJ5dGVzdG9jb3B5OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlEUEQoMywgImJ5dGVzdG9jb3B5IC0tPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOwotCi0JCWlmICgoYnl0ZXN0b2NvcHkgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKLQkJICAgIHx8IChieXRlc3RvY29weSA+PSBjb3VudCkpIHsKLQotCQkJYnl0ZXN0b2NvcHkgPSBtaW5fdCh1MzIsIGJ5dGVzdG9jb3B5LCBjb3VudCk7Ci0KLQkJCWVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YSh3b2luc3QsICh1OCBfX3VzZXIgKikgYnVmZmVyLCAmYnl0ZXN0b2NvcHkpOwotCi0JCQljb3VudCAtPSBieXRlc3RvY29weTsKLQkJCWJ1ZmZlciArPSBieXRlc3RvY29weSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCXJldCArPSBieXRlc3RvY29weSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgKz0gYnl0ZXN0b2NvcHk7Ci0KLQkJCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpCi0JCQkgICAgJiYgKHdvaW5zdC0+dG90YWxfY29waWVkID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpKQotCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCSAgICB8fCAoISh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKSkpCi0JCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRUFHQUlOKTsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTKTsKLQkJfQotCX0KLQotCURQRCgzLCAiYnl0ZXMgY29waWVkIC0+ICVkXG4iLCAodTMyKSByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSBOVUxMOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IE5VTEw7Ci0JaW50IHZhbCA9IDA7Ci0JdTMyIGJ5dGVzdG9jb3B5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwotCi0JRFBGKDQsICJlbXUxMGsxX2F1ZGlvX2lvY3RsKClcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQl3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCXdpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCURQRigyLCAiT1NTX0dFVFZFUlNJT046XG4iKTsKLQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1JFU0VUOgotCQlEUEYoMiwgIlNORENUTF9EU1BfUkVTRVQ6XG4iKTsKLQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgPSBQQ01fRU5BQkxFX09VVFBVVCB8IFBDTV9FTkFCTEVfSU5QVVQ7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJd29pbnN0LT5tbWFwcGVkID0gMDsKLQkJCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKLQkJCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKLQkJCXdvaW5zdC0+YmxvY2tzID0gMDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKLQkJCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOwotCQkJd2lpbnN0LT5ibG9ja3MgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1lOQzpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0KLQkJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJCQkJd2hpbGUgKCh3b2luc3QtPnRvdGFsX3BsYXllZCA8IHdvaW5zdC0+dG90YWxfY29waWVkKQotCQkJCQkgICAgICAgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0JCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCX0KLQkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJfQotCi0JCQl3b2luc3QtPm1tYXBwZWQgPSAwOwotCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgPSAwOwotCQkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOwotCQkJd29pbnN0LT5ibG9ja3MgPSAwOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlaW5fY2xvc2Uod2F2ZV9kZXYpOwotCQkJfQotCi0JCQl3aWluc3QtPm1tYXBwZWQgPSAwOwotCQkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7Ci0JCQl3aWluc3QtPmJsb2NrcyA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUQ0FQUzpcbiIpOwotCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKLQkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAgfAotCQkJCURTUF9DQVBfQ09QUk9DfCBEU1BfQ0FQX01VTFRJLCBwKTsKLQljYXNlIFNORENUTF9EU1BfU1BFRUQ6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TUEVFRDpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICJ2YWwgaXMgJWRcbiIsIHZhbCk7Ci0KLQkJaWYgKHZhbCA+IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5zYW1wbGluZ3JhdGUgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIHNhbXBsaW5nIHJhdGUgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuc2FtcGxpbmdyYXRlID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBzYW1wbGluZyByYXRlIC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1RFUkVPOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgIiB2YWwgaXMgJWRcbiIsIHZhbCk7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7Ci0JCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKLQotCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzIC0gMTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQlEUEQoMiwgInNldCByZWNvcmRpbmcgc3RlcmVvIC0+ICVkXG4iLCB2YWwpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWZvcm1hdCA9IHdvaW5zdC0+Zm9ybWF0OwotCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsID8gMiA6IDE7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgLSAxOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgc3RlcmVvIC0+ICVkXG4iLCB2YWwpOwotCQl9Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOwotCi0JCWlmICh2YWwgPiAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIG51bWJlciBvZiBjaGFubmVscyAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKLQkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VURk1UUzpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gQUZNVF9TMTZfTEU7Ci0JCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7Ci0JCQlpZiAoZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZ3YXZlX2Rldi0+Y2FyZC0+bWdyLAotCQkJCQkJICAgICB3YXZlX2Rldi0+Y2FyZC0+cHQucGF0Y2hfbmFtZSwgCi0JCQkJCQkgICAgIHdhdmVfZGV2LT5jYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUpID49IDApCi0JCQkJdmFsIHw9IEFGTVRfQUMzOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoJLyogU2FtZSBhcyBTTkRDVExfRFNQX1NBTVBMRVNJWkUgKi8KLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVEZNVDpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOwotCi0JCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LmlkID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5pZDsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBmb3JtYXQgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuaWQgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5pZDsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIGZvcm1hdCAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5pZDsKLQkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmlkOwotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsOwotCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKLQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKLQkJRFBGKDIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgotCQlEUEYoMiwgIlNPVU5EX1BDTV9SRUFEX0ZJTFRFUjogbm90IGltcGxlbWVudGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VUU1lOQ1JPOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUVFJJR0dFUjpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpCi0JCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpCi0JCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwotCQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQotCQkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOwotCQkJfSBlbHNlIHsKLQkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7Ci0JCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkJCWVtdTEwazFfd2F2ZW91dF9zdG9wKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewotCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzIHw9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0JCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pCi0JCQkJCWVtdTEwazFfd2F2ZWluX3N0YXJ0KHdhdmVfZGV2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgJj0gflBDTV9FTkFCTEVfSU5QVVQ7Ci0JCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkJCWVtdTEwazFfd2F2ZWluX3N0b3Aod2F2ZV9kZXYpOwotCQkJfQotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JCXsKLQkJCWF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0KLQkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRPU1BBQ0U6XG4iKTsKLQotCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0JCQkJaW5mby5ieXRlcyA9IGJ5dGVzdG9jb3B5OwotCQkJfSBlbHNlIHsKLQkJCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQkJCQlpbmZvLmJ5dGVzID0gd29pbnN0LT5idWZmZXIuc2l6ZTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpbmZvLmJ5dGVzICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCWluZm8uZnJhZ3NpemUgPSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICogd29pbnN0LT5udW1fdm9pY2VzOwotCQkJaW5mby5mcmFnc3RvdGFsID0gd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQlpbmZvLmZyYWdtZW50cyA9IGluZm8uYnl0ZXMgLyBpbmZvLmZyYWdzaXplOwotCi0JCQlpZiAoY29weV90b191c2VyKHAsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJewotCQkJYXVkaW9fYnVmX2luZm8gaW5mbzsKLQotCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVElTUEFDRTpcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7Ci0JCQkJZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUod2lpbnN0LCAmYnl0ZXN0b2NvcHkpOwotCQkJCWluZm8uYnl0ZXMgPSBieXRlc3RvY29weTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0JCQkJaW5mby5ieXRlcyA9IDA7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaW5mby5mcmFnc3RvdGFsID0gd2lpbnN0LT5idWZmZXIubnVtZnJhZ3M7Ci0JCQlpbmZvLmZyYWdtZW50cyA9IGluZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCQkJaW5mby5mcmFnc2l6ZSA9IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9OT05CTE9DSzpcbiIpOwotCi0JCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgotCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT0RFTEFZOlxuIik7Ci0KLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQkJCXZhbCA9IHdvaW5zdC0+YnVmZmVyLnNpemUgLSBieXRlc3RvY29weTsKLQkJfSBlbHNlCi0JCQl2YWwgPSAwOwotCi0JCXZhbCAqPSB3b2luc3QtPm51bV92b2ljZXM7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6Ci0JCXsKLQkJCWNvdW50X2luZm8gY2luZm87Ci0KLQkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRJUFRSOiBcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQkJCQljaW5mby5wdHIgPSB3aWluc3QtPmJ1ZmZlci5od19wb3M7Ci0JCQkJY2luZm8uYnl0ZXMgPSBjaW5mby5wdHIgKyB3aWluc3QtPnRvdGFsX3JlY29yZGVkIC0gd2lpbnN0LT50b3RhbF9yZWNvcmRlZCAlIHdpaW5zdC0+YnVmZmVyLnNpemU7Ci0JCQkJY2luZm8uYmxvY2tzID0gY2luZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplIC0gd2lpbnN0LT5ibG9ja3M7Ci0JCQkJd2lpbnN0LT5ibG9ja3MgPSBjaW5mby5ieXRlcyAvIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCWNpbmZvLnB0ciA9IDA7Ci0JCQkJY2luZm8uYnl0ZXMgPSAwOwotCQkJCWNpbmZvLmJsb2NrcyA9IDA7Ci0JCQl9Ci0KLQkJCWlmICh3aWluc3QtPm1tYXBwZWQpCi0JCQkJd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgJT0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgotCQl7Ci0JCQljb3VudF9pbmZvIGNpbmZvOwotCi0JCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT1BUUjpcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4gfHwgCi0JCQkgICAgKCh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSAmJiB3YXZlX2Rldi0+Y2FyZC0+cHQuc3RhdGUpKSB7Ci0JCQkJaW50IG51bV9mcmFnbWVudHM7Ci0KLQkJCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgewotCQkJCQllbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHdhdmVfZGV2KTsKLQkJCQkJY2luZm8uYnl0ZXMgPSB3b2luc3QtPnRvdGFsX3BsYXllZDsKLQkJCQl9IGVsc2UgewotCQkJCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JCQkJCWNpbmZvLmJ5dGVzID0gd29pbnN0LT50b3RhbF9wbGF5ZWQ7Ci0JCQkJfQotCi0JCQkJY2luZm8ucHRyID0gd29pbnN0LT5idWZmZXIuaHdfcG9zOwotCQkJCW51bV9mcmFnbWVudHMgPSBjaW5mby5ieXRlcyAvIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCQkJY2luZm8uYmxvY2tzID0gbnVtX2ZyYWdtZW50cyAtIHdvaW5zdC0+YmxvY2tzOwotCQkJCXdvaW5zdC0+YmxvY2tzID0gbnVtX2ZyYWdtZW50czsKLQotCQkJCWNpbmZvLmJ5dGVzICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCQljaW5mby5wdHIgKj0gd29pbnN0LT5udW1fdm9pY2VzOwotCQkJfSBlbHNlIHsKLQkJCQljaW5mby5wdHIgPSAwOwotCQkJCWNpbmZvLmJ5dGVzID0gMDsKLQkJCQljaW5mby5ibG9ja3MgPSAwOwotCQkJfQotCi0JCQlpZiAod29pbnN0LT5tbWFwcGVkKQotCQkJCXdvaW5zdC0+YnVmZmVyLmZyZWVfYnl0ZXMgJT0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQkJCXZhbCA9IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0JCQl2YWwgPSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkJICAgICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQotCQkJICAgICYmICh3b2luc3QtPnRvdGFsX2NvcGllZCA+IDApKQotCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1VCRElWSURFOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgInZhbCBpcyAlI3hcbiIsIHZhbCk7Ci0KLQkJaWYgKHZhbCA9PSAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkvKiBkaWdpdGFsIHBhc3MtdGhyb3VnaCBmcmFnbWVudCBjb3VudCBhbmQgc2l6ZSBhcmUgZml4ZWQgdmFsdWVzICovCi0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTiB8fCAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CS8qIHRvbyBsYXRlIHRvIGNoYW5nZSAqLwotCi0JCQl3b2luc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7Ci0JCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQotCQkJCXJldHVybiAtRUlOVkFMOwkvKiB0b28gbGF0ZSB0byBjaGFuZ2UgKi8KLQotCQkJd2lpbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwotCQkJd2lpbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfQ09QUl9MT0FEOgotCQl7Ci0JCQljb3ByX2J1ZmZlciAqYnVmOwotCQkJdTMyIGk7Ci0KLQkJCURQRig0LCAiU05EQ1RMX0NPUFJfTE9BRDpcbiIpOwotCi0JCQlidWYgPSBrbWFsbG9jKHNpemVvZihjb3ByX2J1ZmZlciksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFidWYpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHAsIHNpemVvZihjb3ByX2J1ZmZlcikpKSB7Ci0JCQkJa2ZyZWUgKGJ1Zik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCWlmICgoYnVmLT5jb21tYW5kICE9IENNRF9SRUFEKSAmJiAoYnVmLT5jb21tYW5kICE9IENNRF9XUklURSkpIHsKLQkJCQlrZnJlZSAoYnVmKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJaWYgKGJ1Zi0+Y29tbWFuZCA9PSBDTURfV1JJVEUpIHsKLQkJCQkKLSNpZmRlZiBEQkdFTVUKLQkJCQlpZiAoKGJ1Zi0+b2ZmcyA8IDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+IDB4ZTAwKSB8fCAoYnVmLT5sZW4gPiAxMDAwKSkgewotI2Vsc2UKLQkJCQlpZiAoKChidWYtPm9mZnMgPCAweDEwMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gKHdhdmVfZGV2LT5jYXJkLT5pc19hdWRpZ3kgPyAweGUwMCA6IDB4ODAwKSkgfHwgKGJ1Zi0+bGVuID4gMTAwMCkKLQkJCQkpICYmICEoCi0JCQkJCS8vYW55IHJlZ2lzdGVyIGFsbG93ZWQgcmF3IGFjY2VzcyB0byB1c2VycyBnb2VzIGhlcmU6Ci0JCQkJCShidWYtPm9mZnMgPT0gREJHIHx8Ci0JCQkJCSAgYnVmLT5vZmZzID09IEFfREJHKQotCQkJCQkmJiAoYnVmLT5sZW4gPT0gMSkpKSB7Ci0jZW5kaWYJCQotCQkJCQlrZnJlZShidWYpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoYnVmLT5vZmZzIDwgMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gMHhlMDApIHx8IChidWYtPmxlbiA+IDEwMDApKSB7Ci0JCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCX0JCQkKLQkJCQkKLQkJCWlmICgoKHVuc2lnbmVkKWJ1Zi0+ZmxhZ3MpID4gMHgzZikKLQkJCQlidWYtPmZsYWdzID0gMDsKLQotCQkJaWYgKGJ1Zi0+Y29tbWFuZCA9PSBDTURfUkVBRCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKQotCQkJCQkoKHUzMiAqKSBidWYtPmRhdGEpW2ldID0gc2JsaXZlX3JlYWRwdHIod2F2ZV9kZXYtPmNhcmQsIGJ1Zi0+b2ZmcyArIGksIGJ1Zi0+ZmxhZ3MpOwotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihwLCBidWYsIHNpemVvZihjb3ByX2J1ZmZlcikpKSB7Ci0JCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bGVuOyBpKyspCi0JCQkJCXNibGl2ZV93cml0ZXB0cih3YXZlX2Rldi0+Y2FyZCwgYnVmLT5vZmZzICsgaSwgYnVmLT5mbGFncywgKCh1MzIgKikgYnVmLT5kYXRhKVtpXSk7Ci0JCQl9Ci0KLQkJCWtmcmVlIChidWYpOwotCQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6CQkvKiBEZWZhdWx0IGlzIHVucmVjb2duaXplZCBjb21tYW5kICovCi0JCURQRCgyLCAiZGVmYXVsdDogJSN4XG4iLCBjbWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZW11MTBrMV9tbV9ub3BhZ2UgKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0Jc3RydWN0IHBhZ2UgKmRtYXBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBwZ29mZjsKLQlpbnQgcmQsIHdyOwotCi0JRFBGKDMsICJlbXUxMGsxX21tX25vcGFnZSgpXG4iKTsKLQlEUEQoMywgImFkZHI6ICUjbHhcbiIsIGFkZHJlc3MpOwotCi0JaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgewotCQlEUEYoMSwgIkVYSVQsIHJldHVybmluZyBOT1BBR0VfU0lHQlVTXG4iKTsKLQkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLwotCX0KLQotCXBnb2ZmID0gdm1hLT52bV9wZ29mZiArICgoYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpOwotCWlmICh3b2luc3QgIT0gTlVMTCkKLQkJd3IgPSB3b2luc3QtPm1tYXBwZWQ7Ci0JZWxzZQotCQl3ciA9IDA7Ci0KLQlpZiAod2lpbnN0ICE9IE5VTEwpCi0JCXJkID0gd2lpbnN0LT5tbWFwcGVkOwotCWVsc2UKLQkJcmQgPSAwOwotCi0JLyogaWYgZnVsbC1kdXBsZXggKHJlYWQrd3JpdGUpIGFuZCB3ZSBoYXZlIHR3byBzZXRzIG9mIGJ1ZnMsCi0JKiB0aGVuIHRoZSBwbGF5YmFjayBidWZmZXJzIGNvbWUgZmlyc3QsIHNleiBzb3VuZGNhcmQuYyAqLwotCWlmICh3cikgewotCQlpZiAocGdvZmYgPj0gd29pbnN0LT5idWZmZXIucGFnZXMpIHsKLQkJCXBnb2ZmIC09IHdvaW5zdC0+YnVmZmVyLnBhZ2VzOwotCQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAoKHU4ICopIHdpaW5zdC0+YnVmZmVyLmFkZHIgKyBwZ29mZiAqIFBBR0VfU0laRSk7Ci0JCX0gZWxzZQotCQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAod29pbnN0LT52b2ljZVswXS5tZW0uYWRkcltwZ29mZl0pOwotCX0gZWxzZSB7Ci0JCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKCh1OCAqKSB3aWluc3QtPmJ1ZmZlci5hZGRyICsgcGdvZmYgKiBQQUdFX1NJWkUpOwotCX0KLQotCWdldF9wYWdlIChkbWFwYWdlKTsKLQotCURQRCgzLCAicGFnZTogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGRtYXBhZ2UpOwotCWlmICh0eXBlKQotCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOwotCXJldHVybiBkbWFwYWdlOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGVtdTEwazFfbW1fb3BzID0gewotCS5ub3BhZ2UgICAgICAgICA9IGVtdTEwazFfbW1fbm9wYWdlLAotfTsKLQotc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzLCBuX3BhZ2VzLCBwZ29mZnNldDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSBOVUxMOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9hdWRpb19tbWFwKClcbiIpOwotCi0JbWF4X3BhZ2VzID0gMDsKLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7Ci0JCXdvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIE5vIG0nbWFwcGluZyBwb3NzaWJsZSBmb3IgbXVsdGljaGFubmVsICovCi0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAod29pbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgewotCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfb3Blbih3YXZlX2RldikgPCAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRVJST1IoKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCi0JCXdvaW5zdC0+bW1hcHBlZCA9IDE7Ci0JCW1heF9wYWdlcyArPSB3b2luc3QtPmJ1ZmZlci5wYWdlczsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7Ci0JCXdpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlpZiAod2lpbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgewotCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVpbl9vcGVuKHdhdmVfZGV2KSA8IDApIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlFUlJPUigpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJd2lpbnN0LT5tbWFwcGVkID0gMTsKLQkJbWF4X3BhZ2VzICs9IHdpaW5zdC0+YnVmZmVyLnBhZ2VzOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQluX3BhZ2VzID0gKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKLQlwZ29mZnNldCA9IHZtYS0+dm1fcGdvZmY7Ci0KLQlEUEQoMiwgInZtYV9zdGFydDogJSNseCwgdm1hX2VuZDogJSNseCwgdm1hX29mZnNldDogJWxkXG4iLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgcGdvZmZzZXQpOwotCURQRCgyLCAibl9wYWdlczogJWxkLCBtYXhfcGFnZXM6ICVsZFxuIiwgbl9wYWdlcywgbWF4X3BhZ2VzKTsKLQotCWlmIChwZ29mZnNldCArIG5fcGFnZXMgPiBtYXhfcGFnZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKLQl2bWEtPnZtX29wcyA9ICZlbXUxMGsxX21tX29wczsKLQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHdhdmVfZGV2OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2OwotCi0JRFBGKDIsICJlbXUxMGsxX2F1ZGlvX29wZW4oKVxuIik7Ci0KLQkvKiBDaGVjayBmb3IgY29ycmVjdCBkZXZpY2UgdG8gb3BlbiAqLwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7Ci0KLQkJaWYgKCEoKGNhcmQtPmF1ZGlvX2RldiBeIG1pbm9yKSAmIH4weGYpIHx8ICEoKGNhcmQtPmF1ZGlvX2RldjEgXiBtaW5vcikgJiB+MHhmKSkKLQkJCWdvdG8gbWF0Y2g7Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLW1hdGNoOgotCi0Jd2F2ZV9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAod2F2ZV9kZXYgPT0gTlVMTCkgeyAKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jd2F2ZV9kZXYtPmNhcmQgPSBjYXJkOwotCXdhdmVfZGV2LT53aWluc3QgPSBOVUxMOwotCXdhdmVfZGV2LT53b2luc3QgPSBOVUxMOwotCXdhdmVfZGV2LT5lbmFibGViaXRzID0gUENNX0VOQUJMRV9PVVRQVVQgfCBQQ01fRU5BQkxFX0lOUFVUOwkvKiBEZWZhdWx0ICovCi0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkvKiBSZWNvcmRpbmcgKi8KLQkJc3RydWN0IHdpaW5zdCAqd2lpbnN0OwotCi0JCWlmICgod2lpbnN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdpaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCQlFUlJPUigpOwotCQkJa2ZyZWUod2F2ZV9kZXYpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQl3aWluc3QtPnJlY3NyYyA9IGNhcmQtPndhdmVpbi5yZWNzcmM7Ci0gICAgICAgICAgICAgICAgd2lpbnN0LT5meHdjID0gY2FyZC0+d2F2ZWluLmZ4d2M7Ci0KLQkJc3dpdGNoICh3aWluc3QtPnJlY3NyYykgewotCQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOwotCQkJd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCXdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQkJd2lpbnN0LT5mb3JtYXQuaWQgPSBBRk1UX1MxNl9MRTsKLQkJCXdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7Ci0JCQl3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA0ODAwMDsKLQkJCXdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQl3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9IGh3ZWlnaHQzMih3aWluc3QtPmZ4d2MpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlrZnJlZSh3YXZlX2Rldik7Ci0JCQlrZnJlZSh3aWluc3QpOwotCQkJQlVHKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXdpaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKLQotCQl3aWluc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSAwOwotCQl3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplID0gMDsKLQkJd2lpbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAwOwotCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndpaW5zdC0+d2FpdF9xdWV1ZSk7Ci0KLQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKLQkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7Ci0JCXdpaW5zdC0+YmxvY2tzID0gMDsKLQkJc3Bpbl9sb2NrX2luaXQoJndpaW5zdC0+bG9jayk7Ci0JCXRhc2tsZXRfaW5pdCgmd2lpbnN0LT50aW1lci50YXNrbGV0LCBlbXUxMGsxX3dhdmVpbl9iaCwgKHVuc2lnbmVkIGxvbmcpIHdhdmVfZGV2KTsKLQkJd2F2ZV9kZXYtPndpaW5zdCA9IHdpaW5zdDsKLQkJZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmd2lpbnN0LT5mb3JtYXQpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7Ci0JCWludCBpOwotCi0JCWlmICgod29pbnN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdvaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCQlFUlJPUigpOwotCQkJa2ZyZWUod2F2ZV9kZXYpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlpZiAod2F2ZV9kZXYtPndpaW5zdCAhPSBOVUxMKSB7Ci0JCQl3b2luc3QtPmZvcm1hdCA9IHdhdmVfZGV2LT53aWluc3QtPmZvcm1hdDsKLQkJfSBlbHNlIHsKLQkJCXdvaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9VODsKLQkJCXdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7Ci0JCQl3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDg7Ci0JCQl3b2luc3QtPmZvcm1hdC5jaGFubmVscyA9IDE7Ci0JCX0KLQotCQl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7Ci0KLQkJd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSA9IDA7Ci0JCXdvaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IDA7Ci0JCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gMDsKLQkJd29pbnN0LT5kZXZpY2UgPSAoY2FyZC0+YXVkaW9fZGV2MSA9PSBtaW5vcik7Ci0JCXdvaW5zdC0+dGltZXIuc3RhdGUgPSBUSU1FUl9TVEFURV9VTklOU1RBTExFRDsKLQkJd29pbnN0LT5udW1fdm9pY2VzID0gMTsKLQkJZm9yIChpID0gMDsgaSA8IFdBVkVPVVRfTUFYVk9JQ0VTOyBpKyspIHsKLQkJCXdvaW5zdC0+dm9pY2VbaV0udXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOwotCQkJd29pbnN0LT52b2ljZVtpXS5tZW0uZW11cGFnZWluZGV4ID0gLTE7Ci0JCX0KLQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3b2luc3QtPndhaXRfcXVldWUpOwotCi0JCXdvaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKLQkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOwotCQl3b2luc3QtPmJsb2NrcyA9IDA7Ci0JCXNwaW5fbG9ja19pbml0KCZ3b2luc3QtPmxvY2spOwotCQl0YXNrbGV0X2luaXQoJndvaW5zdC0+dGltZXIudGFza2xldCwgZW11MTBrMV93YXZlb3V0X2JoLCAodW5zaWduZWQgbG9uZykgd2F2ZV9kZXYpOwotCQl3YXZlX2Rldi0+d29pbnN0ID0gd29pbnN0OwotCQllbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmd29pbnN0LT5mb3JtYXQpOwotCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIHdhdmVfZGV2OwotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0KLQlEUEYoMiwgImVtdTEwazFfYXVkaW9fcmVsZWFzZSgpXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJaWYod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2g9PTIpCi0JCQljYXJkLT5wdC5zdGF0ZT1QVF9TVEFURV9QTEFZSU5HOwotCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggJiYgY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpewotCQkJc3Bpbl9sb2NrKCZjYXJkLT5wdC5sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtdTEwazFfcHRfc3RvcChjYXJkKTsKLQkJCXNwaW5fdW5sb2NrKCZjYXJkLT5wdC5sb2NrKTsKLQkJfQotCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpIHsKLQkJCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKLQkJCQkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KQotCQkJCQkgICAgICAgJiYgKHdvaW5zdC0+dG90YWxfcGxheWVkIDwgd29pbnN0LT50b3RhbF9jb3BpZWQpKSB7Ci0JCQkJCQlEUEYoNCwgIkJ1ZmZlciBoYXNuJ3QgYmVlbiB0b3RhbGx5IHBsYXllZCwgc2xlZXAuLi4uXG4iKTsKLQkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJLyogcmVtb3ZlIHRoZSB0YXNrbGV0ICovCi0JCXRhc2tsZXRfa2lsbCgmd29pbnN0LT50aW1lci50YXNrbGV0KTsKLQkJa2ZyZWUod2F2ZV9kZXYtPndvaW5zdCk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl0YXNrbGV0X2tpbGwoJndpaW5zdC0+dGltZXIudGFza2xldCk7Ci0JCWtmcmVlKHdhdmVfZGV2LT53aWluc3QpOwotCX0KLQotCWtmcmVlKHdhdmVfZGV2KTsKLQotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjYXJkLT5vcGVuX3dhaXQpKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRklYTUUgc29ydCBvdXQgcG9sbCgpICsgbW1hcCgpICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwazFfYXVkaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0JdTMyIGJ5dGVzdG9jb3B5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoNCwgImVtdTEwazFfYXVkaW9fcG9sbCgpXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJcG9sbF93YWl0KGZpbGUsICZ3b2luc3QtPndhaXRfcXVldWUsIHdhaXQpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCXBvbGxfd2FpdChmaWxlLCAmd2lpbnN0LT53YWl0X3F1ZXVlLCB3YWl0KTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0KLQkJCWlmIChieXRlc3RvY29weSA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQotCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCX0gZWxzZQotCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQkJCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCQkJaWYgKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCi0JCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vZnJhZyhzdHJ1Y3Qgd29pbnN0ICp3b2luc3QpCi17Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0JdTMyIGZyYWdzaXplOwotCi0JaWYgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFidWZmZXItPm9zc2ZyYWdzaGlmdCkgewotCQlmcmFnc2l6ZSA9ICh3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlICogd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogV0FWRU9VVF9ERUZBVUxURlJBR0xFTikgLyAxMDAwIC0gMTsKLQotCQl3aGlsZSAoZnJhZ3NpemUpIHsKLQkJCWZyYWdzaXplID4+PSAxOwotCQkJYnVmZmVyLT5vc3NmcmFnc2hpZnQrKzsKLQkJfQotCX0KLQotCWlmIChidWZmZXItPm9zc2ZyYWdzaGlmdCA8IFdBVkVPVVRfTUlORlJBR1NISUZUKQotCQlidWZmZXItPm9zc2ZyYWdzaGlmdCA9IFdBVkVPVVRfTUlORlJBR1NISUZUOwotCi0JYnVmZmVyLT5mcmFnbWVudF9zaXplID0gMSA8PCBidWZmZXItPm9zc2ZyYWdzaGlmdDsKLQotCXdoaWxlIChidWZmZXItPmZyYWdtZW50X3NpemUgKiBXQVZFT1VUX01JTkZSQUdTID4gV0FWRU9VVF9NQVhCVUZTSVpFKQotCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7Ci0KLQkvKiBub3cgd2UgYXJlIHN1cmUgdGhhdDoKLQkgKDJeV0FWRU9VVF9NSU5GUkFHU0hJRlQpIDw9IChmcmFnbWVudF9zaXplID0gMl5uKSA8PSAoV0FWRU9VVF9NQVhCVUZTSVpFIC8gV0FWRU9VVF9NSU5GUkFHUykKLQkqLwotCi0JaWYgKCFidWZmZXItPm51bWZyYWdzKSB7Ci0JCXUzMiBudW1mcmFnczsKLQotCQludW1mcmFncyA9ICh3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlICogd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogV0FWRU9VVF9ERUZBVUxUQlVGTEVOKSAvCi0JCQkgICAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogMTAwMCkgLSAxOwotCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSAxOwotCi0JCXdoaWxlIChudW1mcmFncykgewotCQkJbnVtZnJhZ3MgPj49IDE7Ci0JCQlidWZmZXItPm51bWZyYWdzIDw8PSAxOwotCQl9Ci0JfQotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFT1VUX01JTkZSQUdTKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRU9VVF9NSU5GUkFHUzsKLQotCWlmIChidWZmZXItPm51bWZyYWdzICogYnVmZmVyLT5mcmFnbWVudF9zaXplID4gV0FWRU9VVF9NQVhCVUZTSVpFKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRU9VVF9NQVhCVUZTSVpFIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFT1VUX01JTkZSQUdTKQotCQlCVUcoKTsKLQotCWJ1ZmZlci0+c2l6ZSA9IGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIGJ1ZmZlci0+bnVtZnJhZ3M7Ci0JYnVmZmVyLT5wYWdlcyA9IGJ1ZmZlci0+c2l6ZSAvIFBBR0VfU0laRSArICgoYnVmZmVyLT5zaXplICUgUEFHRV9TSVpFKSA/IDEgOiAwKTsKLQotCURQRCgyLCAiIGNhbGN1bGF0ZWQgcGxheWJhY2sgZnJhZ21lbnRfc2l6ZSAtPiAlZFxuIiwgYnVmZmVyLT5mcmFnbWVudF9zaXplKTsKLQlEUEQoMiwgIiBjYWxjdWxhdGVkIHBsYXliYWNrIG51bWZyYWdzIC0+ICVkXG4iLCBidWZmZXItPm51bWZyYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgY2FsY3VsYXRlX2lmcmFnKHN0cnVjdCB3aWluc3QgKndpaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwotCXUzMiBmcmFnc2l6ZSwgYnVmc2l6ZSwgc2l6ZVs0XTsKLQlpbnQgaSwgajsKLQotCWlmIChidWZmZXItPmZyYWdtZW50X3NpemUpCi0JCXJldHVybjsKLQotCWlmICghYnVmZmVyLT5vc3NmcmFnc2hpZnQpIHsKLQkJZnJhZ3NpemUgPSAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWMgKiBXQVZFSU5fREVGQVVMVEZSQUdMRU4pIC8gMTAwMCAtIDE7Ci0KLQkJd2hpbGUgKGZyYWdzaXplKSB7Ci0JCQlmcmFnc2l6ZSA+Pj0gMTsKLQkJCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0Kys7Ci0JCX0KLQl9Ci0KLQlpZiAoYnVmZmVyLT5vc3NmcmFnc2hpZnQgPCBXQVZFSU5fTUlORlJBR1NISUZUKQotCQlidWZmZXItPm9zc2ZyYWdzaGlmdCA9IFdBVkVJTl9NSU5GUkFHU0hJRlQ7Ci0KLQlidWZmZXItPmZyYWdtZW50X3NpemUgPSAxIDw8IGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0OwotCi0Jd2hpbGUgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIFdBVkVJTl9NSU5GUkFHUyA+IFdBVkVJTl9NQVhCVUZTSVpFKQotCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7Ci0KLQkvKiBub3cgd2UgYXJlIHN1cmUgdGhhdDoKLQkgICAoMl5XQVZFSU5fTUlORlJBR1NISUZUKSA8PSAoZnJhZ21lbnRfc2l6ZSA9IDJebikgPD0gKFdBVkVJTl9NQVhCVUZTSVpFIC8gV0FWRUlOX01JTkZSQUdTKQotICAgICAgICAqLwotCi0KLQlpZiAoIWJ1ZmZlci0+bnVtZnJhZ3MpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWMgKiBXQVZFSU5fREVGQVVMVEJVRkxFTikgLyAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogMTAwMCkgLSAxOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFSU5fTUlORlJBR1MpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSBXQVZFSU5fTUlORlJBR1M7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyAqIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+IFdBVkVJTl9NQVhCVUZTSVpFKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRUlOX01BWEJVRlNJWkUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyA8IFdBVkVJTl9NSU5GUkFHUykKLQkJQlVHKCk7Ci0KLQlidWZzaXplID0gYnVmZmVyLT5mcmFnbWVudF9zaXplICogYnVmZmVyLT5udW1mcmFnczsKLQotCS8qIHRoZSBidWZmZXIgc2l6ZSBmb3IgcmVjb3JkaW5nIGlzIHJlc3RyaWN0ZWQgdG8gY2VydGFpbiB2YWx1ZXMsIGFkanVzdCBpdCBub3cgKi8KLQlpZiAoYnVmc2l6ZSA+PSAweDEwMDAwKSB7Ci0JCWJ1ZmZlci0+c2l6ZSA9IDB4MTAwMDA7Ci0JCWJ1ZmZlci0+c2l6ZXJlZ3ZhbCA9IDB4MWY7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyLT5zaXplID0gMDsKLQkJc2l6ZVswXSA9IDM4NDsKLQkJc2l6ZVsxXSA9IDQ0ODsKLQkJc2l6ZVsyXSA9IDUxMjsKLQkJc2l6ZVszXSA9IDY0MDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLQkJCQlpZiAoYnVmc2l6ZSA+PSBzaXplW2pdKSB7Ci0JCQkJCWJ1ZmZlci0+c2l6ZSA9IHNpemVbal07Ci0JCQkJCXNpemVbal0gKj0gMjsKLQkJCQkJYnVmZmVyLT5zaXplcmVndmFsID0gaSAqIDQgKyBqICsgMTsKLQkJCQl9IGVsc2UKLQkJCQkJZ290byBleGl0bG9vcDsKLQkgICAgICBleGl0bG9vcDoKLQkJaWYgKGJ1ZmZlci0+c2l6ZSA9PSAwKSB7Ci0JCQlidWZmZXItPnNpemUgPSAzODQ7Ci0JCQlidWZmZXItPnNpemVyZWd2YWwgPSAweDAxOwotCQl9Ci0JfQotCi0JLyogYWRqdXN0IHRoZSBmcmFnbWVudCBzaXplIHNvIHRoYXQgYnVmZmVyIHNpemUgaXMgYW4gaW50ZWdlciBtdWx0aXBsZSAqLwotCXdoaWxlIChidWZmZXItPnNpemUgJSBidWZmZXItPmZyYWdtZW50X3NpemUpCi0JCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+Pj0gMTsKLQotCWJ1ZmZlci0+bnVtZnJhZ3MgPSBidWZmZXItPnNpemUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7Ci0JYnVmZmVyLT5wYWdlcyA9ICBidWZmZXItPnNpemUgLyBQQUdFX1NJWkUgKyAoKGJ1ZmZlci0+c2l6ZSAlIFBBR0VfU0laRSkgPyAxIDogMCk7Ci0KLQlEUEQoMiwgIiBjYWxjdWxhdGVkIHJlY29yZGluZyBmcmFnbWVudF9zaXplIC0+ICVkXG4iLCBidWZmZXItPmZyYWdtZW50X3NpemUpOwotCURQRCgyLCAiIGNhbGN1bGF0ZWQgcmVjb3JkaW5nIG51bWZyYWdzIC0+ICVkXG4iLCBidWZmZXItPm51bWZyYWdzKTsKLQlEUEQoMiwgIiBidWZmZXIgc2l6ZSByZWdpc3RlciAtPiAlIzA0eFxuIiwgYnVmZmVyLT5zaXplcmVndmFsKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlaW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgcmVmZGF0YTsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXUzMiBieXRlc3RvY29weTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCF3aWluc3QpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIHsKLQkgCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3aWluc3QtPndhaXRfcXVldWUpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3aWluc3QtPndhaXRfcXVldWUpOwotCX0gZWxzZQotCQlEUEQoMywgIk5vdCBlbm91Z2ggdHJhbnNmZXIgc2l6ZSwgJWRcbiIsIGJ5dGVzdG9jb3B5KTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlb3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIHJlZmRhdGE7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQl1MzIgYnl0ZXN0b2NvcHk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghd29pbnN0KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCi0JaWYgKHdvaW5zdC0+YnVmZmVyLmZpbGxfc2lsZW5jZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHdvaW5zdCk7Ci0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGJ5dGVzdG9jb3B5ID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIHsKLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJndvaW5zdC0+d2FpdF9xdWV1ZSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCURQRCgzLCAiTm90IGVub3VnaCB0cmFuc2ZlciBzaXplIC0+ICVkXG4iLCBieXRlc3RvY29weSk7Ci0KLQlyZXR1cm47Ci19Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9hdWRpb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBlbXUxMGsxX2F1ZGlvX3JlYWQsCi0JLndyaXRlCQk9IGVtdTEwazFfYXVkaW9fd3JpdGUsCi0JLnBvbGwJCT0gZW11MTBrMV9hdWRpb19wb2xsLAotCS5pb2N0bAkJPSBlbXUxMGsxX2F1ZGlvX2lvY3RsLAotCS5tbWFwCQk9IGVtdTEwazFfYXVkaW9fbW1hcCwKLQkub3BlbgkJPSBlbXUxMGsxX2F1ZGlvX29wZW4sCi0JLnJlbGVhc2UJPSBlbXUxMGsxX2F1ZGlvX3JlbGVhc2UsCi19OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWU4MWIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGF1ZGlvLmMgLS0gL2Rldi9kc3AgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkJICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHR5cGVzL2xlYWtzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9BVURJT19ICi0jZGVmaW5lIF9BVURJT19ICi0KLXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UKLXsKLSAgICAgICAgc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqd2lpbnN0OwotICAgICAgICBzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7Ci0gICAgICAgIHUxNiBlbmFibGViaXRzOwotfTsKLQotI2VuZGlmIC8qIF9BVURJT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3NGY4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCisrKyAvZGV2L251bGwKQEAgLTEsODMyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHNibGl2ZV9taS5jIC0gTUlESSBVQVJUIGlucHV0IEhBTCBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW4gdXAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiY2FyZG1pLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0KLQotc3RhdGljIGludCBlbXUxMGsxX21wdWluX2NhbGxiYWNrKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1MzIgbXNnLCB1bnNpZ25lZCBsb25nIGRhdGEsIHUzMiBieXRlc3ZhbGlkKTsKLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUluaXQoc3RydWN0IGVtdTEwazFfbXB1aW4gKik7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlRW50cnkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVBhcnNlKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjIoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjMoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0V4Tm9ybShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzUmVhbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci0KLQotc3RhdGljIHN0cnVjdCB7Ci0JaW50ICgqRm4pIChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci19IG1pZGlzdGF0ZWZuW10gPSB7Ci0KLQl7Ci0Jc2JsaXZlX21pU3RhdGVQYXJzZX0sIHsKLQlzYmxpdmVfbWlTdGF0ZTNCeXRlfSwJLyogMHg4biwgMHg5biwgMHhBbiwgMHhCbiwgMHhFbiAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5fSwJLyogQnl0ZSAxICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsfSwJLyogQnl0ZSAyICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTJCeXRlfSwJLyogMHhDbiwgMHhEbiAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTJCeXRlS2V5fSwJLyogQnl0ZSAxICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJ9LAkvKiAweEYxICwgMHhGMyAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMktleX0sCS8qIDB4RjEgLCAweEYzLCBCeXRlIDEgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNDb21tb24zfSwJLyogMHhGMiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNLZXl9LAkvKiAweEYyICwgQnl0ZSAxICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbH0sCS8qIDB4RjIgLCBCeXRlIDIgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNFeE5vcm19LAkvKiAweEYwLCAweEY3LCBOb3JtYWwgbW9kZSAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzUmVhbH0JLyogMHhGNCAtIDB4RjYgLDB4RjggLSAweEZGICAgICAqLwotfTsKLQotCi0vKiBJbnN0YWxscyB0aGUgSVJRIGhhbmRsZXIgZm9yIHRoZSBNUFUgaW4gcG9ydCAgICAgICAgICAgICAgICAgKi8KLQotLyogYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX29wZW4oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IG1pZGlfb3BlbmluZm8gKm9wZW5pbmZvKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fb3BlblxuIik7Ci0KLQlpZiAoIShjYXJkX21wdWluLT5zdGF0dXMgJiBGTEFHU19BVkFJTEFCTEUpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb3B5IG9wZW4gaW5mbyBhbmQgbWFyayBjaGFubmVsIGFzIGluIHVzZSAqLwotCWNhcmRfbXB1aW4tPm9wZW5pbmZvID0gKm9wZW5pbmZvOwotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfQVZBSUxBQkxFOwkvKiBjbGVhciAqLwotCWNhcmRfbXB1aW4tPnN0YXR1cyB8PSBGTEFHU19SRUFEWTsJLyogc2V0ICovCi0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CS8qIGNsZWFyICovCi0JY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IE5VTEw7Ci0JY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQljYXJkX21wdWluLT5xaGVhZCA9IDA7Ci0JY2FyZF9tcHVpbi0+cXRhaWwgPSAwOwotCi0Jc2JsaXZlX21pU3RhdGVJbml0KGNhcmRfbXB1aW4pOwotCi0JZW11MTBrMV9tcHVfcmVzZXQoY2FyZCk7Ci0JZW11MTBrMV9tcHVfYWNxdWlyZShjYXJkKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9tcHVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fY2xvc2UoKVxuIik7Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyBpbnB1dCBTeXNFeCBidWZmZXJzICovCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgIT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRGlzYWJsZSBSWCBpbnRlcnJ1cHQgKi8KLQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7Ci0KLQllbXUxMGsxX21wdV9yZWxlYXNlKGNhcmQpOwotCi0JY2FyZF9tcHVpbi0+c3RhdHVzIHw9IEZMQUdTX0FWQUlMQUJMRTsJLyogc2V0ICovCi0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CS8qIGNsZWFyICovCi0KLQlyZXR1cm4gMDsKLX0KLQotLyogQWRkcyBNSURJIGJ1ZmZlciB0byBsb2NhbCBxdWV1ZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcikKLXsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKClcbiIpOwotCi0JLyogVXBkYXRlIE1JREkgYnVmZmVyIGZsYWdzICovCi0JbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9JTlFVRVVFOwkvKiBzZXQgKi8KLQltaWRpaGRyLT5mbGFncyAmPSB+TUlESUJVRl9ET05FOwkvKiBjbGVhciAqLwotCi0JaWYgKChtaWRpcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJLyogTWVzc2FnZSBsb3N0ICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQltaWRpcS0+bmV4dCA9IE5VTEw7Ci0JbWlkaXEtPnF0eXBlID0gMTsKLQltaWRpcS0+bGVuZ3RoID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOwotCW1pZGlxLT5zaXplTGVmdCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKLQltaWRpcS0+bWlkaWJ5dGUgPSBtaWRpaGRyLT5kYXRhOwotCW1pZGlxLT5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGloZHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkgewotCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXE7Ci0JCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0gZWxzZSB7Ci0JCShjYXJkX21wdWluLT5sYXN0bWlkaXEpLT5uZXh0ID0gbWlkaXE7Ci0JCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBGaXJzdCBzZXQgdGhlIFRpbWUgU3RhbXAgaWYgTUlESSBJTiBoYXMgbm90IHN0YXJ0ZWQuICAgICAgICAgKi8KLQotLyogVGhlbiBlbmFibGUgUlggSXJxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQl1OCBkdW1teTsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9zdGFydCgpXG4iKTsKLQotCS8qIFNldCB0aW1lc3RhbXAgaWYgbm90IHNldCAqLwotCWlmIChjYXJkX21wdWluLT5zdGF0dXMgJiBGTEFHU19NSURNX1NUQVJURUQpIHsKLQkJRFBGKDIsICJUaW1lIFN0YW1wIG5vdCBjaGFuZ2VkXG4iKTsKLQl9IGVsc2UgewotCQl3aGlsZSAoIWVtdTEwazFfbXB1X3JlYWRfZGF0YShjYXJkLCAmZHVtbXkpKTsKLQotCQljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfTUlETV9TVEFSVEVEOwkvKiBzZXQgKi8KLQotCQkvKiBTZXQgbmV3IHRpbWUgc3RhbXAgKi8KLQkJY2FyZF9tcHVpbi0+dGltZXN0YXJ0ID0gKGppZmZpZXMgKiAxMDAwKSAvIEhaOwotCQlEUEQoMiwgIk5ldyBUaW1lIFN0YW1wID0gJWRcbiIsIGNhcmRfbXB1aW4tPnRpbWVzdGFydCk7Ci0KLQkJY2FyZF9tcHVpbi0+cWhlYWQgPSAwOwotCQljYXJkX21wdWluLT5xdGFpbCA9IDA7Ci0KLQkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIERpc2FibGUgdGhlIFJYIElycS4gIElmIGEgcGFydGlhbCByZWNvcmRlZCBidWZmZXIgICAgICAgICAgICAqLwotCi0vKiBleGlzdCwgc2VuZCBpdCB1cCB0byBJTUlESSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1aW5fc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fc3RvcCgpXG4iKTsKLQotCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKLQotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLwotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCWlmIChtaWRpcSAhPSBOVUxMKSB7Ci0JCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IG1pZGlxLT5sZW5ndGgpCi0JCQkJbWlkaXEgPSBOVUxMOwotCQkJZWxzZSB7Ci0JCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCi0JCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKG1pZGlxKSB7Ci0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQkJCWtmcmVlKG1pZGlxKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBEaXNhYmxlIHRoZSBSWCBJcnEuICBJZiBhbnkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogZXhpc3QsIHNlbmQgaXQgdXAgdG8gSU1JREkgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1pbnQgZW11MTBrMV9tcHVpbl9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX3Jlc2V0KClcbiIpOwotCi0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOwotCi0Jd2hpbGUgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0KLQkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSBtaWRpcS0+bGVuZ3RoKQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQkJZWxzZQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HRVJST1IsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0KLQkJa2ZyZWUobWlkaXEpOwotCX0KLQotCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUGFzc2VzIHRoZSBtZXNzYWdlIHdpdGggdGhlIGRhdGEgYmFjayB0byB0aGUgY2xpZW50ICAgICAgICAgICovCi0KLS8qIHZpYSBJUlEgJiBEUEMgY2FsbGJhY2tzIHRvIFJpbmcgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCBlbXUxMGsxX21wdWluX2NhbGxiYWNrKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1MzIgbXNnLCB1bnNpZ25lZCBsb25nIGRhdGEsIHUzMiBieXRlc3ZhbGlkKQotewotCXVuc2lnbmVkIGxvbmcgdGltZWluOwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX21zZ1szXTsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0KLQkvKiBDYWxsZWQgZHVyaW5nIElTUi4gVGhlIGRhdGEgJiBjb2RlIHRvdWNoZWQgYXJlOgotCSAqIDEuIGNhcmRfbXB1aW4KLQkgKiAyLiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0JICovCi0KLQl0aW1laW4gPSBjYXJkX21wdWluLT50aW1laW47Ci0JaWYgKGNhcmRfbXB1aW4tPnRpbWVzdGFydCA8PSB0aW1laW4pCi0JCWNhbGxiYWNrX21zZ1swXSA9IHRpbWVpbiAtIGNhcmRfbXB1aW4tPnRpbWVzdGFydDsKLQllbHNlCi0JCWNhbGxiYWNrX21zZ1swXSA9ICh+MHgwTCAtIGNhcmRfbXB1aW4tPnRpbWVzdGFydCkgKyB0aW1laW47Ci0KLQlpZiAobXNnID09IElDQVJETUlESV9JTkRBVEEgfHwgbXNnID09IElDQVJETUlESV9JTkRBVEFFUlJPUikgewotCQljYWxsYmFja19tc2dbMV0gPSBkYXRhOwotCQljYWxsYmFja19tc2dbMl0gPSBieXRlc3ZhbGlkOwotCQlEUEQoMiwgImVtdTEwazFfbXB1aW5fY2FsbGJhY2s6IG1pZGltc2cgPSAlI2x4XG4iLCBkYXRhKTsKLQl9IGVsc2UgewotCQltaWRpcSA9IChzdHJ1Y3QgbWlkaV9xdWV1ZSAqKSBkYXRhOwotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBtaWRpcS0+cmVmZGF0YTsKLQotCQljYWxsYmFja19tc2dbMV0gPSBtaWRpcS0+bGVuZ3RoIC0gbWlkaXEtPnNpemVMZWZ0OwotCQljYWxsYmFja19tc2dbMl0gPSBtaWRpcS0+cmVmZGF0YTsKLQkJbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfSU5RVUVVRTsKLQkJbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9ET05FOwotCi0JCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSBtaWRpcS0+bGVuZ3RoIC0gbWlkaXEtPnNpemVMZWZ0OwotCX0KLQotCS8qIE5vdGlmeSBjbGllbnQgdGhhdCBTeXNleCBidWZmZXIgaGFzIGJlZW4gc2VudCAqLwotCWVtdTEwazFfbWlkaV9jYWxsYmFjayhtc2csIGNhcmRfbXB1aW4tPm9wZW5pbmZvLnJlZmRhdGEsIGNhbGxiYWNrX21zZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX21wdWluX2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQl1OCBkYXRhOwotCXVuc2lnbmVkIGlkeDsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqKSByZWZkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl3aGlsZSAoY2FyZF9tcHVpbi0+cWhlYWQgIT0gY2FyZF9tcHVpbi0+cXRhaWwpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQkJaWR4ID0gY2FyZF9tcHVpbi0+cWhlYWQ7Ci0JCWRhdGEgPSBjYXJkX21wdWluLT5taWRpcVtpZHhdLmRhdGE7Ci0JCWNhcmRfbXB1aW4tPnRpbWVpbiA9IGNhcmRfbXB1aW4tPm1pZGlxW2lkeF0udGltZWluOwotCQlpZHggPSAoaWR4ICsgMSkgJSBNSURJSU5fTUFYX0JVRkZFUl9TSVpFOwotCQljYXJkX21wdWluLT5xaGVhZCA9IGlkeDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCXNibGl2ZV9taVN0YXRlRW50cnkoY2FyZF9tcHVpbiwgZGF0YSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiBJUlEgY2FsbGJhY2sgaGFuZGxlciByb3V0aW5lIGZvciB0aGUgTVBVIGluIHBvcnQgKi8KLQotaW50IGVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGlkeDsKLQl1bnNpZ25lZCBjb3VudDsKLQl1OCBNUFVJdmFsdWU7Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQotCS8qIElSUSBzZXJ2aWNlIHJvdXRpbmUuIFRoZSBkYXRhIGFuZCBjb2RlIHRvdWNoZWQgYXJlOgotCSAqIDEuIGNhcmRfbXB1aW4KLQkgKi8KLQotCWNvdW50ID0gMDsKLQlpZHggPSBjYXJkX21wdWluLT5xdGFpbDsKLQotCXdoaWxlICgxKSB7Ci0JCWlmIChlbXUxMGsxX21wdV9yZWFkX2RhdGEoY2FyZCwgJk1QVUl2YWx1ZSkgPCAwKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCSsrY291bnQ7Ci0JCQljYXJkX21wdWluLT5taWRpcVtpZHhdLmRhdGEgPSBNUFVJdmFsdWU7Ci0JCQljYXJkX21wdWluLT5taWRpcVtpZHhdLnRpbWVpbiA9IChqaWZmaWVzICogMTAwMCkgLyBIWjsKLQkJCWlkeCA9IChpZHggKyAxKSAlIE1JRElJTl9NQVhfQlVGRkVSX1NJWkU7Ci0JCX0KLQl9Ci0KLQlpZiAoY291bnQpIHsKLQkJY2FyZF9tcHVpbi0+cXRhaWwgPSBpZHg7Ci0KLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmY2FyZF9tcHVpbi0+dGFza2xldCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICBTdXBwb3J0aW5nIGZ1bmN0aW9ucyBmb3IgTWlkaS1JbiBJbnRlcnByZXRhdGlvbiBTdGF0ZSBNYWNoaW5lICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlSW5pdChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbikKLXsKLQljYXJkX21wdWluLT5zdGF0dXMgPSAwOwkvKiBGb3IgTUlESSBydW5uaW5nIHN0YXR1cyAqLwotCWNhcmRfbXB1aW4tPmZzdGF0dXMgPSAwOwkvKiBGb3IgMHhGbiBzdGF0dXMgb25seSAqLwotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKLQljYXJkX21wdWluLT5sYXN0c3RhdGUgPSBTVElOX1BBUlNFOwotCWNhcmRfbXB1aW4tPmRhdGEgPSAwOwotCWNhcmRfbXB1aW4tPnRpbWVzdGFydCA9IDA7Ci0JY2FyZF9tcHVpbi0+dGltZWluID0gMDsKLQotCXJldHVybiAwOwotfQotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUVudHJ5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXJldHVybiBtaWRpc3RhdGVmbltjYXJkX21wdWluLT5jdXJzdGF0ZV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVQYXJzZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQlzd2l0Y2ggKGRhdGEgJiAweGYwKSB7Ci0JY2FzZSAweDgwOgotCWNhc2UgMHg5MDoKLQljYXNlIDB4QTA6Ci0JY2FzZSAweEIwOgotCWNhc2UgMHhFMDoKLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFOwotCQlicmVhazsKLQotCWNhc2UgMHhDMDoKLQljYXNlIDB4RDA6Ci0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURTsKLQkJYnJlYWs7Ci0KLQljYXNlIDB4RjA6Ci0JCS8qIFN5c3RlbSBtZXNzYWdlcyBkbyBub3QgYWZmZWN0IHRoZSBwcmV2aW91cyBydW5uaW5nIHN0YXR1cyEgKi8KLQkJc3dpdGNoIChkYXRhICYgMHgwZikgewotCQljYXNlIDB4MDoKLQkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOwotCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19FWF9OT1JNOwotCi0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQkJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQkJCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKLQkJCQktLW1pZGlxLT5zaXplTGVmdDsKLQkJCQkrK21pZGlxLT5taWRpYnl0ZTsKLQkJCX0KLQotCQkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLQotCQljYXNlIDB4NzoKLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCAweGY3LCAwKTsKLQkJCXJldHVybiAtMTsKLQotCQljYXNlIDB4MjoKLQkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOwotCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMHgxOgotCQljYXNlIDB4MzoKLQkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOwotCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBpbmNsdWRlcyAweEY0IC0gMHhGNiwgMHhGOCAtIDB4RkYgKi8KLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJRFBGKDIsICJCVUc6IGRlZmF1bHQgY2FzZSBoaXRcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIG1pZGlzdGF0ZWZuW2NhcmRfbXB1aW4tPmN1cnN0YXRlXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXU4IHRlbXAgPSBkYXRhICYgMHhmMDsKLQotCWlmICh0ZW1wIDwgMHg4MCkgewotCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl8zQllURV9LRVldLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCX0gZWxzZSBpZiAodGVtcCA8PSAweGUwICYmIHRlbXAgIT0gMHhjMCAmJiB0ZW1wICE9IDB4ZDApIHsKLQkJY2FyZF9tcHVpbi0+c3RhdHVzID0gZGF0YTsKLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFX0tFWTsKLQotCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotCX0KLQotCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1BBUlNFXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAxICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOwotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5kYXRhID0gZGF0YTsKLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEVfVkVMOwotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAyICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOwotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIDw8IDg7Ci0JCXRtcCB8PSBjYXJkX21wdWluLT5kYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXU4IHRlbXAgPSBkYXRhICYgMHhmMDsKLQotCWlmICgodGVtcCA9PSAweGMwKSB8fCAodGVtcCA9PSAweGQwKSkgewotCQljYXJkX21wdWluLT5zdGF0dXMgPSBkYXRhOwotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fMkJZVEVfS0VZOwotCi0JCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci0JfQotCi0JaWYgKHRlbXAgPCAweDgwKQotCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl8yQllURV9LRVldLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fUEFSU0VdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDEgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7Ci0JCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKLQotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQljYXJkX21wdWluLT5mc3RhdHVzID0gZGF0YTsKLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8yX0tFWTsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAxICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7Ci0KLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjMoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JY2FyZF9tcHVpbi0+ZnN0YXR1cyA9IGRhdGE7Ci0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fM19LRVk7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMSAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+ZGF0YSA9IGRhdGE7Ci0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fM19WRUw7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMiAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5kYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzRXhOb3JtKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoKGRhdGEgPiAweDdmKSAmJiAoZGF0YSAhPSAweGY3KSkgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgRGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQotCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKLQkJCS0tbWlkaXEtPnNpemVMZWZ0OwotCQkJKyttaWRpcS0+bWlkaWJ5dGU7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCi0JCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOwotCQktLW1pZGlxLT5zaXplTGVmdDsKLQkJKyttaWRpcS0+bWlkaWJ5dGU7Ci0JfQotCi0JaWYgKGRhdGEgPT0gMHhmNykgewotCQkvKiBFbmQgb2YgU3lzZXggYnVmZmVyICovCi0JCS8qIFNlbmQgZG93biB0aGUgYnVmZmVyICovCi0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0KLQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQotCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IDApIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAqLwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCi0JCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotCQl9Ci0JfQotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c1JlYWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCBkYXRhLCAxKTsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJjMjQxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgc2JsaXZlX21pLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfQ0FSRE1JX0gKLSNkZWZpbmUgX0NBUkRNSV9ICi0KLSNpbmNsdWRlICJpY2FyZG1pZC5oIgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi10eXBlZGVmIGVudW0KLXsKLQlTVElOX1BBUlNFID0gMCwKLQlTVElOXzNCWVRFLCAgICAgICAgICAgICAgICAgICAgIC8qIDB4ODAsIDB4OTAsIDB4QTAsIDB4QjAsIDB4RTAgKi8KLQlTVElOXzNCWVRFX0tFWSwgICAgICAgICAgICAgICAgIC8qIEJ5dGUgMSAqLwotCVNUSU5fM0JZVEVfVkVMLCAgICAgICAgICAgICAgICAgLyogQnl0ZSAxICovCi0JU1RJTl8yQllURSwgICAgICAgICAgICAgICAgICAgICAvKiAweEMwLCAweEQwICovCi0JU1RJTl8yQllURV9LRVksICAgICAgICAgICAgICAgICAvKiBCeXRlIDEgKi8KLQlTVElOX1NZU19DT01NT05fMiwgICAgICAgICAgICAgIC8qIDB4RjEsIDB4RjMgICovCi0JU1RJTl9TWVNfQ09NTU9OXzJfS0VZLAotCVNUSU5fU1lTX0NPTU1PTl8zLCAgICAgICAgICAgICAgLyogMHhGMiAqLwotCVNUSU5fU1lTX0NPTU1PTl8zX0tFWSwKLQlTVElOX1NZU19DT01NT05fM19WRUwsCi0JU1RJTl9TWVNfRVhfTk9STSwgICAgICAgICAgICAgICAvKiAweEYwLCBOb3JtYWwgbW9kZSAqLwotCVNUSU5fU1lTX1JFQUwKLX0gbWlkaV9pbl9zdGF0ZTsKLQotCi0vKiBmbGFncyBmb3IgY2FyZCBNSURJIGluIG9iamVjdCAqLwotI2RlZmluZSBGTEFHU19NSURNX1NUQVJURUQgICAgICAgICAgMHgwMDAwMTAwMCAgICAgIC8vIERhdGEgaGFzIHN0YXJ0ZWQgdG8gY29tZSBpbiBhZnRlciBNaWRtIFN0YXJ0Ci0jZGVmaW5lIE1JRElJTl9NQVhfQlVGRkVSX1NJWkUgICAgICAyMDAgICAgICAgICAgICAgLy8gRGVmaW5pdGlvbiBmb3Igc3RydWN0IGVtdTEwazFfbXB1aW4KLQotc3RydWN0IG1pZGlfZGF0YQotewotCXU4IGRhdGE7Ci0JdTMyIHRpbWVpbjsKLX07Ci0KLXN0cnVjdCBlbXUxMGsxX21wdWluCi17Ci0Jc3BpbmxvY2tfdCAgICAgICAgbG9jazsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqZmlyc3RtaWRpcTsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbGFzdG1pZGlxOwotCXVuc2lnbmVkICAgICAgICAgIHFoZWFkLCBxdGFpbDsKLQlzdHJ1Y3QgbWlkaV9kYXRhICBtaWRpcVtNSURJSU5fTUFYX0JVRkZFUl9TSVpFXTsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKLQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAgICBvcGVuaW5mbzsKLQotCS8qIEZvciBNSURJIHN0YXRlIG1hY2hpbmUgKi8KLQl1OCAgICAgICAgICAgICAgc3RhdHVzOyAgICAgICAgLyogRm9yIE1JREkgcnVubmluZyBzdGF0dXMgKi8KLQl1OCAgICAgICAgICAgICAgZnN0YXR1czsgICAgICAgLyogRm9yIDB4Rm4gc3RhdHVzIG9ubHkgKi8KLQltaWRpX2luX3N0YXRlICAgY3Vyc3RhdGU7Ci0JbWlkaV9pbl9zdGF0ZSAgIGxhc3RzdGF0ZTsKLQl1MzIgICAgICAgICAgICAgdGltZXN0YXJ0OwotCXUzMiAgICAgICAgICAgICB0aW1laW47Ci0JdTggICAgICAgICAgICAgIGRhdGE7Ci19OwotCi1pbnQgZW11MTBrMV9tcHVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfb3BlbmluZm8gKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCBzdHJ1Y3QgbWlkaV9oZHIgKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1aW5fc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1aW5fcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLQotaW50IGVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX21wdWluX2JoKHVuc2lnbmVkIGxvbmcpOwotCi0jZW5kaWYgIC8qIF9DQVJETUlfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjYzc1ZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmRtby5jIC0gTUlESSBVQVJUIG91dHB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyIAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJjYXJkbW8uaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLQotLyogSW5zdGFsbHMgdGhlIElSUSBoYW5kbGVyIGZvciB0aGUgTVBVIG91dCBwb3J0ICAgICAgICAgICAgICAgKgotICogYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBtaWRpX29wZW5pbmZvICpvcGVuaW5mbykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCi0JRFBGKDIsICJlbXUxMGsxX21wdW91dF9vcGVuKClcbiIpOwotCi0JaWYgKCEoY2FyZF9tcHVvdXQtPnN0YXR1cyAmIEZMQUdTX0FWQUlMQUJMRSkpCi0JCXJldHVybiAtMTsKLQotCS8qIENvcHkgb3BlbiBpbmZvIGFuZCBtYXJrIGNoYW5uZWwgYXMgaW4gdXNlICovCi0JY2FyZF9tcHVvdXQtPmludHIgPSAwOwotCWNhcmRfbXB1b3V0LT5vcGVuaW5mbyA9ICpvcGVuaW5mbzsKLQljYXJkX21wdW91dC0+c3RhdHVzICY9IH5GTEFHU19BVkFJTEFCTEU7Ci0JY2FyZF9tcHVvdXQtPmxhc3RzdGF0dXMgPSAweDgwOwotCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gTlVMTDsKLQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKLQotCWVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpOwotCWVtdTEwazFfbXB1X2FjcXVpcmUoY2FyZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfbXB1b3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1b3V0X2Nsb3NlKClcbiIpOwotCi0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgewotCQltaWRpcSA9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxOwotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBtaWRpcS0+cmVmZGF0YTsKLQotCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCi0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJa2ZyZWUobWlkaXEpOwotCX0KLQotCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JZW11MTBrMV9tcHVfcmVsZWFzZShjYXJkKTsKLQotCWNhcmRfbXB1b3V0LT5zdGF0dXMgfD0gRkxBR1NfQVZBSUxBQkxFOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggYnVmZmVyIHNwYWNlLCByZWplY3QgTWlkaSBCdWZmZXIuICAgICAqCi0qIE90aGVyd2lzZSwgZGlzYWJsZSBUWCwgY3JlYXRlIG9iamVjdCB0byBob2xkIE1pZGkgICAgICAgICAgICAqCi0qICB1ZmZlciwgdXBkYXRlIGJ1ZmZlciBmbGFncyBhbmQgb3RoZXIgcGFyYW1ldGVycyAgICAgICAgICAgICAqCi0qIGJlZm9yZSBlbmFibGluZyBUWCBhZ2Fpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcigpXG4iKTsKLQotCWlmIChjYXJkX21wdW91dC0+c3RhdGUgPT0gQ0FSRE1JRElPVVRfU1RBVEVfU1VTUEVORCkKLQkJcmV0dXJuIDA7Ci0KLQltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0lOUVVFVUU7Ci0JbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfRE9ORTsKLQotCWlmICgobWlkaXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9xdWV1ZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCS8qIE1lc3NhZ2UgbG9zdCAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWlkaXEtPm5leHQgPSBOVUxMOwotCW1pZGlxLT5xdHlwZSA9IDE7Ci0JbWlkaXEtPmxlbmd0aCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKLQltaWRpcS0+c2l6ZUxlZnQgPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7Ci0JbWlkaXEtPm1pZGlieXRlID0gbWlkaWhkci0+ZGF0YTsKLQotCW1pZGlxLT5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGloZHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9PSBOVUxMKSB7Ci0JCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gbWlkaXE7Ci0JCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBtaWRpcTsKLQl9IGVsc2UgewotCQkoY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSktPm5leHQgPSBtaWRpcTsKLQkJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0KLQotCWNhcmRfbXB1b3V0LT5pbnRyID0gMDsKLQotCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfbXB1b3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gKHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgcmVmZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCWludCBjQnl0ZVNlbnQgPSAwOwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqZG9uZXEgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB7Ci0JCW1pZGlxID0gY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXE7Ci0KLQkJd2hpbGUgKGNCeXRlU2VudCA8IDQgJiYgbWlkaXEtPnNpemVMZWZ0KSB7Ci0JCQlpZiAoZW11MTBrMV9tcHVfd3JpdGVfZGF0YShjYXJkLCAqbWlkaXEtPm1pZGlieXRlKSA8IDApIHsKLQkJCQlEUEYoMiwgImVtdTEwazFfbXB1b3V0RHBjQ2FsbGJhY2sgZXJyb3IhIVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCSsrY0J5dGVTZW50OwotCQkJCS0tbWlkaXEtPnNpemVMZWZ0OwotCQkJCSsrbWlkaXEtPm1pZGlieXRlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSAwKSB7Ci0JCQlpZiAoZG9uZXEgPT0gTlVMTCkKLQkJCQlkb25lcSA9IG1pZGlxOwotCQkJY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJfSBlbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPT0gTlVMTCkKLQkJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQlpZiAoZG9uZXEgIT0gTlVMTCkgewotCQl3aGlsZSAoZG9uZXEgIT0gY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEpIHsKLQkJCXVuc2lnbmVkIGxvbmcgY2FsbGJhY2tfbXNnWzNdOwotCi0JCQltaWRpcSA9IGRvbmVxOwotCQkJZG9uZXEgPSBtaWRpcS0+bmV4dDsKLQotCQkJaWYgKG1pZGlxLT5xdHlwZSkgewotCQkJCWNhbGxiYWNrX21zZ1swXSA9IDA7Ci0JCQkJY2FsbGJhY2tfbXNnWzFdID0gbWlkaXEtPmxlbmd0aDsKLQkJCQljYWxsYmFja19tc2dbMl0gPSBtaWRpcS0+cmVmZGF0YTsKLQotCQkJCWVtdTEwazFfbWlkaV9jYWxsYmFjayhJQ0FSRE1JRElfT1VUTE9OR0RBVEEsIGNhcmRfbXB1b3V0LT5vcGVuaW5mby5yZWZkYXRhLCBjYWxsYmFja19tc2cpOwotCQkJfSBlbHNlIGlmICgoKHU4KSBtaWRpcS0+cmVmZGF0YSkgPCAweEYwICYmICgodTgpIG1pZGlxLT5yZWZkYXRhKSA+IDB4N0YpCi0JCQkJY2FyZF9tcHVvdXQtPmxhc3RzdGF0dXMgPSAodTgpIG1pZGlxLT5yZWZkYXRhOwotCi0JCQlrZnJlZShtaWRpcSk7Ci0JCX0KLQl9Ci0KLQlpZiAoKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpIHx8IGNCeXRlU2VudCkgewotCQljYXJkX21wdW91dC0+aW50ciA9IDA7Ci0JCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLWludCBlbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQotCURQRig0LCAiZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlclxuIik7Ci0KLQljYXJkX21wdW91dC0+aW50ciA9IDE7Ci0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCi0JdGFza2xldF9oaV9zY2hlZHVsZSgmY2FyZF9tcHVvdXQtPnRhc2tsZXQpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI2ZWIzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZG1vLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveAkgICAgY2xlYW5lZCB1cAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfQ0FSRE1PX0gKLSNkZWZpbmUgX0NBUkRNT19ICi0KLSNpbmNsdWRlICJpY2FyZG1pZC5oIgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jZGVmaW5lIENBUkRNSURJT1VUX1NUQVRFX0RFRkFVTFQgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDQVJETUlESU9VVF9TVEFURV9TVVNQRU5EICAgIDB4MDAwMDAwMDEKLQotc3RydWN0IGVtdTEwazFfbXB1b3V0Ci17Ci0JdTMyCQkJc3RhdHVzOwotCXUzMgkJCXN0YXRlOwotCXZvbGF0aWxlIGludAkJaW50cjsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZQkqZmlyc3RtaWRpcTsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZQkqbGFzdG1pZGlxOwotCXU4CQkJbGFzdHN0YXR1czsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCXRhc2tsZXQ7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbwlvcGVuaW5mbzsKLX07Ci0KLWludCBlbXUxMGsxX21wdW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfb3BlbmluZm8gKik7Ci1pbnQgZW11MTBrMV9tcHVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfaGRyICopOwotCi1pbnQgZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX21wdW91dF9iaCh1bnNpZ25lZCBsb25nKTsKLQotI2VuZGlmICAvKiBfQ0FSRE1PX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGQxYmUuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZHdpLmMgLSBQQ00gaW5wdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICJjYXJkd2kuaCIKLQotLyoqCi0gKiBxdWVyeV9mb3JtYXQgLSByZXR1cm5zIGEgdmFsaWQgc291bmQgZm9ybWF0Ci0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHZhbGlkIHNvdW5kIGZvcm1hdCBhcyBjbG9zZQotICogdG8gdGhlIHJlcXVlc3RlZCBvbmUgYXMgcG9zc2libGUuIAotICovCi1zdGF0aWMgdm9pZCBxdWVyeV9mb3JtYXQoaW50IHJlY3NyYywgc3RydWN0IHdhdmVfZm9ybWF0ICp3YXZlX2ZtdCkKLXsKLQotCXN3aXRjaCAocmVjc3JjKSB7Ci0JY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0KLQkJaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgIT0gMSkgJiYgKHdhdmVfZm10LT5jaGFubmVscyAhPSAyKSkKLQkJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7Ci0KLQkJaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4QkI4MCArIDB4QUM0NCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4QkI4MDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHhBQzQ0ICsgMHg3RDAwKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHhBQzQ0OwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDdEMDAgKyAweDVEQzApIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDdEMDA7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4NURDMCArIDB4NTYyMikgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4NURDMDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHg1NjIyICsgMHgzRTgwKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHg1NjIyOwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDNFODAgKyAweDJCMTEpIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDNFODA7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4MkIxMSArIDB4MUY0MCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MkIxMTsKLQkJZWxzZQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MUY0MDsKLQotCQlzd2l0Y2ggKHdhdmVfZm10LT5pZCkgewotCQljYXNlIEFGTVRfUzE2X0xFOgotCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQlicmVhazsKLQkJY2FzZSBBRk1UX1U4OgotCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gODsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJd2F2ZV9mbXQtPmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQkvKiB0aGVzZSBjYW4ndCBiZSBjaGFuZ2VkIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlcyAqLwotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0KLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsID0gd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID4+IDM7Ci0Jd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJzZWMgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgKiB3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlOwotCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlOwotfQotCi1zdGF0aWMgaW50IGFsbG9jX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCWJ1ZmZlci0+YWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGJ1ZmZlci0+c2l6ZSAqIGJ1ZmZlci0+Y292LAotCQkJCQkgICAgJmJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci0JaWYgKGJ1ZmZlci0+YWRkciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlpZiAoYnVmZmVyLT5hZGRyICE9IE5VTEwpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgYnVmZmVyLT5zaXplICogYnVmZmVyLT5jb3YsCi0JCQkJICAgIGJ1ZmZlci0+YWRkciwgYnVmZmVyLT5kbWFfaGFuZGxlKTsKLX0KLQotaW50IGVtdTEwazFfd2F2ZWluX29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0Jc3RydWN0IHdpaW5zdCAqKndpaW5zdF90bXAgPSBOVUxMOwotCXUxNiBkZWxheTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9vcGVuKClcbiIpOwotCi0Jc3dpdGNoICh3aWluc3QtPnJlY3NyYykgewotCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5hYzk3OwotCQlicmVhazsKLQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5taWM7Ci0JCWJyZWFrOwotCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJd2lpbnN0X3RtcCA9ICZjYXJkLT53YXZlaW4uZng7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWlmICgqd2lpbnN0X3RtcCAhPSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCSp3aWluc3RfdG1wID0gd2lpbnN0OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGhhbmRsZSA4IGJpdCByZWNvcmRpbmcgKi8KLQlpZiAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJjaGFubmVsID09IDEpIHsKLQkJaWYgKHdpaW5zdC0+YnVmZmVyLnNpemUgPiAweDgwMDApIHsKLQkJCXdpaW5zdC0+YnVmZmVyLnNpemUgPSAweDgwMDA7Ci0JCQl3aWluc3QtPmJ1ZmZlci5zaXplcmVndmFsID0gMHgxZjsKLQkJfSBlbHNlCi0JCQl3aWluc3QtPmJ1ZmZlci5zaXplcmVndmFsICs9IDQ7Ci0KLQkJd2lpbnN0LT5idWZmZXIuY292ID0gMjsKLQl9IGVsc2UKLQkJd2lpbnN0LT5idWZmZXIuY292ID0gMTsKLQotCWlmIChhbGxvY19idWZmZXIoY2FyZCwgJndpaW5zdC0+YnVmZmVyKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWVtdTEwazFfc2V0X3JlY29yZF9zcmMoY2FyZCwgd2lpbnN0KTsKLQotCWVtdTEwazFfcmVzZXRfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0KLQl3aWluc3QtPmJ1ZmZlci5od19wb3MgPSAwOwotCXdpaW5zdC0+YnVmZmVyLnBvcyA9IDA7Ci0Jd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgPSAwOwotCi0JZGVsYXkgPSAoNDgwMDAgKiB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvIHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjOwotCi0JZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyLCBkZWxheSAvIDIpOwotCi0Jd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfT1BFTjsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX2Nsb3NlKClcbiIpOwotCi0JZW11MTBrMV93YXZlaW5fc3RvcCh3YXZlX2Rldik7Ci0KLQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lcik7Ci0KLQlmcmVlX2J1ZmZlcihjYXJkLCAmd2lpbnN0LT5idWZmZXIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlzd2l0Y2ggKHdhdmVfZGV2LT53aWluc3QtPnJlY3NyYykgewotCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQljYXJkLT53YXZlaW4uYWM5NyA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCWNhcmQtPndhdmVpbi5taWMgPSBOVUxMOwotCQlicmVhazsKLQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCWNhcmQtPndhdmVpbi5meCA9IE5VTEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0Jd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9zdGFydCgpXG4iKTsKLQotCWVtdTEwazFfc3RhcnRfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0JZW11MTBrMV90aW1lcl9lbmFibGUod2F2ZV9kZXYtPmNhcmQsICZ3aWluc3QtPnRpbWVyKTsKLQotCXdpaW5zdC0+c3RhdGUgfD0gV0FWRV9TVEFURV9TVEFSVEVEOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX3N0b3AoKVxuIik7Ci0KLQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkKLQkJcmV0dXJuOwotCi0JZW11MTBrMV90aW1lcl9kaXNhYmxlKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKLQllbXUxMGsxX3N0b3BfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0KLQl3aWluc3QtPnN0YXRlICY9IH5XQVZFX1NUQVRFX1NUQVJURUQ7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqZm9ybWF0KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXUxNiBkZWxheTsKLQotCURQRigyLCAiZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KClcbiIpOwotCi0JaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCXJldHVybiAtMTsKLQotCXF1ZXJ5X2Zvcm1hdCh3aWluc3QtPnJlY3NyYywgZm9ybWF0KTsKLQotCWlmICgod2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICE9IGZvcm1hdC0+c2FtcGxpbmdyYXRlKQotCSAgICB8fCAod2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgIT0gZm9ybWF0LT5iaXRzcGVyY2hhbm5lbCkKLQkgICAgfHwgKHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzICE9IGZvcm1hdC0+Y2hhbm5lbHMpKSB7Ci0KLQkJd2lpbnN0LT5mb3JtYXQgPSAqZm9ybWF0OwotCi0JCWlmICh3aWluc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKQotCQkJcmV0dXJuIDA7Ci0KLQkJd2lpbnN0LT5idWZmZXIuc2l6ZSAqPSB3aWluc3QtPmJ1ZmZlci5jb3Y7Ci0KLQkJaWYgKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyY2hhbm5lbCA9PSAxKSB7Ci0JCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAyOwotCQkJd2lpbnN0LT5idWZmZXIuc2l6ZSAvPSB3aWluc3QtPmJ1ZmZlci5jb3Y7Ci0JCX0gZWxzZQotCQkJd2lpbnN0LT5idWZmZXIuY292ID0gMTsKLQotCQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lcik7Ci0KLQkJZGVsYXkgPSAoNDgwMDAgKiB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvIHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjOwotCi0JCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lciwgZGVsYXkgLyAyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHUzMiAqIHNpemUpCi17Ci0Jc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKLQotCSpzaXplID0gYnVmZmVyLT5ieXRlc3RvY29weTsKLQotCWlmICh3aWluc3QtPm1tYXBwZWQpCi0JCXJldHVybjsKLQotCWlmICgqc2l6ZSA+IGJ1ZmZlci0+c2l6ZSkgewotCQkqc2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKLQkJYnVmZmVyLT5wb3MgPSBidWZmZXItPmh3X3BvczsKLQkJYnVmZmVyLT5ieXRlc3RvY29weSA9IGJ1ZmZlci0+c2l6ZTsKLQkJRFBGKDEsICJidWZmZXIgb3ZlcnJ1blxuIik7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNvcHlfYmxvY2sodTggX191c2VyICpkc3QsIHU4ICogc3JjLCB1MzIgc3RyLCB1MzIgbGVuLCB1OCBjb3YpCi17Ci0JaWYgKGNvdiA9PSAxKSB7Ci0JCWlmIChfX2NvcHlfdG9fdXNlcihkc3QsIHNyYyArIHN0ciwgbGVuKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCXU4IGJ5dGU7Ci0JCXUzMiBpOwotCi0JCXNyYyArPSAxICsgMiAqIHN0cjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWJ5dGUgPSBzcmNbMiAqIGldIF4gMHg4MDsKLQkJCWlmIChfX2NvcHlfdG9fdXNlcihkc3QgKyBpLCAmYnl0ZSwgMSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKndpaW5zdCwgdTggX191c2VyICpkYXRhLCB1MzIgKiBzaXplKQotewotCXN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIgPSAmd2lpbnN0LT5idWZmZXI7Ci0JdTMyIHNpemV0b2NvcHksIHNpemV0b2NvcHlfbm93LCBzdGFydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlzaXpldG9jb3B5ID0gbWluX3QodTMyLCBidWZmZXItPnNpemUsICpzaXplKTsKLQkqc2l6ZSA9IHNpemV0b2NvcHk7Ci0KLQlpZiAoIXNpemV0b2NvcHkpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCXN0YXJ0ID0gYnVmZmVyLT5wb3M7Ci0JYnVmZmVyLT5wb3MgKz0gc2l6ZXRvY29weTsKLQlidWZmZXItPnBvcyAlPSBidWZmZXItPnNpemU7Ci0JYnVmZmVyLT5ieXRlc3RvY29weSAtPSBzaXpldG9jb3B5OwotCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKLQkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKLQotCQlyZXQgPSBjb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHlfbm93LAotCQkJCSBidWZmZXItPmNvdik7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IGNvcHlfYmxvY2soZGF0YSArIHNpemV0b2NvcHlfbm93LCBidWZmZXItPmFkZHIsIDAsCi0JCQkJCSBzaXpldG9jb3B5LCBidWZmZXItPmNvdik7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gY29weV9ibG9jayhkYXRhLCBidWZmZXItPmFkZHIsIHN0YXJ0LCBzaXpldG9jb3B5LAotCQkJCSBidWZmZXItPmNvdik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl91cGRhdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KQotewotCXUzMiBod19wb3M7Ci0JdTMyIGRpZmY7Ci0KLQkvKiBUaGVyZSBpcyBubyBhY3R1YWwgc3RhcnQgeWV0ICovCi0JaWYgKCEod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKLQkJaHdfcG9zID0gd2lpbnN0LT5idWZmZXIuaHdfcG9zOwotCX0gZWxzZSB7Ci0JCS8qIGh3X3BvcyBpbiBieXRlIHVuaXRzICovCi0JCWh3X3BvcyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIHdpaW5zdC0+YnVmZmVyLmlkeHJlZywgMCkgLyB3aWluc3QtPmJ1ZmZlci5jb3Y7Ci0JfQotCi0JZGlmZiA9ICh3aWluc3QtPmJ1ZmZlci5zaXplICsgaHdfcG9zIC0gd2lpbnN0LT5idWZmZXIuaHdfcG9zKSAlIHdpaW5zdC0+YnVmZmVyLnNpemU7Ci0Jd2lpbnN0LT50b3RhbF9yZWNvcmRlZCArPSBkaWZmOwotCXdpaW5zdC0+YnVmZmVyLmJ5dGVzdG9jb3B5ICs9IGRpZmY7Ci0KLQl3aWluc3QtPmJ1ZmZlci5od19wb3MgPSBod19wb3M7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIwMjliLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZHdpLmggLS0gaGVhZGVyIGZpbGUgZm9yIGNhcmQgd2F2ZSBpbnB1dCBmdW5jdGlvbnMKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZuZGVmIF9DQVJEV0lfSAotI2RlZmluZSBfQ0FSRFdJX0gKLQotI2luY2x1ZGUgImljYXJkd2F2LmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi1zdHJ1Y3Qgd2F2ZWluX2J1ZmZlciB7Ci0JdTE2IG9zc2ZyYWdzaGlmdDsKLSAgICAgICAgdTMyIGZyYWdtZW50X3NpemU7Ci0gICAgICAgIHUzMiBudW1mcmFnczsKLQl1MzIgaHdfcG9zOwkJLyogaGFyZHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCi0JdTMyIHBvczsJCS8qIHNvZnR3YXJlIGN1cnNvciBwb3NpdGlvbiAqLwotCXUzMiBieXRlc3RvY29weTsJLyogYnl0ZXMgb2YgcmVjb3JkZWQgZGF0YSBhdmFpbGFibGUgKi8KLQl1MzIgc2l6ZTsKLQl1MzIgcGFnZXM7Ci0JdTMyIHNpemVyZWc7Ci0JdTMyIHNpemVyZWd2YWw7Ci0gICAgICAgIHUzMiBhZGRycmVnOwotICAgICAgICB1MzIgaWR4cmVnOwotICAgICAgICB1MzIgYWRjY3RsOwotCXZvaWQgKmFkZHI7Ci0JdTggY292OwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsJCi19OwotCi1zdHJ1Y3Qgd2lpbnN0Ci17Ci0JdTggc3RhdGU7Ci0Jc3RydWN0IGVtdV90aW1lciB0aW1lcjsKLQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCXN0cnVjdCB3YXZlaW5fYnVmZmVyIGJ1ZmZlcjsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwotCXU4IG1tYXBwZWQ7Ci0JdTMyIHRvdGFsX3JlY29yZGVkOwkvKiB0b3RhbCBieXRlcyByZWFkKCkgZnJvbSBkZXZpY2UgKi8KLQl1MzIgYmxvY2tzOwotCXNwaW5sb2NrX3QgbG9jazsKLQl1OCByZWNzcmM7Ci0JdTE2IGZ4d2M7Ci19OwotCi0jZGVmaW5lIFdBVkVJTl9NQVhCVUZTSVpFCTY1NTM2Ci0jZGVmaW5lIFdBVkVJTl9NSU5CVUZTSVpFCTM2OAotCi0jZGVmaW5lIFdBVkVJTl9ERUZBVUxURlJBR0xFTgkxMDAgCi0jZGVmaW5lIFdBVkVJTl9ERUZBVUxUQlVGTEVOCTEwMDAKLQotI2RlZmluZSBXQVZFSU5fTUlORlJBR1NISUZUCTggCi0jZGVmaW5lIFdBVkVJTl9NSU5GUkFHUwkJMgotCi1pbnQgZW11MTBrMV93YXZlaW5fb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHN0cnVjdCB3aWluc3QgKiwgdTMyICopOwotaW50IGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKiwgdTggX191c2VyICosIHUzMiAqKTsKLWludCBlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3aWluc3QgKik7Ci0KLQotI2VuZGlmIC8qIF9DQVJEV0lfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkYWNhNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uYworKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkd28uYyAtIFBDTSBvdXRwdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJ2b2ljZW1nci5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0KLXN0YXRpYyB1MzIgc2FtcGxlcmF0ZV90b19saW5lYXJwaXRjaCh1MzIgc2FtcGxpbmdyYXRlKQotewotCXNhbXBsaW5ncmF0ZSA9IChzYW1wbGluZ3JhdGUgPDwgOCkgLyAzNzU7Ci0JcmV0dXJuIChzYW1wbGluZ3JhdGUgPj4gMSkgKyAoc2FtcGxpbmdyYXRlICYgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXJ5X2Zvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldiwgc3RydWN0IHdhdmVfZm9ybWF0ICp3YXZlX2ZtdCkKLXsKLQlpbnQgaSwgaiwgZG9fcGFzc3Rocm91Z2ggPSAwLCBpc19hYzMgPSAwOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgPiAyKSAmJiAod2F2ZV9mbXQtPmlkICE9IEFGTVRfUzE2X0xFKSAmJiAod2F2ZV9mbXQtPmlkICE9IEFGTVRfVTgpKQotCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCi0JaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgPCAxKSB8fCAod2F2ZV9mbXQtPmNoYW5uZWxzID4gV0FWRU9VVF9NQVhWT0lDRVMpKQotCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCi0JaWYgKHdhdmVfZm10LT5jaGFubmVscyA9PSAyKQotCQl3b2luc3QtPm51bV92b2ljZXMgPSAxOwotCWVsc2UKLQkJd29pbnN0LT5udW1fdm9pY2VzID0gd2F2ZV9mbXQtPmNoYW5uZWxzOwotCi0JaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gMHgyZWUwMCkKLQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MmVlMDA7Ci0KLQl3YXZlX2ZtdC0+cGFzc3Rocm91Z2ggPSAwOwotCWRvX3Bhc3N0aHJvdWdoID0gaXNfYWMzID0gMDsKLQotCWlmIChjYXJkLT5wdC5zZWxlY3RlZCkKLQkJZG9fcGFzc3Rocm91Z2ggPSAxOwotCi0Jc3dpdGNoICh3YXZlX2ZtdC0+aWQpIHsKLQljYXNlIEFGTVRfUzE2X0xFOgotCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1U4OgotCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSA4OwotCQlicmVhazsKLQljYXNlIEFGTVRfQUMzOgotCQlkb19wYXNzdGhyb3VnaCA9IDE7Ci0JCWlzX2FjMyA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXdhdmVfZm10LT5pZCA9IEFGTVRfUzE2X0xFOwotCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJYnJlYWs7Ci0JfQkKLQlpZiAoZG9fcGFzc3Rocm91Z2gpIHsKLQkJLyogY3VycmVudGx5IG9ubHkgb25lIHdhdmVvdXQgaW5zdGFuY2UgbWF5IHVzZSBwYXNzLXRocm91Z2ggKi8KLQkJaWYgKHdvaW5zdC0+c3RhdGUgIT0gV0FWRV9TVEFURV9DTE9TRUQgfHwgCi0JCSAgICBjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSB8fAotCQkgICAgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgIT0gNDgwMDAgJiYgIWlzX2FjMykpIHsKLQkJCURQRigyLCAidW5hYmxlIHRvIHNldCBwYXNzLXRocm91Z2ggbW9kZVxuIik7Ci0JCX0gZWxzZSBpZiAoVVNFX1BUX01FVEhPRDEpIHsKLQkJCWkgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwgY2FyZC0+cHQuaW50cl9ncHJfbmFtZSk7Ci0JCQlqID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsIGNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSk7Ci0JCQlpZiAoaSA8IDAgfHwgaiA8IDApCi0JCQkJRFBGKDIsICJ1bmFibGUgdG8gc2V0IHBhc3MtdGhyb3VnaCBtb2RlXG4iKTsKLQkJCWVsc2UgewotCQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSA0ODAwMDsKLQkJCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCQkJCWNhcmQtPnB0LnBvc19ncHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwKLQkJCQkJCQkJCSAgICBjYXJkLT5wdC5wb3NfZ3ByX25hbWUpOwotCQkJCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDE7Ci0JCQkJY2FyZC0+cHQuaW50cl9ncHIgPSBpOwotCQkJCWNhcmQtPnB0LmVuYWJsZV9ncHIgPSBqOwotCQkJCWNhcmQtPnB0LnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7Ci0JCQkKLQkJCQlEUEQoMiwgImlzX2FjMyBpcyAlZFxuIiwgaXNfYWMzKTsKLQkJCQljYXJkLT5wdC5hYzNkYXRhID0gaXNfYWMzOwotCQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJfQotCQl9ZWxzZXsKLQkJCURQRigyLCAiVXNpbmcgUGFzc3Rocm91Z2ggTWV0aG9kIDJcbiIpOwotCQkJY2FyZC0+cHQuZW5hYmxlX2dwciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLAotCQkJCQkJCQkgICAgICAgY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKTsKLQkJCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDI7Ci0JCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJfQotCX0KLQotCXdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWwgPSB3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPj4gMzsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOwotCXdhdmVfZm10LT5ieXRlc3BlcnNlYyA9IHdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSAqIHdhdmVfZm10LT5zYW1wbGluZ3JhdGU7Ci0KLQlpZiAod2F2ZV9mbXQtPmNoYW5uZWxzID09IDIpCi0JCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLQllbHNlCi0JCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLX0KLQotc3RhdGljIGludCBnZXRfdm9pY2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCi17Ci0Jc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSAmd29pbnN0LT52b2ljZVt2b2ljZW51bV07Ci0KLQkvKiBBbGxvY2F0ZSB2b2ljZXMgaGVyZSwgaWYgbm8gdm9pY2VzIGF2YWlsYWJsZSwgcmV0dXJuIGVycm9yLiAqLwotCi0Jdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfUExBWUJBQ0s7Ci0KLQl2b2ljZS0+ZmxhZ3MgPSAwOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID09IDIpCi0JCXZvaWNlLT5mbGFncyB8PSBWT0lDRV9GTEFHU19TVEVSRU87Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPT0gMTYpCi0JCXZvaWNlLT5mbGFncyB8PSBWT0lDRV9GTEFHU18xNkJJVDsKLQotCWlmIChlbXUxMGsxX3ZvaWNlX2FsbG9jKGNhcmQsIHZvaWNlKSA8IDApIHsKLQkJdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENhbGN1bGF0ZSBwaXRjaCAqLwotCXZvaWNlLT5pbml0aWFsX3BpdGNoID0gKHUxNikgKHNyVG9QaXRjaCh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUpID4+IDgpOwotCXZvaWNlLT5waXRjaF90YXJnZXQgPSBzYW1wbGVyYXRlX3RvX2xpbmVhcnBpdGNoKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSk7Ci0KLQlEUEQoMiwgIkluaXRpYWwgcGl0Y2ggLS0+ICUjeFxuIiwgdm9pY2UtPmluaXRpYWxfcGl0Y2gpOwotCi0Jdm9pY2UtPnN0YXJ0bG9vcCA9ICh2b2ljZS0+bWVtLmVtdXBhZ2VpbmRleCA8PCAxMikgLwotCSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCXZvaWNlLT5lbmRsb29wID0gdm9pY2UtPnN0YXJ0bG9vcCArIHdvaW5zdC0+YnVmZmVyLnNpemUgLyB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCXZvaWNlLT5zdGFydCA9IHZvaWNlLT5zdGFydGxvb3A7Ci0KLQkKLQl2b2ljZS0+cGFyYW1zWzBdLnZvbHVtZV90YXJnZXQgPSAweGZmZmY7Ci0Jdm9pY2UtPnBhcmFtc1swXS5pbml0aWFsX2ZjID0gMHhmZjsKLQl2b2ljZS0+cGFyYW1zWzBdLmluaXRpYWxfYXR0biA9IDB4MDA7Ci0Jdm9pY2UtPnBhcmFtc1swXS5ieWFtcGxfZW52X3N1c3RhaW4gPSAweDdmOwotCXZvaWNlLT5wYXJhbXNbMF0uYnlhbXBsX2Vudl9kZWNheSA9IDB4N2Y7Ci0KLQkKLQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7Ci0JCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAyKSB7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUFRdOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSAweGZmOwotCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2RjYmEgPSAweGZmMDA7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9oZ2ZlPTA7Ci0JCX0gZWxzZSB7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTEVGVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdOwotCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX1JJR0hUXTsKLQotCQkJaWYgKHdvaW5zdC0+ZGV2aWNlKSB7Ci0JCQkJLy8gL2Rldi9kcHMxCi0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcgID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV07Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTTFdOwotCQkJfSBlbHNlIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dOwotCQkJfQotCQl9Ci0JCQotCQl2b2ljZS0+cGFyYW1zWzFdLnZvbHVtZV90YXJnZXQgPSAweGZmZmY7Ci0JCXZvaWNlLT5wYXJhbXNbMV0uaW5pdGlhbF9mYyA9IDB4ZmY7Ci0JCXZvaWNlLT5wYXJhbXNbMV0uaW5pdGlhbF9hdHRuID0gMHgwMDsKLQkJdm9pY2UtPnBhcmFtc1sxXS5ieWFtcGxfZW52X3N1c3RhaW4gPSAweDdmOwotCQl2b2ljZS0+cGFyYW1zWzFdLmJ5YW1wbF9lbnZfZGVjYXkgPSAweDdmOwotCX0gZWxzZSB7Ci0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7Ci0JCQkvLyBNdWx0aWNoYW5uZWwgcGNtCi0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYT0weGZmOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmU9MDsKLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IDB4M2YzZjNmMDAgKyBjYXJkLT5tY2hhbm5lbF9meCArIHZvaWNlbnVtOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IDB4M2YzZjNmM2Y7Ci0JCQl9IGVsc2UgewotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gMHhmZmYwICsgY2FyZC0+bWNoYW5uZWxfZnggKyB2b2ljZW51bTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX01PTk9dOwotCi0JCQlpZiAod29pbnN0LT5kZXZpY2UpIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXTsKLQkJCX0gZWxzZSB7Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dOwotCQkJfQotCQl9Ci0JfQotCi0JRFBEKDIsICJ2b2ljZTogc3RhcnRsb29wPSUjeCwgZW5kbG9vcD0lI3hcbiIsIHZvaWNlLT5zdGFydGxvb3AsIHZvaWNlLT5lbmRsb29wKTsKLQotCWVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAodm9pY2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0JdTE2IGRlbGF5OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfb3BlbigpXG4iKTsKLQotCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgewotCQlpZiAoZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoY2FyZCwgJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dLm1lbSwgd29pbnN0LT5idWZmZXIucGFnZXMpIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoZ2V0X3ZvaWNlKGNhcmQsIHdvaW5zdCwgdm9pY2VudW0pIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlidWZmZXItPmZpbGxfc2lsZW5jZSA9IDA7Ci0JYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gMDsKLQlidWZmZXItPnNpbGVuY2VfcG9zID0gMDsKLQlidWZmZXItPmh3X3BvcyA9IDA7Ci0JYnVmZmVyLT5mcmVlX2J5dGVzID0gd29pbnN0LT5idWZmZXIuc2l6ZTsKLQotCWRlbGF5ID0gKDQ4MDAwICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLwotCQkgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpOwotCi0JZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3b2luc3QtPnRpbWVyLCBkZWxheSk7Ci0KLQl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9PUEVOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlb3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXVuc2lnbmVkIGludCB2b2ljZW51bTsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X2Nsb3NlKClcbiIpOwotCi0JZW11MTBrMV93YXZlb3V0X3N0b3Aod2F2ZV9kZXYpOwotCi0JZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0JZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7Ci0JCWVtdTEwazFfdm9pY2VfZnJlZSgmd29pbnN0LT52b2ljZVt2b2ljZW51bV0pOwotCQllbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKGNhcmQsICZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXS5tZW0pOwotCX0KLQotCXdvaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc3RhcnQoKVxuIik7Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMikgewotCQllbXUxMGsxX3B0X3NldHVwKHdhdmVfZGV2KTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgcHQtPmVuYWJsZV9ncHIsIDAsIDEpOwotCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9QTEFZSU5HOwotCX0KLQotCS8qIEFjdHVhbCBzdGFydCAqLwotCWVtdTEwazFfdm9pY2VzX3N0YXJ0KHdvaW5zdC0+dm9pY2UsIHdvaW5zdC0+bnVtX3ZvaWNlcywgd29pbnN0LT50b3RhbF9wbGF5ZWQpOwotCi0JZW11MTBrMV90aW1lcl9lbmFibGUoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0Jd29pbnN0LT5zdGF0ZSB8PSBXQVZFX1NUQVRFX1NUQVJURUQ7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKmZvcm1hdCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0JdTE2IGRlbGF5OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KClcbiIpOwotCi0JaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCXJldHVybiAtMTsKLQotCXF1ZXJ5X2Zvcm1hdCh3YXZlX2RldiwgZm9ybWF0KTsKLQotCWlmICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgIT0gZm9ybWF0LT5zYW1wbGluZ3JhdGUgfHwKLQkgICAgd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgIT0gZm9ybWF0LT5jaGFubmVscyB8fAotCSAgICB3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCAhPSBmb3JtYXQtPmJpdHNwZXJjaGFubmVsKSB7Ci0KLQkJd29pbnN0LT5mb3JtYXQgPSAqZm9ybWF0OwotCi0JCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKQotCQkJcmV0dXJuIDA7Ci0KLQkJZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0JCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgewotCQkJZW11MTBrMV92b2ljZV9mcmVlKCZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXSk7Ci0KLQkJCWlmIChnZXRfdm9pY2UoY2FyZCwgd29pbnN0LCB2b2ljZW51bSkgPCAwKSB7Ci0JCQkJRVJST1IoKTsKLQkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCi0JCWRlbGF5ID0gKDQ4MDAwICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLwotCQkJICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgKiB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKTsKLQotCQllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIsIGRlbGF5KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X3N0b3AoKVxuIik7Ci0KLQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkKLQkJcmV0dXJuOwotCi0JZW11MTBrMV90aW1lcl9kaXNhYmxlKGNhcmQsICZ3b2luc3QtPnRpbWVyKTsKLQotCS8qIFN0b3AgYWN0dWFsIHZvaWNlcyAqLwotCWVtdTEwazFfdm9pY2VzX3N0b3Aod29pbnN0LT52b2ljZSwgd29pbnN0LT5udW1fdm9pY2VzKTsKLQotCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQotCXdvaW5zdC0+c3RhdGUgJj0gfldBVkVfU1RBVEVfU1RBUlRFRDsKLX0KLQotLyoqCi0gKiBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUgLQotICoKLSAqIGdpdmVzIHRoZSB0b3RhbCBmcmVlIGJ5dGVzIG9uIHRoZSB2b2ljZSBidWZmZXIsIGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzCi0gKiAoYmFzaWNhbGx5OiB0b3RhbF9mcmVlX2J5dGVzID0gZnJlZV9ieXRlcyArIHNpbGVuY2VfYnl0ZXMpLgotICoKLSAqLwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUoc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgKnRvdGFsX2ZyZWVfYnl0ZXMpCi17Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0JaW50IHBlbmRpbmdfYnl0ZXM7Ci0KLQlpZiAod29pbnN0LT5tbWFwcGVkKSB7Ci0JCSp0b3RhbF9mcmVlX2J5dGVzID0gYnVmZmVyLT5mcmVlX2J5dGVzOwotCQlyZXR1cm47Ci0JfQotCi0JcGVuZGluZ19ieXRlcyA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+ZnJlZV9ieXRlczsKLQotCWJ1ZmZlci0+ZmlsbF9zaWxlbmNlID0gKHBlbmRpbmdfYnl0ZXMgPCAoc2lnbmVkKSBidWZmZXItPmZyYWdtZW50X3NpemUgKiAyKSA/IDEgOiAwOwotCi0JaWYgKHBlbmRpbmdfYnl0ZXMgPiAoc2lnbmVkKSBidWZmZXItPnNpbGVuY2VfYnl0ZXMpIHsKLQkJKnRvdGFsX2ZyZWVfYnl0ZXMgPSAoYnVmZmVyLT5mcmVlX2J5dGVzICsgYnVmZmVyLT5zaWxlbmNlX2J5dGVzKTsKLQl9IGVsc2UgewotCQkqdG90YWxfZnJlZV9ieXRlcyA9IGJ1ZmZlci0+c2l6ZTsKLQkJYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gcGVuZGluZ19ieXRlczsKLQkJaWYgKHBlbmRpbmdfYnl0ZXMgPCAwKSB7Ci0JCQlidWZmZXItPnNpbGVuY2VfcG9zID0gYnVmZmVyLT5od19wb3M7Ci0JCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOwotCQkJYnVmZmVyLT5mcmVlX2J5dGVzID0gYnVmZmVyLT5zaXplOwotCQkJRFBGKDEsICJidWZmZXIgdW5kZXJydW5cbiIpOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGNvcHlfYmxvY2sgLQotICoKLSAqIGNvcGllcyBhIGJsb2NrIG9mIHBjbSBkYXRhIHRvIGEgdm9pY2UgYnVmZmVyLgotICogTm90aWNlIHRoYXQgdGhlIHZvaWNlIGJ1ZmZlciBpcyBhY3R1YWxseSBhIHNldCBvZiBkaXNqb2ludGVkIG1lbW9yeSBwYWdlcy4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGNvcHlfYmxvY2sodm9pZCAqKmRzdCwgdTMyIHN0ciwgdTggX191c2VyICpzcmMsIHUzMiBsZW4pCi17Ci0JdW5zaWduZWQgaW50IHBnOwotCXVuc2lnbmVkIGludCBwZ29mZjsKLQl1bnNpZ25lZCBpbnQgazsKLQotCXBnID0gc3RyIC8gUEFHRV9TSVpFOwotCXBnb2ZmID0gc3RyICUgUEFHRV9TSVpFOwotCi0JaWYgKGxlbiA+IFBBR0VfU0laRSAtIHBnb2ZmKSB7Ci0JCWsgPSBQQUdFX1NJWkUgLSBwZ29mZjsKLQkJaWYgKF9fY29weV9mcm9tX3VzZXIoKHU4ICopZHN0W3BnXSArIHBnb2ZmLCBzcmMsIGspKQotCQkJcmV0dXJuOwotCQlsZW4gLT0gazsKLQkJd2hpbGUgKGxlbiA+IFBBR0VfU0laRSkgewotCQkJaWYgKF9fY29weV9mcm9tX3VzZXIoZHN0WysrcGddLCBzcmMgKyBrLCBQQUdFX1NJWkUpKQotCQkJCXJldHVybjsKLQkJCWsgKz0gUEFHRV9TSVpFOwotCQkJbGVuIC09IFBBR0VfU0laRTsKLQkJfQotCQlpZiAoX19jb3B5X2Zyb21fdXNlcihkc3RbKytwZ10sIHNyYyArIGssIGxlbikpCi0JCQlyZXR1cm47Ci0KLQl9IGVsc2UKLQkJX19jb3B5X2Zyb21fdXNlcigodTggKilkc3RbcGddICsgcGdvZmYsIHNyYywgbGVuKTsKLX0KLQotLyoqCi0gKiBjb3B5X2lsdl9ibG9jayAtCi0gKgotICogY29waWVzIGEgYmxvY2sgb2YgcGNtIGRhdGEgY29udGFpbmluZyBuIGludGVybGVhdmVkIGNoYW5uZWxzIHRvIG4gbW9ubyB2b2ljZSBidWZmZXJzLgotICogTm90aWNlIHRoYXQgdGhlIHZvaWNlIGJ1ZmZlciBpcyBhY3R1YWxseSBhIHNldCBvZiBkaXNqb2ludGVkIG1lbW9yeSBwYWdlcy4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGNvcHlfaWx2X2Jsb2NrKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyIHN0ciwgdTggX191c2VyICpzcmMsIHUzMiBsZW4pIAotewotICAgICAgICB1bnNpZ25lZCBpbnQgcGc7Ci0JdW5zaWduZWQgaW50IHBnb2ZmOwotCXVuc2lnbmVkIGludCB2b2ljZV9udW07Ci0Jc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSB3b2luc3QtPnZvaWNlOwotCi0JcGcgPSBzdHIgLyBQQUdFX1NJWkU7Ci0JcGdvZmYgPSBzdHIgJSBQQUdFX1NJWkU7Ci0KLQl3aGlsZSAobGVuKSB7IAotCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspIHsKLQkJCWlmIChfX2NvcHlfZnJvbV91c2VyKCh1OCAqKSh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSkgKyBwZ29mZiwgc3JjLCB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKSkKLQkJCQlyZXR1cm47Ci0JCQlzcmMgKz0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQkJfQotCi0JCWxlbiAtPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCi0JCXBnb2ZmICs9IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0JCWlmIChwZ29mZiA+PSBQQUdFX1NJWkUpIHsKLQkJCXBnb2ZmID0gMDsKLQkJCXBnKys7Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogZmlsbF9ibG9jayAtCi0gKgotICogZmlsbHMgYSBzZXQgdm9pY2UgYnVmZmVycyB3aXRoIGEgYmxvY2sgb2YgYSBnaXZlbiBzYW1wbGUuCi0gKgotICovCi1zdGF0aWMgdm9pZCBmaWxsX2Jsb2NrKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyIHN0ciwgdTggZGF0YSwgdTMyIGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgcGc7Ci0JdW5zaWduZWQgaW50IHBnb2ZmOwotCXVuc2lnbmVkIGludCB2b2ljZV9udW07Ci0gICAgICAgIHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlID0gd29pbnN0LT52b2ljZTsKLQl1bnNpZ25lZCBpbnQgIGs7Ci0KLQlwZyA9IHN0ciAvIFBBR0VfU0laRTsKLQlwZ29mZiA9IHN0ciAlIFBBR0VfU0laRTsKLQotCWlmIChsZW4gPiBQQUdFX1NJWkUgLSBwZ29mZikgewotCQlrID0gUEFHRV9TSVpFIC0gcGdvZmY7Ci0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCW1lbXNldCgodTggKil2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSArIHBnb2ZmLCBkYXRhLCBrKTsKLQkJbGVuIC09IGs7Ci0JCXdoaWxlIChsZW4gPiBQQUdFX1NJWkUpIHsKLQkJCXBnKys7Ci0JCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCi0JCQkJbWVtc2V0KHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddLCBkYXRhLCBQQUdFX1NJWkUpOwotCi0JCQlsZW4gLT0gUEFHRV9TSVpFOwotCQl9Ci0JCXBnKys7Ci0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCW1lbXNldCh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSwgZGF0YSwgbGVuKTsKLQotCX0gZWxzZSB7Ci0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCW1lbXNldCgodTggKil2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSArIHBnb2ZmLCBkYXRhLCBsZW4pOwotCX0KLX0KLQotLyoqCi0gKiBlbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEgLQotICoKLSAqIGNvcGllcyBwY20gZGF0YSB0byB0aGUgdm9pY2UgYnVmZmVyLiBTaWxlbmNlIHNhbXBsZXMKLSAqIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhcmUgb3ZlcndyaXR0ZW4uCi0gKgotICovCi12b2lkIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICpzaXplKQotewotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOwotCXN0cnVjdCB2b2ljZV9tZW0gKm1lbSA9ICZ3b2luc3QtPnZvaWNlWzBdLm1lbTsKLQl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzaXpldG9jb3B5ID0gbWluX3QodTMyLCBidWZmZXItPnNpemUsICpzaXplKTsKLQkqc2l6ZSA9IHNpemV0b2NvcHk7Ci0KLQlpZiAoIXNpemV0b2NvcHkpCi0JCXJldHVybjsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0Jc3RhcnQgPSAoYnVmZmVyLT5zaXplICsgYnVmZmVyLT5zaWxlbmNlX3BvcyAtIGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgJSBidWZmZXItPnNpemU7Ci0KLQlpZiAoc2l6ZXRvY29weSA+IGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgewotCQlidWZmZXItPnNpbGVuY2VfcG9zICs9IHNpemV0b2NvcHkgLSBidWZmZXItPnNpbGVuY2VfYnl0ZXM7Ci0JCWJ1ZmZlci0+ZnJlZV9ieXRlcyAtPSBzaXpldG9jb3B5IC0gYnVmZmVyLT5zaWxlbmNlX2J5dGVzOwotCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOwotCX0gZWxzZQotCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgLT0gc2l6ZXRvY29weTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0Jc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKLQlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7Ci0JCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7Ci0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7Ci0JCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5X25vdyk7Ci0JCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIDAsIGRhdGEgKyBzaXpldG9jb3B5X25vdyAqIHdvaW5zdC0+bnVtX3ZvaWNlcywgc2l6ZXRvY29weSk7Ci0JCX0gZWxzZSB7Ci0JCQljb3B5X2Jsb2NrKG1lbS0+YWRkciwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHlfbm93KTsKLQkJCWNvcHlfYmxvY2sobWVtLT5hZGRyLCAwLCBkYXRhICsgc2l6ZXRvY29weV9ub3csIHNpemV0b2NvcHkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpCi0JCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5KTsKLQkJZWxzZQotCQkJY29weV9ibG9jayhtZW0tPmFkZHIsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5KTsKLQl9Ci19Ci0KLS8qKgotICogZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlIC0KLSAqCi0gKiBhZGRzIHNhbXBsZXMgb2Ygc2lsZW5jZSB0byB0aGUgdm9pY2UgYnVmZmVyIHNvIHRoYXQgd2UKLSAqIGRvbid0IGxvb3Agb3ZlciBzdGFsZSBwY20gZGF0YS4KLSAqCi0gKi8KLXZvaWQgZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OwotCXU4IGZpbGxkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzaXpldG9jb3B5ID0gYnVmZmVyLT5mcmFnbWVudF9zaXplOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID09IDE2KQotCQlmaWxsZGF0YSA9IDB4MDA7Ci0JZWxzZQotCQlmaWxsZGF0YSA9IDB4ODA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JYnVmZmVyLT5zaWxlbmNlX2J5dGVzICs9IHNpemV0b2NvcHk7Ci0JYnVmZmVyLT5mcmVlX2J5dGVzIC09IHNpemV0b2NvcHk7Ci0JYnVmZmVyLT5zaWxlbmNlX3BvcyAlPSBidWZmZXItPnNpemU7Ci0Jc3RhcnQgPSBidWZmZXItPnNpbGVuY2VfcG9zOwotCWJ1ZmZlci0+c2lsZW5jZV9wb3MgKz0gc2l6ZXRvY29weTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7Ci0KLQlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7Ci0JCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7Ci0JCWZpbGxfYmxvY2sod29pbnN0LCBzdGFydCwgZmlsbGRhdGEsIHNpemV0b2NvcHlfbm93KTsKLQkJZmlsbF9ibG9jayh3b2luc3QsIDAsIGZpbGxkYXRhLCBzaXpldG9jb3B5KTsKLQl9IGVsc2UgewotCQlmaWxsX2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGZpbGxkYXRhLCBzaXpldG9jb3B5KTsKLQl9Ci19Ci0KLS8qKgotICogZW11MTBrMV93YXZlb3V0X3VwZGF0ZSAtCi0gKgotICogdXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHZvaWNlIGJ1ZmZlciBoYXJkd2FyZSBwb2ludGVyIChod19wb3MpCi0gKiBhbmQgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIG9uIHRoZSBidWZmZXIgKGZyZWVfYnl0ZXMpLgotICogVGhlIGZyZWUgYnl0ZXMgX2Rvbid0XyBpbmNsdWRlIHNpbGVuY2UgYnl0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuCi0gKiBhZGRlZCB0byB0aGUgYnVmZmVyLgotICoKLSAqLwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKLXsKLQl1MzIgaHdfcG9zOwotCXUzMiBkaWZmOwotCi0JLyogVGhlcmUgaXMgbm8gYWN0dWFsIHN0YXJ0IHlldCAqLwotCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7Ci0JCWh3X3BvcyA9IHdvaW5zdC0+YnVmZmVyLmh3X3BvczsKLQl9IGVsc2UgewotCQkvKiBod19wb3MgaW4gc2FtcGxlIHVuaXRzICovCi0JCWh3X3BvcyA9IHNibGl2ZV9yZWFkcHRyKHdvaW5zdC0+dm9pY2VbMF0uY2FyZCwgQ0NDQV9DVVJSQUREUiwgd29pbnN0LT52b2ljZVswXS5udW0pOwotCi0JCWlmKGh3X3BvcyA8IHdvaW5zdC0+dm9pY2VbMF0uc3RhcnQpCi0JCQlod19wb3MgKz0gd29pbnN0LT5idWZmZXIuc2l6ZSAvIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUgLSB3b2luc3QtPnZvaWNlWzBdLnN0YXJ0OwotCQllbHNlCi0JCQlod19wb3MgLT0gd29pbnN0LT52b2ljZVswXS5zdGFydDsKLQotCQlod19wb3MgKj0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQl9Ci0KLQlkaWZmID0gKHdvaW5zdC0+YnVmZmVyLnNpemUgKyBod19wb3MgLSB3b2luc3QtPmJ1ZmZlci5od19wb3MpICUgd29pbnN0LT5idWZmZXIuc2l6ZTsKLQl3b2luc3QtPnRvdGFsX3BsYXllZCArPSBkaWZmOwotCXdvaW5zdC0+YnVmZmVyLmZyZWVfYnl0ZXMgKz0gZGlmZjsKLQl3b2luc3QtPmJ1ZmZlci5od19wb3MgPSBod19wb3M7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGVjZTg4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkd28uaCAtLSBoZWFkZXIgZmlsZSBmb3IgY2FyZCB3YXZlIG91dCBmdW5jdGlvbnMKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2lmbmRlZiBfQ0FSRFdPX0gKLSNkZWZpbmUgX0NBUkRXT19ICi0KLSNpbmNsdWRlICJpY2FyZHdhdi5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAidm9pY2VtZ3IuaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi0vKiBzZXR0aW5nIHRoaXMgdG8gb3RoZXIgdGhhbiBhIHBvd2VyIG9mIHR3byBtYXkgYnJlYWsgc29tZSBhcHBsaWNhdGlvbnMgKi8KLSNkZWZpbmUgV0FWRU9VVF9NQVhCVUZTSVpFCU1BWEJVRlNJWkUKLQotI2RlZmluZSBXQVZFT1VUX0RFRkFVTFRGUkFHTEVOCTIwIC8qIFRpbWUgdG8gcGxheSBhIGZyYWdtZW50IGluIG1zIChsYXRlbmN5KSAqLwotI2RlZmluZSBXQVZFT1VUX0RFRkFVTFRCVUZMRU4JNTAwIC8qIFRpbWUgdG8gcGxheSB0aGUgZW50aXJlIGJ1ZmZlciBpbiBtcyAqLwotCi0jZGVmaW5lIFdBVkVPVVRfTUlORlJBR1NISUZUCTYgLyogTWluaW11bSBmcmFnbWVudCBzaXplIGluIGJ5dGVzIGlzIDJeNiAqLwotI2RlZmluZSBXQVZFT1VUX01JTkZSQUdTCTMgLyogX2Rvbid0XyBnbyBiZWxsb3cgMywgaXQgd291bGQgYnJlYWsgc2lsZW5jZSBmaWxsaW5nICovCi0jZGVmaW5lIFdBVkVPVVRfTUFYVk9JQ0VTCTYKLQotc3RydWN0IHdhdmVvdXRfYnVmZmVyIHsKLQl1MTYgb3NzZnJhZ3NoaWZ0OwotCXUzMiBudW1mcmFnczsKLQl1MzIgZnJhZ21lbnRfc2l6ZTsJLyogaW4gYnl0ZXMgdW5pdHMgKi8KLQl1MzIgc2l6ZTsJCS8qIGluIGJ5dGVzIHVuaXRzICovCi0JdTMyIHBhZ2VzOwkJLyogYnVmZmVyIHNpemUgaW4gcGFnZSB1bml0cyovCi0JdTMyIHNpbGVuY2VfcG9zOwkvKiBzb2Z0d2FyZSBjdXJzb3IgcG9zaXRpb24gKGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzKSAqLwotCXUzMiBod19wb3M7CQkvKiBoYXJkd2FyZSBjdXJzb3IgcG9zaXRpb24gKi8KLQl1MzIgZnJlZV9ieXRlczsJCS8qIGZyZWUgYnl0ZXMgYXZhaWxhYmxlIG9uIHRoZSBidWZmZXIgKG5vdCBpbmNsdWRpbmcgc2lsZW5jZSBieXRlcykgKi8KLQl1OCBmaWxsX3NpbGVuY2U7Ci0JdTMyIHNpbGVuY2VfYnl0ZXM7ICAgICAgLyogc2lsZW5jZSBieXRlcyBvbiB0aGUgYnVmZmVyICovCi19OwotCi1zdHJ1Y3Qgd29pbnN0IAotewotCXU4IHN0YXRlOwotCXU4IG51bV92b2ljZXM7Ci0Jc3RydWN0IGVtdV92b2ljZSB2b2ljZVtXQVZFT1VUX01BWFZPSUNFU107Ci0Jc3RydWN0IGVtdV90aW1lciB0aW1lcjsKLQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciBidWZmZXI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKLQl1OCBtbWFwcGVkOwotCXUzMiB0b3RhbF9jb3BpZWQ7CS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuKCkgdG8gdGhlIGJ1ZmZlciAoZXhjbHVkaW5nIHNpbGVuY2UpICovCi0JdTMyIHRvdGFsX3BsYXllZDsJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHBsYXllZCBpbmNsdWRpbmcgc2lsZW5jZSAqLwotCXUzMiBibG9ja3M7Ci0JdTggZGV2aWNlOwotCXNwaW5sb2NrX3QgbG9jazsKLX07Ci0KLWludCBlbXUxMGsxX3dhdmVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd29pbnN0KiwgdTMyICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEoc3RydWN0IHdvaW5zdCosIHU4IF9fdXNlciAqLCB1MzIgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9maWxsc2lsZW5jZShzdHJ1Y3Qgd29pbnN0Kik7Ci1pbnQgZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlKiwgc3RydWN0IHdhdmVfZm9ybWF0Kik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF91cGRhdGUoc3RydWN0IHdvaW5zdCopOwotCi0jZW5kaWYgLyogX0NBUkRXT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jIGIvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlNjM1Zi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZWNhcmQuYyAtIEUtY2FyZCBpbml0aWFsaXphdGlvbiBjb2RlCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovIAotCi0jaW5jbHVkZSAiZWNhcmQuaCIKLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi0vKiBQcml2YXRlIHJvdXRpbmVzICovCi1zdGF0aWMgdm9pZCBlY2FyZF9zZXRhZGNnYWluKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVjYXJkX3N0YXRlICosIHUxNik7Ci1zdGF0aWMgdm9pZCBlY2FyZF93cml0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZ1bmMgU2V0IHRoZSBnYWluIG9mIHRoZSBFQ0FSRCdzIENTMzMxMCBUcmltL2dhaW4gY29udHJvbGxlci4gIFRoZQotICogdHJpbSB2YWx1ZSBjb25zaXN0cyBvZiBhIDE2Yml0IHZhbHVlIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHR3bwotICogOCBiaXQgZ2Fpbi90cmltIHZhbHVlcywgb25lIGZvciB0aGUgbGVmdCBjaGFubmVsIGFuZCBvbmUgZm9yIHRoZQotICogcmlnaHQgY2hhbm5lbC4gIFRoZSBmb2xsb3dpbmcgdGFibGUgbWFwcyBmcm9tIHRoZSBHYWluL0F0dGVudWF0aW9uCi0gKiB2YWx1ZSBpbiBkZWNpYmVscyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBwYXR0ZXJuIGZvciBhIHNpbmdsZQotICogY2hhbm5lbC4KLSAqLwotCi1zdGF0aWMgdm9pZCBlY2FyZF9zZXRhZGNnYWluKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlY2FyZF9zdGF0ZSAqZWNhcmQsIHUxNiBnYWluKQotewotCXUzMiBjdXJyYml0OwotCWVjYXJkLT5hZGNfZ2FpbiA9IGdhaW47Ci0KLQkvKiBFbmFibGUgd3JpdGluZyB0byB0aGUgVFJJTSByZWdpc3RlcnMgKi8KLQllY2FyZF93cml0ZShjYXJkLCBlY2FyZC0+Y29udHJvbF9iaXRzICYgfkVDX1RSSU1fQ1NOKTsKLQotCS8qIERvIGl0IGFnYWluIHRvIGluc3VyZSB0aGF0IHdlIG1lZXQgaG9sZCB0aW1lIHJlcXVpcmVtZW50cyAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLT5jb250cm9sX2JpdHMgJiB+RUNfVFJJTV9DU04pOwotCi0JZm9yIChjdXJyYml0ID0gKDFMIDw8IDE1KTsgY3VycmJpdDsgY3VycmJpdCA+Pj0gMSkgewotCi0JCXUzMiB2YWx1ZSA9IGVjYXJkLT5jb250cm9sX2JpdHMgJiB+KEVDX1RSSU1fQ1NOfEVDX1RSSU1fU0RBVEEpOwotCi0JCWlmIChnYWluICYgY3VycmJpdCkKLQkJICAgICAgdmFsdWUgfD0gRUNfVFJJTV9TREFUQTsKLQotCQkvKiBDbG9jayB0aGUgYml0ICovCi0JCWVjYXJkX3dyaXRlKGNhcmQsIHZhbHVlKTsKLQkJZWNhcmRfd3JpdGUoY2FyZCwgdmFsdWUgfCBFQ19UUklNX1NDTEspOwotCQllY2FyZF93cml0ZShjYXJkLCB2YWx1ZSk7Ci0JfQotCi0JZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQtPmNvbnRyb2xfYml0cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZ1bmMgQ2xvY2sgYml0cyBpbnRvIHRoZSBFY2FyZCdzIGNvbnRyb2wgbGF0Y2guICBUaGUgRWNhcmQgdXNlcyBhCi0gKiAgY29udHJvbCBsYXRjaCB3aWxsIGlzIGxvYWRlZCBiaXQtc2VyaWFsbHkgYnkgdG9nZ2xpbmcgdGhlIE1vZGVtIGNvbnRyb2wKLSAqICBsaW5lcyBmcm9tIGZ1bmN0aW9uIDIgb24gdGhlIEU4MDEwLiAgVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGVzZSBkZXRhaWxzCi0gKiAgYW5kIHByZXNlbnRzIHRoZSBpbGx1c2lvbiB0aGF0IHdlIGFyZSBhY3R1YWxseSB3cml0aW5nIHRvIGEgZGlzdGluY3QKLSAqICByZWdpc3Rlci4KLSAqLwotc3RhdGljIHZvaWQgZWNhcmRfd3JpdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHZhbHVlKQotewotCXUxNiBjb3VudDsKLQl1MzIgZGF0YSwgaGN2YWx1ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWhjdmFsdWUgPSBpbmwoY2FyZC0+aW9iYXNlICsgSENGRykgJiB+KEhPT0tOX0JJVHxIQU5ETl9CSVR8UFVMU0VOX0JJVCk7Ci0KLQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUpOwotCi0JZm9yIChjb3VudCA9IDAgOyBjb3VudCA8IEVDX05VTV9DT05UUk9MX0JJVFM7IGNvdW50KyspIHsKLQkKLQkJLyogU2V0IHVwIHRoZSB2YWx1ZSAqLwotCQlkYXRhID0gKCh2YWx1ZSAmIDB4MSkgPyBQVUxTRU5fQklUIDogMCk7Ci0JCXZhbHVlID4+PSAxOwotCi0JCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IGRhdGEpOwotCi0JCS8qIENsb2NrIHRoZSBzaGlmdCByZWdpc3RlciAqLwotCQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBkYXRhIHwgSEFORE5fQklUKTsKLQkJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgZGF0YSk7Ci0JfQotCi0JLyogTGF0Y2ggdGhlIGJpdHMgKi8KLQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBIT09LTl9CSVQpOwotCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgX19kZXZpbml0IGVtdTEwazFfZWNhcmRfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXUzMiBoY3ZhbHVlOwotCXN0cnVjdCBlY2FyZF9zdGF0ZSBlY2FyZDsKLQotCS8qIFNldCB1cCB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotCWVjYXJkLm11eDBfc2V0dGluZyA9IEVDX0RFRkFVTFRfU1BESUYwX1NFTDsKLQllY2FyZC5tdXgxX3NldHRpbmcgPSBFQ19ERUZBVUxUX1NQRElGMV9TRUw7Ci0JZWNhcmQubXV4Ml9zZXR0aW5nID0gMDsKLQllY2FyZC5hZGNfZ2FpbiA9IEVDX0RFRkFVTFRfQURDX0dBSU47Ci0JZWNhcmQuY29udHJvbF9iaXRzID0gRUNfUkFXX1JVTl9NT0RFIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1NQRElGMF9TRUxFQ1QoZWNhcmQubXV4MF9zZXR0aW5nKSB8Ci0JCQkgICAgIEVDX1NQRElGMV9TRUxFQ1QoZWNhcmQubXV4MV9zZXR0aW5nKTsKLQotCi0JLyogU3RlcCAwOiBTZXQgdGhlIGNvZGVjIHR5cGUgaW4gdGhlIGhhcmR3YXJlIGNvbnRyb2wgcmVnaXN0ZXIgCi0JICogYW5kIGVuYWJsZSBhdWRpbyBvdXRwdXQgKi8KLQloY3ZhbHVlID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIEhDRkcpOwotCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgaGN2YWx1ZSB8IEhDRkdfQVVESU9FTkFCTEUgfCBIQ0ZHX0NPREVDRk9STUFUX0kyUyk7Ci0KLQkvKiBTdGVwIDE6IFR1cm4gb2ZmIHRoZSBsZWQgYW5kIGRlYXNzZXJ0IFRSSU1fQ1MgKi8KLQllY2FyZF93cml0ZShjYXJkLCBFQ19BRENDQUwgfCBFQ19MRUROIHwgRUNfVFJJTV9DU04pOwotCi0JLyogU3RlcCAyOiBDYWxpYnJhdGUgdGhlIEFEQyBhbmQgREFDICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgRUNfREFDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKLQotCS8qIFN0ZXAgMzogV2FpdCBmb3IgYXdoaWxlOyBGSVhNRTogSXMgdGhpcyBjb3JyZWN0PyAqLwotCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChIWik7Ci0KLQkvKiBTdGVwIDQ6IFN3aXRjaCBvZmYgdGhlIERBQyBhbmQgQURDIGNhbGlicmF0aW9uLiAgTm90ZQotCSAqIFRoYXQgQURDX0NBTCBpcyBhY3R1YWxseSBhbiBpbnZlcnRlZCBzaWduYWwsIHNvIHdlIGFzc2VydAotCSAqIGl0IGhlcmUgdG8gc3RvcCBjYWxpYnJhdGlvbi4gICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgRUNfQURDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKLQotCS8qIFN0ZXAgNDogU3dpdGNoIGludG8gcnVuIG1vZGUgKi8KLQllY2FyZF93cml0ZShjYXJkLCBlY2FyZC5jb250cm9sX2JpdHMpOwotCi0JLyogU3RlcCA1OiBTZXQgdGhlIGFuYWxvZyBpbnB1dCBnYWluICovCi0JZWNhcmRfc2V0YWRjZ2FpbihjYXJkLCAmZWNhcmQsIGVjYXJkLmFkY19nYWluKTsKLX0KLQotCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5oIGIvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhZWFkMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZWNhcmQuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8gCi0KLSNpZm5kZWYgX0VDQVJEX0gKLSNkZWZpbmUgX0VDQVJEX0gKLQotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotLyogSW4gQTEgU2lsaWNvbiwgdGhlc2UgYml0cyBhcmUgaW4gdGhlIEhDIHJlZ2lzdGVyICovCi0jZGVmaW5lIEhPT0tOX0JJVCAgICgxTCA8PCAxMikKLSNkZWZpbmUgSEFORE5fQklUICAgKDFMIDw8IDExKQotI2RlZmluZSBQVUxTRU5fQklUICAoMUwgPDwgMTApCi0KLSNkZWZpbmUgRUNfR0RJMSAoMSA8PCAxMykKLSNkZWZpbmUgRUNfR0RJMCAoMSA8PCAxNCkKLQotI2RlZmluZSBFQ19OVU1fQ09OVFJPTF9CSVRTIDIwCi0KLSNkZWZpbmUgRUNfQUMzX0RBVEFfU0VMTiAgMHgwMDAxTAotI2RlZmluZSBFQ19FRV9EQVRBX1NFTCAgICAweDAwMDJMCi0jZGVmaW5lIEVDX0VFX0NOVFJMX1NFTE4gIDB4MDAwNEwKLSNkZWZpbmUgRUNfRUVDTEsgICAgICAgICAgMHgwMDA4TAotI2RlZmluZSBFQ19FRUNTICAgICAgICAgICAweDAwMTBMCi0jZGVmaW5lIEVDX0VFU0RPICAgICAgICAgIDB4MDAyMEwKLSNkZWZpbmUgRUNfVFJJTV9DU04JICAweDAwNDBMCi0jZGVmaW5lIEVDX1RSSU1fU0NMSwkgIDB4MDA4MEwKLSNkZWZpbmUgRUNfVFJJTV9TREFUQQkgIDB4MDEwMEwKLSNkZWZpbmUgRUNfVFJJTV9NVVRFTgkgIDB4MDIwMEwKLSNkZWZpbmUgRUNfQURDQ0FMCSAgMHgwNDAwTAotI2RlZmluZSBFQ19BRENSU1ROCSAgMHgwODAwTAotI2RlZmluZSBFQ19EQUNDQUwJICAweDEwMDBMCi0jZGVmaW5lIEVDX0RBQ01VVEVOCSAgMHgyMDAwTAotI2RlZmluZSBFQ19MRUROCQkgIDB4NDAwMEwKLQotI2RlZmluZSBFQ19TUERJRjBfU0VMX1NISUZUCTE1Ci0jZGVmaW5lIEVDX1NQRElGMV9TRUxfU0hJRlQJMTcJCi0jZGVmaW5lIEVDX1NQRElGMF9TRUxfTUFTSwkoMHgzTCA8PCBFQ19TUERJRjBfU0VMX1NISUZUKQotI2RlZmluZSBFQ19TUERJRjFfU0VMX01BU0sJKDB4N0wgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkKLSNkZWZpbmUgRUNfU1BESUYwX1NFTEVDVChfeCkgKCgoX3gpIDw8IEVDX1NQRElGMF9TRUxfU0hJRlQpICYgRUNfU1BESUYwX1NFTF9NQVNLKQotI2RlZmluZSBFQ19TUERJRjFfU0VMRUNUKF94KSAoKChfeCkgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkgJiBFQ19TUERJRjFfU0VMX01BU0spCi0jZGVmaW5lIEVDX0NVUlJFTlRfUFJPTV9WRVJTSU9OIDB4MDEgLyogU2VsZi1leHBsYW5hdG9yeS4gIFRoaXMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgaW5jcmVtZW50ZWQgYW55IHRpbWUgdGhlIEVFUFJPTSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9ybWF0IGlzIGNoYW5nZWQuICAqLwotCi0jZGVmaW5lIEVDX0VFUFJPTV9TSVpFCSAgICAgICAgMHg0MCAvKiBFQ0FSRCBFRVBST00gaGFzIDY0IDE2LWJpdCB3b3JkcyAqLwotCi0vKiBBZGRyZXNzZXMgZm9yIHNwZWNpYWwgdmFsdWVzIHN0b3JlZCBpbiB0byBFRVBST00gKi8KLSNkZWZpbmUgRUNfUFJPTV9WRVJTSU9OX0FERFIJMHgyMAkvKiBBZGRyZXNzIG9mIHRoZSBjdXJyZW50IHByb20gdmVyc2lvbiAqLwotI2RlZmluZSBFQ19CT0FSRFJFVjBfQUREUgkweDIxCS8qIExTVyBvZiBib2FyZCByZXYgKi8KLSNkZWZpbmUgRUNfQk9BUkRSRVYxX0FERFIgCTB4MjIJLyogTVNXIG9mIGJvYXJkIHJldiAqLyAKLQotI2RlZmluZSBFQ19MQVNUX1BST01GSUxFX0FERFIJMHgyZgotCi0jZGVmaW5lIEVDX1NFUklBTE5VTV9BREQJMHgzMAkvKiBGaXJzdCB3b3JkIG9mIHNlcmlhbCBudW1iZXIuICBUaGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FuIGJlIHVwIHRvIDMwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGlzIHN0b3JlZCBhcyBhIE5VTEwtdGVybWluYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFTQ0lJIHN0cmluZy4gIEFueSB1bnVzZWQgYnl0ZXMgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbGxlZCB3aXRoIHplcm9zICovCi0jZGVmaW5lIEVDX0NIRUNLU1VNX0FERFIJMHgzZiAgICAvKiBMb2NhdGlvbiBhdCB3aGljaCBjaGVja3N1bSBpcyBzdG9yZWQgKi8KLQotCi0KLS8qIE1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBwcmV0dHkgc2VsZi1ldmlkZW50LiAgQWNjb3JkaW5nIHRvIHRoZSBoYXJkd2FyZSAKLSAqIGR1ZGVzLCB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBBRENDQUwgYml0IGxvdyBpbiBvcmRlciB0byBhdm9pZCBhIERDIAotICogb2Zmc2V0IHByb2JsZW0uICBXZWlyZC4KLSAqLwotI2RlZmluZSBFQ19SQVdfUlVOX01PREUJKEVDX0RBQ01VVEVOIHwgRUNfQURDUlNUTiB8IEVDX1RSSU1fTVVURU4gfCBFQ19UUklNX0NTTikKLQotCi0jZGVmaW5lIEVDX0RFRkFVTFRfQURDX0dBSU4gICAweEM0QzQKLSNkZWZpbmUgRUNfREVGQVVMVF9TUERJRjBfU0VMIDB4MAotI2RlZmluZSBFQ19ERUZBVUxUX1NQRElGMV9TRUwgMHg0Ci0KLSNkZWZpbmUgSENfRUEgMHgwMUwKLQotLyogRUNBUkQgc3RhdGUgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUgbWFpbnRhaW5zIHRoZSBzdGF0ZQotICogZm9yIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIEVDQVJEJ3Mgb25ib2FyZCBoYXJkd2FyZS4KLSAqLwotc3RydWN0IGVjYXJkX3N0YXRlIHsKLQl1MzIgY29udHJvbF9iaXRzOwotCXUxNiBhZGNfZ2FpbjsKLQl1MTYgbXV4MF9zZXR0aW5nOwotCXUxNiBtdXgxX3NldHRpbmc7Ci0JdTE2IG11eDJfc2V0dGluZzsKLX07Ci0KLXZvaWQgZW11MTBrMV9lY2FyZF9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgX19kZXZpbml0OwotCi0jZW5kaWYgLyogX0VDQVJEX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNTg2NWQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZWZ4bWdyLmMKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiZWZ4bWdyLmgiCi0KLWludCBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciwgY29uc3QgY2hhciAqcGF0Y2hfbmFtZSwgY29uc3QgY2hhciAqZ3ByX25hbWUpCi17Ci0gICAgICAgIHN0cnVjdCBkc3BfcGF0Y2ggKnBhdGNoOwotCXN0cnVjdCBkc3BfcnBhdGNoICpycGF0Y2g7Ci0JY2hhciBzW1BBVENIX05BTUVfU0laRSArIDRdOwotCXVuc2lnbmVkIGxvbmcgKmdwcl91c2VkOwotCWludCBpOwotCi0JRFBEKDIsICJlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoKTogJXMgJXNcbiIsIHBhdGNoX25hbWUsIGdwcl9uYW1lKTsKLQotCXJwYXRjaCA9ICZtZ3ItPnJwYXRjaDsKLQlpZiAoIXN0cmNtcChycGF0Y2gtPm5hbWUsIHBhdGNoX25hbWUpKSB7Ci0JCWdwcl91c2VkID0gcnBhdGNoLT5ncHJfdXNlZDsKLQkJZ290byBtYXRjaDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWdyLT5jdXJyZW50X3BhZ2VzICogUEFUQ0hFU19QRVJfUEFHRTsgaSsrKSB7Ci0JCXBhdGNoID0gUEFUQ0gobWdyLCBpKTsKLQkJCXNwcmludGYocywiJXMiLCBwYXRjaC0+bmFtZSk7Ci0KLQkJaWYgKCFzdHJjbXAocywgcGF0Y2hfbmFtZSkpIHsKLQkJCWdwcl91c2VkID0gcGF0Y2gtPmdwcl91c2VkOwotCQkJZ290byBtYXRjaDsKLQkJfQotCX0KLQotCXJldHVybiAtMTsKLQotICBtYXRjaDoKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dQUlM7IGkrKykKLQkJaWYgKG1nci0+Z3ByW2ldLnR5cGUgPT0gR1BSX1RZUEVfQ09OVFJPTCAmJgotCQkgICAgdGVzdF9iaXQoaSwgZ3ByX3VzZWQpICYmCi0JCSAgICAhc3RyY21wKG1nci0+Z3ByW2ldLm5hbWUsIGdwcl9uYW1lKSkKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIC0xOwotfQotCi12b2lkIGVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBhZGRyLCBzMzIgdmFsLCBpbnQgZmxhZykKLXsKLQlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyID0gJmNhcmQtPm1ncjsKLQotCURQRCgyLCAiZW11MTBrMV9zZXRfY29udHJvbF9ncHIoKTogJWQgJXhcbiIsIGFkZHIsIHZhbCk7Ci0KLQlpZiAoYWRkciA8IDAgfHwgYWRkciA+PSBOVU1fR1BSUykKLQkJcmV0dXJuOwotCi0JLy9maXhtZTogb25jZSBwYXRjaCBtYW5hZ2VyIGlzIHVwLCByZW1lbWJlciB0byBmaXggdGhpcyBmb3IgdGhlIGF1ZGlneQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfR1BSX0JBU0UgKyBhZGRyLCAwLCB2YWwpOwotCX0gZWxzZSB7Ci0JCWlmIChmbGFnKQotCQkJdmFsICs9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEdQUl9CQVNFICsgYWRkciwgMCk7Ci0JCWlmICh2YWwgPiBtZ3ItPmdwclthZGRyXS5tYXgpCi0JCQl2YWwgPSBtZ3ItPmdwclthZGRyXS5tYXg7Ci0JCWVsc2UgaWYgKHZhbCA8IG1nci0+Z3ByW2FkZHJdLm1pbikKLQkJCXZhbCA9IG1nci0+Z3ByW2FkZHJdLm1pbjsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEdQUl9CQVNFICsgYWRkciwgMCwgdmFsKTsKLQl9Ci0JCi0JCi19Ci0KLS8vVE9ETzogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZToKLSNkZWZpbmUgVk9MQ1RSTF9DSEFOTkVMIFNPVU5EX01JWEVSX1ZPTFVNRQotI2RlZmluZSBWT0xDVFJMX1NURVBfU0laRSAgICAgICAgNQotCi0vL0FuIGludGVybmFsIGZ1bmN0aW9uIGZvciBzZXR0aW5nIE9TUyBtaXhlciBjb250cm9scy4KLXN0YXRpYyB2b2lkIGVtdTEwazFfc2V0X29zc192b2woc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IG9zc19taXhlciwKLQkJCQl1bnNpZ25lZCBpbnQgbGVmdCwgdW5zaWduZWQgaW50IHJpZ2h0KQotewotCWV4dGVybiBjaGFyIHZvbHVtZV9wYXJhbXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKLQotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19taXhlcl0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OwotCi0JaWYgKCFjYXJkLT5pc19hcHMpCi0JCWNhcmQtPmFjOTctPndyaXRlX21peGVyKGNhcmQtPmFjOTcsIG9zc19taXhlciwgbGVmdCwgcmlnaHQpOwotCQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMF0sIGxlZnQsCi0JCQkgICAgICAgdm9sdW1lX3BhcmFtc1tvc3NfbWl4ZXJdKTsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMV0sIHJpZ2h0LAotCQkJICAgICAgIHZvbHVtZV9wYXJhbXNbb3NzX21peGVyXSk7Ci19Ci0KLS8vRklYTUU6IG11dGUgc2hvdWxkIHVubXV0ZSB3aGVuIHByZXNzZWQgYSBzZWNvbmQgdGltZQotdm9pZCBlbXUxMGsxX211dGVfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBvc3NfY2hhbm5lbCA9IFZPTENUUkxfQ0hBTk5FTDsKLQlpbnQgbGVmdCwgcmlnaHQ7Ci0Jc3RhdGljIGludCB2YWw7Ci0KLQlpZiAodmFsKSB7Ci0JCWxlZnQgPSB2YWwgJiAweGZmOwotCQlyaWdodCA9ICh2YWwgPj4gOCkgJiAweGZmOwotCQl2YWwgPSAwOwotCX0gZWxzZSB7Ci0JCXZhbCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXTsKLQkJbGVmdCA9IDA7Ci0JCXJpZ2h0ID0gMDsKLQl9Ci0KLQllbXUxMGsxX3NldF9vc3Nfdm9sKGNhcmQsIG9zc19jaGFubmVsLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2xpbmNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgb3NzX2NoYW5uZWwgPSBWT0xDVFJMX0NIQU5ORUw7Ci0JaW50IGxlZnQsIHJpZ2h0OwotCi0JbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSAmIDB4ZmY7Ci0JcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdID4+IDgpICYgMHhmZjsKLQotCWlmICgobGVmdCArPSBWT0xDVFJMX1NURVBfU0laRSkgPiAxMDApCi0JCWxlZnQgPSAxMDA7Ci0KLQlpZiAoKHJpZ2h0ICs9IFZPTENUUkxfU1RFUF9TSVpFKSA+IDEwMCkKLQkJcmlnaHQgPSAxMDA7Ci0KLQllbXUxMGsxX3NldF9vc3Nfdm9sKGNhcmQsIG9zc19jaGFubmVsLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2xkZWNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgb3NzX2NoYW5uZWwgPSBWT0xDVFJMX0NIQU5ORUw7Ci0JaW50IGxlZnQsIHJpZ2h0OwotCi0JbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSAmIDB4ZmY7Ci0JcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdID4+IDgpICYgMHhmZjsKLQotCWlmICgobGVmdCAtPSBWT0xDVFJMX1NURVBfU0laRSkgPCAwKQotCQlsZWZ0ID0gMDsKLQotCWlmICgocmlnaHQgLT0gVk9MQ1RSTF9TVEVQX1NJWkUpIDwgMCkKLQkJcmlnaHQgPSAwOwotCi0JZW11MTBrMV9zZXRfb3NzX3ZvbChjYXJkLCBvc3NfY2hhbm5lbCwgbGVmdCwgcmlnaHQpOwotfQotCi12b2lkIGVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGFkZHIsIHMzMiB2b2wsIGludCBzY2FsZSkKLXsKLQlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyID0gJmNhcmQtPm1ncjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3RhdGljIGNvbnN0IHMzMiBsb2cybGluWzRdID17ICAgICAgICAgICAvLyAgYXR0ZW51YXRpb24gKGRCKQotCQkweDdmZmZmZmZmLCAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAwLjAgICAgICAgICAKLQkJMHg3ZmZmZmZmZiAqIDAuODQwODk2NDE1MjUzNzE1ICwgLy8gICAgICAgMS41ICAgICAgICAgIAotCQkweDdmZmZmZmZmICogMC43MDcxMDY3ODExODY1NDgsICAvLyAgICAgICAzLjAKLQkJMHg3ZmZmZmZmZiAqIDAuNTk0NjAzNTU3NTAxMzYxICwgLy8gICAgICAgNC41Ci0JfTsKLQotCWlmIChhZGRyIDwgMCkKLQkJcmV0dXJuOwotCi0Jdm9sID0gKDEwMCAtIHZvbCApICogc2NhbGUgLyAxMDA7Ci0KLQkvLyBUaGFua3MgdG8gdGhlIGNvbXAuZHNwIG5ld3Nncm91cCBmb3IgdGhpcyBuZWF0IHRyaWNrOgotCXZvbCA9ICh2b2wgPj0gc2NhbGUpID8gMCA6IChsb2cybGluW3ZvbCAmIDNdID4+ICh2b2wgPj4gMikpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1nci0+bG9jaywgZmxhZ3MpOwotCWVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKGNhcmQsIGFkZHIsIHZvbCwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWdyLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgZW11MTBrMV9kc3BfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJdTMyIGJjOwotCQliYyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEdQUl9CQVNFICsgY2FyZC0+cHQuaW50cl9ncHIsIDApOwotCQlpZiAoYmMgIT0gMCkgewotCQkJRFBEKDMsICJwdCBpbnRlcnJ1cHQsIGJjID0gJWRcbiIsIGJjKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0JCQljYXJkLT5wdC5ibG9ja3NfcGxheWVkID0gYmM7Ci0JCQlpZiAoY2FyZC0+cHQuYmxvY2tzX3BsYXllZCA+PSBjYXJkLT5wdC5ibG9ja3NfY29waWVkKSB7Ci0JCQkJRFBGKDEsICJidWZmZXIgdW5kZXJydW4gaW4gcGFzc3Rocm91Z2ggcGxheWJhY2tcbiIpOwotCQkJCWVtdTEwazFfcHRfc3RvcChjYXJkKTsKLQkJCX0KLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FyZC0+cHQud2FpdCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5oIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDhlNWMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBzYmxpdmVfZnguaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaWZuZGVmIF9FRlhNR1JfSAotI2RlZmluZSBfRUZYTUdSX0gKLQotc3RydWN0IGVtdV9lZnhfaW5mb190ewotCWludCBvcGNvZGVfc2hpZnQ7Ci0JaW50IGhpZ2hfb3BlcmFuZF9zaGlmdDsKLQlpbnQgaW5zdHJ1Y3Rpb25fc3RhcnQ7Ci0JaW50IGdwcl9iYXNlOwotCWludCBvdXRwdXRfYmFzZTsKLX07Ci0KLQotI2RlZmluZSBXUklURV9FRlgoYSwgYiwgYykgc2JsaXZlX3dyaXRlcHRyKChhKSwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0uaW5zdHJ1Y3Rpb25fc3RhcnQgKyAoYiksIDAsIChjKSkKLQotI2RlZmluZSBPUChvcCwgeiwgdywgeCwgeSkgXAotCWRvIHsgV1JJVEVfRUZYKGNhcmQsIChwYykgKiAyLCAoKHgpIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmhpZ2hfb3BlcmFuZF9zaGlmdCkgfCAoeSkpOyBcCi0JV1JJVEVfRUZYKGNhcmQsIChwYykgKiAyICsgMSwgKChvcCkgPDwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0ub3Bjb2RlX3NoaWZ0ICkgfCAoKHopIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmhpZ2hfb3BlcmFuZF9zaGlmdCkgfCAodykpOyBcCi0JKytwYzsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBOVU1fSU5QVVRTIDB4MjAKLSNkZWZpbmUgTlVNX09VVFBVVFMgMHgyMAotI2RlZmluZSBOVU1fR1BSUyAweDEwMAotCi0jZGVmaW5lIEFfTlVNX0lOUFVUUyAweDYwCi0jZGVmaW5lIEFfTlVNX09VVFBVVFMgMHg2MCAgLy9maXhtZTogdGhpcyBtYXkgb3IgbWF5IG5vdCBiZSB0cnVlCi0jZGVmaW5lIEFfTlVNX0dQUlMgMHgyMDAKLQotI2RlZmluZSBHUFJfTkFNRV9TSVpFICAgMzIKLSNkZWZpbmUgUEFUQ0hfTkFNRV9TSVpFIDMyCi0KLXN0cnVjdCBkc3BfcnBhdGNoIHsKLQljaGFyIG5hbWVbUEFUQ0hfTkFNRV9TSVpFXTsKLQl1MTYgY29kZV9zdGFydDsKLQl1MTYgY29kZV9zaXplOwotCi0JdW5zaWduZWQgbG9uZyBncHJfdXNlZFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwotCXVuc2lnbmVkIGxvbmcgZ3ByX2lucHV0W05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07Ci0JdW5zaWduZWQgbG9uZyByb3V0ZVtOVU1fT1VUUFVUU107Ci0JdW5zaWduZWQgbG9uZyByb3V0ZV92W05VTV9PVVRQVVRTXTsKLX07Ci0KLXN0cnVjdCBkc3BfcGF0Y2ggewotCWNoYXIgbmFtZVtQQVRDSF9OQU1FX1NJWkVdOwotCXU4IGlkOwotCXVuc2lnbmVkIGxvbmcgaW5wdXQ7CS8qIGJpdG1hcCBvZiB0aGUgbGluZXMgdXNlZCBhcyBpbnB1dHMgKi8KLQl1bnNpZ25lZCBsb25nIG91dHB1dDsJLyogYml0bWFwIG9mIHRoZSBsaW5lcyB1c2VkIGFzIG91dHB1dHMgKi8KLQl1MTYgY29kZV9zdGFydDsKLQl1MTYgY29kZV9zaXplOwotCi0JdW5zaWduZWQgbG9uZyBncHJfdXNlZFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwkvKiBiaXRtYXAgb2YgdXNlZCBncHJzICovCi0JdW5zaWduZWQgbG9uZyBncHJfaW5wdXRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsKLQl1OCB0cmFtbF9pc3RhcnQ7CS8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIHRyYW0gbGluZXMgdXNlZCAqLwotCXU4IHRyYW1sX2lzaXplOwkJLyogbnVtYmVyIG9mIGludGVybmFsIHRyYW0gbGluZXMgdXNlZCAqLwotCi0JdTggdHJhbWxfZXN0YXJ0OwotCXU4IHRyYW1sX2VzaXplOwotCi0JdTE2IHRyYW1iX2lzdGFydDsgICAgICAgIC8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIHRyYW0gbWVtb3J5IHVzZWQgKi8KLQl1MTYgdHJhbWJfaXNpemU7ICAgICAgICAgLyogYW1vdW50IG9mIGludGVybmFsIG1lbW9yeSB1c2VkICovCi0JdTMyIHRyYW1iX2VzdGFydDsKLQl1MzIgdHJhbWJfZXNpemU7Ci19OwotCi1zdHJ1Y3QgZHNwX2dwciB7Ci0JdTggdHlwZTsJCQkvKiBncHIgdHlwZSwgU1RBVElDLCBEWU5BTUlDLCBJTlBVVCwgT1VUUFVULCBDT05UUk9MICovCi0JY2hhciBuYW1lW0dQUl9OQU1FX1NJWkVdOwkvKiBncHIgdmFsdWUsIG9ubHkgdmFsaWQgZm9yIGNvbnRyb2wgZ3BycyAqLwotCXMzMiBtaW4sIG1heDsJCQkvKiB2YWx1ZSByYW5nZSBmb3IgdGhpcyBncHIsIG9ubHkgdmFsaWQgZm9yIGNvbnRyb2wgZ3BycyAqLwotCXU4IGxpbmU7CQkJLyogd2hpY2ggaW5wdXQvb3V0cHV0IGxpbmUgaXMgdGhlIGdwciBhdHRhY2hlZCwgb25seSB2YWxpZCBmb3IgaW5wdXQvb3V0cHV0IGdwcnMgKi8KLQl1OCB1c2FnZTsKLX07Ci0KLWVudW0gewotCUdQUl9UWVBFX05VTEwgPSAwLAotCUdQUl9UWVBFX0lPLAotCUdQUl9UWVBFX1NUQVRJQywKLQlHUFJfVFlQRV9EWU5BTUlDLAotCUdQUl9UWVBFX0NPTlRST0wsCi0JR1BSX1RZUEVfQ09OU1RBTlQKLX07Ci0KLSNkZWZpbmUgR1BSX0JBU0UgMHgxMDAKLSNkZWZpbmUgT1VUUFVUX0JBU0UgMHgyMAotCi0jZGVmaW5lIEFfR1BSX0JBU0UgMHg0MDAKLSNkZWZpbmUgQV9PVVRQVVRfQkFTRSAweDYwCi0KLSNkZWZpbmUgTUFYX1BBVENIRVNfUEFHRVMgMzIKLQotc3RydWN0IHBhdGNoX21hbmFnZXIgewotCXZvaWQgKnBhdGNoW01BWF9QQVRDSEVTX1BBR0VTXTsKLQlpbnQgY3VycmVudF9wYWdlczsKLQlzdHJ1Y3QgZHNwX3JwYXRjaCBycGF0Y2g7Ci0Jc3RydWN0IGRzcF9ncHIgZ3ByW05VTV9HUFJTXTsgICAvKiBncHIgdXNhZ2UgdGFibGUgKi8KLQlzcGlubG9ja190IGxvY2s7Ci0JczE2IGN0cmxfZ3ByW1NPVU5EX01JWEVSX05SREVWSUNFU11bMl07Ci19OwotCi0jZGVmaW5lIFBBVENIRVNfUEVSX1BBR0UgKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSkKLQotI2RlZmluZSBQQVRDSChtZ3IsIGkpICgoc3RydWN0IGRzcF9wYXRjaCAqKSAobWdyKS0+cGF0Y2hbKGkpIC8gUEFUQ0hFU19QRVJfUEFHRV0gKyAoaSkgJSBQQVRDSEVTX1BFUl9QQUdFKQotCi0vKiBQQ00gdm9sdW1lIGNvbnRyb2wgKi8KLSNkZWZpbmUgVE1QX1BDTV9MICAgICAweDEwMCAvL3RlbXAgUENNIEwgKGFmdGVyIHRoZSB2b2wgY29udHJvbCkgICAgICAgCi0jZGVmaW5lIFRNUF9QQ01fUiAgICAgMHgxMDEKLSNkZWZpbmUgVk9MX1BDTV9MICAgICAweDEwMiAvL3ZvbCBQQ00KLSNkZWZpbmUgVk9MX1BDTV9SICAgICAweDEwMwotCi0vKiBSb3V0aW5nIHBhdGNoICovCi0jZGVmaW5lIFRNUF9BQ19MICAgICAgMHgxMDQgLy90bXAgYWM5NyBvdXQKLSNkZWZpbmUgVE1QX0FDX1IgICAgICAweDEwNQotI2RlZmluZSBUTVBfUkVBUl9MICAgIDB4MTA2IC8vb3V0cHV0IC0gVGVtcCBSZWFyCi0jZGVmaW5lIFRNUF9SRUFSX1IgICAgMHgxMDcKLSNkZWZpbmUgVE1QX0RJR0lfTCAgICAweDEwOCAvL291dHB1dCAtIFRlbXAgZGlnaXRhbAotI2RlZmluZSBUTVBfRElHSV9SICAgIDB4MTA5Ci0jZGVmaW5lIERTUF9WT0xfTCAgICAgMHgxMGEgLy8gbWFpbiBkc3Agdm9sdW1lCi0jZGVmaW5lIERTUF9WT0xfUiAgICAgMHgxMGIKLQotLyogaHcgaW5wdXRzICovCi0jZGVmaW5lIFBDTV9JTl9MIAkweDAwCi0jZGVmaW5lIFBDTV9JTl9SIAkweDAxCi0KLSNkZWZpbmUgUENNMV9JTl9MICAgICAgICAweDA0Ci0jZGVmaW5lIFBDTTFfSU5fUiAgICAgICAgMHgwNQotLy9tdXRpbGNoYW5uZWwgcGxheWJhY2sgc3RyZWFtIGFwcGVhciBoZXJlOgotCi0jZGVmaW5lIE1VTFRJX0ZST05UX0wJMHgwOAotI2RlZmluZSBNVUxUSV9GUk9OVF9SCTB4MDkKLSNkZWZpbmUgTVVMVElfUkVBUl9MCTB4MGEKLSNkZWZpbmUgTVVMVElfUkVBUl9SCTB4MGIKLSNkZWZpbmUgTVVMVElfQ0VOVEVSCTB4MGMKLSNkZWZpbmUgTVVMVElfTEZFCTB4MGQKLQotI2RlZmluZSBBQzk3X0lOX0wJMHgxMAotI2RlZmluZSBBQzk3X0lOX1IJMHgxMQotI2RlZmluZSBTUERJRl9DRF9MCTB4MTIKLSNkZWZpbmUgU1BESUZfQ0RfUgkweDEzCi0KLS8qIGh3IG91dHB1dHMgKi8KLSNkZWZpbmUgQUM5N19GUk9OVF9MCTB4MjAKLSNkZWZpbmUgQUM5N19GUk9OVF9SCTB4MjEKLSNkZWZpbmUgRElHSVRBTF9PVVRfTAkweDIyCi0jZGVmaW5lIERJR0lUQUxfT1VUX1IJMHgyMwotI2RlZmluZSBESUdJVEFMX0NFTlRFUgkweDI0Ci0jZGVmaW5lIERJR0lUQUxfTEZFCTB4MjUKLQotI2RlZmluZSBBTkFMT0dfUkVBUl9MCTB4MjgKLSNkZWZpbmUgQU5BTE9HX1JFQVJfUgkweDI5Ci0jZGVmaW5lIEFEQ19SRUNfTAkweDJhCi0jZGVmaW5lIEFEQ19SRUNfUgkweDJiCi0KLSNkZWZpbmUgQU5BTE9HX0NFTlRFUgkweDMxCi0jZGVmaW5lIEFOQUxPR19MRkUJMHgzMgotCi0KLSNkZWZpbmUgSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tLCBsbiwgaSkJCVwKLWRvIHsJCQkJCQkJXAotCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsJCQlcCi0Jc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CQkJXAotCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwkJCVwKLQlwYXRjaC0+aW5wdXQgPSAoMTw8KDB4MWYmbG4pKTsJCQlcCi0JcGF0Y2gtPm91dHB1dD0gKDE8PCgweDFmJmxuKSk7CQkJXAotCXBhdGNoLT5pZCA9IGk7CQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKQkJCQlcCi1kbyB7CQkJCQkJCVwKLQlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7CVwKLQlwYXRjaF9uKys7CQkJCQlcCi19IHdoaWxlKDApCi0KLQotI2RlZmluZSBST1VUSU5HX1BBVENIX1NUQVJUKHBhdGNoLCBubSkJXAotZG8gewkJCQkJXAotCXBhdGNoID0gJm1nci0+cnBhdGNoOwkJXAotCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwlcCi0JcGF0Y2gtPmNvZGVfc3RhcnQgPSBwYyAqIDI7CVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBST1VUSU5HX1BBVENIX0VORChwYXRjaCkJCQlcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7ICAgICAgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIENPTk5FQ1QoaW5wdXQsIG91dHB1dCkgc2V0X2JpdChpbnB1dCwgJnJwYXRjaC0+cm91dGVbKG91dHB1dCkgLSBPVVRQVVRfQkFTRV0pOwotCi0jZGVmaW5lIENPTk5FQ1RfVihpbnB1dCwgb3V0cHV0KSBzZXRfYml0KGlucHV0LCAmcnBhdGNoLT5yb3V0ZV92WyhvdXRwdXQpIC0gT1VUUFVUX0JBU0VdKTsKLQotI2RlZmluZSBPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tLCBsbiwgaSkJCVwKLWRvIHsJCQkJCQkJXAotCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsJCQlcCi0Jc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CQkJXAotCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwkJCVwKLQlwYXRjaC0+aW5wdXQgPSAoMTw8KDB4MWYmbG4pKTsJCQlcCi0JcGF0Y2gtPm91dHB1dD0gKDE8PCgweDFmJmxuKSk7CQkJXAotCXBhdGNoLT5pZCA9IGk7CQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgT1VUUFVUX1BBVENIX0VORChwYXRjaCkJCQkJXAotZG8gewkJCQkJCQlcCi0JcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OwlcCi0JcGF0Y2hfbisrOwkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEdFVF9PVVRQVVRfR1BSKHBhdGNoLCBnLCBsbikJCQlcCi1kbyB7CQkJCQkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udHlwZSA9IEdQUl9UWVBFX0lPOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLmxpbmUgPSBsbjsJCVwKLQlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOwlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX0lOUFVUX0dQUihwYXRjaCwgZywgbG4pCQkJXAotZG8gewkJCQkJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9JTzsJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5saW5lID0gbG47CQlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfaW5wdXQpOwlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCBnKQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9EWU5BTUlDOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQkJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7ICAgICAgICAgIAlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX0NPTlRST0xfR1BSKHBhdGNoLCBnLCBubSwgYSwgYikJCQlcCi1kbyB7CQkJCQkJCQlcCi0Jc3RyY3B5KG1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5uYW1lLCBubSk7CQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9DT05UUk9MOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5taW4gPSBhOwkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubWF4ID0gYjsJCQlcCi0Jc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGcsIDAsIGIpOwkJCQlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJCVwKLX0gd2hpbGUoMCkKLQotI2VuZGlmIC8qIF9FRlhNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZW11YWR4bWcuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDJkNGMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZW11YWR4bWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0KLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZW11YWR4bWcuYyAtIEFkZHJlc3Mgc3BhY2UgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIgCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi0vKiBBbGxvY2F0ZXMgZW11IGFkZHJlc3Mgc3BhY2UgKi8KLQotaW50IGVtdTEwazFfYWRkeG1ncl9hbGxvYyh1MzIgc2l6ZSwgc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1MTYgKnBhZ2V0YWJsZSA9IGNhcmQtPmVtdXBhZ2V0YWJsZTsKLQl1MTYgaW5kZXggPSAwOwotCXUxNiBudW1wYWdlczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQ29udmVydCBieXRlcyB0byBwYWdlcyAqLwotCW51bXBhZ2VzID0gKHNpemUgLyBFTVVQQUdFU0laRSkgKyAoKHNpemUgJSBFTVVQQUdFU0laRSkgPyAxIDogMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGluZGV4IDwgKE1BWFBBR0VTIC0gMSkpIHsKLQkJaWYgKHBhZ2V0YWJsZVtpbmRleF0gJiAweDgwMDApIHsKLQkJCS8qIFRoaXMgYmxvY2sgb2YgcGFnZXMgaXMgaW4gdXNlLCBqdW1wIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBibG9jay4gKi8KLQkJCWluZGV4ICs9IChwYWdldGFibGVbaW5kZXhdICYgMHg3ZmZmKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEZvdW5kIGZyZWUgYmxvY2sgKi8KLQkJCWlmIChwYWdldGFibGVbaW5kZXhdID49IG51bXBhZ2VzKSB7Ci0KLQkJCQkvKiBCbG9jayBpcyBsYXJnZSBlbm91Z2ggKi8KLQotCQkJCS8qIElmIGZyZWUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gdGhlIGJsb2NrIHJlcXVlc3RlZAotCQkJCSAqIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBibG9jayByZW1haW5pbmcgKi8KLQkJCQlpZiAocGFnZXRhYmxlW2luZGV4XSA+IG51bXBhZ2VzKQotCQkJCQlwYWdldGFibGVbaW5kZXggKyBudW1wYWdlc10gPSBwYWdldGFibGVbaW5kZXhdIC0gbnVtcGFnZXM7Ci0KLQkJCQlwYWdldGFibGVbaW5kZXhdID0gKG51bXBhZ2VzIHwgMHg4MDAwKTsJLyogTWFyayBibG9jayBhcyB1c2VkICovCi0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEJsb2NrIHRvbyBzbWFsbCwganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgYmxvY2sgKi8KLQkJCQlpbmRleCArPSBwYWdldGFibGVbaW5kZXhdOwotCQkJfQotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGVtdSBhZGRyZXNzIHNwYWNlLiAqLwotCi12b2lkIGVtdTEwazFfYWRkeG1ncl9mcmVlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBpbmRleCkKLXsKLQl1MTYgKnBhZ2V0YWJsZSA9IGNhcmQtPmVtdXBhZ2V0YWJsZTsKLQl1MTYgb3JpZ3NpemUgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHBhZ2V0YWJsZVtpbmRleF0gJiAweDgwMDApIHsKLQkJLyogQmxvY2sgaXMgYWxsb2NhdGVkIC0gbWFyayBibG9jayBhcyBmcmVlICovCi0JCW9yaWdzaXplID0gcGFnZXRhYmxlW2luZGV4XSAmIDB4N2ZmZjsKLQkJcGFnZXRhYmxlW2luZGV4XSA9IG9yaWdzaXplOwotCi0JCS8qIElmIG5leHQgYmxvY2sgaXMgZnJlZSwgd2UgY29uY2F0IGJvdGggYmxvY2tzICovCi0JCWlmICghKHBhZ2V0YWJsZVtpbmRleCArIG9yaWdzaXplXSAmIDB4ODAwMCkpCi0JCQlwYWdldGFibGVbaW5kZXhdICs9IHBhZ2V0YWJsZVtpbmRleCArIG9yaWdzaXplXSAmIDB4N2ZmZjsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jIGIvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjMTZhOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGh3YWNjZXNzLmMgLS0gSGFyZHdhcmUgYWNjZXNzIGxheWVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgRGVjZW1iZXIgOSwgMTk5OSAgICAgSm9uIFRheWxvciAgICAgIHJld3JvdGUgdGhlIEkvTyBzdWJzeXN0ZW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImljYXJkbWlkLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZ1bmN0aW9uIDogc3JUb1BpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBJbnB1dCAgICA6IHNhbXBsZVJhdGUgLSBzYW1wbGluZyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogUmV0dXJuICAgOiBwaXRjaCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIEFib3V0ICAgIDogY29udmVydCBzYW1wbGluZyByYXRlIHRvIHBpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBOb3RlICAgICA6IGZvciA4MDEwLCBzYW1wbGluZyByYXRlIGlzIGF0IDQ4a0h6LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCAgICoKLSogICAgICAgICAgICBiZSBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNyVG9QaXRjaCh1MzIgc2FtcGxlUmF0ZSkKLXsKLQlpbnQgaTsKLQotCS8qIEZJWE1FOiBUaGVzZSB0YWJsZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4gYSBoZWFkZXJmaWxlICovCi0Jc3RhdGljIHUzMiBsb2dNYWdUYWJsZVsxMjhdID0gewotCQkweDAwMDAwLCAweDAyZGZjLCAweDA1YjllLCAweDA4OGU2LCAweDBiNWQ2LCAweDBlMjZmLCAweDEwZWIzLCAweDEzYWEyLAotCQkweDE2NjNmLCAweDE5MThhLCAweDFiYzg0LCAweDFlNzJlLCAweDIxMThiLCAweDIzYjlhLCAweDI2NTVkLCAweDI4ZWQ1LAotCQkweDJiODAzLCAweDJlMGU4LCAweDMwOTg1LCAweDMzMWRiLCAweDM1OWViLCAweDM4MWI2LCAweDNhOTNkLCAweDNkMDgxLAotCQkweDNmNzgyLCAweDQxZTQyLCAweDQ0NGMxLCAweDQ2YjAxLCAweDQ5MTAxLCAweDRiNmM0LCAweDRkYzQ5LCAweDUwMTkxLAotCQkweDUyNjllLCAweDU0YjZmLCAweDU3MDA2LCAweDU5NDYzLCAweDViODg4LCAweDVkYzc0LCAweDYwMDI5LCAweDYyM2E3LAotCQkweDY0NmVlLCAweDY2YTAwLCAweDY4Y2RkLCAweDZhZjg2LCAweDZkMWZhLCAweDZmNDNjLCAweDcxNjRiLCAweDczODI5LAotCQkweDc1OWQ0LCAweDc3YjRmLCAweDc5YzlhLCAweDdiZGI1LCAweDdkZWExLCAweDdmZjVlLCAweDgxZmVkLCAweDg0MDRlLAotCQkweDg2MDgyLCAweDg4MDg5LCAweDhhMDY0LCAweDhjMDE0LCAweDhkZjk4LCAweDhmZWYxLCAweDkxZTIwLCAweDkzZDI2LAotCQkweDk1YzAxLCAweDk3YWI0LCAweDk5OTNlLCAweDliNzlmLCAweDlkNWQ5LCAweDlmM2VjLCAweGExMWQ4LCAweGEyZjlkLAotCQkweGE0ZDNjLCAweGE2YWI1LCAweGE4ODA4LCAweGFhNTM3LCAweGFjMjQxLCAweGFkZjI2LCAweGFmYmU3LCAweGIxODg1LAotCQkweGIzNTAwLCAweGI1MTU3LCAweGI2ZDhjLCAweGI4OTlmLCAweGJhNThmLCAweGJjMTVlLCAweGJkZDBjLCAweGJmODk5LAotCQkweGMxNDA0LCAweGMyZjUwLCAweGM0YTdiLCAweGM2NTg3LCAweGM4MDczLCAweGM5YjNmLCAweGNiNWVkLCAweGNkMDdjLAotCQkweGNlYWVjLCAweGQwNTNmLCAweGQxZjczLCAweGQzOThhLCAweGQ1Mzg0LCAweGQ2ZDYwLCAweGQ4NzIwLCAweGRhMGMzLAotCQkweGRiYTRhLCAweGRkM2I0LCAweGRlZDAzLCAweGUwNjM2LCAweGUxZjRlLCAweGUzODRhLCAweGU1MTJjLCAweGU2OWYzLAotCQkweGU4MjlmLCAweGU5YjMxLCAweGViM2E5LCAweGVjYzA4LCAweGVlNDRjLCAweGVmYzc4LCAweGYxNDhhLCAweGYyYzgzLAotCQkweGY0NDYzLCAweGY1YzJhLCAweGY3M2RhLCAweGY4YjcxLCAweGZhMmYwLCAweGZiYTU3LCAweGZkMWE3LCAweGZlOGRmCi0JfTsKLQotCXN0YXRpYyBjaGFyIGxvZ1Nsb3BlVGFibGVbMTI4XSA9IHsKLQkJMHg1YywgMHg1YywgMHg1YiwgMHg1YSwgMHg1YSwgMHg1OSwgMHg1OCwgMHg1OCwKLQkJMHg1NywgMHg1NiwgMHg1NiwgMHg1NSwgMHg1NSwgMHg1NCwgMHg1MywgMHg1MywKLQkJMHg1MiwgMHg1MiwgMHg1MSwgMHg1MSwgMHg1MCwgMHg1MCwgMHg0ZiwgMHg0ZiwKLQkJMHg0ZSwgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHg0YywgMHg0YywgMHg0YiwgMHg0YiwKLQkJMHg0YSwgMHg0YSwgMHg0OSwgMHg0OSwgMHg0OCwgMHg0OCwgMHg0NywgMHg0NywKLQkJMHg0NywgMHg0NiwgMHg0NiwgMHg0NSwgMHg0NSwgMHg0NSwgMHg0NCwgMHg0NCwKLQkJMHg0MywgMHg0MywgMHg0MywgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MSwgMHg0MSwKLQkJMHg0MSwgMHg0MCwgMHg0MCwgMHg0MCwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZSwKLQkJMHgzZSwgMHgzZSwgMHgzZCwgMHgzZCwgMHgzZCwgMHgzYywgMHgzYywgMHgzYywKLQkJMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYSwgMHgzYSwgMHgzYSwgMHgzOSwKLQkJMHgzOSwgMHgzOSwgMHgzOSwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzNywKLQkJMHgzNywgMHgzNywgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNSwKLQkJMHgzNSwgMHgzNSwgMHgzNSwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwKLQkJMHgzMywgMHgzMywgMHgzMywgMHgzMywgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwKLQkJMHgzMiwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMCwgMHgzMCwKLQkJMHgzMCwgMHgzMCwgMHgzMCwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZgotCX07Ci0KLQlpZiAoc2FtcGxlUmF0ZSA9PSAwKQotCQlyZXR1cm4gMDsJLyogQmFpbCBvdXQgaWYgbm8gbGVhZGluZyAiMSIgKi8KLQotCXNhbXBsZVJhdGUgKj0gMTExODU7CS8qIFNjYWxlIDQ4MDAwIHRvIDB4MjAwMDIzODAgKi8KLQotCWZvciAoaSA9IDMxOyBpID4gMDsgaS0tKSB7Ci0JCWlmIChzYW1wbGVSYXRlICYgMHg4MDAwMDAwMCkgewkvKiBEZXRlY3QgbGVhZGluZyAiMSIgKi8KLQkJCXJldHVybiAodTMyKSAoKChzMzIpIChpIC0gMTUpIDw8IDIwKSArCi0JCQkJICAgICAgbG9nTWFnVGFibGVbMHg3ZiAmIChzYW1wbGVSYXRlID4+IDI0KV0gKwotCQkJCSAgICAgICgweDdmICYgKHNhbXBsZVJhdGUgPj4gMTcpKSAqIGxvZ1Nsb3BlVGFibGVbMHg3ZiAmIChzYW1wbGVSYXRlID4+IDI0KV0pOwotCQl9Ci0JCXNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlIDw8IDE7Ci0JfQotCi0JRFBGKDIsICJzclRvUGl0Y2g6IEJVRyFcbiIpOwotCXJldHVybiAwOwkJLyogU2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcG9pbnQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogd3JpdGUvcmVhZCBQQ0kgZnVuY3Rpb24gMCByZWdpc3RlcnMgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZW11MTBrMV93cml0ZWZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJdTMyIG1hc2s7Ci0JCXU4IHNpemUsIG9mZnNldDsKLQotCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCWRhdGEgPSAoZGF0YSA8PCBvZmZzZXQpICYgbWFzazsKLQkJcmVnICY9IDB4N2Y7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJZGF0YSB8PSBpbmwoY2FyZC0+aW9iYXNlICsgcmVnKSAmIH5tYXNrOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIHJlZyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIHJlZyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLSNpZmRlZiBEQkdFTVUKLXZvaWQgZW11MTBrMV93cml0ZWZuMF8yKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiBkYXRhLCBpbnQgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzaXplID09IDMyKQotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIChyZWcgJiAweDFGKSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAxNikKLQkJb3V0dyhkYXRhLCBjYXJkLT5pb2Jhc2UgKyAocmVnICYgMHgxRikpOwotCWVsc2UKLQkJb3V0YihkYXRhLCBjYXJkLT5pb2Jhc2UgKyAocmVnICYgMHgxRikpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotI2VuZGlmICAvKiAgREJHRU1VICAqLwotCi11MzIgZW11MTBrMV9yZWFkZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiBjYXJkLCB1MzIgcmVnKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7Ci0JCXUzMiBtYXNrOwotCQl1OCBzaXplLCBvZmZzZXQ7Ci0KLQkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKLQkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OwotCQlyZWcgJj0gMHg3ZjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgcmVnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAodmFsICYgbWFzaykgPj4gb2Zmc2V0OwotICAgICAgICB9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgcmVnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gdmFsOwotCX0KLX0KLQotdm9pZCBlbXUxMGsxX3RpbWVyX3NldChzdHJ1Y3QgZW11MTBrMV9jYXJkICogY2FyZCwgdTE2IGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0Jb3V0dyhkYXRhICYgVElNRVJfUkFURV9NQVNLLCBjYXJkLT5pb2Jhc2UgKyBUSU1FUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHdyaXRlL3JlYWQgRW11MTBrMSBwb2ludGVyLW9mZnNldCByZWdpc3RlciBzZXQsIGFjY2Vzc2VkIHRocm91Z2ggICAgICAqCi0qICB0aGUgUFRSIGFuZCBEQVRBIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBX1BUUl9BRERSRVNTX01BU0sgMHgwZmZmMDAwMAotdm9pZCBzYmxpdmVfd3JpdGVwdHIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIGNoYW5uZWwsIHUzMiBkYXRhKQotewotCXUzMiByZWdwdHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIEFfUFRSX0FERFJFU1NfTUFTSykgfCAoY2hhbm5lbCAmIFBUUl9DSEFOTkVMTlVNX01BU0spOwotCi0JaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJdTMyIG1hc2s7Ci0JCXU4IHNpemUsIG9mZnNldDsKLQotCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCWRhdGEgPSAoZGF0YSA8PCBvZmZzZXQpICYgbWFzazsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJZGF0YSB8PSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSkgJiB+bWFzazsKLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIERBVEEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfQotfQotCi0vKiAuLi4gOiAgZGF0YSwgcmVnLCAuLi4gLCBUQUdMSVNUX0VORCAqLwotdm9pZCBzYmxpdmVfd3JpdGVwdHJfdGFnKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiBjaGFubmVsLCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdTMyIHJlZzsKLQotCXZhX3N0YXJ0KGFyZ3MsIGNoYW5uZWwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAoKHJlZyA9IHZhX2FyZyhhcmdzLCB1MzIpKSAhPSBUQUdMSVNUX0VORCkgewotCQl1MzIgZGF0YSA9IHZhX2FyZyhhcmdzLCB1MzIpOwotCQl1MzIgcmVncHRyID0gKCgocmVnIDw8IDE2KSAmIEFfUFRSX0FERFJFU1NfTUFTSykKLQkJCSAgICAgIHwgKGNoYW5uZWwgJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKSk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQkJaW50IHNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQkJdTMyIG1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7Ci0KLQkJCWRhdGEgfD0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpICYgfm1hc2s7Ci0JCX0KLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JdmFfZW5kKGFyZ3MpOwotCi0JcmV0dXJuOwotfQotCi11MzIgc2JsaXZlX3JlYWRwdHIoc3RydWN0IGVtdTEwazFfY2FyZCAqIGNhcmQsIHUzMiByZWcsIHUzMiBjaGFubmVsKQotewotCXUzMiByZWdwdHIsIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmVncHRyID0gKChyZWcgPDwgMTYpICYgQV9QVFJfQUREUkVTU19NQVNLKSB8IChjaGFubmVsICYgUFRSX0NIQU5ORUxOVU1fTUFTSyk7Ci0KLQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQl1MzIgbWFzazsKLQkJdTggc2l6ZSwgb2Zmc2V0OwotCi0JCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0JCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKLQkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuICh2YWwgJiBtYXNrKSA+PiBvZmZzZXQ7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7Ci0JCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiB2YWw7Ci0JfQotfQotCi12b2lkIGVtdTEwazFfaXJxX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgaXJxX21hc2spCi17Ci0JdTMyIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsImVtdTEwazFfaXJxX2VuYWJsZSgpXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIHZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBJTlRFKSB8IGlycV9tYXNrOwotICAgICAgICBvdXRsKHZhbCwgY2FyZC0+aW9iYXNlICsgSU5URSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCXJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX2lycV9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiBpcnFfbWFzaykKLXsKLSAgICAgICAgdTMyIHZhbDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgICAgICBEUEYoMiwiZW11MTBrMV9pcnFfZGlzYWJsZSgpXG4iKTsKLQotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICB2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgSU5URSkgJiB+aXJxX21hc2s7Ci0gICAgICAgIG91dGwodmFsLCBjYXJkLT5pb2Jhc2UgKyBJTlRFKTsKLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICByZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV9jbGVhcl9zdG9wX29uX2xvb3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHZvaWNlbnVtKQotewotCS8qIFZvaWNlIGludGVycnVwdCAqLwotCWlmICh2b2ljZW51bSA+PSAzMikKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNPTEVIIHwgKCgweDAxMDAgfCAodm9pY2VudW0gLSAzMikpIDw8IDE2KSwgMCwgMCk7Ci0JZWxzZQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU09MRUwgfCAoKDB4MDEwMCB8IHZvaWNlbnVtKSA8PCAxNiksIDAsIDApOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBzYmxpdmVfd2N3YWl0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiB3YWl0KQotewotCXZvbGF0aWxlIHVuc2lnbmVkIHVDb3VudDsKLQl1MzIgbmV3dGltZSA9IDAsIGN1cnRpbWU7Ci0KLQljdXJ0aW1lID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIFdDX1NBTVBMRUNPVU5URVIpOwotCXdoaWxlICh3YWl0LS0pIHsKLQkJdUNvdW50ID0gMDsKLQkJd2hpbGUgKHVDb3VudCsrIDwgVElNRU9VVCkgewotCQkJbmV3dGltZSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBXQ19TQU1QTEVDT1VOVEVSKTsKLQkJCWlmIChuZXd0aW1lICE9IGN1cnRpbWUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodUNvdW50ID49IFRJTUVPVVQpCi0JCQlicmVhazsKLQotCQljdXJ0aW1lID0gbmV3dGltZTsKLQl9Ci19Ci0KLXUxNiBlbXUxMGsxX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKLQl1MTYgZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCW91dGIocmVnLCBjYXJkLT5pb2Jhc2UgKyBBQzk3QUREUkVTUyk7Ci0JZGF0YSA9IGludyhjYXJkLT5pb2Jhc2UgKyBBQzk3REFUQSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotdm9pZCBlbXUxMGsxX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCW91dGIocmVnLCBjYXJkLT5pb2Jhc2UgKyBBQzk3QUREUkVTUyk7Ci0Jb3V0dyh2YWx1ZSwgY2FyZC0+aW9iYXNlICsgQUM5N0RBVEEpOwotCW91dGIoIEFDOTdfRVhURU5ERURfSUQsIGNhcmQtPmlvYmFzZSArIEFDOTdBRERSRVNTKTsgCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgTVBVIGFjY2VzcyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgZW11MTBrMV9tcHVfd3JpdGVfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1OCBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJaWYgKChzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VU1RBVCwwKSAmIE1VU1RBVF9PUkRZTikgPT0gMCkgewotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVEQVRBLCAwLCBkYXRhKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKGluYihjYXJkLT5pb2Jhc2UgKyBNVVNUQVQpICYgTVVTVEFUX09SRFlOKSA9PSAwKSB7Ci0JCQlvdXRiKGRhdGEsIGNhcmQtPmlvYmFzZSArIE1VREFUQSk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZW11MTBrMV9tcHVfcmVhZF9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHU4ICogZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmICgoc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVVNUQVQsMCkgJiBNVVNUQVRfSVJEWU4pID09IDApIHsKLQkJCSpkYXRhID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVURBVEEsMCk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChpbmIoY2FyZC0+aW9iYXNlICsgTVVTVEFUKSAmIE1VU1RBVF9JUkRZTikgPT0gMCkgewotCQkJKmRhdGEgPSBpbmIoY2FyZC0+aW9iYXNlICsgTVVEQVRBKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBlbXUxMGsxX21wdV9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXU4IHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdV9yZXNldCgpXG4iKTsKLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmIChjYXJkLT5tcHVhY3Fjb3VudCA9PSAwKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVUNNRCwgMCwgTVVDTURfUkVTRVQpOwotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VQ01ELCAwLCBNVUNNRF9SRVNFVCk7Ci0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVDTUQsIDAsIE1VQ01EX0VOVEVSVUFSVE1PREUpOwotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQkJCXN0YXR1cyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVEQVRBLCAwKTsKLQkJCWlmIChzdGF0dXMgPT0gMHhmZSkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlpZiAoY2FyZC0+bXB1YWNxY291bnQgPT0gMCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCW91dGIoTVVDTURfUkVTRVQsIGNhcmQtPmlvYmFzZSArIE1VQ01EKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCW91dGIoTVVDTURfUkVTRVQsIGNhcmQtPmlvYmFzZSArIE1VQ01EKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCW91dGIoTVVDTURfRU5URVJVQVJUTU9ERSwgY2FyZC0+aW9iYXNlICsgTVVDTUQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJc3RhdHVzID0gaW5iKGNhcmQtPmlvYmFzZSArIE1VREFUQSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChzdGF0dXMgPT0gMHhmZSkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLWludCBlbXUxMGsxX21wdV9hY3F1aXJlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KLQkrK2NhcmQtPm1wdWFjcWNvdW50OwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX21wdV9yZWxlYXNlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KLQktLWNhcmQtPm1wdWFjcWNvdW50OwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oIGIvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlMjdiZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGh3YWNjZXNzLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZQkJICAgIEF1dGhvcgkgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLQkJICAgIC0tLS0tLQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9IV0FDQ0VTU19ICi0jZGVmaW5lIF9IV0FDQ0VTU19ICi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSAiZWZ4bWdyLmgiCi0jaW5jbHVkZSAicGFzc3Rocm91Z2guaCIKLSNpbmNsdWRlICJtaWRpLmgiCi0KLSNkZWZpbmUgRU1VUEFHRVNJWkUgICAgIDQwOTYgICAgICAgICAgICAvKiBkb24ndCBjaGFuZ2UgKi8KLSNkZWZpbmUgTlVNX0cgICAgICAgICAgIDY0ICAgICAgICAgICAgICAvKiB1c2UgYWxsIGNoYW5uZWxzICovCi0jZGVmaW5lIE5VTV9GWFNFTkRTICAgICA0ICAgICAgICAgICAgICAgLyogZG9uJ3QgY2hhbmdlICovCi0vKiBzZXR0aW5nIHRoaXMgdG8gb3RoZXIgdGhhbiBhIHBvd2VyIG9mIHR3byBtYXkgYnJlYWsgc29tZSBhcHBsaWNhdGlvbnMgKi8KLSNkZWZpbmUgTUFYQlVGU0laRQk2NTUzNgotI2RlZmluZSBNQVhQQUdFUwk4MTkyIAotI2RlZmluZSBCVUZNQVhQQUdFUyAgICAgKE1BWEJVRlNJWkUgLyBQQUdFX1NJWkUpCi0KLSNkZWZpbmUgRkxBR1NfQVZBSUxBQkxFICAgICAweDAwMDEKLSNkZWZpbmUgRkxBR1NfUkVBRFkgICAgICAgICAweDAwMDIKLQotc3RydWN0IG1lbWhhbmRsZQotewotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKLQl2b2lkICphZGRyOwotCXUzMiBzaXplOwotfTsKLQotI2RlZmluZSBERUJVR19MRVZFTCAyCi0KLSNpZmRlZiBFTVUxMEsxX0RFQlVHCi0jIGRlZmluZSBEUEQobGV2ZWwseCx5Li4uKSBkbyB7aWYobGV2ZWwgPD0gREVCVUdfTEVWRUwpIHByaW50ayggS0VSTl9OT1RJQ0UgImVtdTEwazE6ICVzOiAlZDogIiB4ICwgX19GSUxFX18gLCBfX0xJTkVfXyAsIHkgKTt9IHdoaWxlKDApCi0jIGRlZmluZSBEUEYobGV2ZWwseCkgICBkbyB7aWYobGV2ZWwgPD0gREVCVUdfTEVWRUwpIHByaW50ayggS0VSTl9OT1RJQ0UgImVtdTEwazE6ICVzOiAlZDogIiB4ICwgX19GSUxFX18gLCBfX0xJTkVfXyApO30gd2hpbGUoMCkKLSNlbHNlCi0jIGRlZmluZSBEUEQobGV2ZWwseCx5Li4uKSBkbyB7IH0gd2hpbGUgKDApIC8qIG5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KLSMgZGVmaW5lIERQRihsZXZlbCx4KSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogRU1VMTBLMV9ERUJVRyAqLwotCi0jZGVmaW5lIEVSUk9SKCkgRFBGKDEsImVycm9yXG4iKQotCi0vKiBEQVRBIFNUUlVDVFVSRVMgKi8KLQotc3RydWN0IGVtdTEwazFfd2F2ZW91dAotewotCXUzMiBzZW5kX3JvdXRpbmdbM107Ci0JLy8gYXVkaWd5IG9ubHk6Ci0JdTMyIHNlbmRfcm91dGluZzJbM107Ci0KLQl1MzIgc2VuZF9kY2JhWzNdOwotCS8vIGF1ZGlneSBvbmx5OgotCXUzMiBzZW5kX2hnZmVbM107Ci19OwotI2RlZmluZSBST1VURV9QQ00gMAotI2RlZmluZSBST1VURV9QVCAxCi0jZGVmaW5lIFJPVVRFX1BDTTEgMgotCi0jZGVmaW5lIFNFTkRfTU9OTyAwCi0jZGVmaW5lIFNFTkRfTEVGVCAxCi0jZGVmaW5lIFNFTkRfUklHSFQgMgotCi1zdHJ1Y3QgZW11MTBrMV93YXZlaW4KLXsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqYWM5NzsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqbWljOwotICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICpmeDsKLQotICAgICAgICB1OCByZWNzcmM7Ci0gICAgICAgIHUzMiBmeHdjOwotfTsKLQotI2RlZmluZSBDTURfUkVBRCAxCi0jZGVmaW5lIENNRF9XUklURSAyCi0KLXN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsIHsKLSAgICAgICAgdTMyIGNtZDsKLSAgICAgICAgdTMyIHZhbFs5MF07Ci19OwotCi0vKiBib2d1cyBpb2N0bHMgbnVtYmVycyB0byBlc2NhcGUgZnJvbSBPU1MgbWl4ZXIgbGltaXRhdGlvbnMgKi8KLSNkZWZpbmUgQ01EX1dSSVRFRk4wICAgICAgICAgICAgX0lPVygnRCcsIDAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfUkVBREZOMAkJX0lPUignRCcsIDEsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1dSSVRFUFRSCQlfSU9XKCdEJywgMiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfUkVBRFBUUgkJX0lPUignRCcsIDMsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVFJFQ1NSQwkJX0lPVygnRCcsIDQsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVFJFQ1NSQwkJX0lPUignRCcsIDUsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVFZPSUNFUEFSQU0JX0lPUignRCcsIDYsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVFZPSUNFUEFSQU0JX0lPVygnRCcsIDcsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVFBBVENICQlfSU9SKCdEJywgOCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUR1BSCQlfSU9SKCdEJywgOSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUQ1RMR1BSICAgICAgICAgICBfSU9SKCdEJywgMTAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfU0VUUEFUQ0gJCV9JT1coJ0QnLCAxMSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfU0VUR1BSCQlfSU9XKCdEJywgMTIsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVENUTEdQUgkJX0lPVygnRCcsIDEzLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVEdQT1VUCQlfSU9XKCdEJywgMTQsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfR0VUR1BSMk9TUwkJX0lPUignRCcsIDE1LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVEdQUjJPU1MJCV9JT1coJ0QnLCAxNiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRNQ0hfRlgJCV9JT1coJ0QnLCAxNywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRQQVNTVEhST1VHSAlfSU9XKCdEJywgMTgsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfUFJJVkFURTNfVkVSU0lPTglfSU9XKCdEJywgMTksIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfQUM5N19CT09TVAkJX0lPVygnRCcsIDIwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLQotLy91cCB0aGlzIG51bWJlciB3aGVuIGJyZWFraW5nIGNvbXBhdGliaWxpdHkKLSNkZWZpbmUgUFJJVkFURTNfVkVSU0lPTiAyCi0KLXN0cnVjdCBlbXUxMGsxX2NhcmQgCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0Jc3RydWN0IG1lbWhhbmRsZQl2aXJ0dWFscGFnZXRhYmxlOwotCXN0cnVjdCBtZW1oYW5kbGUJdGFua21lbTsKLQlzdHJ1Y3QgbWVtaGFuZGxlCXNpbGVudHBhZ2U7Ci0KLQlzcGlubG9ja190CQlsb2NrOwotCi0JdTgJCQl2b2ljZXRhYmxlW05VTV9HXTsKLQl1MTYJCQllbXVwYWdldGFibGVbTUFYUEFHRVNdOwotCi0Jc3RydWN0IGxpc3RfaGVhZAl0aW1lcnM7Ci0JdTE2CQkJdGltZXJfZGVsYXk7Ci0Jc3BpbmxvY2tfdAkJdGltZXJfbG9jazsKLQotCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBpb2Jhc2U7Ci0JdW5zaWduZWQgbG9uZwkJbGVuZ3RoOwotCXVuc2lnbmVkIHNob3J0CQltb2RlbDsKLQl1bnNpZ25lZCBpbnQgaXJxOyAKLQotCWludAlhdWRpb19kZXY7Ci0JaW50CWF1ZGlvX2RldjE7Ci0JaW50CW1pZGlfZGV2OwotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JaW50IHNlcV9kZXY7Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqc2VxX21pZGlkZXY7Ci0jZW5kaWYKLQotCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3OwotCWludCBhYzk3X3N1cHBvcnRlZF9taXhlcnM7Ci0JaW50IGFjOTdfc3RlcmVvX21peGVyczsKLQotCS8qIE51bWJlciBvZiBmaXJzdCBmeCB2b2ljZSBmb3IgbXVsdGljaGFubmVsIG91dHB1dCAqLwotCXU4IG1jaGFubmVsX2Z4OwotCXN0cnVjdCBlbXUxMGsxX3dhdmVvdXQJd2F2ZW91dDsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlaW4Jd2F2ZWluOwotCXN0cnVjdCBlbXUxMGsxX21wdW91dAkqbXB1b3V0OwotCXN0cnVjdCBlbXUxMGsxX21wdWluCSptcHVpbjsKLQotCXN0cnVjdCBtdXRleAkJb3Blbl9zZW07Ci0JbW9kZV90CQkJb3Blbl9tb2RlOwotCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKLQotCXUzMgkgICAgbXB1YWNxY291bnQ7CSAgLy8gTXB1IGFjcXVpcmUgY291bnQKLQl1MzIJICAgIGhhc190b3NsaW5rOwkgICAgICAgLy8gVE9TTGluayBkZXRlY3Rpb24KLQotCXU4IGNoaXByZXY7ICAgICAgICAgICAgICAgICAgICAvKiBDaGlwIHJldmlzaW9uICAgICAgICAgICAgICAgICovCi0JdTggaXNfYXVkaWd5OwotCXU4IGlzX2FwczsKLQotCXN0cnVjdCBwYXRjaF9tYW5hZ2VyIG1ncjsKLQlzdHJ1Y3QgcHRfZGF0YSBwdDsKLX07Ci0KLWludCBlbXUxMGsxX2FkZHhtZ3JfYWxsb2ModTMyLCBzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX2FkZHhtZ3JfZnJlZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCk7Ci0KLWludCBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoc3RydWN0IHBhdGNoX21hbmFnZXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotdm9pZCBlbXUxMGsxX3NldF9jb250cm9sX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCAsIHMzMiwgaW50ICk7Ci0KLXZvaWQgZW11MTBrMV9zZXRfdm9sdW1lX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCwgczMyLCBpbnQpOwotCi0KLSNkZWZpbmUgVk9MXzZCSVQgMHg0MAotI2RlZmluZSBWT0xfNUJJVCAweDIwCi0jZGVmaW5lIFZPTF80QklUIDB4MTAKLQotI2RlZmluZSBUSU1FT1VUIAkJICAgIDE2Mzg0Ci0KLXUzMiBzclRvUGl0Y2godTMyKTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZW11MTBrMV9kZXZzOwotCi0vKiBIYXJkd2FyZSBBYnN0cmFjdGlvbiBMYXllciBhY2Nlc3MgZnVuY3Rpb25zICovCi0KLXZvaWQgZW11MTBrMV93cml0ZWZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyKTsKLXZvaWQgZW11MTBrMV93cml0ZWZuMF8yKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIsIGludCk7Ci11MzIgZW11MTBrMV9yZWFkZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLQotdm9pZCBlbXUxMGsxX3RpbWVyX3NldChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUxNik7Ci0KLXZvaWQgc2JsaXZlX3dyaXRlcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIsIHUzMik7Ci12b2lkIHNibGl2ZV93cml0ZXB0cl90YWcoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIC4uLik7Ci0jZGVmaW5lIFRBR0xJU1RfRU5ECTAKLQotdTMyIHNibGl2ZV9yZWFkcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyICwgdTMyICk7Ci0KLXZvaWQgZW11MTBrMV9pcnFfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLXZvaWQgZW11MTBrMV9pcnFfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci12b2lkIGVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLQotLyogQUM5NyBDb2RlYyByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb24gKi8KLXUxNiBlbXUxMGsxX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqLCB1OCk7Ci12b2lkIGVtdTEwazFfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqLCB1OCwgdTE2KTsKLQotLyogTVBVIGFjY2VzcyBmdW5jdGlvbiovCi1pbnQgZW11MTBrMV9tcHVfd3JpdGVfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHU4KTsKLWludCBlbXUxMGsxX21wdV9yZWFkX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1OCAqKTsKLWludCBlbXUxMGsxX21wdV9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1X2FjcXVpcmUoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdV9yZWxlYXNlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci0KLSNlbmRpZiAgLyogX0hXQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkbWlkLmggYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTZlZjQxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkbWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaXNibGl2ZV9taWQuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfSUNBUkRNSURJX0gKLSNkZWZpbmUgX0lDQVJETUlESV9ICi0KLS8qIE1JREkgZGVmaW5lcyAqLwotI2RlZmluZSBNSURJX0RBVEFfRklSU1QgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTUlESV9EQVRBX0xBU1QgICAgICAgICAgICAgICAgICAweDdGCi0jZGVmaW5lIE1JRElfU1RBVFVTX0ZJUlNUICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBNSURJX1NUQVRVU19MQVNUICAgICAgICAgICAgICAgIDB4RkYKLQotLyogQ2hhbm5lbCBzdGF0dXMgYnl0ZXMgKi8KLSNkZWZpbmUgTUlESV9TVEFUVVNfQ0hBTk5FTF9GSVJTVCAgICAgICAweDgwCi0jZGVmaW5lIE1JRElfU1RBVFVTX0NIQU5ORUxfTEFTVCAgICAgICAgMHhFMAotI2RlZmluZSBNSURJX1NUQVRVU19DSEFOTkVMX01BU0sgICAgICAgIDB4RjAKLQotLyogQ2hhbm5lbCB2b2ljZSBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX1ZPSUNFX05PVEVfT0ZGICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgTUlESV9WT0lDRV9OT1RFX09OICAgICAgICAgICAgICAweDkwCi0jZGVmaW5lIE1JRElfVk9JQ0VfUE9MWV9QUkVTU1VSRSAgICAgICAgMHhBMAotI2RlZmluZSBNSURJX1ZPSUNFX0NPTlRST0xfQ0hBTkdFICAgICAgIDB4QjAKLSNkZWZpbmUgTUlESV9WT0lDRV9QUk9HUkFNX0NIQU5HRSAgICAgICAweEMwCi0jZGVmaW5lIE1JRElfVk9JQ0VfQ0hBTk5FTF9QUkVTU1VSRSAgICAgMHhEMAotI2RlZmluZSBNSURJX1ZPSUNFX1BJVENIX0JFTkQgICAgICAgICAgIDB4RTAKLQotLyogQ2hhbm5lbCBtb2RlIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1JRElfTU9ERV9DSEFOTkVMICAgICAgICAgICAgICAgTUlESV9WT0lDRV9DT05UUk9MX0NIQU5HRQotCi0vKiBTeXN0ZW0gc3RhdHVzIGJ5dGVzICovCi0jZGVmaW5lIE1JRElfU1RBVFVTX1NZU1RFTV9GSVJTVCAgICAgICAgMHhGMAotI2RlZmluZSBNSURJX1NUQVRVU19TWVNURU1fTEFTVCAgICAgICAgIDB4RkYKLQotLyogU3lzdGVtIGV4Y2x1c2l2ZSBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX1NZU0VYX0JFR0lOICAgICAgICAgICAgICAgIDB4RjAKLSNkZWZpbmUgTUlESV9TWVNFWF9FT1ggICAgICAgICAgICAgICAgICAweEY3Ci0KLS8qIFN5c3RlbSBjb21tb24gbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9DT01NT05fVENRRiAgICAgICAgICAgICAgICAweEYxCS8qIFRpbWUgY29kZSBxdWFydGVyIGZyYW1lICAqLwotI2RlZmluZSBNSURJX0NPTU1PTl9TT05HX1BPU0lUSU9OICAgICAgIDB4RjIKLSNkZWZpbmUgTUlESV9DT01NT05fU09OR19TRUxFQ1QgICAgICAgICAweEYzCi0jZGVmaW5lIE1JRElfQ09NTU9OX1VOREVGSU5FRF9GNCAgICAgICAgMHhGNAotI2RlZmluZSBNSURJX0NPTU1PTl9VTkRFRklORURfRjUgICAgICAgIDB4RjUKLSNkZWZpbmUgTUlESV9DT01NT05fVFVORV9SRVFVRVNUICAgICAgICAweEY2Ci0KLS8qIFN5c3RlbSByZWFsLXRpbWUgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9SVElNRV9USU1JTkdfQ0xPQ0sgICAgICAgICAweEY4Ci0jZGVmaW5lIE1JRElfUlRJTUVfVU5ERUZJTkVEX0Y5ICAgICAgICAgMHhGOQotI2RlZmluZSBNSURJX1JUSU1FX1NUQVJUICAgICAgICAgICAgICAgIDB4RkEKLSNkZWZpbmUgTUlESV9SVElNRV9DT05USU5VRSAgICAgICAgICAgICAweEZCCi0jZGVmaW5lIE1JRElfUlRJTUVfU1RPUCAgICAgICAgICAgICAgICAgMHhGQwotI2RlZmluZSBNSURJX1JUSU1FX1VOREVGSU5FRF9GRCAgICAgICAgIDB4RkQKLSNkZWZpbmUgTUlESV9SVElNRV9BQ1RJVkVfU0VOU0lORyAgICAgICAweEZFCi0jZGVmaW5lIE1JRElfUlRJTUVfU1lTVEVNX1JFU0VUICAgICAgICAgMHhGRgotCi0vKiBGbGFncyBmb3IgZmxhZ3MgcGFybSBvZiBtaWRpT3V0Q2FjaGVQYXRjaGVzKCksIG1pZGlPdXRDYWNoZURydW1QYXRjaGVzKCkgKi8KLSNkZWZpbmUgTUlESV9DQUNIRV9BTEwgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1JRElfQ0FDSEVfQkVTVEZJVCAgICAgICAgICAgICAgMgotI2RlZmluZSBNSURJX0NBQ0hFX1FVRVJZICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUlESV9VTkNBQ0hFICAgICAgICAgICAgICAgICAgICA0Ci0KLS8qIEV2ZW50IGRlY2xhcmF0aW9ucyBmb3IgTVBVIElSUSBDYWxsYmFja3MgKi8KLSNkZWZpbmUgSUNBUkRNSURJX0lOTE9OR0RBVEEgICAgICAgICAgICAweDAwMDAwMDAxIC8qIE1JTV9MT05HREFUQSAqLwotI2RlZmluZSBJQ0FSRE1JRElfSU5MT05HRVJST1IgICAgICAgICAgIDB4MDAwMDAwMDIgLyogTUlNX0xPTkdFUlJPUiAqLwotI2RlZmluZSBJQ0FSRE1JRElfT1VUTE9OR0RBVEEgICAgICAgICAgIDB4MDAwMDAwMDQgLyogTU9NX0RPTkUgZm9yIE1QVSBPVVQgYnVmZmVyICovCi0jZGVmaW5lIElDQVJETUlESV9JTkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiBNSU1fREFUQSAqLwotI2RlZmluZSBJQ0FSRE1JRElfSU5EQVRBRVJST1IgICAgICAgICAgIDB4MDAwMDAwMjAgLyogTUlNX0VSUk9SICovCi0KLS8qIERlY2xhcmF0aW9uIGZvciBmbGFncyBpbiBDQVJETUlESUJVRkZFUkhEUiAqLwotLyogTWFrZSBpdCB0aGUgc2FtZSBhcyBNSERSX0RPTkUsIE1IRFJfSU5RVUVVRSBpbiBtbXN5c3RlbS5oICovCi0jZGVmaW5lIE1JRElCVUZfRE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBNSURJQlVGX0lOUVVFVUUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLQotLyogRGVjbGFyYXRpb24gZm9yIG1zZyBwYXJhbWV0ZXIgaW4gbWlkaUNhbGxiYWNrRm4gKi8KLSNkZWZpbmUgSUNBUkRNSURJX09VVEJVRkZFUk9LICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIElDQVJETUlESV9JTk1JRElPSyAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKiBEZWNsYXJhdGlvbiBmb3IgdGVjaG5vbG9neSBpbiBzdHJ1Y3QgbWlkaV9jYXBzICovCi0jZGVmaW5lIE1UX01JRElQT1JUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBJbiBvcmlnaW5hbCBNSURJT1VUQ0FQUyBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgTVRfRk1TWU5USCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CS8qIEluIG9yaWdpbmFsIE1JRElPVVRDQVBTIHN0cnVjdHVyZSAqLwotI2RlZmluZSBNVF9BV0VTWU5USCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgTVRfUENJU1lOVEggICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIE1UX1BDSVNZTlRINjQgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBDQVJETUlESV9BV0VNQVNLICAgICAgICAgICAgICAgIDB4MDAwMEYwMDAKLQotZW51bSBMb2NhbEVycm9yQ29kZQotewotICAgICAgICBDVFNUQVRVU19OT1RFTkFCTEVEID0gMHg3MDAwLAotICAgICAgICBDVFNUQVRVU19SRUFEWSwKLSAgICAgICAgQ1RTVEFUVVNfQlVTWSwKLSAgICAgICAgQ1RTVEFUVVNfREFUQUFWQUlMLAotICAgICAgICBDVFNUQVRVU19OT0RBVEEsCi0gICAgICAgIENUU1RBVFVTX05FWFRfQllURQotfTsKLQotLyogTUlESSBkYXRhIGJsb2NrIGhlYWRlciAqLwotc3RydWN0IG1pZGlfaGRyCi17Ci0JdTggKnJlc2VydmVkOwkJLyogUG9pbnRlciB0byBvcmlnaW5hbCBsb2NrZWQgZGF0YSBibG9jayAqLwotCXUzMiBidWZmZXJsZW5ndGg7CS8qIExlbmd0aCBvZiBkYXRhIGluIGRhdGEgYmxvY2sgKi8KLQl1MzIgYnl0ZXNyZWNvcmRlZDsJLyogVXNlZCBmb3IgaW5wdXQgb25seSAqLwotCXUzMiB1c2VyOwkJLyogRm9yIGNsaWVudCdzIHVzZSAqLwotCXUzMiBmbGFnczsJCS8qIEFzc29ydGVkIGZsYWdzIChzZWUgZGVmaW5lcykgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIFJlc2VydmVkIGZvciBkcml2ZXIgKi8KLQl1OCAqZGF0YTsJCS8qIFNlY29uZCBjb3B5IG9mIGZpcnN0IHBvaW50ZXIgKi8KLX07Ci0KLS8qIEVudW1lcmF0aW9uIGZvciBTZXRDb250cm9sICovCi1lbnVtCi17Ci0JTUlESU9CSlZPTFVNRSA9IDB4MSwKLQlNSURJUVVFUllBQ1RJVkVJTlNUCi19OwotCi1zdHJ1Y3QgbWlkaV9xdWV1ZQotewotCXN0cnVjdCBtaWRpX3F1ZXVlICAqbmV4dDsKLQl1MzIgcXR5cGU7ICAgICAgICAgICAgLyogMCA9IHNob3J0IG1lc3NhZ2UsIDEgPSBsb25nIGRhdGEgKi8KLQl1MzIgbGVuZ3RoOwotCXUzMiBzaXplTGVmdDsKLQl1OCAqbWlkaWJ5dGU7Ci0JdW5zaWduZWQgbG9uZyByZWZkYXRhOwotfTsKLQotc3RydWN0IG1pZGlfb3BlbmluZm8KLXsKLQl1MzIgICAgIGNic2l6ZTsKLQl1MzIgICAgIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgIHJlZmRhdGE7Ci0JdTMyICAgICBzdHJlYW1pZDsKLX07Ci0KLWludCBlbXUxMGsxX21pZGlfY2FsbGJhY2sodW5zaWduZWQgbG9uZyAsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKik7Ci0KLSNlbmRpZiAvKiBfSUNBUkRNSURJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmggYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZHdhdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJlNDA5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGljYXJkd2F2LmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2lmbmRlZiBfSUNBUkRXQVZfSAotI2RlZmluZSBfSUNBUkRXQVZfSAotCi1zdHJ1Y3Qgd2F2ZV9mb3JtYXQgCi17Ci0JaW50IGlkOwotCWludCBzYW1wbGluZ3JhdGU7Ci0JdTggYml0c3BlcmNoYW5uZWw7Ci0JdTggY2hhbm5lbHM7CQkvKiAxID0gTW9ubywgMiA9IFN0ZXJlbywgMywgLi4uID0gTXVsdGljaGFubmVsICovCi0JdTggYnl0ZXNwZXJjaGFubmVsOwotCXU4IGJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0JdTggYnl0ZXNwZXJzYW1wbGU7Ci0JaW50IGJ5dGVzcGVyc2VjOwotCXU4IHBhc3N0aHJvdWdoOwotfTsKLQotLyogZW11MTBrMV93YXZlIHN0YXRlcyAqLwotI2RlZmluZSBXQVZFX1NUQVRFX09QRU4JCTB4MDEJCi0jZGVmaW5lIFdBVkVfU1RBVEVfU1RBUlRFRAkweDAyCi0jZGVmaW5lIFdBVkVfU1RBVEVfQ0xPU0VECTB4MDQKLQotI2VuZGlmIC8qIF9JQ0FSRFdBVl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJjZTYzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGlycW1nci5jIC0gSVJRIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiY2FyZG1pLmgiCi0jaW5jbHVkZSAiY2FyZG1vLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0KLS8qIEludGVycnVwdCBoYW5kbGVyICovCi0KLWlycXJldHVybl90IGVtdTEwazFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gKHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgZGV2X2lkOwotCXUzMiBpcnFzdGF0dXMsIGlycXN0YXR1c190bXA7Ci0JaW50IGhhbmRsZWQgPSAwOwotCi0JRFBEKDQsICJlbXUxMGsxX2ludGVycnVwdCBjYWxsZWQsIGlycSA9ICAldVxuIiwgaXJxKTsKLQotCS8qCi0JICoqIE5PVEUgOgotCSAqKiBXZSBkbyBhICd3aGlsZSBsb29wJyBoZXJlIGNvcyBvbiBjZXJ0YWluIG1hY2hpbmVzLCB3aXRoIGJvdGgKLQkgKiogcGxheWJhY2sgYW5kIHJlY29yZGluZyBnb2luZyBvbiBhdCB0aGUgc2FtZSB0aW1lLCBJUlFzIHdpbGwKLQkgKiogc3RvcCBjb21pbmcgaW4gYWZ0ZXIgYSB3aGlsZS4gQ2hlY2tpbmcgSVBORCBpbmRlZWQgc2hvd3MgdGhhdAotCSAqKiB0aGVyZSBhcmUgaW50ZXJydXB0cyBwZW5kaW5nIGJ1dCB0aGUgUElDIHNheXMgbm8gSVJRcyBwZW5kaW5nLgotCSAqKiBJIHN1c3BlY3QgdGhhdCBzb21lIGJvYXJkcyBuZWVkIGVkZ2UtdHJpZ2dlcmVkIElSUXMgYnV0IGFyZSBub3QKLQkgKiogZ2V0dGluZyB0aGF0IGNvbmRpdGlvbiBpZiB3ZSBkb24ndCBjb21wbGV0ZWx5IGNsZWFyIHRoZSBJUE5ECi0JICoqIChtYWtlIHN1cmUgbm8gbW9yZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nKS4KLQkgKiogLSBFcmljCi0JICovCi0KLQl3aGlsZSAoKGlycXN0YXR1cyA9IGlubChjYXJkLT5pb2Jhc2UgKyBJUFIpKSkgewotCQlEUEQoNCwgImlycSBzdGF0dXMgJSN4XG4iLCBpcnFzdGF0dXMpOwotCi0JCWlycXN0YXR1c190bXAgPSBpcnFzdGF0dXM7Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfVElNRVIpIHsKLQkJCWVtdTEwazFfdGltZXJfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9USU1FUjsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX0RTUCkgewotCQkJZW11MTBrMV9kc3BfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9EU1A7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9NUFVJTikgewotCQkJZW11MTBrMV9tcHVpbl9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX01QVUlOOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfTVBVT1VUKSB7Ci0JCQllbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX01QVU9VVDsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUFJfTVVURSkgewotCQkJZW11MTBrMV9tdXRlX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj1+SVBSX01VVEU7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVBSX1ZPTElOQ1IpIHsKLQkJCWVtdTEwazFfdm9saW5jcl9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9fklQUl9WT0xJTkNSOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElQUl9WT0xERUNSKSB7Ci0JCQllbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPX5JUFJfVk9MREVDUjsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMpewotCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBXYXJuaW5nLCB1bmhhbmRsZWQgaW50ZXJydXB0OiAlIzA4eFxuIiwgaXJxc3RhdHVzKTsKLQkJCS8vbWFrZSBzdXJlIGFueSBpbnRlcnJ1cHRzIHdlIGRvbid0IGhhbmRsZSBhcmUgZGlzYWJsZWQ6Ci0JCQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIH4oSU5URV9NSURJUlhFTkFCTEUgfCBJTlRFX01JRElUWEVOQUJMRSB8IElOVEVfSU5URVJWQUxUSU1FUkVOQiB8Ci0JCQkJCQlJTlRFX1ZPTERFQ1JFTkFCTEUgfCBJTlRFX1ZPTElOQ1JFTkFCTEUgfCBJTlRFX01VVEVFTkFCTEUgfAotCQkJCQkJSU5URV9GWERTUEVOQUJMRSkpOwotCQl9Ci0KLQkJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCi0JCW91dGwoaXJxc3RhdHVzX3RtcCwgY2FyZC0+aW9iYXNlICsgSVBSKTsKLQkJaGFuZGxlZCA9IDE7Ci0JfQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3YzljYS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGlycS5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9JUlFfSAotI2RlZmluZSBfSVJRX0gKLQotLyogRU1VIElycSBUeXBlcyAqLwotI2RlZmluZSBJUlFUWVBFX1BDSUJVU0VSUk9SCUlQUl9QQ0lFUlJPUgotI2RlZmluZSBJUlFUWVBFX01JWEVSQlVUVE9OCShJUFJfVk9MSU5DUiB8IElQUl9WT0xERUNSIHwgSVBSX01VVEUpCi0jZGVmaW5lIElSUVRZUEVfVk9JQ0UJCShJUFJfQ0hBTk5FTExPT1AgfCBJUFJfQ0hBTk5FTE5VTUJFUk1BU0spCi0jZGVmaW5lIElSUVRZUEVfUkVDT1JECQkoSVBSX0FEQ0JVRkZVTEwgfCBJUFJfQURDQlVGSEFMRkZVTEwgfCBJUFJfTUlDQlVGRlVMTCB8IElQUl9NSUNCVUZIQUxGRlVMTCB8IElQUl9FRlhCVUZGVUxMIHwgSVBSX0VGWEJVRkhBTEZGVUxMKQotI2RlZmluZSBJUlFUWVBFX01QVU9VVAkJKElQUl9NSURJVFJBTlNCVUZFTVBUWSB8IEFfSVBSX01JRElUUkFOU0JVRkVNUFRZMikgCi0jZGVmaW5lIElSUVRZUEVfTVBVSU4JCShJUFJfTUlESVJFQ1ZCVUZFTVBUWSB8IEFfSVBSX01JRElSRUNWQlVGRU1QVFkyKQotI2RlZmluZSBJUlFUWVBFX1RJTUVSCQlJUFJfSU5URVJWQUxUSU1FUgotI2RlZmluZSBJUlFUWVBFX1NQRElGCQkoSVBSX0dQU1BESUZTVEFUVVNDSEFOR0UgfCBJUFJfQ0RST01TVEFUVVNDSEFOR0UpCi0jZGVmaW5lIElSUVRZUEVfRFNQCQlJUFJfRlhEU1AKLQotdm9pZCBlbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV9kc3BfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX211dGVfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotCi0jZW5kaWYgLyogX0lSUV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTg0MTEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3MSArMCwwIEBACi0gLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWFpbi5jIC0gQ3JlYXRpdmUgRU1VMTBLMSBhdWRpbyBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCBzdHVmZgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICBTdXBwb3J0ZWQgZGV2aWNlczoKLSAqICAgICAgL2Rldi9kc3A6ICAgICAgICBTdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIE9TUy1jb21wYXRpYmxlCi0gKiAgICAgIC9kZXYvZHNwMTogICAgICAgUm91dGVzIHRvIHJlYXIgc3BlYWtlcnMgb25seQkgCi0gKiAgICAgIC9kZXYvbWl4ZXI6ICAgICAgU3RhbmRhcmQgL2Rldi9taXhlciBkZXZpY2UsIE9TUy1jb21wYXRpYmxlCi0gKiAgICAgIC9kZXYvbWlkaTogICAgICAgUmF3IE1JREkgVUFSVCBkZXZpY2UsIG1vc3RseSBPU1MtY29tcGF0aWJsZQotICoJL2Rldi9zZXF1ZW5jZXI6ICBTZXF1ZW5jZXIgSW50ZXJmYWNlIChyZXF1aXJlcyBzb3VuZC5vKQotICoKLSAqICAgICAgUmV2aXNpb24gaGlzdG9yeToKLSAqICAgICAgMC4xIGJldGEgSW5pdGlhbCByZWxlYXNlCi0gKiAgICAgIDAuMiBMb3dlcmVkIGluaXRpYWwgbWl4ZXIgdm9sLiBJbXByb3ZlZCBvbiBzdHV0dGVyaW5nIHdhdmUgcGxheWJhY2suIEFkZGVkIE1JREkgVUFSVCBzdXBwb3J0LgotICogICAgICAwLjMgRml4ZWQgbWl4ZXIgcm91dGluZyBidWcsIGFkZGVkIEFQUywgam95c3RpY2sgc3VwcG9ydC4KLSAqICAgICAgMC40IEFkZGVkIHJlYXItY2hhbm5lbCwgU1BESUYgc3VwcG9ydC4KLSAqCTAuNSBTb3VyY2UgY2xlYW51cCwgU01QIGZpeGVzLCBtdWx0aW9wZW4gc3VwcG9ydCwgNjQgYml0IGFyY2ggZml4ZXMsCi0gKgkgICAgbW92ZWQgYmgncyB0byB0YXNrbGV0cywgbW92ZWQgdG8gdGhlIG5ldyBQQ0kgZHJpdmVyIGluaXRpYWxpemF0aW9uIHN0eWxlLgotICoJMC42IE1ha2UgdXNlIG9mIHBjaV9hbGxvY19jb25zaXN0ZW50LCBpbXByb3ZlIGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIDIuMiBrZXJuZWxzLAotICoJICAgIGNvZGUgcmVvcmdhbml6YXRpb24gYW5kIGNsZWFudXAuCi0gKgkwLjcgU3VwcG9ydCBmb3IgdGhlIEVtdS1BUFMuIEJ1ZyBmaXhlcyBmb3Igdm9pY2UgY2FjaGUgc2V0dXAsIG1tYXBlZCBzb3VuZCArIHBvbGwoKS4KLSAqICAgICAgICAgIFN1cHBvcnQgZm9yIHNldHRpbmcgZXh0ZXJuYWwgVFJBTSBzaXplLgotICogICAgICAwLjggTWFrZSB1c2Ugb2YgdGhlIGtlcm5lbCBhYzk3IGludGVyZmFjZS4gU3VwcG9ydCBmb3IgYSBkc3AgcGF0Y2ggbWFuYWdlci4KLSAqICAgICAgMC45IFJlLWVuYWJsZXMgcmVhciBzcGVha2VycyB2b2x1bWUgY29udHJvbHMKLSAqICAgICAwLjEwIEluaXRpYWxpemVzIHJlYXIgc3BlYWtlciB2b2x1bWUuCi0gKgkgICAgRHluYW1pYyBwYXRjaCBzdG9yYWdlIGFsbG9jYXRpb24uCi0gKgkgICAgTmV3IHByaXZhdGUgaW9jdGxzIHRvIGNoYW5nZSBjb250cm9sIGdwciB2YWx1ZXMuCi0gKgkgICAgRW5hYmxlIHZvbHVtZSBjb250cm9sIGludGVycnVwdHMuCi0gKgkgICAgQnkgZGVmYXVsdCBlbmFibGUgZHNwIHJvdXRlcyB0byBkaWdpdGFsIG91dC4gCi0gKiAgICAgMC4xMSBGaXhlZCBmeCAvIDQgcHJvYmxlbS4KLSAqICAgICAwLjEyIEltcGxlbWVudGVkIG1tYXBlZCBmb3IgcmVjb3JkaW5nLgotICoJICAgIEZpeGVkIGJ1Zzogbm90IHVucmVzZXJ2aW5nIG1tYXBlZCBidWZmZXIgcGFnZXMuCi0gKgkgICAgSVJRIGhhbmRsZXIgY2xlYW51cC4KLSAqICAgICAwLjEzIEZpeGVkIHByb2JsZW0gd2l0aCBkc3AxCi0gKiAgICAgICAgICBTaW1wbGlmaWVkIGRzcCBwYXRjaCB3cml0aW5nIChpbnNpZGUgdGhlIGRyaXZlcikKLSAqCSAgICBGaXhlZCBzZXZlcmFsIGJ1Z3MgZm91bmQgYnkgdGhlIFN0YW5mb3JkIHRvb2xzCi0gKiAgICAgMC4xNCBOZXcgY29udHJvbCBncHIgdG8gb3NzIG1peGVyIG1hcHBpbmcgZmVhdHVyZSAoQ2hyaXMgUHVybmVsbCkKLSAqICAgICAgICAgIEFkZGVkIEFDMyBQYXNzdGhyb3VnaCBTdXBwb3J0IChKdWhhIFlyam9sYSkKLSAqICAgICAgICAgIEFkZGVkIFN1cHBvcnQgZm9yIDUuMSBjYXJkcyAoZGlnaXRhbCBvdXQgYW5kIHRoZSB0aGlyZCBhbmFsb2cgb3V0KQotICogICAgIDAuMTUgQWRkZWQgU2VxdWVuY2VyIFN1cHBvcnQgKERhbmllbCBNYWNrKQotICogICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGljaGFubmVsIHBjbSBwbGF5YmFjayAoRWR1YXJkIEhhc2VubGVpdGhuZXIpCi0gKiAgICAgMC4xNiBNaXhlciBpbXByb3ZlbWVudHMsIGFkZGVkIG9sZCB0cmVibGUvYmFzcyBzdXBwb3J0IChEYW5pZWwgQmVydHJhbmQpCi0gKiAgICAgICAgICBTbWFsbCBjb2RlIGZvcm1hdCBjbGVhbnVwLgotICogICAgICAgICAgRGVhZGxvY2sgYnVnIGZpeCBmb3IgZW11MTBrMV92b2x4eHhfaXJxaGFuZGxlcigpLgotICogICAgIDAuMTcgRml4IGZvciBtaXhlciBTT1VORF9NSVhFUl9JTkZPIGlvY3RsLgotICoJICAgIEZpeCBmb3IgSElHSE1FTSBtYWNoaW5lcyAoZW11MTBrMSBjYW4gb25seSBkbyAzMSBiaXQgYnVzIG1hc3RlcikgCi0gKgkgICAgbWlkaSBwb2xsIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0gKgkgICAgU21hbGwgbWl4ZXIgZml4ZXMvY2xlYW51cHMuCi0gKgkgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgNS4xIGNhcmRzLgotICogICAgIDAuMTggRml4IGZvciBwb3NzaWJsZSBsZWFrIGluIHBjaV9hbGxvY19jb25zaXN0ZW50KCkKLSAqICAgICAgICAgIENsZWFuZWQgdXAgcG9sbCgpIGZ1bmN0aW9ucyAoYXVkaW8gYW5kIG1pZGkpLiBEb24ndCBzdGFydCBpbnB1dC4KLSAqCSAgICBSZXN0cmljdCBETUEgcGFnZXMgdXNlZCB0byA1MTJNaWIgcmFuZ2UuCi0gKgkgICAgTmV3IEFDOTdfQk9PU1QgbWl4ZXIgaW9jdGwuCi0gKiAgICAwLjE5YSBBZGRlZCBTdXBwb3J0IGZvciBBdWRpZ3kgQ2FyZHMKLSAqCSAgICBSZWFsIGZpeCBmb3Iga2VybmVsIHdpdGggaGlnaG1lbSBzdXBwb3J0IChjYXN0IGRtYV9oYW5kbGUgdG8gdTMyKS4KLSAqCSAgICBGaXggcmVjb3JkaW5nIGJ1ZmZlcmluZyBwYXJhbWV0ZXJzIGNhbGN1bGF0aW9uLgotICoJICAgIFVzZSB1bnNpZ25lZCBsb25nIGZvciB2YXJpYWJsZXMgaW4gYml0IG9wcy4KLSAqICAgIDAuMjBhIEZpeGVkIHJlY29yZGluZyBzdGFydHVwCi0gKgkgICAgRml4ZWQgdGltZXIgcmF0ZSBzZXR0aW5nIChpdCdzIGEgMTYtYml0IHJlZ2lzdGVyKQotICoJMC4yMSBDb252ZXJ0ZWQgY29kZSB0byB1c2UgcGNpX25hbWUoKSBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBzbG90X25hbWUKLSAqCSAgICBkaXJlY3RseSAoRXVnZW5lIFRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZXNlIGFyZSBvbmx5IGluY2x1ZGVkIG9uY2UgcGVyIG1vZHVsZSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImVmeG1nci5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotI2luY2x1ZGUgImNhcmRtby5oIgotI2luY2x1ZGUgImNhcmRtaS5oIgotI2luY2x1ZGUgInJlY21nci5oIgotI2luY2x1ZGUgImVjYXJkLmgiCi0KLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0jZGVmaW5lIE1JRElfU1lOVEhfTkFNRSAiRU1VMTBLMSBNSURJIgotI2RlZmluZSBNSURJX1NZTlRIX0NBUFMgU1lOVEhfQ0FQX0lOUFVUCi0gCi0jaW5jbHVkZSAiLi4vc291bmRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vbWlkaV9zeW50aC5oIgotCi0vKiB0aGlzIHNob3VsZCBiZSBpbiBkZXZfdGFibGUuaCAqLwotI2RlZmluZSBTTkRDQVJEX0VNVTEwSzEgNDYKLSNlbmRpZgotIAotCi0vKiB0aGUgZW11MTBrMSBfc2VlbXNfIHRvIG9ubHkgc3VwcG9ydHMgMjkgYml0ICg1MTJNaUIpIGJpdCBidXMgbWFzdGVyICovCi0jZGVmaW5lIEVNVTEwSzFfRE1BX01BU0sgRE1BXzI5QklUX01BU0sJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLwotCi0jaWZuZGVmIFBDSV9WRU5ET1JfSURfQ1JFQVRJVkUKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DUkVBVElWRSAweDExMDIKLSNlbmRpZgotCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0VNVTEwSzEgMHgwMDAyCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kgMHgwMDA0Ci0jZW5kaWYKLQotI2RlZmluZSBFTVVfQVBTX1NVQklECTB4NDAwMTExMDIKLSAKLWVudW0gewotCUVNVTEwSzEgPSAwLAotCUFVRElHWSwKLX07Ci0KLXN0YXRpYyBjaGFyICpjYXJkX25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKLQkiRU1VMTBLMSIsCi0JIkF1ZGlneSIsCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZW11MTBrMV9wY2lfdGJsW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgRU1VMTBLMX0sCi0Je1BDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBVURJR1l9LAotCXswLH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlbXUxMGsxX3BjaV90YmwpOwotCi0vKiBHbG9iYWwgdmFyIGluc3RhbnRpYXRpb24gKi8KLQotTElTVF9IRUFEKGVtdTEwazFfZGV2cyk7Ci0KLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfYXVkaW9fZm9wczsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWl4ZXJfZm9wczsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9mb3BzOwotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLXN0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9vcGVyYXRpb25zOwotI2VuZGlmCi0KLWV4dGVybiBpcnFyZXR1cm5fdCBlbXUxMGsxX2ludGVycnVwdChpbnQsIHZvaWQgKik7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfYXVkaW9faW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCS8qIEFzc2lnbiBkZWZhdWx0IHBsYXliYWNrIHZvaWNlIHBhcmFtZXRlcnMgKi8KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQljYXJkLT5tY2hhbm5lbF9meCA9IDA7Ci0JZWxzZQotCQljYXJkLT5tY2hhbm5lbF9meCA9IDg7Ci0KLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJLyogbW9ubyB2b2ljZSAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dID0gMHhmZmZmZmZmZjsKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9NT05PXSA9IDB4MDAwMGZmZmY7Ci0JCi0JCS8qIHN0ZXJlbyB2b2ljZSAqLwotCQkvKiBsZWZ0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF0gPSAweDAwZmYwMGZmOwotCQljYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX0xFRlRdID0gMHgwMDAwN2Y3ZjsJCi0JCS8qIHJpZ2h0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdID0gMHhmZjAwZmYwMDsKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9SSUdIVF0gPSAweDAwMDA3ZjdmOwotCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV0gPSAweDAzMDIwMTAwOyAvLyBSZWd1bGFyIHBjbQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNXSA9IDB4MDcwNjA1MDQ7Ci0KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUFRdID0gMHgzZjNmM2QzYzsgLy8gUGFzc3Rocm91Z2gKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BUXSA9IDB4M2YzZjNmM2Y7Ci0JCQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXSA9IDB4MDMwMjAxMDA7IC8vIFNwYXJlCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXSA9IDB4MDcwNjA0MDQ7Ci0JCQotCX0gZWxzZSB7Ci0JCS8qIG1vbm8gdm9pY2UgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9NT05PXSA9IDB4MDAwMGZmZmY7Ci0JCi0JCS8qIHN0ZXJlbyB2b2ljZSAqLwotCQkvKiBsZWZ0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF0gPSAweDAwMDAwMGZmOwotCQkvKiByaWdodCAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX1JJR0hUXSA9IDB4MDAwMGZmMDA7Ci0KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNXSA9IDB4MzIxMDsgLy8gcGNtCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXSA9IDB4MzIxMDsgLy8gcGFzc3Rocm91Z2gKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV0gPSAweDc2NTQ7IC8vIC9kZXYvZHNwMQotCX0KLQotCS8qIEFzc2lnbiBkZWZhdWx0IHJlY29yZGluZyBwYXJhbWV0ZXJzICovCi0JLyogRklYTUUgKi8KLQlpZiAoY2FyZC0+aXNfYXBzKQotCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9GWDsKLQllbHNlCi0JCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0FDOTc7Ci0KLQljYXJkLT53YXZlaW4uZnh3YyA9IDB4MDAwMzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9hdWRpb19jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWNhcmQtPmF1ZGlvX2RldiA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZW11MTBrMV9hdWRpb19mb3BzLCAtMSk7Ci0JaWYgKGNhcmQtPmF1ZGlvX2RldiA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgZmlyc3QgYXVkaW8gZGV2aWNlIVxuIik7Ci0JCWdvdG8gZXJyX2RldjsKLQl9Ci0KLQljYXJkLT5hdWRpb19kZXYxID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlbXUxMGsxX2F1ZGlvX2ZvcHMsIC0xKTsKLQlpZiAoY2FyZC0+YXVkaW9fZGV2MSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgc2Vjb25kIGF1ZGlvIGRldmljZSFcbiIpOwotCQlnb3RvIGVycl9kZXYxOwotCX0KLQotCWNhcmQtPmFjOTctPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZlbXUxMGsxX21peGVyX2ZvcHMsIC0xKTsKLQlpZiAoY2FyZC0+YWM5Ny0+ZGV2X21peGVyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaXhlciBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl9taXhlcjsKLSAgICAgICAgfQotCi0JY2FyZC0+bWlkaV9kZXYgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZlbXUxMGsxX21pZGlfZm9wcywgLTEpOwotCWlmIChjYXJkLT5taWRpX2RldiA8IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaWRpIGRldmljZSFcbiIpOwotCQlnb3RvIGVycl9taWRpOwotICAgICAgICB9Ci0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWNhcmQtPnNlcV9kZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7Ci0JaWYgKGNhcmQtPnNlcV9kZXYgPT0gLTEpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IHVuYWJsZSB0byByZWdpc3RlciBzZXF1ZW5jZXIgZGV2aWNlISIpOwotCWVsc2UgewotCQlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IGNhcmQtPnNlcV9kZXY7Ci0JCW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSA9IAotCQkJKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgKikKLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKLQotCQlpZiAobWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKTsKLQkJCXNvdW5kX3VubG9hZF9taWRpZGV2KGNhcmQtPnNlcV9kZXYpOwotCQkJY2FyZC0+c2VxX2RldiA9IC0xOwotCQkJLyogcmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLQkJfSBlbHNlIHsKLQkJCW1lbWNweSgoY2hhciAqKW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSwgCi0JCQkJKGNoYXIgKikmZW11MTBrMV9taWRpX29wZXJhdGlvbnMsIAotCQkJCXNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7Ci0JCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0tPmRldmMgPSBjYXJkOwotCQkJc2VxdWVuY2VyX2luaXQoKTsKLQkJCWNhcmQtPnNlcV9taWRpZGV2ID0gTlVMTDsKLQkJfQotCX0KLSNlbmRpZgotCXJldHVybiAwOwotCi1lcnJfbWlkaToKLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7Ci1lcnJfbWl4ZXI6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKLWVycl9kZXYxOgotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7Ci1lcnJfZGV2OgotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JaWYgKGNhcmQtPnNlcV9kZXYgPiAtMSkgewotCQlrZnJlZShtaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0pOwotCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0gPSBOVUxMOwotCQlzb3VuZF91bmxvYWRfbWlkaWRldihjYXJkLT5zZXFfZGV2KTsKLQkJY2FyZC0+c2VxX2RldiA9IC0xOwotCX0KLSNlbmRpZgotCi0JdW5yZWdpc3Rlcl9zb3VuZF9taWRpKGNhcmQtPm1pZGlfZGV2KTsKLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2MSk7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2luZm9fcHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBkYXRhOwotCWludCBsZW4gPSAwOwotCQotCWlmIChjYXJkID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJEcml2ZXIgVmVyc2lvbiA6ICVzXG4iLCBEUklWRVJfVkVSU0lPTik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJDYXJkIHR5cGUgICAgICA6ICVzXG4iLCBjYXJkLT5pc19hcHMgPyAiQXBzIiA6IChjYXJkLT5pc19hdWRpZ3kgPyAiQXVkaWd5IiA6ICJFbXUxMGsxIikpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiUmV2aXNpb24gICAgICAgOiAlZFxuIiwgY2FyZC0+Y2hpcHJldik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJNb2RlbCAgICAgICAgICA6ICUjMDZ4XG4iLCBjYXJkLT5tb2RlbCk7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJJTyAgICAgICAgICAgICA6ICUjMDZseC0lIzA2bHhcbiIsIGNhcmQtPmlvYmFzZSwgY2FyZC0+aW9iYXNlICsgY2FyZC0+bGVuZ3RoIC0gMSk7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJJUlEgICAgICAgICAgICA6ICVkXG5cbiIsIGNhcmQtPmlycSk7Ci0JCi0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJSZWdpc3RlcmVkIC9kZXYgRW50cmllczpcbiIpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9kc3AlZFxuIiwgY2FyZC0+YXVkaW9fZGV2IC8gMTYpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9kc3AlZFxuIiwgY2FyZC0+YXVkaW9fZGV2MSAvIDE2KTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvbWl4ZXIlZFxuIiwgY2FyZC0+YWM5Ny0+ZGV2X21peGVyIC8gMTYpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9taWRpJWRcbiIsIGNhcmQtPm1pZGlfZGV2IC8gMTYpOwotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvc2VxdWVuY2VyXG4iKTsKLSNlbmRpZgotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9wcm9jX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQljaGFyIHNbNDhdOwotCi0JaWYgKCFwcm9jX21rZGlyICgiZHJpdmVyL2VtdTEwazEiLCBOVUxMKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXJlY3RvcnkgZHJpdmVyL2VtdTEwazFcbiIpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JaWYgKCFwcm9jX21rZGlyIChzLCBOVUxMKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXJlY3RvcnkgJXNcbiIsIHMpOwotCQlnb3RvIGVycl9lbXUxMGsxX3Byb2M7Ci0JfQotCi0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvaW5mbyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHMsIDAsIE5VTEwsIGVtdTEwazFfaW5mb19wcm9jLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgcyk7Ci0JCWdvdG8gZXJyX2Rldl9wcm9jOwotCX0KLQotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2FjOTciLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAocywgMCwgTlVMTCwgYWM5N19yZWFkX3Byb2MsIGNhcmQtPmFjOTcpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgcyk7Ci0JCQlnb3RvIGVycl9wcm9jX2FjOTc7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3Byb2NfYWM5NzoKLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9pbmZvIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCi1lcnJfZGV2X3Byb2M6Ci0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0KLWVycl9lbXUxMGsxX3Byb2M6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9lbXUxMGsxIiwgTlVMTCk7Ci0KLWVycl9vdXQ6Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfcHJvY19jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JY2hhciBzWzQ4XTsKLQotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2FjOTciLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCX0KLQotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2luZm8iLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0KLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKLQkJCi0JcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9lbXUxMGsxIiwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfbWl4ZXJfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyAgPSBhYzk3X2FsbG9jX2NvZGVjKCk7Ci0JCi0JaWYoY29kZWMgPT0gTlVMTCkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGFsbG9jYXRlIG1peGVyXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWNhcmQtPmFjOTcgPSBjb2RlYzsKLQljYXJkLT5hYzk3LT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCi0JaWYgKCFjYXJkLT5pc19hcHMpIHsKLQkJY2FyZC0+YWM5Ny0+aWQgPSAwOwotCQljYXJkLT5hYzk3LT5jb2RlY19yZWFkID0gZW11MTBrMV9hYzk3X3JlYWQ7Ci0gICAgICAgIAljYXJkLT5hYzk3LT5jb2RlY193cml0ZSA9IGVtdTEwazFfYWM5N193cml0ZTsKLQotCQlpZiAoYWM5N19wcm9iZV9jb2RlYyAoY2FyZC0+YWM5NykgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gcHJvYmUgQUM5NyBjb2RlY1xuIik7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQkJLyogNS4xOiBFbmFibGUgdGhlIGFkZGl0aW9uYWwgQUM5NyBTbG90cyBhbmQgdW5tdXRlIGV4dHJhIGNoYW5uZWxzIG9uIEFDOTcgY29kZWMgKi8KLQkJaWYgKGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKSAmIDB4MDA4MCl7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJlbXUxMGsxOiBTQkxpdmUhIDUuMSBjYXJkIGRldGVjdGVkXG4iKTsgCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFIgfCBBQzk3U0xPVF9MRkUpOwotCQkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMHgwKTsKLQkJfQotCi0JCS8vIEZvcmNlIDViaXQ6CQkgICAgCi0JCS8vY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb249NTsKLQotCQkvKiB0aGVzZSB3aWxsIHN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgYW5kIG5ldmVyIGJlIG1vZGlmaWVkICovCi0JCWNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyA9IGNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnM7Ci0JCWNhcmQtPmFjOTdfc3RlcmVvX21peGVycyA9IGNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSBlcnJfb3V0OgotIAlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5Nyk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfbWl4ZXJfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9taWRpX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgcmV0OwotCi0JY2FyZC0+bXB1b3V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfbXB1b3V0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhcmQtPm1wdW91dCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbXUxMGsxX21wdW91dDogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDE7Ci0JfQotCi0JY2FyZC0+bXB1b3V0LT5pbnRyID0gMTsKLQljYXJkLT5tcHVvdXQtPnN0YXR1cyA9IEZMQUdTX0FWQUlMQUJMRTsKLQljYXJkLT5tcHVvdXQtPnN0YXRlID0gQ0FSRE1JRElPVVRfU1RBVEVfREVGQVVMVDsKLQotCXRhc2tsZXRfaW5pdCgmY2FyZC0+bXB1b3V0LT50YXNrbGV0LCBlbXUxMGsxX21wdW91dF9iaCwgKHVuc2lnbmVkIGxvbmcpIGNhcmQpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPm1wdW91dC0+bG9jayk7Ci0KLQljYXJkLT5tcHVpbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdWluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhcmQtPm1wdWluID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZW11MTBrMTogVW5hYmxlIHRvIGFsbG9jYXRlIGVtdTEwazFfbXB1aW46IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyX291dDI7Ci0JfQotCi0JY2FyZC0+bXB1aW4tPnN0YXR1cyA9IEZMQUdTX0FWQUlMQUJMRTsKLQotCXRhc2tsZXRfaW5pdCgmY2FyZC0+bXB1aW4tPnRhc2tsZXQsIGVtdTEwazFfbXB1aW5fYmgsICh1bnNpZ25lZCBsb25nKSBjYXJkLT5tcHVpbik7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bXB1aW4tPmxvY2spOwotCi0JLyogUmVzZXQgdGhlIE1QVSBwb3J0ICovCi0JaWYgKGVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpIDwgMCkgewotCQlFUlJPUigpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycl9vdXQzOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfb3V0MzoKLQlrZnJlZShjYXJkLT5tcHVpbik7Ci1lcnJfb3V0MjoKLQlrZnJlZShjYXJkLT5tcHVvdXQpOwotZXJyX291dDE6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9taWRpX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl0YXNrbGV0X2tpbGwoJmNhcmQtPm1wdW91dC0+dGFza2xldCk7Ci0Ja2ZyZWUoY2FyZC0+bXB1b3V0KTsKLQotCXRhc2tsZXRfa2lsbCgmY2FyZC0+bXB1aW4tPnRhc2tsZXQpOwotCWtmcmVlKGNhcmQtPm1wdWluKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHZvaWNlX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSsrKQotCQljYXJkLT52b2ljZXRhYmxlW2ldID0gVk9JQ0VfVVNBR0VfRlJFRTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHRpbWVyX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlJTklUX0xJU1RfSEVBRCgmY2FyZC0+dGltZXJzKTsKLQljYXJkLT50aW1lcl9kZWxheSA9IFRJTUVSX1NUT1BQRUQ7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnRpbWVyX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYWRkeG1ncl9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGNvdW50OwotCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUFYUEFHRVM7IGNvdW50KyspCi0JCWNhcmQtPmVtdXBhZ2V0YWJsZVtjb3VudF0gPSAwOwotCi0JLyogTWFyayBmaXJzdCBwYWdlIGFzIHVzZWQgKi8KLQkvKiBUaGlzIHBhZ2UgaXMgcmVzZXJ2ZWQgYnkgdGhlIGRyaXZlciAqLwotCWNhcmQtPmVtdXBhZ2V0YWJsZVswXSA9IDB4ODAwMTsKLQljYXJkLT5lbXVwYWdldGFibGVbMV0gPSBNQVhQQUdFUyAtIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ4X2NsZWFudXAoc3RydWN0IHBhdGNoX21hbmFnZXIgKm1ncikKLXsKLQlpbnQgaTsKLQlmb3IoaSA9IDA7IGkgPCBtZ3ItPmN1cnJlbnRfcGFnZXM7IGkrKykKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBtZ3ItPnBhdGNoW2ldKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZnhfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IgPSAmY2FyZC0+bWdyOwotCXN0cnVjdCBkc3BfcGF0Y2ggKnBhdGNoOwotCXN0cnVjdCBkc3BfcnBhdGNoICpycGF0Y2g7Ci0JczMyIGxlZnQsIHJpZ2h0OwotCWludCBpOwotCXUzMiBwYyA9IDA7Ci0JdTMyIHBhdGNoX249MDsKLQlzdHJ1Y3QgZW11X2VmeF9pbmZvX3QgZW11X2VmeF9pbmZvWzJdPQotCQl7eyAyMCwgMTAsIDB4NDAwLCAweDEwMCwgMHgyMCB9LAotCQkgeyAyNCwgMTIsIDB4NjAwLCAweDQwMCwgMHg2MCB9LAotCQl9OyAKLQkJCQotCi0JZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7Ci0JCW1nci0+Y3RybF9ncHJbaV1bMF0gPSAtMTsKLQkJbWdyLT5jdHJsX2dwcltpXVsxXSA9IC0xOwotCX0KLQotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJbWdyLT5jdXJyZW50X3BhZ2VzID0gKDIgKyBQQVRDSEVTX1BFUl9QQUdFIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFOwotCWVsc2UKLQkJLyogISEgVGhlIG51bWJlciBiZWxvdyBtdXN0IGVxdWFsIHRoZSBudW1iZXIgb2YgcGF0Y2hlcywgY3VycmVudGx5IDExICEhICovCi0JCW1nci0+Y3VycmVudF9wYWdlcyA9ICgxMSArIFBBVENIRVNfUEVSX1BBR0UgLSAxKSAvIFBBVENIRVNfUEVSX1BBR0U7Ci0JCi0JZm9yIChpID0gMDsgaSA8IG1nci0+Y3VycmVudF9wYWdlczsgaSsrKSB7Ci0JCW1nci0+cGF0Y2hbaV0gPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKG1nci0+cGF0Y2hbaV0gPT0gTlVMTCkgewotCQkJbWdyLT5jdXJyZW50X3BhZ2VzID0gaTsKLQkJCWZ4X2NsZWFudXAobWdyKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCW1lbXNldChtZ3ItPnBhdGNoW2ldLCAwLCBQQUdFX1NJWkUpOwotCX0KLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKLQkJCU9QKDB4ZiwgMHgwYzAsIDB4MGMwLCAweDBjZiwgMHgwYzApOwotCi0JCWZvciAoaSA9IDA7IGkgPCA1MTIgOyBpKyspCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9HUFJfQkFTRStpLDAsMCk7Ci0KLQkJcGM9MDsKLQotCQkvL1BjbSBpbnB1dCB2b2x1bWUKLQkJT1AoMCwgMHg0MDIsIDB4MGMwLCAweDQwNiwgMHgwMDApOwotCQlPUCgwLCAweDQwMywgMHgwYzAsIDB4NDA3LCAweDAwMSk7Ci0KLQkJLy9DRC1EaWdpdGFsIGlucHV0IFZvbHVtZQotCQlPUCgwLCAweDQwNCwgMHgwYzAsIDB4NDBkLCAweDQyKTsKLQkJT1AoMCwgMHg0MDUsIDB4MGMwLCAweDQwZiwgMHg0Myk7Ci0KLQkJLy8gQ0QgKyBQQ00gCi0JCU9QKDYsIDB4NDAwLCAweDBjMCwgMHg0MDIsIDB4NDA0KTsKLQkJT1AoNiwgMHg0MDEsIDB4MGMwLCAweDQwMywgMHg0MDUpOwotCQkKLQkJLy8gRnJvbnQgT3V0cHV0ICsgTWFzdGVyIFZvbHVtZQotCQlPUCgwLCAweDY4LCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHg2OSwgMHgwYzAsIDB4NDA5LCAweDQwMSk7Ci0KLQkJLy8gQWRkLWluIGFuYWxvZyBpbnB1dHMgZm9yIG90aGVyIHNwZWFrZXJzCi0JCU9QKDYsIDB4NDAwLCAweDQwLCAweDQwMCwgMHhjMCk7Ci0JCU9QKDYsIDB4NDAxLCAweDQxLCAweDQwMSwgMHhjMCk7Ci0KLQkJLy8gRGlnaXRhbCBGcm9udCArIE1hc3RlciBWb2x1bWUKLQkJT1AoMCwgMHg2MCwgMHgwYzAsIDB4NDA4LCAweDQwMCk7Ci0JCU9QKDAsIDB4NjEsIDB4MGMwLCAweDQwOSwgMHg0MDEpOwotCi0JCS8vIFJlYXIgT3V0cHV0ICsgUmVhciBWb2x1bWUKLQkJT1AoMCwgMHgwNmUsIDB4MGMwLCAweDQxOSwgMHg0MDApOwotCQlPUCgwLCAweDA2ZiwgMHgwYzAsIDB4NDFhLCAweDQwMSk7CQkKLQotCQkvLyBEaWdpdGFsIFJlYXIgT3V0cHV0ICsgUmVhciBWb2x1bWUKLQkJT1AoMCwgMHgwNjYsIDB4MGMwLCAweDQxOSwgMHg0MDApOwotCQlPUCgwLCAweDA2NywgMHgwYzAsIDB4NDFhLCAweDQwMSk7CQkKLQotCQkvLyBBdWRpZ3kgRHJpdmUsIEhlYWRwaG9uZSBvdXQKLQkJT1AoNiwgMHg2NCwgMHgwYzAsIDB4MGMwLCAweDQwMCk7Ci0JCU9QKDYsIDB4NjUsIDB4MGMwLCAweDBjMCwgMHg0MDEpOwotCi0JCS8vIGFjOTcgUmVjb3JkaW5nCi0JCU9QKDYsIDB4NzYsIDB4MGMwLCAweDBjMCwgMHg0MCk7Ci0JCU9QKDYsIDB4NzcsIDB4MGMwLCAweDBjMCwgMHg0MSk7Ci0JCQotCQkvLyBDZW50ZXIgPSBzdWIgPSBMZWZ0LzIgKyBSaWdodC8yCi0JCU9QKDB4ZSwgMHg0MDAsIDB4NDAxLCAweGNkLCAweDQwMCk7Ci0KLQkJLy8gY2VudGVyL3N1YiAgVm9sdW1lIChtYXN0ZXIpCi0JCU9QKDAsIDB4MDZhLCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHgwNmIsIDB4MGMwLCAweDQwOSwgMHg0MDApOwotCi0JCS8vIERpZ2l0YWwgY2VudGVyL3N1YiAgVm9sdW1lIChtYXN0ZXIpCi0JCU9QKDAsIDB4MDYyLCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHgwNjMsIDB4MGMwLCAweDQwOSwgMHg0MDApOwotCi0JCVJPVVRJTkdfUEFUQ0hfU1RBUlQocnBhdGNoLCAiUm91dGluZyIpOwotCQlST1VUSU5HX1BBVENIX0VORChycGF0Y2gpOwotCi0JCS8qIGRlbGltaXRlciBwYXRjaCAqLwotCQlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7Ci0JCXBhdGNoLT5jb2RlX3NpemUgPSAwOwotCi0JCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAweDUzLCAwLCAwKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgNTEyIDsgaSsrKQotCQkJT1AoNiwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCQkJCQkgICAgRlhHUFJFR0JBU0UgKyBpLCAwLAotCQkJCQkgICAgVEFOS01FTUFERFJSRUdCQVNFICsgaSwgMCwKLQkJCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCQkKLQkJcGMgPSAwOwotCi0JCS8vZmlyc3QgZnJlZSBHUFIgPSAweDExYgotCQotCQkKLQkJLyogRlggdm9sdW1lIGNvcnJlY3Rpb24gYW5kIFZvbHVtZSBjb250cm9sKi8KLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJQY20gTCB2b2wiLCAweDAsIDApOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMDAsIDB4MCk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDYsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQkJR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCAweDExMik7Ci0KLQkJT1AoNCwgMHgxMTIsIDB4NDAsIFBDTV9JTl9MLCAweDQ0KTsgLy8qNAkKLQkJT1AoMCwgMHgxMDAsIDB4MDQwLCAweDExMiwgMHgxMDYpOyAgLy8qdm9sCQotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJQY20gUiB2b2wiLCAweDEsIDApOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMDEsIDB4MSk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDcsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQkJR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCAweDExMik7Ci0KLQkJT1AoNCwgMHgxMTIsIDB4NDAsIFBDTV9JTl9SLCAweDQ0KTsgCi0JCU9QKDAsIDB4MTAxLCAweDA0MCwgMHgxMTIsIDB4MTA3KTsKLQotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJLy8gQ0QtRGlnaXRhbCBJbiBWb2x1bWUgY29udHJvbAkKLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJDRC1EaWdpdGFsIFZvbCBMIiwgMHgxMiwgMCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwYywgMHgxMik7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMGQsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCAweDEwYywgMHgwNDAsIFNQRElGX0NEX0wsIDB4MTBkKTsKLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIkNELURpZ2l0YWwgVm9sIFIiLCAweDEzLCAwKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTBlLCAweDEzKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwZiwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIDB4MTBlLCAweDA0MCwgU1BESUZfQ0RfUiwgMHgxMGYpOwotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0JCS8vVm9sdW1lIENvcnJlY3Rpb24gZm9yIE11bHRpLWNoYW5uZWwgSW5wdXRzCQotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIk11bHRpLUNoYW5uZWwgR2FpbiIsIDB4MDgsIDApOwotCQlwYXRjaC0+aW5wdXQ9cGF0Y2gtPm91dHB1dD0weDNGMDA7Ci0KLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTEzLCBNVUxUSV9GUk9OVF9MKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE0LCBNVUxUSV9GUk9OVF9SKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE1LCBNVUxUSV9SRUFSX0wpOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTYsIE1VTFRJX1JFQVJfUik7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNywgTVVMVElfQ0VOVEVSKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE4LCBNVUxUSV9MRkUpOwotCi0JCU9QKDQsIDB4MTEzLCAweDQwLCBNVUxUSV9GUk9OVF9MLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTQsIDB4NDAsIE1VTFRJX0ZST05UX1IsIDB4NDQpOwotCQlPUCg0LCAweDExNSwgMHg0MCwgTVVMVElfUkVBUl9MLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTYsIDB4NDAsIE1VTFRJX1JFQVJfUiwgMHg0NCk7Ci0JCU9QKDQsIDB4MTE3LCAweDQwLCBNVUxUSV9DRU5URVIsIDB4NDQpOwotCQlPUCg0LCAweDExOCwgMHg0MCwgTVVMVElfTEZFLCAweDQ0KTsKLQkKLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCS8vUm91dGluZyBwYXRjaCBzdGFydAkKLQkJUk9VVElOR19QQVRDSF9TVEFSVChycGF0Y2gsICJSb3V0aW5nIik7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwMCwgMHgwKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTAxLCAweDEpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMGMsIDB4MTIpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMGUsIDB4MTMpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTMsIE1VTFRJX0ZST05UX0wpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTQsIE1VTFRJX0ZST05UX1IpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTUsIE1VTFRJX1JFQVJfTCk7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNiwgTVVMVElfUkVBUl9SKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE3LCBNVUxUSV9DRU5URVIpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTgsIE1VTFRJX0xGRSk7Ci0KLQkJR0VUX0RZTkFNSUNfR1BSKHJwYXRjaCwgMHgxMDIpOwotCQlHRVRfRFlOQU1JQ19HUFIocnBhdGNoLCAweDEwMyk7Ci0KLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwNCwgMHg4KTsKLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwNSwgMHg5KTsKLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwYSwgMHgyKTsKLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwYiwgMHgzKTsKLQkJCi0JCQotCQkvKiBpbnB1dCBidWZmZXIgKi8KLQkJT1AoNiwgMHgxMDIsIEFDOTdfSU5fTCwgMHg0MCwgMHg0MCk7Ci0JCU9QKDYsIDB4MTAzLCBBQzk3X0lOX1IsIDB4NDAsIDB4NDApOwotCi0KLQkJLyogRGlnaXRhbCBJbiArIFBDTSArIE1VTFRJX0ZST05ULT4gQUM5NyBvdXQgKGZyb250IHNwZWFrZXJzKSovCi0JCU9QKDYsIEFDOTdfRlJPTlRfTCwgMHgxMDAsIDB4MTBjLCAweDExMyk7Ci0KLQkJQ09OTkVDVChNVUxUSV9GUk9OVF9MLCBBQzk3X0ZST05UX0wpOwotCQlDT05ORUNUKFBDTV9JTl9MLCBBQzk3X0ZST05UX0wpOwotCQlDT05ORUNUKFNQRElGX0NEX0wsIEFDOTdfRlJPTlRfTCk7Ci0KLQkJT1AoNiwgQUM5N19GUk9OVF9SLCAweDEwMSwgMHgxMGUsIDB4MTE0KTsKLQotCQlDT05ORUNUKE1VTFRJX0ZST05UX1IsIEFDOTdfRlJPTlRfUik7Ci0JCUNPTk5FQ1QoUENNX0lOX1IsIEFDOTdfRlJPTlRfUik7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfUiwgQUM5N19GUk9OVF9SKTsKLQotCQkvKiBEaWdpdGFsIEluICsgUENNICsgQUM5NyBJbiArIFBDTTEgKyBNVUxUSV9SRUFSIC0tPiBSZWFyIENoYW5uZWwgKi8gCi0JCU9QKDYsIDB4MTA0LCBQQ00xX0lOX0wsIDB4MTAwLCAweDExNSk7Ci0JCU9QKDYsIDB4MTA0LCAweDEwNCwgMHgxMGMsIDB4MTAyKTsKLQotCQlDT05ORUNUKE1VTFRJX1JFQVJfTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoQUM5N19JTl9MLCBBTkFMT0dfUkVBUl9MKTsKLQkJQ09OTkVDVChQQ01fSU5fTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoUENNMV9JTl9MLCBBTkFMT0dfUkVBUl9MKTsKLQotCQlPUCg2LCAweDEwNSwgUENNMV9JTl9SLCAweDEwMSwgMHgxMTYpOwotCQlPUCg2LCAweDEwNSwgMHgxMDUsIDB4MTBlLCAweDEwMyk7Ci0KLQkJQ09OTkVDVChNVUxUSV9SRUFSX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKEFDOTdfSU5fUiwgQU5BTE9HX1JFQVJfUik7Ci0JCUNPTk5FQ1QoUENNX0lOX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKFNQRElGX0NEX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKFBDTTFfSU5fUiwgQU5BTE9HX1JFQVJfUik7Ci0KLQkJLyogRGlnaXRhbCBJbiArIFBDTSArIEFDOTcgSW4gKyBNVUxUSV9GUk9OVCAtLT4gRGlnaXRhbCBvdXQgKi8KLQkJT1AoNiwgMHgxMGIsIDB4MTAwLCAweDEwMiwgMHgxMGMpOwotCQlPUCg2LCAweDEwYiwgMHgxMGIsIDB4MTEzLCAweDQwKTsKLQotCQlDT05ORUNUKE1VTFRJX0ZST05UX0wsIERJR0lUQUxfT1VUX0wpOwotCQlDT05ORUNUKFBDTV9JTl9MLCBESUdJVEFMX09VVF9MKTsKLQkJQ09OTkVDVChBQzk3X0lOX0wsIERJR0lUQUxfT1VUX0wpOwotCQlDT05ORUNUKFNQRElGX0NEX0wsIERJR0lUQUxfT1VUX0wpOwotCi0JCU9QKDYsIDB4MTBhLCAweDEwMSwgMHgxMDMsIDB4MTBlKTsKLQkJT1AoNiwgMHgxMGIsIDB4MTBiLCAweDExNCwgMHg0MCk7Ci0KLQkJQ09OTkVDVChNVUxUSV9GUk9OVF9SLCBESUdJVEFMX09VVF9SKTsKLQkJQ09OTkVDVChQQ01fSU5fUiwgRElHSVRBTF9PVVRfUik7Ci0JCUNPTk5FQ1QoQUM5N19JTl9SLCBESUdJVEFMX09VVF9SKTsKLQkJQ09OTkVDVChTUERJRl9DRF9SLCBESUdJVEFMX09VVF9SKTsKLQotCQkvKiBBQzk3IEluIC0tPiBBREMgUmVjb3JkaW5nIEJ1ZmZlciAqLwotCQlPUCg2LCBBRENfUkVDX0wsIDB4MTAyLCAweDQwLCAweDQwKTsKLQotCQlDT05ORUNUKEFDOTdfSU5fTCwgQURDX1JFQ19MKTsKLQotCQlPUCg2LCBBRENfUkVDX1IsIDB4MTAzLCAweDQwLCAweDQwKTsKLQotCQlDT05ORUNUKEFDOTdfSU5fUiwgQURDX1JFQ19SKTsKLQotCi0JCS8qIGZ4MTI6QW5hbG9nLUNlbnRlciAqLwotCQlPUCg2LCBBTkFMT0dfQ0VOVEVSLCAweDExNywgMHg0MCwgMHg0MCk7Ci0JCUNPTk5FQ1QoTVVMVElfQ0VOVEVSLCBBTkFMT0dfQ0VOVEVSKTsKLQotCQkvKiBmeDExOkFuYWxvZy1MRkUgKi8KLQkJT1AoNiwgQU5BTE9HX0xGRSwgMHgxMTgsIDB4NDAsIDB4NDApOwotCQlDT05ORUNUKE1VTFRJX0xGRSwgQU5BTE9HX0xGRSk7Ci0KLQkJLyogZngxMjpEaWdpdGFsLUNlbnRlciAqLwotCQlPUCg2LCBESUdJVEFMX0NFTlRFUiwgMHgxMTcsIDB4NDAsIDB4NDApOwotCQlDT05ORUNUKE1VTFRJX0NFTlRFUiwgRElHSVRBTF9DRU5URVIpOwotCQkKLQkJLyogZngxMTpBbmFsb2ctTEZFICovCi0JCU9QKDYsIERJR0lUQUxfTEZFLCAweDExOCwgMHg0MCwgMHg0MCk7Ci0JCUNPTk5FQ1QoTVVMVElfTEZFLCBESUdJVEFMX0xGRSk7Ci0JCi0JCVJPVVRJTkdfUEFUQ0hfRU5EKHJwYXRjaCk7Ci0KLQotCQkvLyBSZWFyIHZvbHVtZSBjb250cm9sCQotCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgUmVhciBMIiwgMHg4LCAwKTsKLQkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMDQsIDB4OCk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMTksICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCBBTkFMT0dfUkVBUl9MLCAweDA0MCwgMHgxMDQsIDB4MTE5KTsKLQkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIFJlYXIgUiIsIDB4OSwgMCk7Ci0JCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTA1LCAweDkpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTFhLCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgQU5BTE9HX1JFQVJfUiwgMHgwNDAsIDB4MTA1LCAweDExYSk7Ci0JCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJLy9NYXN0ZXIgdm9sdW1lIGNvbnRyb2wgb24gZnJvbnQtZGlnaXRhbAkKLQkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIE1hc3RlciBMIiwgMHgyLCAxKTsKLQkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMGEsIDB4Mik7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDgsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCBESUdJVEFMX09VVF9MLCAweDA0MCwgMHgxMGEsIDB4MTA4KTsKLQkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgTWFzdGVyIFIiLCAweDMsIDEpOwotCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwYiwgMHgzKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwOSwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIERJR0lUQUxfT1VUX1IsIDB4MDQwLCAweDEwYiwgMHgxMDkpOwotCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCS8qIGRlbGltaXRlciBwYXRjaCAqLwotCQlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7Ci0JCXBhdGNoLT5jb2RlX3NpemUgPSAwOwotCi0JCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBEQkcsIDAsIDApOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZtZ3ItPmxvY2spOwotCi0JLy8gU2V0IHVwIFZvbHVtZSBjb250cm9scywgdHJ5IHRvIGtlZXAgdGhpcyB0aGUgc2FtZSBmb3IgYm90aCBBdWRpZ3kgYW5kIExpdmUKLQotCS8vTWFzdGVyIHZvbHVtZQotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfVk9MVU1FXVswXSA9IDg7Ci0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9WT0xVTUVdWzFdID0gOTsKLQotCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9WT0xVTUVdICYgMHhmZjsKLQlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9WT0xVTUVdID4+IDgpICYgMHhmZjsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgOCwgbGVmdCwgMSA8PCBjYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbik7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA5LCByaWdodCwgMSA8PCBjYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbik7Ci0KLQkvL1JlYXIgdm9sdW1lCi0JbWdyLT5jdHJsX2dwclsgU09VTkRfTUlYRVJfT0dBSU4gXVswXSA9IDB4MTk7Ci0JbWdyLT5jdHJsX2dwclsgU09VTkRfTUlYRVJfT0dBSU4gXVsxXSA9IDB4MWE7Ci0KLQlsZWZ0ID0gcmlnaHQgPSA2NzsKLQljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9PR0FJTl0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OwotCi0JY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSBTT1VORF9NQVNLX09HQUlOOwotCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gU09VTkRfTUFTS19PR0FJTjsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHgxOSwgbGVmdCwgVk9MXzVCSVQpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHgxYSwgcmlnaHQsIFZPTF81QklUKTsKLQotCS8vUENNIFZvbHVtZQotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfUENNXVswXSA9IDY7Ci0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9QQ01dWzFdID0gNzsKLQotCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9QQ01dICYgMHhmZjsKLQlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9QQ01dID4+IDgpICYgMHhmZjsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgNiwgbGVmdCwgVk9MXzVCSVQpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgNywgcmlnaHQsIFZPTF81QklUKTsKLQotCS8vQ0QtRGlnaXRhbCBWb2x1bWUKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX0RJR0lUQUwxXVswXSA9IDB4ZDsKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX0RJR0lUQUwxXVsxXSA9IDB4ZjsKLQotCWxlZnQgPSByaWdodCA9IDY3OwotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX0RJR0lUQUwxXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7IAotCi0JY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSBTT1VORF9NQVNLX0RJR0lUQUwxOwotCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gU09VTkRfTUFTS19ESUdJVEFMMTsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHhkLCBsZWZ0LCBWT0xfNUJJVCk7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweGYsIHJpZ2h0LCBWT0xfNUJJVCk7Ci0KLQotCS8vaGFyZCB3aXJlIHRoZSBhYzk3J3MgcGNtLCBwY20gdm9sdW1lIGlzIGRvbmUgYWJvdmUgdXNpbmcgZHNwIGNvZGUuCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJLy9mb3IgQXVkaWd5LCB3ZSBtdXRlIGl0IGFuZCB1c2UgdGhlIHBoaWxpcHMgNiBjaGFubmVsIERBQyBpbnN0ZWFkCi0JCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDgwMDApOwotCWVsc2UKLQkJLy9Gb3IgdGhlIExpdmUgd2UgaGFyZHdpcmUgaXQgdG8gZnVsbCB2b2x1bWUKLQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4MCk7Ci0KLQkvL3JlbW92ZSBpdCBmcm9tIHRoZSBhYzk3X2NvZGVjJ3MgY29udHJvbAotCWNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyAmPSB+U09VTkRfTUFTS19QQ007Ci0JY2FyZC0+YWM5N19zdGVyZW9fbWl4ZXJzICY9IH5TT1VORF9NQVNLX1BDTTsKLQotCS8vc2V0IElnYWluIHRvIDBkQiBieSBkZWZhdWx0LCBtYXliZSBjb25zaWRlciBoYXJkd2lyaW5nIGl0IGhlcmUuCi0JZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIEFDOTdfUkVDT1JEX0dBSU4sIDB4MDAwMCk7Ci0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfSUdBSU5dID0gMHgxMDE7IAotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGh3X2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgbkNoOwotCXUzMiBwYWdlY291bnQ7IC8qIHRtcCAqLwotCWludCByZXQ7Ci0KLQkvKiBEaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUpOwotCi0JLyogUmVzZXQgcmVjb3JkaW5nIGJ1ZmZlcnMgKi8KLQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0JCQkgICAgTUlDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBNSUNCQSwgMCwKLQkJCSAgICBGWEJTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgRlhCQSwgMCwKLQkJCSAgICBBRENCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIEFEQ0JBLCAwLAotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCS8qIERpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KLQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIElOVEUsIDApOwotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQkJCSAgICBDTElFTCwgMCwKLQkJCSAgICBDTElFSCwgMCwKLQkJCSAgICBTT0xFTCwgMCwKLQkJCSAgICBTT0xFSCwgMCwKLQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwwLAotCQkJCSAgICAweDVlLDB4ZjAwLAotCQkJCSAgICAweDVmLDB4MywKLQkJCQkgICAgVEFHTElTVF9FTkQpOwotCX0KLQotCS8qIEluaXQgZW52ZWxvcGUgZW5naW5lICovCi0JZm9yIChuQ2ggPSAwOyBuQ2ggPCBOVU1fRzsgbkNoKyspIHsKLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCBuQ2gsCi0JCQkJICAgIERDWVNVU1YsIDAsCi0JCQkJICAgIElQLCAwLAotCQkJCSAgICBWVEZULCAweGZmZmYsCi0JCQkJICAgIENWQ0YsIDB4ZmZmZiwKLQkJCQkgICAgUFRSWCwgMCwKLQkJCQkgICAgLy9DUEYsIDAsCi0JCQkJICAgIENDUiwgMCwKLQotCQkJCSAgICBQU1NULCAwLAotCQkJCSAgICBEU0wsIDB4MTAsCi0JCQkJICAgIENDQ0EsIDAsCi0JCQkJICAgIFoxLCAwLAotCQkJCSAgICBaMiwgMCwKLQkJCQkgICAgRlhSVCwgMHhkMDFjMDAwMCwKLQotCQkJCSAgICBBVEtITERNLCAwLAotCQkJCSAgICBEQ1lTVVNNLCAwLAotCQkJCSAgICBJRkFUTiwgMHhmZmZmLAotCQkJCSAgICBQRUZFLCAwLAotCQkJCSAgICBGTU1PRCwgMCwKLQkJCQkgICAgVFJFTUZSUSwgMjQsCS8qIDEgSHogKi8KLQkJCQkgICAgRk0yRlJRMiwgMjQsCS8qIDEgSHogKi8KLQkJCQkgICAgVEVNUEVOViwgMCwKLQotCQkJCSAgICAvKioqIFRoZXNlIGFyZSBsYXN0IHNvIE9GRiBwcmV2ZW50cyB3cml0aW5nICoqKi8KLQkJCQkgICAgTEZPVkFMMiwgMCwKLQkJCQkgICAgTEZPVkFMMSwgMCwKLQkJCQkgICAgQVRLSExEViwgMCwKLQkJCQkgICAgRU5WVk9MLCAwLAotCQkJCSAgICBFTlZWQUwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdMSVNUX0VORCk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIG5DaCwgMCk7Ci0JCS8qCi0JCSAgQXVkaWd5IEZYUlQgaW5pdGlhbGl6YXRpb24KLQkJICByZXZlcnNlZCBlbmcnZCwgbWF5IG5vdCBiZSBhY2N1cmF0ZS4KLQkJICovCi0JCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCxuQ2gsCi0JCQkJCSAgICAweDRjLDB4MCwKLQkJCQkJICAgIDB4NGQsMHgwLAotCQkJCQkgICAgMHg0ZSwweDAsCi0JCQkJCSAgICAweDRmLDB4MCwKLQkJCQkJICAgIEFfRlhSVDEsIDB4M2YzZjNmM2YsCi0JCQkJCSAgICBBX0ZYUlQyLCAweDNmM2YzZjNmLAotCQkJCQkgICAgQV9TRU5EQU1PVU5UUywgMCwKLQkJCQkJICAgIFRBR0xJU1RfRU5EKTsKLQkJfQotCX0KLQkKLQotCS8qCi0JICoqIEluaXQgdG8gMHgwMjEwOTIwNCA6Ci0JICoqIENsb2NrIGFjY3VyYWN5ICAgID0gMCAgICAgKDEwMDBwcG0pCi0JICoqIFNhbXBsZSBSYXRlICAgICAgID0gMiAgICAgKDQ4a0h6KQotCSAqKiBBdWRpbyBDaGFubmVsICAgICA9IDEgICAgIChMZWZ0IG9mIDIpCi0JICoqIFNvdXJjZSBOdW1iZXIgICAgID0gMCAgICAgKFVuc3BlY2lmaWVkKQotCSAqKiBHZW5lcmF0aW9uIFN0YXR1cyA9IDEgICAgIChPcmlnaW5hbCBmb3IgQ2F0IENvZGUgMTIpCi0JICoqIENhdCBDb2RlICAgICAgICAgID0gMTIgICAgKERpZ2l0YWwgU2lnbmFsIE1peGVyKQotCSAqKiBNb2RlICAgICAgICAgICAgICA9IDAgICAgIChNb2RlIDApCi0JICoqIEVtcGhhc2lzICAgICAgICAgID0gMCAgICAgKE5vbmUpCi0JICoqIENQICAgICAgICAgICAgICAgID0gMSAgICAgKENvcHlyaWdodCB1bmFzc2VydGVkKQotCSAqKiBBTiAgICAgICAgICAgICAgICA9IDAgICAgIChEaWdpdGFsIGF1ZGlvKQotCSAqKiBQICAgICAgICAgICAgICAgICA9IDAgICAgIChDb25zdW1lcikKLQkgKi8KLQotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQotCQkJICAgIC8qIFNQRElGMCAqLwotCQkJICAgIFNQQ1MwLCAoU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCAweDAwMjAwMDAwMCB8Ci0JCQkJICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKSwKLQotCQkJICAgIC8qIFNQRElGMSAqLwotCQkJICAgIFNQQ1MxLCAoU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCAweDAwMjAwMDAwMCB8Ci0JCQkJICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKSwKLQotCQkJICAgIC8qIFNQRElGMiAmIFNQRElGMyAqLwotCQkJICAgIFNQQ1MyLCAoU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCAweDAwMjAwMDAwMCB8Ci0JCQkJICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKSwKLQotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kgJiYgKGNhcmQtPmNoaXByZXYgPT0gNCkpIHsKLQkJLyogSGFja3MgZm9yIEFsaWNlMyB0byB3b3JrIGluZGVwZW5kZW50IG9mIGhhUDE2ViBkcml2ZXIgKi8KLQkJdTMyIHRtcDsKLQotCQkvL1NldHVwIFNSQ011bHRpX0kyUyBTYW1wbGluZ1JhdGUKLQkJdG1wID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9TUERJRl9TQU1QTEVSQVRFLCAwKTsKLQkJdG1wICY9IDB4ZmZmZmYxZmY7Ci0JCXRtcCB8PSAoMHgyPDw5KTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfU1BESUZfU0FNUExFUkFURSwgMCwgdG1wKTsKLQotCQkvKiBTZXR1cCBTUkNTZWwgKEVuYWJsZSBTcGRpZixJMlMgU1JDTXVsdGkpICovCi0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyMCwgMHg2MDAwMDApOwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjQsIDB4MTQpOwotCi0JCS8qIFNldHVwIFNSQ011bHRpIElucHV0IEF1ZGlvIEVuYWJsZSAqLwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjAsIDB4NkUwMDAwKTsKLQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDI0LCAweEZGMDBGRjAwKTsKLQl9Ci0KLQlyZXQgPSBmeF9pbml0KGNhcmQpOwkJLyogaW5pdGlhbGl6ZSBlZmZlY3RzIGVuZ2luZSAqLwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JY2FyZC0+dGFua21lbS5zaXplID0gMDsKLQotCWNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSA9IE1BWFBBR0VTICogc2l6ZW9mKHUzMik7Ci0KLQljYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUsICZjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUpOwotCWlmIChjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIgPT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjA7Ci0JfQotCi0JY2FyZC0+c2lsZW50cGFnZS5zaXplID0gRU1VUEFHRVNJWkU7Ci0KLQljYXJkLT5zaWxlbnRwYWdlLmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT5zaWxlbnRwYWdlLnNpemUsICZjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUpOwotCWlmIChjYXJkLT5zaWxlbnRwYWdlLmFkZHIgPT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JZm9yIChwYWdlY291bnQgPSAwOyBwYWdlY291bnQgPCBNQVhQQUdFUzsgcGFnZWNvdW50KyspCi0JCSgodTMyICopIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkcilbcGFnZWNvdW50XSA9IGNwdV90b19sZTMyKCgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSB8IHBhZ2Vjb3VudCk7Ci0KLQkvKiBJbml0IHBhZ2UgdGFibGUgJiB0YW5rIG1lbW9yeSBiYXNlIHJlZ2lzdGVyICovCi0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCQkJICAgIFBUQiwgKHUzMikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlLAotCQkJICAgIFRDQiwgMCwKLQkJCSAgICBUQ0JTLCAwLAotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCWZvciAobkNoID0gMDsgbkNoIDwgTlVNX0c7IG5DaCsrKSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgbkNoLAotCQkJCSAgICBNQVBBLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCi0JCQkJICAgIE1BUEIsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKLQkJCQkgICAgVEFHTElTVF9FTkQpOwotCX0KLQotCS8qIEhva2F5LCBub3cgZW5hYmxlIHRoZSBBVUQgYml0ICovCi0JLyogRW5hYmxlIEF1ZGlvID0gMSAqLwotCS8qIE11dGUgRGlzYWJsZSBBdWRpbyA9IDAgKi8KLQkvKiBMb2NrIFRhbmsgTWVtb3J5ID0gMSAqLwotCS8qIExvY2sgU291bmQgTWVtb3J5ID0gMCAqLwotCS8qIEF1dG8gTXV0ZSA9IDEgKi8KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmIChjYXJkLT5jaGlwcmV2ID09IDQpCi0JCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19BQzNFTkFCTEVfQ0RTUERJRiB8IEhDRkdfQUMzRU5BQkxFX0dQU1BESUYgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUpOwotCQllbHNlCi0JCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFKTsKLQl9IGVsc2UgewotCQlpZiAoY2FyZC0+bW9kZWwgPT0gMHgyMCB8fCBjYXJkLT5tb2RlbCA9PSAweGM0MDAgfHwKLQkJIChjYXJkLT5tb2RlbCA9PSAweDIxICYmIGNhcmQtPmNoaXByZXYgPCA2KSkKLQkgICAgICAgIAllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX0FVVE9NVVRFKTsKLQkJZWxzZQotCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFKTsKLQl9Ci0JLyogRW5hYmxlIFZvbF9DdHJsIGlycXMgKi8KLQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgSU5URV9WT0xJTkNSRU5BQkxFIHwgSU5URV9WT0xERUNSRU5BQkxFIHwgSU5URV9NVVRFRU5BQkxFIHwgSU5URV9GWERTUEVOQUJMRSk7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5ICYmIChjYXJkLT5jaGlwcmV2ID09IDQpKSB7Ci0JCS8qIFVubXV0ZSBBbmFsb2cgbm93LiAgU2V0IEdQTzYgdG8gMSBmb3IgQXBvbGxvLgotCQkgKiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGluaXQgQUxpY2UzIEkyU091dCBiZXlvbmQgNDhLSHouCi0JCSAqIFNvLCBzZXF1ZW5jZSBpcyBpbXBvcnRhbnQuICovCi0JCXUzMiB0bXAgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgQV9JT0NGRyk7Ci0JCXRtcCB8PSAweDAwNDA7Ci0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgQV9JT0NGRywgdG1wKTsKLQl9Ci0JCi0JLyogRklYTUU6IFRPU0xpbmsgZGV0ZWN0aW9uICovCi0JY2FyZC0+aGFzX3Rvc2xpbmsgPSAwOwotCi0JLyogSW5pdGlhbGl6ZSBkaWdpdGFsIHBhc3N0aHJvdWdoIHZhcmlhYmxlcyAqLwotCWNhcmQtPnB0LnBvc19ncHIgPSBjYXJkLT5wdC5pbnRyX2dwciA9IGNhcmQtPnB0LmVuYWJsZV9ncHIgPSAtMTsKLQljYXJkLT5wdC5zZWxlY3RlZCA9IDA7Ci0JY2FyZC0+cHQuc3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKLQljYXJkLT5wdC5zcGNzX3RvX3VzZSA9IDB4MDE7Ci0JY2FyZC0+cHQucGF0Y2hfbmFtZSA9ICJBQzNwYXNzIjsKLQljYXJkLT5wdC5pbnRyX2dwcl9uYW1lID0gImNvdW50IjsKLQljYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUgPSAiZW5hYmxlIjsKLQljYXJkLT5wdC5wb3NfZ3ByX25hbWUgPSAicHRyIjsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+cHQubG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+cHQud2FpdCk7Ci0KLS8qCXRtcCA9IHNibGl2ZV9yZWFkZm4wKGNhcmQsIEhDRkcpOwotCWlmICh0bXAgJiAoSENGR19HUElOUFVUMCB8IEhDRkdfR1BJTlBVVDEpKSB7Ci0JCXNibGl2ZV93cml0ZWZuMChjYXJkLCBIQ0ZHLCB0bXAgfCAweDgwMCk7Ci0KLQkJdWRlbGF5KDUxMik7Ci0KLQkJaWYgKHRtcCAhPSAoc2JsaXZlX3JlYWRmbjAoY2FyZCwgSENGRykgJiB+MHg4MDApKSB7Ci0JCQljYXJkLT5oYXNfdG9zbGluayA9IDE7Ci0JCQlzYmxpdmVfd3JpdGVmbjAoY2FyZCwgSENGRywgdG1wKTsKLQkJfQotCX0KLSovCi0JcmV0dXJuIDA7Ci0KLSAgZXJyMToKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUpOwotICBlcnIwOgotCWZ4X2NsZWFudXAoJmNhcmQtPm1ncik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQkvKiBJbml0IENhcmQgKi8KLQlpZiAoaHdfaW5pdChjYXJkKSA8IDApCi0JCXJldHVybiAtMTsKLQotCXZvaWNlX2luaXQoY2FyZCk7Ci0JdGltZXJfaW5pdChjYXJkKTsKLQlhZGR4bWdyX2luaXQoY2FyZCk7Ci0KLQlEUEQoMiwgIiAgaHcgY29udHJvbCByZWdpc3RlciAtPiAlI3hcbiIsIGVtdTEwazFfcmVhZGZuMChjYXJkLCBIQ0ZHKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IGNoOwotCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBJTlRFLCAwKTsKLQotCS8qKiBTaHV0ZG93biB0aGUgY2hpcCAqKi8KLQlmb3IgKGNoID0gMDsgY2ggPCBOVU1fRzsgY2grKykKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIERDWVNVU1YsIGNoLCAwKTsKLQotCWZvciAoY2ggPSAwOyBjaCA8IE5VTV9HOyBjaCsrKSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgY2gsCi0JCQkJICAgIFZURlQsIDAsCi0JCQkJICAgIENWQ0YsIDAsCi0JCQkJICAgIFBUUlgsIDAsCi0JCQkJICAgIC8vQ1BGLCAwLAotCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIGNoLCAwKTsKLQl9Ci0KLQkvKiBEaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUpOwotCi0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUQiwgMCwKLQotCQkJICAgIC8qIFJlc2V0IHJlY29yZGluZyBidWZmZXJzICovCi0JCQkgICAgTUlDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBNSUNCQSwgMCwKLQkJCSAgICBGWEJTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgRlhCQSwgMCwKLQkJCSAgICBGWFdDLCAwLAotCQkJICAgIEFEQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgQURDQkEsIDAsCi0JCQkgICAgVENCUywgMCwKLQkJCSAgICBUQ0IsIDAsCi0JCQkgICAgREJHLCAweDgwMDAsCi0KLQkJCSAgICAvKiBEaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0ICovCi0JCQkgICAgQ0xJRUwsIDAsCi0JCQkgICAgQ0xJRUgsIDAsCi0JCQkgICAgU09MRUwsIDAsCi0JCQkgICAgU09MRUgsIDAsCi0JCQkgICAgVEFHTElTVF9FTkQpOwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIDAsIEFfREJHLCAgQV9EQkdfU0lOR0xFX1NURVApOwotCi0JcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlKTsKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnNpbGVudHBhZ2Uuc2l6ZSwgY2FyZC0+c2lsZW50cGFnZS5hZGRyLCBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUpOwotCQotCWlmKGNhcmQtPnRhbmttZW0uc2l6ZSAhPSAwKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnRhbmttZW0uc2l6ZSwgY2FyZC0+dGFua21lbS5hZGRyLCBjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUpOwotCi0JLyogcmVsZWFzZSBwYXRjaCBzdG9yYWdlIG1lbW9yeSAqLwotCWZ4X2NsZWFudXAoJmNhcmQtPm1ncik7Ci19Ci0KLS8qIERyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0JdTMyIHN1YnN5c3ZpZDsKLQlpbnQgcmV0OwotCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgRU1VMTBLMV9ETUFfTUFTSykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOWJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKLQotCWlmICgoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogb3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCWNhcmQtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKTsKLQljYXJkLT5sZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApOyAKLQotCWlmIChyZXF1ZXN0X3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCwgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IElPIHNwYWNlIGluIHVzZVxuIik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfcmVnaW9uOwotCX0KLQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBjYXJkKTsKLQotCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKLQljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKLQotCS8qIFJlc2VydmUgSVJRIExpbmUgKi8KLQlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCBlbXUxMGsxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogSVJRIGluIHVzZVxuIik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfaXJxOwotCX0KLQotCWNhcmQtPmNoaXByZXYgPSBwY2lfZGV2LT5yZXZpc2lvbjsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmY2FyZC0+bW9kZWwpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiZW11MTBrMTogJXMgcmV2ICVkIG1vZGVsICUjMDR4IGZvdW5kLCBJTyBhdCAlIzA0bHgtJSMwNGx4LCBJUlEgJWRcbiIsCi0JCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQtPmNoaXByZXYsIGNhcmQtPm1vZGVsLCBjYXJkLT5pb2Jhc2UsCi0JCWNhcmQtPmlvYmFzZSArIGNhcmQtPmxlbmd0aCAtIDEsIGNhcmQtPmlycSk7Ci0KLQlpZiAocGNpX2lkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kpCi0JCWNhcmQtPmlzX2F1ZGlneSA9IDE7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXN2aWQpOwotCWNhcmQtPmlzX2FwcyA9IChzdWJzeXN2aWQgPT0gRU1VX0FQU19TVUJJRCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmY2FyZC0+b3Blbl9zZW0pOwotCWNhcmQtPm9wZW5fbW9kZSA9IDA7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+b3Blbl93YWl0KTsKLQotCXJldCA9IGVtdTEwazFfYXVkaW9faW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgYXVkaW8gZGV2aWNlc1xuIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJfYXVkaW87Ci0gICAgICAgIH0KLQotCXJldCA9IGVtdTEwazFfbWl4ZXJfaW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIEFDOTcgY29kZWNcbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyX21peGVyOwotCX0KLQotCXJldCA9IGVtdTEwazFfbWlkaV9pbml0KGNhcmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIG1pZGkgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfbWlkaTsKLQl9Ci0KLQlyZXQgPSBlbXUxMGsxX2luaXQoY2FyZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl9lbXUxMGsxX2luaXQ7Ci0JfQotCi0JaWYgKGNhcmQtPmlzX2FwcykKLQkJZW11MTBrMV9lY2FyZF9pbml0KGNhcmQpOwotCi0JcmV0ID0gZW11MTBrMV9yZWdpc3Rlcl9kZXZpY2VzKGNhcmQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9yZWdpc3RlcjsKLQotCS8qIHByb2MgZW50cmllcyBtdXN0IGJlIGNyZWF0ZWQgYWZ0ZXIgcmVnaXN0ZXJpbmcgZGV2aWNlcywgYXMKLQkgKiBlbXUxMGsxX2luZm9fcHJvYyBwcmludHMgY2FyZC0+YXVkaW9fZGV2ICZjby4gKi8KLQlyZXQgPSBlbXUxMGsxX3Byb2NfaW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIHByb2MgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycl9wcm9jOwotCX0KLQkKLQlsaXN0X2FkZCgmY2FyZC0+bGlzdCwgJmVtdTEwazFfZGV2cyk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3Byb2M6Ci0JZW11MTBrMV91bnJlZ2lzdGVyX2RldmljZXMoY2FyZCk7Ci0KLWVycl9yZWdpc3RlcjoKLQllbXUxMGsxX2NsZWFudXAoY2FyZCk7Ci0JCi1lcnJfZW11MTBrMV9pbml0OgotCWVtdTEwazFfbWlkaV9jbGVhbnVwKGNhcmQpOwotCi1lcnJfbWlkaToKLQllbXUxMGsxX21peGVyX2NsZWFudXAoY2FyZCk7Ci0KLWVycl9taXhlcjoKLQllbXUxMGsxX2F1ZGlvX2NsZWFudXAoY2FyZCk7Ci0KLWVycl9hdWRpbzoKLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCi1lcnJfaXJxOgotCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoKTsKLQlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7Ci0KLWVycl9yZWdpb246Ci0Ja2ZyZWUoY2FyZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgZW11MTBrMV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLQotCWxpc3RfZGVsKCZjYXJkLT5saXN0KTsKLQotCWVtdTEwazFfdW5yZWdpc3Rlcl9kZXZpY2VzKGNhcmQpOwotCWVtdTEwazFfY2xlYW51cChjYXJkKTsKLQllbXUxMGsxX21pZGlfY2xlYW51cChjYXJkKTsKLQllbXUxMGsxX21peGVyX2NsZWFudXAoY2FyZCk7Ci0JZW11MTBrMV9wcm9jX2NsZWFudXAoY2FyZCk7Ci0JZW11MTBrMV9hdWRpb19jbGVhbnVwKGNhcmQpOwkKLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoKTsKLQlrZnJlZShjYXJkKTsKLQlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIkJlcnRyYW5kIExlZSwgQ2FpIFlpbmcuIChFbWFpbCB0bzogZW11MTBrMS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNyZWF0aXZlIEVNVTEwSzEgUENJIEF1ZGlvIERyaXZlciB2IiBEUklWRVJfVkVSU0lPTiAiXG5Db3B5cmlnaHQgKEMpIDE5OTkgQ3JlYXRpdmUgVGVjaG5vbG9neSBMdGQuIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlbXUxMGsxX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImVtdTEwazEiLAotCS5pZF90YWJsZQk9IGVtdTEwazFfcGNpX3RibCwKLQkucHJvYmUJCT0gZW11MTBrMV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVtdTEwazFfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVtdTEwazFfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPICJDcmVhdGl2ZSBFTVUxMEsxIFBDSSBBdWRpbyBEcml2ZXIsIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiLCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKLQotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlbXUxMGsxX3BjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZW11MTBrMV9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZW11MTBrMV9wY2lfZHJpdmVyKTsKLQotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQoZW11MTBrMV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChlbXUxMGsxX2NsZWFudXBfbW9kdWxlKTsKLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0KLS8qIGluIG1pZGkuYyAqLwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsIAotCQkJCXZvaWQgKCppbnB1dCkoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpLAotCQkJCXZvaWQgKCpvdXRwdXQpKGludCBkZXYpKTsKLWV4dGVybiB2b2lkIGVtdTEwazFfc2VxX21pZGlfY2xvc2UoaW50IGRldik7Ci1leHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKTsKLWV4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpOwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkKGludCBkZXYpOwotZXh0ZXJuIHZvaWQgZW11MTBrMV9zZXFfbWlkaV9raWNrKGludCBkZXYpOwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMoaW50IGRldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9vcGVyYXRpb25zID0KLXsKLQlUSElTX01PRFVMRSwKLQl7IkVNVTEwSzEgTUlESSIsIDAsIDAsIFNORENBUkRfRU1VMTBLMX0sCi0JJnN0ZF9taWRpX3N5bnRoLAotCXswfSwKLQllbXUxMGsxX3NlcV9taWRpX29wZW4sCi0JZW11MTBrMV9zZXFfbWlkaV9jbG9zZSwKLQlOVUxMLAotCWVtdTEwazFfc2VxX21pZGlfb3V0LAotCWVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZCwKLQllbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkLAotCWVtdTEwazFfc2VxX21pZGlfa2ljaywKLQlOVUxMLAotCWVtdTEwazFfc2VxX21pZGlfYnVmZmVyX3N0YXR1cywKLQlOVUxMCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxZTk5MC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWlkaS5jIC0gL2Rldi9taWRpIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJjYXJkbW8uaCIKLSNpbmNsdWRlICJjYXJkbWkuaCIKLSNpbmNsdWRlICJtaWRpLmgiCi0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgotI2VuZGlmCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWlkaV9zcGlubG9jayk7Ci0KLXN0YXRpYyB2b2lkIGluaXRfbWlkaV9oZHIoc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQotewotCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IE1JRElJTl9CVUZMRU47Ci0JbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IDA7Ci0JbWlkaWhkci0+ZmxhZ3MgPSAwOwotfQotCi1zdGF0aWMgaW50IG1pZGlpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2LCBzdHJ1Y3QgbWlkaV9oZHIgKiptaWRpaGRycHRyKQotewotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQotCWlmICgobWlkaWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWluaXRfbWlkaV9oZHIobWlkaWhkcik7Ci0KLQltaWRpaGRyLT5kYXRhID0ga21hbGxvYyhNSURJSU5fQlVGTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1pZGloZHItPmRhdGEpIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LT5jYXJkLT5tcHVpbiwgbWlkaWhkcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCSptaWRpaGRycHRyID0gbWlkaWhkcjsKLQlsaXN0X2FkZF90YWlsKCZtaWRpaGRyLT5saXN0LCAmbWlkaV9kZXYtPm1pZF9oZHJzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0KLQlEUEYoMiwgImVtdTEwazFfbWlkaV9vcGVuKClcbiIpOwotCi0JLyogQ2hlY2sgZm9yIGNvcnJlY3QgZGV2aWNlIHRvIG9wZW4gKi8KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZW11MTBrMV9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11MTBrMV9jYXJkLCBsaXN0KTsKLQotCQlpZiAoY2FyZC0+bWlkaV9kZXYgPT0gbWlub3IpCi0JCQlnb3RvIG1hdGNoOwotCX0KLQotCXJldHVybiAtRU5PREVWOwotCi1tYXRjaDoKLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWlmIChjYXJkLT5zZXFfbWlkaWRldikJLyogY2FyZCBpcyBvcGVuZWQgYnkgc2VxdWVuY2VyICovCi0JCXJldHVybiAtRUJVU1k7Ci0jZW5kaWYKLQotCS8qIFdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLwotCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQl3aGlsZSAoY2FyZC0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgewotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5vcGVuX3dhaXQpOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJfQotCi0JCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQl9Ci0KLQlpZiAoKG1pZGlfZGV2ID0ga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWlkaV9kZXYtPmNhcmQgPSBjYXJkOwotCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPm9XYWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+aVdhaXQpOwotCW1pZGlfZGV2LT5pcmQgPSAwOwotCW1pZGlfZGV2LT5pd3IgPSAwOwotCW1pZGlfZGV2LT5pY250ID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmbWlkaV9kZXYtPm1pZF9oZHJzKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKLQkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyMTsKLQkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyMjsKLQotCQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKLQotCQlpZiAoZW11MTBrMV9tcHVpbl9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJLyogQWRkIHR3byBidWZmZXJzIHRvIHJlY2VpdmUgc3lzZXggYnVmZmVyICovCi0JCWlmIChtaWRpaW5fYWRkX2J1ZmZlcihtaWRpX2RldiwgJm1pZGloZHIxKSA8IDApIHsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJaWYgKG1pZGlpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LCAmbWlkaWhkcjIpIDwgMCkgewotCQkJbGlzdF9kZWwoJm1pZGloZHIxLT5saXN0KTsKLQkJCWtmcmVlKG1pZGloZHIxLT5kYXRhKTsKLQkJCWtmcmVlKG1pZGloZHIxKTsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKLQotCQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKLQotCQlpZiAoZW11MTBrMV9tcHVvdXRfb3BlbihjYXJkLCAmZHNDYXJkTWlkaU9wZW5JbmZvKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQlrZnJlZShtaWRpX2Rldik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIG1pZGlfZGV2OwotCi0JY2FyZC0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSk7Ci0KLQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21pZGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCi0JbG9ja19rZXJuZWwoKTsKLQotCWNhcmQgPSBtaWRpX2Rldi0+Y2FyZDsKLQlEUEYoMiwgImVtdTEwazFfbWlkaV9yZWxlYXNlKClcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCi0JCQl3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIChjYXJkLT5tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkpIHsKLQkJCQlEUEYoNCwgIkNhbm5vdCBjbG9zZSAtIGJ1ZmZlcnMgbm90IGVtcHR5XG4iKTsKLQotCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJm1pZGlfZGV2LT5vV2FpdCk7Ci0KLQkJCX0KLQkJfQotCi0JCWVtdTEwazFfbXB1b3V0X2Nsb3NlKGNhcmQpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQotCQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUQVJURUQpIHsKLQkJCWVtdTEwazFfbXB1aW5fc3RvcChjYXJkKTsKLQkJCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7Ci0JCX0KLQotCQllbXUxMGsxX21wdWluX3Jlc2V0KGNhcmQpOwotCQllbXUxMGsxX21wdWluX2Nsb3NlKGNhcmQpOwotCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmbWlkaV9kZXYtPm1pZF9oZHJzKSkgewotCQkJbWlkaWhkciA9IGxpc3RfZW50cnkobWlkaV9kZXYtPm1pZF9oZHJzLm5leHQsIHN0cnVjdCBtaWRpX2hkciwgbGlzdCk7Ci0KLQkJCWxpc3RfZGVsKG1pZGlfZGV2LT5taWRfaGRycy5uZXh0KTsKLQkJCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQkJa2ZyZWUobWlkaWhkcik7Ci0JCX0KLQl9Ci0KLQlrZnJlZShtaWRpX2Rldik7Ci0KLQltdXRleF9sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0JY2FyZC0+b3Blbl9tb2RlICY9IH4oKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSk7Ci0JbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5vcGVuX3dhaXQpOwotCi0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVtdTEwazFfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JdTE2IGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBEKDQsICJlbXUxMGsxX21pZGlfcmVhZCgpLCBjb3VudCAlI3hcbiIsICh1MzIpIGNvdW50KTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVE9QUEVEKSB7Ci0JCWlmIChlbXUxMGsxX21wdWluX3N0YXJ0KG1pZGlfZGV2LT5jYXJkKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUQVJURUQ7Ci0JfQotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQljbnQgPSBNSURJSU5fQlVGTEVOIC0gbWlkaV9kZXYtPmlyZDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCWlmIChtaWRpX2Rldi0+aWNudCA8IGNudCkKLQkJCWNudCA9IG1pZGlfZGV2LT5pY250OwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY250ID4gY291bnQpCi0JCQljbnQgPSBjb3VudDsKLQotCQlpZiAoY250IDw9IDApIHsKLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLQkJCURQRigyLCAiIEdvIHRvIHNsZWVwLi4uXG4iKTsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmbWlkaV9kZXYtPmlXYWl0KTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIG1pZGlfZGV2LT5pQnVmICsgbWlkaV9kZXYtPmlyZCwgY250KSkgewotCQkJRVJST1IoKTsKLQkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOwotCQl9Ci0KLQkJbWlkaV9kZXYtPmlyZCArPSBjbnQ7Ci0JCW1pZGlfZGV2LT5pcmQgJT0gTUlESUlOX0JVRkxFTjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCW1pZGlfZGV2LT5pY250IC09IGNudDsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJY291bnQgLT0gY250OwotCQlidWZmZXIgKz0gY250OwotCQlyZXQgKz0gY250OwotCi0JCWlmIChtaWRpX2Rldi0+aWNudCA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgZW11MTBrMV9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRCg0LCAiZW11MTBrMV9taWRpX3dyaXRlKCksIGNvdW50PSUjeFxuIiwgKHUzMikgY291bnQpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgobWlkaWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IGNvdW50OwotCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOwotCW1pZGloZHItPmZsYWdzID0gMDsKLQotCW1pZGloZHItPmRhdGEgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1pZGloZHItPmRhdGEpIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihtaWRpaGRyLT5kYXRhLCBidWZmZXIsIGNvdW50KSkgewotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihtaWRpX2Rldi0+Y2FyZCwgbWlkaWhkcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW11MTBrMV9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotCURQRig0LCAiZW11MTBrMV9taWRpX3BvbGwoKSBjYWxsZWRcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQlwb2xsX3dhaXQoZmlsZSwgJm1pZGlfZGV2LT5vV2FpdCwgd2FpdCk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJcG9sbF93YWl0KGZpbGUsICZtaWRpX2Rldi0+aVdhaXQsIHdhaXQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RBUlRFRCkKLQkJCWlmIChtaWRpX2Rldi0+aWNudCA+IDApCi0JCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBtYXNrOwotfQotCi1pbnQgZW11MTBrMV9taWRpX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgbXNnLCB1bnNpZ25lZCBsb25nIHJlZmRhdGEsIHVuc2lnbmVkIGxvbmcgKnBtc2cpCi17Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSByZWZkYXRhOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkciA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKLQotCURQRig0LCAiZW11MTBrMV9taWRpX2NhbGxiYWNrKClcbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBJQ0FSRE1JRElfT1VUTE9OR0RBVEE6Ci0JCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIHBtc2dbMl07Ci0KLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pZGlfZGV2LT5vV2FpdCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIElDQVJETUlESV9JTkxPTkdEQVRBOgotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBwbXNnWzJdOwotCi0JCWZvciAoaSA9IDA7IGkgPCBtaWRpaGRyLT5ieXRlc3JlY29yZGVkOyBpKyspIHsKLQkJCW1pZGlfZGV2LT5pQnVmW21pZGlfZGV2LT5pd3IrK10gPSBtaWRpaGRyLT5kYXRhW2ldOwotCQkJbWlkaV9kZXYtPml3ciAlPSBNSURJSU5fQlVGTEVOOwotCQl9Ci0KLQkJbWlkaV9kZXYtPmljbnQgKz0gbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZDsKLQotCQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUQVJURUQpIHsKLQkJCWluaXRfbWlkaV9oZHIobWlkaWhkcik7Ci0JCQllbXUxMGsxX21wdWluX2FkZF9idWZmZXIobWlkaV9kZXYtPmNhcmQtPm1wdWluLCBtaWRpaGRyKTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWlkaV9kZXYtPmlXYWl0KTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgSUNBUkRNSURJX0lOREFUQToKLQkJewotCQkJdTggKnBCdWYgPSAodTggKikgJiBwbXNnWzFdOwotCQkJdTE2IGJ5dGVzdmFsaWQgPSBwbXNnWzJdOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXN2YWxpZDsgaSsrKSB7Ci0JCQkJbWlkaV9kZXYtPmlCdWZbbWlkaV9kZXYtPml3cisrXSA9IHBCdWZbaV07Ci0JCQkJbWlkaV9kZXYtPml3ciAlPSBNSURJSU5fQlVGTEVOOwotCQkJfQotCi0JCQltaWRpX2Rldi0+aWNudCArPSBieXRlc3ZhbGlkOwotCQl9Ci0KLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaWRpX2Rldi0+aVdhaXQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6CQkvKiBVbmtub3duIG1lc3NhZ2UgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE1JREkgZmlsZSBvcGVyYXRpb25zICovCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkucmVhZAkJPSBlbXUxMGsxX21pZGlfcmVhZCwKLQkud3JpdGUJCT0gZW11MTBrMV9taWRpX3dyaXRlLAotCS5wb2xsCQk9IGVtdTEwazFfbWlkaV9wb2xsLAotCS5vcGVuCQk9IGVtdTEwazFfbWlkaV9vcGVuLAotCS5yZWxlYXNlCT0gZW11MTBrMV9taWRpX3JlbGVhc2UsCi19OwotCi0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCi0vKiBmdW5jdGlvbnMgdXNlZCBmb3Igc2VxdWVuY2VyIGFjY2VzcyAqLwotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLAotCQkJCXZvaWQgKCppbnB1dCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSksCi0JCQkJdm9pZCAoKm91dHB1dCkgKGludCBkZXYpKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IG1pZGlfb3BlbmluZm8gZHNDYXJkTWlkaU9wZW5JbmZvOwotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2OwotCi0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0KLQlpZiAoY2FyZC0+b3Blbl9tb2RlKQkJLyogY2FyZCBpcyBvcGVuZWQgbmF0aXZlICovCi0JCXJldHVybiAtRUJVU1k7Ci0JCQkKLQlEUEYoMiwgImVtdTEwazFfc2VxX21pZGlfb3BlbigpXG4iKTsKLQkKLQlpZiAoKG1pZGlfZGV2ID0ga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWlkaV9kZXYtPmNhcmQgPSBjYXJkOwotCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPm9XYWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+aVdhaXQpOwotCW1pZGlfZGV2LT5pcmQgPSAwOwotCW1pZGlfZGV2LT5pd3IgPSAwOwotCW1pZGlfZGV2LT5pY250ID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmbWlkaV9kZXYtPm1pZF9oZHJzKTsKLQotCWRzQ2FyZE1pZGlPcGVuSW5mby5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGlfZGV2OwotCi0JaWYgKGVtdTEwazFfbXB1b3V0X29wZW4oY2FyZCwgJmRzQ2FyZE1pZGlPcGVuSW5mbykgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWNhcmQtPnNlcV9taWRpZGV2ID0gbWlkaV9kZXY7Ci0JCQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfc2VxX21pZGlfY2xvc2UoaW50IGRldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCi0JRFBGKDIsICJlbXUxMGsxX3NlcV9taWRpX2Nsb3NlKClcbiIpOwotCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCi0JCXJldHVybjsKLQotCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKLQllbXUxMGsxX21wdW91dF9jbG9zZShjYXJkKTsKLQotCWtmcmVlKGNhcmQtPnNlcV9taWRpZGV2KTsKLQljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7Ci19Ci0KLWludCBlbXUxMGsxX3NlcV9taWRpX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0KLQlpZiAoKG1pZGloZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9oZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltaWRpaGRyLT5idWZmZXJsZW5ndGggPSAxOwotCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOwotCW1pZGloZHItPmZsYWdzID0gMDsKLQotCW1pZGloZHItPmRhdGEgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwotCWlmICghbWlkaWhkci0+ZGF0YSkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JKihtaWRpaGRyLT5kYXRhKSA9IG1pZGlfYnl0ZTsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoY2FyZCwgbWlkaWhkcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KQotewotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZChpbnQgZGV2KQotewotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfc2VxX21pZGlfa2ljayhpbnQgZGV2KQotewotfQotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9idWZmZXJfc3RhdHVzKGludCBkZXYpCi17Ci0JaW50IGNvdW50OwotCXN0cnVjdCBtaWRpX3F1ZXVlICpxdWV1ZTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCi0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb3VudCA9IDA7Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0JcXVldWUgPSBjYXJkLT5tcHVvdXQtPmZpcnN0bWlkaXE7Ci0KLQl3aGlsZSAocXVldWUgIT0gTlVMTCkgewotCQljb3VudCsrOwotCQlpZiAocXVldWUgPT0gY2FyZC0+bXB1b3V0LT5sYXN0bWlkaXEpCi0JCQlicmVhazsKLQotCQlxdWV1ZSA9IHF1ZXVlLT5uZXh0OwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaCBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1OWVjOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIG1pZGkuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLyAKLQotI2lmbmRlZiBfTUlESV9ICi0jZGVmaW5lIF9NSURJX0gKLQotI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKLSNkZWZpbmUgRk1PREVfTUlESV9SRUFEICAoRk1PREVfUkVBRCA8PCBGTU9ERV9NSURJX1NISUZUKQotI2RlZmluZSBGTU9ERV9NSURJX1dSSVRFIChGTU9ERV9XUklURSA8PCBGTU9ERV9NSURJX1NISUZUKQotCi0jZGVmaW5lIE1JRElJTl9TVEFURV9TVEFSVEVEIDB4MDAwMDAwMDEKLSNkZWZpbmUgTUlESUlOX1NUQVRFX1NUT1BQRUQgMHgwMDAwMDAwMgotCi0jZGVmaW5lIE1JRElJTl9CVUZMRU4gMTAyNAotCi1zdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQl1MzIgbWlzdGF0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvV2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBpV2FpdDsKLQlzOCBpQnVmW01JRElJTl9CVUZMRU5dOwotCXUxNiBpcmQsIGl3ciwgaWNudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG1pZF9oZHJzOwotfTsKLQotLyogdW5jb21tZW50IG5leHQgbGluZSB0byB1c2UgbWlkaSBwb3J0IG9uIEF1ZGlneSBkcml2ZSAqLwotLy8jZGVmaW5lIFVTRV9BVURJR1lfRFJJVkVfTUlESQotCi0jaWZkZWYgVVNFX0FVRElHWV9EUklWRV9NSURJCi0jZGVmaW5lIEFfTVVEQVRBCUFfTVVEQVRBMgotI2RlZmluZSBBX01VQ01ECQlBX01VQ01EMgotI2RlZmluZSBBX01VU1RBVAlBX01VQ01EMgotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWQlBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTIKLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWQlBX0lQUl9NSURJUkVDVkJVRkVNUFRZMgotI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFCUFfSU5URV9NSURJVFhFTkFCTEUyCi0jZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUJQV9JTlRFX01JRElSWEVOQUJMRTIKLSNlbHNlCi0jZGVmaW5lIEFfTVVEQVRBCUFfTVVEQVRBMQotI2RlZmluZSBBX01VQ01ECQlBX01VQ01EMQotI2RlZmluZSBBX01VU1RBVAlBX01VQ01EMQotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWQlBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTEKLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWQlBX0lQUl9NSURJUkVDVkJVRkVNUFRZMQotI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFCUFfSU5URV9NSURJVFhFTkFCTEUxCi0jZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUJQV9JTlRFX01JRElSWEVOQUJMRTEKLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBfTUlESV9IICovCi0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzM4MDVmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWl4ZXIuYyAtIC9kZXYvbWl4ZXIgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHN0dWZmCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0KLQotc3RhdGljIGNvbnN0IHUzMiBiYXNzX3RhYmxlWzQxXVs1XSA9IHsKLQl7IDB4M2U0Zjg0NGYsIDB4ODRlZDRjYzMsIDB4M2NjNjk5MjcsIDB4N2IwMzU1M2EsIDB4YzRkYTg0ODYgfSwKLQl7IDB4M2U2OWExN2EsIDB4ODRjMjgwZmIsIDB4M2NkNzdjZDQsIDB4N2IyZjJhNmYsIDB4YzRiMDhkMWQgfSwKLQl7IDB4M2U4MmZmNDIsIDB4ODQ5OTkxZDUsIDB4M2NlNzQ2NmIsIDB4N2I1OTE3YzYsIDB4YzQ4ODYzZWUgfSwKLQl7IDB4M2U5YmFiM2MsIDB4ODQ3MjY3ZjAsIDB4M2NmNWZmZTgsIDB4N2I4MTM1NjAsIDB4YzQ2MWYyMmMgfSwKLQl7IDB4M2ViM2IyNzUsIDB4ODQ0Y2VkMjksIDB4M2QwM2IyOTUsIDB4N2JhNzlhMWMsIDB4YzQzZDIyM2IgfSwKLQl7IDB4M2VjYjIxNzQsIDB4ODQyOTBjOGIsIDB4M2QxMDY3MTQsIDB4N2JjYzViYTMsIDB4YzQxOWRmYTUgfSwKLQl7IDB4M2VlMjA0NGIsIDB4ODQwNmIyNDQsIDB4M2QxYzI1NjEsIDB4N2JlZjhlNzcsIDB4YzNmODE3MGYgfSwKLQl7IDB4M2VmODY2OTgsIDB4ODNlNWNiOTYsIDB4M2QyNmY0ZDgsIDB4N2MxMTQ2MDAsIDB4YzNkN2I2MjUgfSwKLQl7IDB4M2YwZTUzOTAsIDB4ODNjNjQ2YzksIDB4M2QzMGRjMzksIDB4N2MzMTk0OTgsIDB4YzNiOGFiOTcgfSwKLQl7IDB4M2YyM2Q2MGIsIDB4ODNhODEzMjEsIDB4M2QzOWUxYWYsIDB4N2M1MDhiOWMsIDB4YzM5YWU3MDQgfSwKLQl7IDB4M2YzOGY4ODQsIDB4ODM4YjIwZDIsIDB4M2Q0MjBhZDIsIDB4N2M2ZTNiNzUsIDB4YzM3ZTU4ZjEgfSwKLQl7IDB4M2Y0ZGM1MmMsIDB4ODM2ZjYwZWYsIDB4M2Q0OTVjYWIsIDB4N2M4YWIzYTYsIDB4YzM2MmYyYmUgfSwKLQl7IDB4M2Y2MjQ1ZTgsIDB4ODM1NGM1NjUsIDB4M2Q0ZmRiYjgsIDB4N2NhNjAyZDYsIDB4YzM0OGE2OWIgfSwKLQl7IDB4M2Y3Njg0NWYsIDB4ODMzYjQwZWMsIDB4M2Q1NThiZjAsIDB4N2NjMDM2ZGYsIDB4YzMyZjY3N2MgfSwKLQl7IDB4M2Y4YThhMDMsIDB4ODMyMmM2ZmIsIDB4M2Q1YTcwYzQsIDB4N2NkOTVjZDcsIDB4YzMxNzI5MGIgfSwKLQl7IDB4M2Y5ZTYwMTQsIDB4ODMwYjRiYzMsIDB4M2Q1ZThkMjUsIDB4N2NmMTgxMWEsIDB4YzJmZmRmYTUgfSwKLQl7IDB4M2ZiMjBmYWUsIDB4ODJmNGM0MjAsIDB4M2Q2MWUzN2YsIDB4N2QwOGFmNTYsIDB4YzJlOTgwNGEgfSwKLQl7IDB4M2ZjNWExY2MsIDB4ODJkZjI1OTIsIDB4M2Q2NDc1YzMsIDB4N2QxZWYyOTQsIDB4YzJkNDAwOTYgfSwKLQl7IDB4M2ZkOTFmNTUsIDB4ODJjYTY2MzIsIDB4M2Q2NjQ1NjQsIDB4N2QzNDU1NDEsIDB4YzJiZjU2YjkgfSwKLQl7IDB4M2ZlYzkxMjAsIDB4ODJiNjdjYWMsIDB4M2Q2NzUzNTYsIDB4N2Q0OGUxMzgsIDB4YzJhYjc5NmUgfSwKLQl7IDB4NDAwMDAwMDAsIDB4ODJhMzYwMzcsIDB4M2Q2N2EwMTIsIDB4N2Q1YzlmYzksIDB4YzI5ODVmZWUgfSwKLQl7IDB4NDAxMzc0YzcsIDB4ODI5MTA4OGEsIDB4M2Q2NzJiOTMsIDB4N2Q2Zjk5YzMsIDB4YzI4NjAxZjIgfSwKLQl7IDB4NDAyNmY4NTcsIDB4ODI3ZjZkZDcsIDB4M2Q2NWY1NTksIDB4N2Q4MWQ3N2MsIDB4YzI3NDU3YTMgfSwKLQl7IDB4NDAzYTkzOWYsIDB4ODI2ZTg4YzUsIDB4M2Q2M2ZjNjMsIDB4N2Q5MzYwZDQsIDB4YzI2MzU5OTYgfSwKLQl7IDB4NDA0ZTRmYWYsIDB4ODI1ZTUyNjYsIDB4M2Q2MTNmMzIsIDB4N2RhNDNkNDIsIDB4YzI1MzAwYzYgfSwKLQl7IDB4NDA2MjM1YmEsIDB4ODI0ZWM0MzQsIDB4M2Q1ZGJiYzMsIDB4N2RiNDczZDcsIDB4YzI0MzQ2OGUgfSwKLQl7IDB4NDA3NjRmMWYsIDB4ODIzZmQ4MGMsIDB4M2Q1OTZmOGYsIDB4N2RjNDBiNDQsIDB4YzIzNDI0YTIgfSwKLQl7IDB4NDA4YWE1NzYsIDB4ODIzMTg4MjQsIDB4M2Q1NDU3ODcsIDB4N2RkMzA5ZTIsIDB4YzIyNTk1MDkgfSwKLQl7IDB4NDA5ZjQyOTYsIDB4ODIyM2NmMGIsIDB4M2Q0ZTcwMTIsIDB4N2RlMTc1YjUsIDB4YzIxNzkyMTggfSwKLQl7IDB4NDBiNDMwYTAsIDB4ODIxNmE3YTEsIDB4M2Q0N2I1MDUsIDB4N2RlZjU0NzUsIDB4YzIwYTE2NzAgfSwKLQl7IDB4NDBjOTdhMGEsIDB4ODIwYTBkMTIsIDB4M2Q0MDIxYTEsIDB4N2RmY2FiOGQsIDB4YzFmZDFjZjUgfSwKLQl7IDB4NDBkZjI5YTYsIDB4ODFmZGZhZDYsIDB4M2QzN2IwOGQsIDB4N2UwOTgwMjgsIDB4YzFmMGEwY2EgfSwKLQl7IDB4NDBmNTRhYjEsIDB4ODFmMjZjYTksIDB4M2QyZTViZDEsIDB4N2UxNWQ3MmIsIDB4YzFlNDlkNTIgfSwKLQl7IDB4NDEwYmU4ZGEsIDB4ODFlNzVlODksIDB4M2QyNDFjY2UsIDB4N2UyMWI1NDQsIDB4YzFkOTBlMjQgfSwKLQl7IDB4NDEyMzEwNTEsIDB4ODFkY2NjYjMsIDB4M2QxOGVjMzcsIDB4N2UyZDFlZTYsIDB4YzFjZGVmMTAgfSwKLQl7IDB4NDEzYWNkZDAsIDB4ODFkMmIzOWUsIDB4M2QwY2MyMGEsIDB4N2UzODE4NGUsIDB4YzFjMzNjMTMgfSwKLQl7IDB4NDE1MzJlYTcsIDB4ODFjOTBmZmIsIDB4M2NmZjk1ODUsIDB4N2U0MmE1OGIsIDB4YzFiOGYxNWEgfSwKLQl7IDB4NDE2YzQwY2QsIDB4ODFiZmRlYjIsIDB4M2NmMTVkMjEsIDB4N2U0Y2NhN2MsIDB4YzFhZjBiM2YgfSwKLQl7IDB4NDE4NjEyZWEsIDB4ODFiNzFjZGMsIDB4M2NlMjBlODUsIDB4N2U1NjhhZDMsIDB4YzFhNTg2NDAgfSwKLQl7IDB4NDFhMGI0NjUsIDB4ODFhZWM3YzUsIDB4M2NkMTllN2MsIDB4N2U1ZmVhMWUsIDB4YzE5YzVmMDMgfSwKLQl7IDB4NDFiYzM1NzMsIDB4ODFhNmRjZWEsIDB4M2NjMDAwZTksIDB4N2U2OGViYzIsIDB4YzE5MzkyNTAgfQotfTsKLQotc3RhdGljIGNvbnN0IHUzMiB0cmVibGVfdGFibGVbNDFdWzVdID0gewotCXsgMHgwMTI1Y2JhOSwgMHhmZWQ1ZGViZCwgMHgwMDU5OWI2YywgMHgwZDI1MDZkYSwgMHhmYTg1YjM1NCB9LAotCXsgMHgwMTQyZjY3ZSwgMHhmZWIwMzE2MywgMHgwMDY2Y2QwZiwgMHgwZDE0YzY5ZCwgMHhmYTkxNDQ3MyB9LAotCXsgMHgwMTYzMjhiZCwgMHhmZTg2MDE1OCwgMHgwMDc1YjdmMiwgMHgwZDAzZWIyNywgMHhmYTlkMzJkMiB9LAotCXsgMHgwMTg2YjQzOCwgMHhmZTU2Yzk4MiwgMHgwMDg2OTIzNCwgMHgwY2YyNzA0OCwgMHhmYWE5N2ZjYSB9LAotCXsgMHgwMWFkZjM1OCwgMHhmZTIxZjVmZSwgMHgwMDk5OTg0MiwgMHgwY2UwNTFjMiwgMHhmYWI2MmNhNSB9LAotCXsgMHgwMWQ5NDlmYSwgMHhmZGU2ZTI4NywgMHgwMGFmMGQ4ZCwgMHgwY2NkOGI0YSwgMHhmYWMzM2FhNyB9LAotCXsgMHgwMjA5MjY2OSwgMHhmZGE0ZDhiZiwgMHgwMGM3M2Q0YywgMHgwY2JhMTg4NCwgMHhmYWQwYWIwNyB9LAotCXsgMHgwMjNlMDI2OCwgMHhmZDViMGU0YSwgMHgwMGUyN2I1NCwgMHgwY2E1ZjUwOSwgMHhmYWRlN2VmMiB9LAotCXsgMHgwMjc4NjQ1YywgMHhmZDA4YTJiMCwgMHgwMTAxMjUwOSwgMHgwYzkxMWM2MywgMHhmYWVjYjc4OCB9LAotCXsgMHgwMmI4ZTA5MSwgMHhmY2FjOWQxYSwgMHgwMTIzYTI2MiwgMHgwYzdiOGExNCwgMHhmYWZiNTVkZiB9LAotCXsgMHgwMzAwMWE5YSwgMHhmYzQ1ZTljZSwgMHgwMTRhNjcwOSwgMHgwYzY1Mzk4ZiwgMHhmYjBhNWFmZiB9LAotCXsgMHgwMzRlYzZkNywgMHhmYmQzNTc2YiwgMHgwMTc1ZjM5NywgMHgwYzRlMjY0MywgMHhmYjE5YzdlNCB9LAotCXsgMHgwM2E1YWMxNSwgMHhmYjUzOTNlZSwgMHgwMWE2ZDZlZCwgMHgwYzM2NGI5NCwgMHhmYjI5OWQ3YyB9LAotCXsgMHgwNDA1YTU2MiwgMHhmYWM1Mjk2OCwgMHgwMWRkYWZhZSwgMHgwYzFkYTRlMiwgMHhmYjM5ZGNhNSB9LAotCXsgMHgwNDZmYTNmZSwgMHhmYTI2N2E2NiwgMHgwMjFiMmRkZCwgMHgwYzA0MmQ4ZCwgMHhmYjRhODYzMSB9LAotCXsgMHgwNGU0YjE3ZiwgMHhmOTc1YmUwZiwgMHgwMjYwMTQ5ZiwgMHgwYmU5ZTBmMiwgMHhmYjViOWFlMCB9LAotCXsgMHgwNTY1ZjIyMCwgMHhmOGIwZmJlNSwgMHgwMmFkM2MyOSwgMHgwYmNlYmE3MywgMHhmYjZkMWI2MCB9LAotCXsgMHgwNWY0YTc0NSwgMHhmN2Q2MDcyMiwgMHgwMzAzOTNkNCwgMHgwYmIyYjU3OCwgMHhmYjdmMDg0ZCB9LAotCXsgMHgwNjkyMzIzNiwgMHhmNmUyNzliZCwgMHgwMzY0MjQ2NSwgMHgwYjk1Y2Q3NSwgMHhmYjkxNjIzMyB9LAotCXsgMHgwNzQwMTcxMywgMHhmNWQzYWVmOSwgMHgwM2QwMTI4MywgMHgwYjc3ZmRlZCwgMHhmYmE0Mjk4NCB9LAotCXsgMHgwODAwMDAwMCwgMHhmNGE2YmQ4OCwgMHgwNDQ4YTE2MSwgMHgwYjU5NDI3OCwgMHhmYmI3NWU5ZiB9LAotCXsgMHgwOGQzYzA5NywgMHhmMzU4NzEzMSwgMHgwNGNmMzVhNCwgMHgwYjM5OTZjOSwgMHhmYmNiMDFjYiB9LAotCXsgMHgwOWJkNTlhMiwgMHhmMWU1NDNmOSwgMHgwNTY1NTg4MCwgMHgwYjE4ZjZiMiwgMHhmYmRmMTMzMyB9LAotCXsgMHgwYWJlZmQwZiwgMHhmMDQ5NTZjYSwgMHgwNjBjYmIxMiwgMHgwYWY3NWUyYywgMHhmYmYzOTJlOCB9LAotCXsgMHgwYmRiMTIzZSwgMHhlZTgwNjk4NCwgMHgwNmM3MzlmZSwgMHgwYWQ0Yzk2MiwgMHhmYzA4ODBkZCB9LAotCXsgMHgwZDE0M2E5NCwgMHhlYzg1ZDI4NywgMHgwNzk2ZTE1MCwgMHgwYWIxMzRiMCwgMHhmYzFkZGNlNSB9LAotCXsgMHgwZTZkNTY2NCwgMHhlYTU0NzU5OCwgMHgwODdkZjBhMCwgMHgwYThjOWNiNiwgMHhmYzMzYTZhZCB9LAotCXsgMHgwZmU5OGEyYSwgMHhlN2U2YmEzNSwgMHgwOTdlZGY4MywgMHgwYTY2ZmU1YiwgMHhmYzQ5ZGRjMiB9LAotCXsgMHgxMThjNDQyMSwgMHhlNTM2ODEzYSwgMHgwYTljNjI0OCwgMHgwYTQwNTZkNywgMHhmYzYwODE4NSB9LAotCXsgMHgxMzU5NDIyZSwgMHhlMjNkMTllYiwgMHgwYmQ5NmVmYiwgMHgwYTE4YTNiZiwgMHhmYzc3OTEyYyB9LAotCXsgMHgxNTU0OTgyYiwgMHhkZWYzMzY0NSwgMHgwZDM5NDJiZCwgMHgwOWVmZTMxMiwgMHhmYzhmMGJjMSB9LAotCXsgMHgxNzgyYjY4YSwgMHhkYjUwZGViMSwgMHgwZWJmNjc2ZCwgMHgwOWM2MTMzZiwgMHhmY2E2ZjAxOSB9LAotCXsgMHgxOWU4NzE1ZCwgMHhkNzRkNjRmZCwgMHgxMDZmYjk5OSwgMHgwOTliMzMzNywgMHhmY2JmM2NkNiB9LAotCXsgMHgxYzhiMDdiOCwgMHhkMmRmNTZhYiwgMHgxMjRlNmVjOCwgMHgwOTZmNDI3NCwgMHhmY2Q3ZjA2MCB9LAotCXsgMHgxZjcwMmI2ZCwgMHhjZGZjNmU5MiwgMHgxNDYwMWMxMCwgMHgwOTQyNDEwYiwgMHhmY2YxMDhlNSB9LAotCXsgMHgyMjllMDkzMywgMHhjODk5ODVjZCwgMHgxNmE5YmNmYSwgMHgwOTE0MmZiNSwgMHhmZDBhODQ1MSB9LAotCXsgMHgyNjFiNTExOCwgMHhjMmFhODQwOSwgMHgxOTMwYmFiNiwgMHgwOGU1MGZkYywgMHhmZDI0NjA0ZCB9LAotCXsgMHgyOWVmM2Y1ZCwgMHhiYzIyNGYyOCwgMHgxYmZhZjM5NiwgMHgwOGI0ZTNhYSwgMHhmZDNlOWEzYiB9LAotCXsgMHgyZTIxYTU5YiwgMHhiNGYyYmE0NiwgMHgxZjBlYzJkNiwgMHgwODgzYWUxNSwgMHhmZDU5MmYzMyB9LAotCXsgMHgzMmJhZjQ0YiwgMHhhZDBjNzQyOSwgMHgyMjczMDhhMywgMHgwODUxNzJlYiwgMHhmZDc0MWJmZCB9LAotCXsgMHgzN2M0NDQ4YiwgMHhhNDVlZjUxZCwgMHgyNjJmMzI2NywgMHgwODFlMzZkYywgMHhmZDhmNWQxNCB9Ci19OwotCi0KLXN0YXRpYyB2b2lkIHNldF9iYXNzKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBsLCBpbnQgcikKLXsKLQlpbnQgaTsKLQotCWwgPSAobCAqIDQwICsgNTApIC8gMTAwOwotCXIgPSAociAqIDQwICsgNTApIC8gMTAwOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgY2FyZC0+bWdyLmN0cmxfZ3ByW1NPVU5EX01JWEVSX0JBU1NdWzBdICsgaSwgMCwgYmFzc190YWJsZVtsXVtpXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF90cmVibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGwsIGludCByKQotewotCWludCBpOwotCi0JbCA9IChsICogNDAgKyA1MCkgLyAxMDA7Ci0JciA9IChyICogNDAgKyA1MCkgLyAxMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBjYXJkLT5tZ3IuY3RybF9ncHJbU09VTkRfTUlYRVJfVFJFQkxFXVswXSArIGkgLCAwLCB0cmVibGVfdGFibGVbbF1baV0pOwotfQotCi1jb25zdCBjaGFyIHZvbHVtZV9wYXJhbXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXT0gewotLyogVXNlZCBieSB0aGUgYWM5NyBkcml2ZXIgKi8KLQlbU09VTkRfTUlYRVJfVk9MVU1FXQk9CVZPTF82QklULAotCVtTT1VORF9NSVhFUl9CQVNTXQk9CVZPTF80QklULAotCVtTT1VORF9NSVhFUl9UUkVCTEVdCT0JVk9MXzRCSVQsCi0JW1NPVU5EX01JWEVSX1BDTV0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfU1BFQUtFUl0JPQlWT0xfNEJJVCwKLQlbU09VTkRfTUlYRVJfTElORV0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfTUlDXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9DRF0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfQUxUUENNXQk9CVZPTF82QklULAotCVtTT1VORF9NSVhFUl9JR0FJTl0JPQlWT0xfNEJJVCwKLQlbU09VTkRfTUlYRVJfTElORTFdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1BIT05FSU5dCT0gCVZPTF81QklULAotCVtTT1VORF9NSVhFUl9QSE9ORU9VVF0JPSAJVk9MXzZCSVQsCi0JW1NPVU5EX01JWEVSX1ZJREVPXQk9CVZPTF81QklULAotLyogTm90IHVzZWQgYnkgdGhlIGFjOTcgZHJpdmVyICovCi0JW1NPVU5EX01JWEVSX1NZTlRIXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9JTUlYXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9SRUNMRVZdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX09HQUlOXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9MSU5FMl0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfTElORTNdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0RJR0lUQUwxXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9ESUdJVEFMMl0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfRElHSVRBTDNdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1JBRElPXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9NT05JVE9SXQk9CVZPTF81QklUCi19OwotCi0vKiBNaXhlciBmaWxlIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBpbnQgZW11MTBrMV9wcml2YXRlX21peGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsICpjdGw7Ci0Jc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7Ci0JdTMyIHNpemUsIHBhZ2U7Ci0JaW50IGFkZHIsIHNpemVfcmVnLCBpLCByZXQ7Ci0JdW5zaWduZWQgaW50IGlkLCBjaDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQotCXN3aXRjaCAoY21kKSB7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgotCi0JCWN0bCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjdGwgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjdGwsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKSB7Ci0JCQlrZnJlZShjdGwpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlyZXQgPSAwOwotCQlzd2l0Y2ggKGN0bC0+Y21kKSB7Ci0jaWZkZWYgREJHRU1VCi0JCWNhc2UgQ01EX1dSSVRFRk4wOgotCQkJZW11MTBrMV93cml0ZWZuMF8yKGNhcmQsIGN0bC0+dmFsWzBdLCBjdGwtPnZhbFsxXSwgY3RsLT52YWxbMl0pOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSBDTURfV1JJVEVQVFI6Ci0jaWZkZWYgREJHRU1VCi0JCQlpZiAoY3RsLT52YWxbMV0gPj0gMHg0MCB8fCBjdGwtPnZhbFswXSA+PSAweDEwMDApIHsKLSNlbHNlCi0JCQlpZiAoY3RsLT52YWxbMV0gPj0gMHg0MCB8fCBjdGwtPnZhbFswXSA+PSAweDEwMDAgfHwgKChjdGwtPnZhbFswXSA8IDB4MTAwICkgJiYKLQkJICAgIC8vQW55IHJlZ2lzdGVyIGFsbG93ZWQgcmF3IGFjY2VzcyBnb2VzIGhlcmU6Ci0JCQkJICAgICAoY3RsLT52YWxbMF0gIT0gQV9TUERJRl9TQU1QTEVSQVRFKSAmJiAoY3RsLT52YWxbMF0gIT0gQV9EQkcpCi0JCQkpCi0JCQkJKSB7Ci0jZW5kaWYKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGN0bC0+dmFsWzBdLCBjdGwtPnZhbFsxXSwgY3RsLT52YWxbMl0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfUkVBREZOMDoKLQkJCWN0bC0+dmFsWzJdID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIGN0bC0+dmFsWzBdKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1JFQURQVFI6Ci0JCQlpZiAoY3RsLT52YWxbMV0gPj0gMHg0MCB8fCAoY3RsLT52YWxbMF0gJiAweDdmZikgPiAweGZmKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKChjdGwtPnZhbFswXSAmIDB4N2ZmKSA+IDB4M2YpCi0JCQkJY3RsLT52YWxbMV0gPSAweDAwOwotCi0JCQljdGwtPnZhbFsyXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIGN0bC0+dmFsWzBdLCBjdGwtPnZhbFsxXSk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRSRUNTUkM6Ci0JCQlzd2l0Y2ggKGN0bC0+dmFsWzBdKSB7Ci0JCQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJCQlpZiAoY2FyZC0+aXNfYXBzKSB7Ci0JCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0FDOTc7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfTUlDOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfRlg7Ci0JCQkJY2FyZC0+d2F2ZWluLmZ4d2MgPSBjdGwtPnZhbFsxXSAmIDB4ZmZmZjsKLQotCQkJCWlmICghY2FyZC0+d2F2ZWluLmZ4d2MpCi0JCQkJCXJldCA9IC1FSU5WQUw7Ci0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfR0VUUkVDU1JDOgotCQkJY3RsLT52YWxbMF0gPSBjYXJkLT53YXZlaW4ucmVjc3JjOwotCQkJY3RsLT52YWxbMV0gPSBjYXJkLT53YXZlaW4uZnh3YzsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRWT0lDRVBBUkFNOgotCQkJY3RsLT52YWxbMF0gPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1swXTsKLQkJCWN0bC0+dmFsWzFdID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMF07Ci0KLQkJCWN0bC0+dmFsWzJdID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMV07Ci0JCQljdGwtPnZhbFszXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzFdOwotCi0JCQljdGwtPnZhbFs0XSA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzJdOwotCQkJY3RsLT52YWxbNV0gPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsyXTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVFZPSUNFUEFSQU06Ci0JCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1swXSA9IGN0bC0+dmFsWzBdOwotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMF0gPSBjdGwtPnZhbFsxXTsKLQotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMV0gPSBjdGwtPnZhbFsyXTsKLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzFdID0gY3RsLT52YWxbM107Ci0KLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzJdID0gY3RsLT52YWxbNF07Ci0JCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsyXSA9IGN0bC0+dmFsWzVdOwotCi0JCQlicmVhazsKLQkJCi0JCWNhc2UgQ01EX1NFVE1DSF9GWDoKLQkJCWNhcmQtPm1jaGFubmVsX2Z4ID0gY3RsLT52YWxbMF0gJiAweDAwMGY7Ci0JCQlicmVhazsKLQkJCi0JCWNhc2UgQ01EX0dFVFBBVENIOgotCQkJaWYgKGN0bC0+dmFsWzBdID09IDApIHsKLQkJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjYXJkLT5tZ3IucnBhdGNoLCBzaXplb2Yoc3RydWN0IGRzcF9ycGF0Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXJldCA9IC1FRkFVTFQ7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoY3RsLT52YWxbMF0gLSAxKSAvIFBBVENIRVNfUEVSX1BBR0UgPj0gY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMpIHsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBQQVRDSCgmY2FyZC0+bWdyLCBjdGwtPnZhbFswXSAtIDEpLCBzaXplb2Yoc3RydWN0IGRzcF9wYXRjaCkpKQotCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRHUFI6Ci0JCQlpZCA9IGN0bC0+dmFsWzBdOwotCi0JCQlpZiAoaWQgPiBOVU1fR1BSUykgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNhcmQtPm1nci5ncHJbaWRdLCBzaXplb2Yoc3RydWN0IGRzcF9ncHIpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRDVExHUFI6Ci0JCQlhZGRyID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIChjaGFyICopIGN0bC0+dmFsLCAmKChjaGFyICopIGN0bC0+dmFsKVtQQVRDSF9OQU1FX1NJWkVdKTsKLQkJCWN0bC0+dmFsWzBdID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgYWRkciwgMCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRQQVRDSDoKLQkJCWlmIChjdGwtPnZhbFswXSA9PSAwKQotCQkJCW1lbWNweSgmY2FyZC0+bWdyLnJwYXRjaCwgJmN0bC0+dmFsWzFdLCBzaXplb2Yoc3RydWN0IGRzcF9ycGF0Y2gpKTsKLQkJCWVsc2UgewotCQkJCXBhZ2UgPSAoY3RsLT52YWxbMF0gLSAxKSAvIFBBVENIRVNfUEVSX1BBR0U7Ci0JCQkJaWYgKHBhZ2UgPiBNQVhfUEFUQ0hFU19QQUdFUykgewotCQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAocGFnZSA+PSBjYXJkLT5tZ3IuY3VycmVudF9wYWdlcykgewotCQkJCQlmb3IgKGkgPSBjYXJkLT5tZ3IuY3VycmVudF9wYWdlczsgaSA8IHBhZ2UgKyAxOyBpKyspIHsKLQkJCQkgICAgICAgICAgICAgICAgY2FyZC0+bWdyLnBhdGNoW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCQkJCQlpZihjYXJkLT5tZ3IucGF0Y2hbaV0gPT0gTlVMTCkgewotCQkJCQkJCWNhcmQtPm1nci5jdXJyZW50X3BhZ2VzID0gaTsKLQkJCQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJbWVtc2V0KGNhcmQtPm1nci5wYXRjaFtpXSwgMCwgUEFHRV9TSVpFKTsKLQkJCQkJfQotCQkJCQljYXJkLT5tZ3IuY3VycmVudF9wYWdlcyA9IHBhZ2UgKyAxOwotCQkJCX0KLQotCQkJCXBhdGNoID0gUEFUQ0goJmNhcmQtPm1nciwgY3RsLT52YWxbMF0gLSAxKTsKLQotCQkJCW1lbWNweShwYXRjaCwgJmN0bC0+dmFsWzFdLCBzaXplb2Yoc3RydWN0IGRzcF9wYXRjaCkpOwotCi0JCQkJaWYgKHBhdGNoLT5jb2RlX3NpemUgPT0gMCkgewotCQkJCQlmb3IoaSA9IHBhZ2UgKyAxOyBpIDwgY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY2FyZC0+bWdyLnBhdGNoW2ldKTsKLQotCQkJCQljYXJkLT5tZ3IuY3VycmVudF9wYWdlcyA9IHBhZ2UgKyAxOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVEdQUjoKLQkJCWlmIChjdGwtPnZhbFswXSA+IE5VTV9HUFJTKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbWVtY3B5KCZjYXJkLT5tZ3IuZ3ByW2N0bC0+dmFsWzBdXSwgJmN0bC0+dmFsWzFdLCBzaXplb2Yoc3RydWN0IGRzcF9ncHIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVENUTEdQUjoKLQkJCWFkZHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgKGNoYXIgKikgY3RsLT52YWwsIChjaGFyICopIGN0bC0+dmFsICsgUEFUQ0hfTkFNRV9TSVpFKTsKLQkJCWVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKGNhcmQsIGFkZHIsICooKHMzMiAqKSgoY2hhciAqKSBjdGwtPnZhbCArIDIgKiBQQVRDSF9OQU1FX1NJWkUpKSwgMCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRHUE9VVDoKLQkJCWlmICggKChjdGwtPnZhbFswXSA+IDIpICYmICghY2FyZC0+aXNfYXVkaWd5KSkKLQkJCSAgICAgfHwgKGN0bC0+dmFsWzBdID4gMTUpIHx8IGN0bC0+dmFsWzFdID4gMSkgewotCQkJCXJldD0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsICgxIDw8IDI0KSB8ICgoY3RsLT52YWxbMF0pIDw8IDE2KSB8IEFfSU9DRkcsIGN0bC0+dmFsWzFdKTsKLQkJCWVsc2UKLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsICgxIDw8IDI0KSB8ICgoKGN0bC0+dmFsWzBdKSArIDEwKSA8PCAxNikgfCBIQ0ZHLCBjdGwtPnZhbFsxXSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRHUFIyT1NTOgotCQkJaWQgPSBjdGwtPnZhbFswXTsKLQkJCWNoID0gY3RsLT52YWxbMV07Ci0KLQkJCWlmIChpZCA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgY2ggPj0gMikgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWN0bC0+dmFsWzJdID0gY2FyZC0+bWdyLmN0cmxfZ3ByW2lkXVtjaF07Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRHUFIyT1NTOgotCQkJaWQgPSBjdGwtPnZhbFswXTsKLQkJCS8qIDAgPT0gbGVmdCwgMSA9PSByaWdodCAqLwotCQkJY2ggPSBjdGwtPnZhbFsxXTsKLQkJCWFkZHIgPSBjdGwtPnZhbFsyXTsKLQotCQkJaWYgKGlkID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCBjaCA+PSAyKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FyZC0+bWdyLmN0cmxfZ3ByW2lkXVtjaF0gPSBhZGRyOwotCi0JCQlpZiAoY2FyZC0+aXNfYXBzKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoYWRkciA+PSAwKSB7Ci0JCQkJdW5zaWduZWQgaW50IHN0YXRlID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdOwotCi0JCQkJaWYgKGNoID09IDEpIHsKLQkJCQkJc3RhdGUgPj49IDg7Ci0JCQkJCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gKDEgPDwgaWQpOwotCQkJCX0KLQotCQkJCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gKDEgPDwgaWQpOwotCi0JCQkJaWYgKGlkID09IFNPVU5EX01JWEVSX1RSRUJMRSkgewotCQkJCQlzZXRfdHJlYmxlKGNhcmQsIGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSAmIDB4ZmYsIChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gPj4gOCkgJiAweGZmKTsKLQkJCQl9IGVsc2UgaWYgKGlkID09IFNPVU5EX01JWEVSX0JBU1MpIHsKLQkJCQkJc2V0X2Jhc3MoY2FyZCwgY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdICYgMHhmZiwgKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSA+PiA4KSAmIDB4ZmYpOwotCQkJCX0gZWxzZQotCQkJCQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGFkZHIsIHN0YXRlICYgMHhmZiwKLQkJCQkJCQkgICAgICAgdm9sdW1lX3BhcmFtc1tpZF0pOwotCQkJfSBlbHNlIHsKLQkJCQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzICY9IH4oMSA8PCBpZCk7Ci0JCQkJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSBjYXJkLT5hYzk3X3N0ZXJlb19taXhlcnM7Ci0KLQkJCQlpZiAoY2ggPT0gMCkgewotCQkJCQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzICY9IH4oMSA8PCBpZCk7Ci0JCQkJCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVFBBU1NUSFJPVUdIOgotCQkJY2FyZC0+cHQuc2VsZWN0ZWQgPSBjdGwtPnZhbFswXSA/IDEgOiAwOwotCQkJaWYgKGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKQotCQkJCWJyZWFrOwotCi0JCQljYXJkLT5wdC5zcGNzX3RvX3VzZSA9IGN0bC0+dmFsWzBdICYgMHgwNzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1BSSVZBVEUzX1ZFUlNJT046Ci0JCQljdGwtPnZhbFswXSA9IFBSSVZBVEUzX1ZFUlNJT047CS8vcHJpdmF0ZTMgdmVyc2lvbgotCQkJY3RsLT52YWxbMV0gPSBNQUpPUl9WRVI7CS8vbWFqb3IgZHJpdmVyIHZlcnNpb24KLQkJCWN0bC0+dmFsWzJdID0gTUlOT1JfVkVSOwkvL21pbm9yIGRyaXZlciB2ZXJzaW9uCi0JCQljdGwtPnZhbFszXSA9IGNhcmQtPmlzX2F1ZGlneTsJLy8xPWNhcmQgaXMgYXVkaWd5Ci0KLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCQkJY3RsLT52YWxbNF09ZW11MTBrMV9yZWFkZm4wKGNhcmQsIDB4MTgpOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FDOTdfQk9PU1Q6Ci0JCQlpZiAoY3RsLT52YWxbMF0pCi0JCQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4MCk7CQotCQkJZWxzZQotCQkJCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDA4MDgpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlrZnJlZShjdGwpOwotCQlyZXR1cm4gcmV0OwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzaXplLCBhcmdwLCBzaXplb2Yoc2l6ZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICJFeHRlcm5hbCB0cmFtIHNpemUgJSN4XG4iLCBzaXplKTsKLQotCQlpZiAoc2l6ZSA+IDB4MWZmZmZmKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJc2l6ZV9yZWcgPSAwOwotCi0JCWlmIChzaXplICE9IDApIHsKLQkJCXNpemUgPSAoc2l6ZSAtIDEpID4+IDE0OwotCi0JCQl3aGlsZSAoc2l6ZSkgewotCQkJCXNpemUgPj49IDE7Ci0JCQkJc2l6ZV9yZWcrKzsKLQkJCX0KLQotCQkJc2l6ZSA9IDB4NDAwMCA8PCBzaXplX3JlZzsKLQkJfQotCi0JCURQRCgyLCAiRXh0ZXJuYWwgdHJhbSBzaXplICUjeCAlI3hcbiIsIHNpemUsIHNpemVfcmVnKTsKLQotCQlpZiAoc2l6ZSAhPSBjYXJkLT50YW5rbWVtLnNpemUpIHsKLQkJCWlmIChjYXJkLT50YW5rbWVtLnNpemUgPiAwKSB7Ci0JCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHX0xPQ0tUQU5LQ0FDSEUsIDEpOwotCi0JCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLCBUQ0IsIDAsIFRDQlMsIDAsIFRBR0xJU1RfRU5EKTsKLQotCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dGFua21lbS5zaXplLCBjYXJkLT50YW5rbWVtLmFkZHIsIGNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSk7Ci0KLQkJCQljYXJkLT50YW5rbWVtLnNpemUgPSAwOwotCQkJfQotCi0JCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQkJY2FyZC0+dGFua21lbS5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2Rldiwgc2l6ZSwgJmNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSk7Ci0JCQkJaWYgKGNhcmQtPnRhbmttZW0uYWRkciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJCWNhcmQtPnRhbmttZW0uc2l6ZSA9IHNpemU7Ci0KLQkJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsIFRDQiwgKHUzMikgY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlLCBUQ0JTLCh1MzIpIHNpemVfcmVnLCBUQUdMSVNUX0VORCk7Ci0KLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkdfTE9DS1RBTktDQUNIRSwgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9kc3BfbWl4ZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IG9zc19taXhlciwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0OwotCWludCB2YWw7Ci0JaW50IHNjYWxlOwotCi0JY2FyZC0+YWM5Ny0+bW9kY250Kys7Ci0KLQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogY2xlYW5zZSBpbnB1dCBhIGxpdHRsZSAqLwotCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZik7Ci0JbGVmdCA9ICh2YWwgICYgMHhmZik7Ci0KLQlpZiAocmlnaHQgPiAxMDApIHJpZ2h0ID0gMTAwOwotCWlmIChsZWZ0ID4gMTAwKSBsZWZ0ID0gMTAwOwotCi0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX21peGVyXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7Ci0JaWYgKG9zc19taXhlciA9PSBTT1VORF9NSVhFUl9UUkVCTEUpIHsKLQkJc2V0X3RyZWJsZShjYXJkLCBsZWZ0LCByaWdodCk7Ci0JCXJldHVybiAwOwotCX0gaWYgKG9zc19taXhlciA9PSBTT1VORF9NSVhFUl9CQVNTKSB7Ci0JCXNldF9iYXNzKGNhcmQsIGxlZnQsIHJpZ2h0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG9zc19taXhlciA9PSBTT1VORF9NSVhFUl9WT0xVTUUpCi0JCXNjYWxlID0gMSA8PCBjYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbjsKLQllbHNlCi0JCXNjYWxlID0gdm9sdW1lX3BhcmFtc1tvc3NfbWl4ZXJdOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVswXSwgbGVmdCwgc2NhbGUpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMV0sIHJpZ2h0LCBzY2FsZSk7Ci0KLQlpZiAoY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzICYgKDEgPDwgb3NzX21peGVyKSkKLQkJY2FyZC0+YWM5Ny0+d3JpdGVfbWl4ZXIoY2FyZC0+YWM5Nywgb3NzX21peGVyLCBsZWZ0LCByaWdodCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21peGVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgaW50IG9zc19taXhlciA9IF9JT0NfTlIoY21kKTsKLQkKLQlyZXQgPSAtRUlOVkFMOwotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgewotCQkJbWl4ZXJfaW5mbyBpbmZvOwotCi0JCQlzdHJsY3B5KGluZm8uaWQsIGNhcmQtPmFjOTctPm5hbWUsIHNpemVvZihpbmZvLmlkKSk7Ci0KLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCQkJc3RybGNweShpbmZvLm5hbWUsICJBdWRpZ3kgLSBFbXUxMGsxIiwgc2l6ZW9mKGluZm8ubmFtZSkpOwotCQkJZWxzZQotCQkJCXN0cmxjcHkoaW5mby5uYW1lLCAiQ3JlYXRpdmUgU0JMaXZlIC0gRW11MTBrMSIsIHNpemVvZihpbmZvLm5hbWUpKTsKLQkJCQkKLQkJCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBjYXJkLT5hYzk3LT5tb2RjbnQ7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoKF9TSU9DX0RJUihjbWQpID09IChfU0lPQ19XUklURXxfU0lPQ19SRUFEKSkgJiYgb3NzX21peGVyIDw9IFNPVU5EX01JWEVSX05SREVWSUNFUykKLQkJCXJldCA9IGVtdTEwazFfZHNwX21peGVyKGNhcmQsIG9zc19taXhlciwgYXJnKTsKLQkJZWxzZQotCQkJcmV0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfaW9jdGwoY2FyZC0+YWM5NywgY21kLCBhcmcpOwotCX0KLQkKLQlpZiAocmV0IDwgMCkKLQkJcmV0ID0gZW11MTBrMV9wcml2YXRlX21peGVyKGNhcmQsIGNtZCwgYXJnKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0KLQlEUEYoNCwgImVtdTEwazFfbWl4ZXJfb3BlbigpXG4iKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZlbXUxMGsxX2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXUxMGsxX2NhcmQsIGxpc3QpOwotCi0JCWlmIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPT0gbWlub3IpCi0JCQlnb3RvIG1hdGNoOwotCX0KLQotCXJldHVybiAtRU5PREVWOwotCi0gICAgICBtYXRjaDoKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlEUEYoNCwgImVtdTEwazFfbWl4ZXJfcmVsZWFzZSgpXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX21peGVyX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5pb2N0bAkJPSBlbXUxMGsxX21peGVyX2lvY3RsLAotCS5vcGVuCQk9IGVtdTEwazFfbWl4ZXJfb3BlbiwKLQkucmVsZWFzZQk9IGVtdTEwazFfbWl4ZXJfcmVsZWFzZSwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jIGIvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyMWQ0My4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHBhc3N0aHJvdWdoLmMgLS0gRW11MTBrMSBkaWdpdGFsIHBhc3N0aHJvdWdoCi0gKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxICBKdWhhIFlyavZs5CA8anlyam9sYUBjYy5odXQuZmk+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBNYXkgMTUsIDIwMDEJICAgIEp1aGEgWXJq9mzkCSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotI2luY2x1ZGUgInJlY21nci5oIgotI2luY2x1ZGUgImlycW1nci5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotCi1zdGF0aWMgdm9pZCBwdF9wdXRzYW1wbGVzKHN0cnVjdCBwdF9kYXRhICpwdCwgdTE2ICpwdHIsIHUxNiBsZWZ0LCB1MTYgcmlnaHQpCi17Ci0JdW5zaWduZWQgaW50IGlkeDsKLQotCXB0cltwdC0+Y29weXB0cl0gPSBsZWZ0OwotCWlkeCA9IHB0LT5jb3B5cHRyICsgUFRfU0FNUExFUy8yOwotCWlkeCAlPSBQVF9TQU1QTEVTOwotCXB0cltpZHhdID0gcmlnaHQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHB0X2Nhbl93cml0ZShzdHJ1Y3QgcHRfZGF0YSAqcHQpCi17Ci0JcmV0dXJuIHB0LT5ibG9ja3NfY29waWVkIDwgcHQtPmJsb2Nrc19wbGF5ZWQgKyA4OwotfQotCi1zdGF0aWMgaW50IHB0X3dhaXRfZm9yX3dyaXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVkZXYsIGludCBub25ibG9jaykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZWRldi0+Y2FyZDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0KLQlpZiAobm9uYmxvY2sgJiYgIXB0X2Nhbl93cml0ZShwdCkpCi0JCXJldHVybiAtRUFHQUlOOwotCXdoaWxlICghcHRfY2FuX3dyaXRlKHB0KSAmJiBwdC0+c3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcHQtPndhaXQpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCX0KLQlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX0lOQUNUSVZFKQotCQlyZXR1cm4gLUVBR0FJTjsKLQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdF9wdXRibG9jayhzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiwgdTE2ICpibG9jaywgaW50IG5vbmJsb2NrKQotewotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQl1MTYgKnB0ciA9ICh1MTYgKikgY2FyZC0+dGFua21lbS5hZGRyOwotCWludCBpID0gMCwgcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JciA9IHB0X3dhaXRfZm9yX3dyaXRlKHdhdmVfZGV2LCBub25ibG9jayk7Ci0JaWYgKHIgPCAwKQotCQlyZXR1cm4gcjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOwotCXdoaWxlIChpIDwgUFRfQkxPQ0tTQU1QTEVTKSB7Ci0JCXB0X3B1dHNhbXBsZXMocHQsIHB0ciwgYmxvY2tbMippXSwgYmxvY2tbMippKzFdKTsKLQkJaWYgKHB0LT5jb3B5cHRyID09IDApCi0JCQlwdC0+Y29weXB0ciA9IFBUX1NBTVBMRVM7Ci0JCXB0LT5jb3B5cHRyLS07Ci0JCWkrKzsKLQl9Ci0Jd29pbnN0LT50b3RhbF9jb3BpZWQgKz0gUFRfQkxPQ0tTSVpFOwotCXB0LT5ibG9ja3NfY29waWVkKys7Ci0JaWYgKHB0LT5ibG9ja3NfY29waWVkID49IDQgJiYgcHQtPnN0YXRlICE9IFBUX1NUQVRFX1BMQVlJTkcpIHsKLQkJRFBGKDIsICJhY3RpdmF0aW5nIGRpZ2l0YWwgcGFzcy10aHJvdWdoIHBsYXliYWNrXG4iKTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEdQUl9CQVNFICsgcHQtPmVuYWJsZV9ncHIsIDAsIDEpOwotCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9QTEFZSU5HOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX3B0X3NldHVwKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXUzMiBiaXRzOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXB0LT5vbGRfc3Bjc1tpXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCk7Ci0JCWlmIChwdC0+c3Bjc190b191c2UgJiAoMSA8PCBpKSkgewotCQkJRFBEKDIsICJ1c2luZyBTL1BESUYgcG9ydCAlZFxuIiwgaSk7Ci0JCQliaXRzID0gU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAotCQkJCVNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwKLQkJCQkweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQ7Ci0JCQlpZiAocHQtPmFjM2RhdGEpCi0JCQkJYml0cyB8PSBTUENTX05PVEFVRElPREFUQTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTUENTMCArIGksIDAsIGJpdHMpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zc2l6ZV90IGVtdTEwazFfcHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCWludCBub25ibG9jaywgaSwgciwgYmxvY2tzLCBibG9ja3NfY29waWVkLCBieXRlc19jb3BpZWQgPSAwOwotCi0JRFBEKDMsICJlbXUxMGsxX3B0X3dyaXRlKCk6ICVkIGJ5dGVzXG4iLCBjb3VudCk7Ci0JCi0Jbm9uYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKLQkKLQlpZiAoY2FyZC0+dGFua21lbS5zaXplIDwgUFRfU0FNUExFUyoyKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCURQRigyLCAiYnVmcHRyIGluaXRcbiIpOwotCQlwdC0+cGxheXB0ciA9IFBUX1NBTVBMRVMtMTsKLQkJcHQtPmNvcHlwdHIgPSBQVF9JTklUUFRSOwotCQlwdC0+YmxvY2tzX3BsYXllZCA9IHB0LT5ibG9ja3NfY29waWVkID0gMDsKLQkJbWVtc2V0KGNhcmQtPnRhbmttZW0uYWRkciwgMCwgY2FyZC0+dGFua21lbS5zaXplKTsKLQkJcHQtPnN0YXRlID0gUFRfU1RBVEVfQUNUSVZBVEVEOwotCQlwdC0+YnVmID0ga21hbGxvYyhQVF9CTE9DS1NJWkUsIEdGUF9LRVJORUwpOwotCQlwdC0+cHJlcGVuZF9zaXplID0gMDsKLQkJaWYgKHB0LT5idWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQllbXUxMGsxX3B0X3NldHVwKHdhdmVfZGV2KTsKLQl9Ci0JaWYgKHB0LT5wcmVwZW5kX3NpemUpIHsKLQkJaW50IG5lZWRlZCA9IFBUX0JMT0NLU0laRSAtIHB0LT5wcmVwZW5kX3NpemU7Ci0KLQkJRFBEKDMsICJwcmVwZW5kIHNpemUgJWQsIHByZXBlbmRpbmcgJWQgYnl0ZXNcbiIsIHB0LT5wcmVwZW5kX3NpemUsIG5lZWRlZCk7Ci0JCWlmIChjb3VudCA8IG5lZWRlZCkgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYgKyBwdC0+cHJlcGVuZF9zaXplLAotCQkJCQkgICBidWZmZXIsIGNvdW50KSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0LT5wcmVwZW5kX3NpemUgKz0gY291bnQ7Ci0JCQlEUEQoMywgInByZXBlbmQgc2l6ZSBub3cgJWRcbiIsIHB0LT5wcmVwZW5kX3NpemUpOwotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwdC0+YnVmICsgcHQtPnByZXBlbmRfc2l6ZSwgYnVmZmVyLCBuZWVkZWQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXIgPSBwdF9wdXRibG9jayh3YXZlX2RldiwgKHUxNiAqKSBwdC0+YnVmLCBub25ibG9jayk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JCWJ5dGVzX2NvcGllZCArPSBuZWVkZWQ7Ci0JCXB0LT5wcmVwZW5kX3NpemUgPSAwOwotCX0KLQlibG9ja3MgPSAoY291bnQtYnl0ZXNfY29waWVkKS9QVF9CTE9DS1NJWkU7Ci0JYmxvY2tzX2NvcGllZCA9IDA7Ci0Jd2hpbGUgKGJsb2NrcyA+IDApIHsKLQkJdTE2IF9fdXNlciAqYnVmcHRyID0gKHUxNiBfX3VzZXIgKikgYnVmZmVyICsgKGJ5dGVzX2NvcGllZC8yKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYsIGJ1ZnB0ciwgUFRfQkxPQ0tTSVpFKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyID0gcHRfcHV0YmxvY2sod2F2ZV9kZXYsICh1MTYgKilwdC0+YnVmLCBub25ibG9jayk7Ci0JCWlmIChyKSB7Ci0JCQlpZiAoYnl0ZXNfY29waWVkKQotCQkJCXJldHVybiBieXRlc19jb3BpZWQ7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQkJYnl0ZXNfY29waWVkICs9IFBUX0JMT0NLU0laRTsKLQkJYmxvY2tzLS07Ci0JCWJsb2Nrc19jb3BpZWQrKzsKLQl9Ci0JaSA9IGNvdW50IC0gYnl0ZXNfY29waWVkOwotCWlmIChpKSB7Ci0JCXB0LT5wcmVwZW5kX3NpemUgPSBpOwotCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiwgYnVmZmVyICsgYnl0ZXNfY29waWVkLCBpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlieXRlc19jb3BpZWQgKz0gaTsKLQkJRFBEKDMsICJmaWxsaW5nIHByZXBlbmQgYnVmZmVyIHdpdGggJWQgYnl0ZXMiLCBpKTsKLQl9Ci0JcmV0dXJuIGJ5dGVzX2NvcGllZDsKLX0KLQotdm9pZCBlbXUxMGsxX3B0X3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0JaW50IGk7Ci0KLQlpZiAocHQtPnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCURQRigyLCAiZGlnaXRhbCBwYXNzLXRocm91Z2ggc3RvcHBlZFxuIik7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIHB0LT5lbmFibGVfZ3ByLCAwLCAwKTsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0LT5zcGNzX3RvX3VzZSAmICgxIDw8IGkpKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTUENTMCArIGksIDAsIHB0LT5vbGRfc3Bjc1tpXSk7Ci0JCX0KLQkJcHQtPnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7Ci0JCWtmcmVlKHB0LT5idWYpOwotCX0KLX0KLQotdm9pZCBlbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJndhdmVfZGV2LT5jYXJkLT5wdDsKLQl1MzIgcG9zOwotCi0JaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9QTEFZSU5HICYmIHB0LT5wb3NfZ3ByID49IDApIHsKLQkJcG9zID0gc2JsaXZlX3JlYWRwdHIod2F2ZV9kZXYtPmNhcmQsIEdQUl9CQVNFICsgcHQtPnBvc19ncHIsIDApOwotCQlpZiAocG9zID4gUFRfQkxPQ0tTQU1QTEVTKQotCQkJcG9zID0gUFRfQkxPQ0tTQU1QTEVTOwotCQlwb3MgPSA0ICogKFBUX0JMT0NLU0FNUExFUyAtIHBvcyk7Ci0JfSBlbHNlCi0JCXBvcyA9IDA7Ci0Jd29pbnN0LT50b3RhbF9wbGF5ZWQgPSBwdC0+YmxvY2tzX3BsYXllZCAqIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKyBwb3M7Ci0Jd29pbnN0LT5idWZmZXIuaHdfcG9zID0gcG9zOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guaCBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGNjOTcuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHBhc3N0aHJvdWdoLmggLS0gRW11MTBrMSBkaWdpdGFsIHBhc3N0aHJvdWdoIGhlYWRlciBmaWxlCi0gKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxICBKdWhhIFlyavZs5CA8anlyam9sYUBjYy5odXQuZmk+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBNYXkgMTUsIDIwMDEJICAgIEp1aGEgWXJq9mzkICAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfUEFTU1RIUk9VR0hfSAotI2RlZmluZSBfUEFTU1RIUk9VR0hfSAotCi0jaW5jbHVkZSAiYXVkaW8uaCIKLQotLyogbnVtYmVyIG9mIDE2LWJpdCBzdGVyZW8gc2FtcGxlcyBpbiBYVFJBTSBidWZmZXIgKi8KLSNkZWZpbmUgUFRfU0FNUExFUyAweDgwMDAKLSNkZWZpbmUgUFRfQkxPQ0tTQU1QTEVTIDB4NDAwCi0jZGVmaW5lIFBUX0JMT0NLU0laRSAoUFRfQkxPQ0tTQU1QTEVTKjQpCi0jZGVmaW5lIFBUX0JMT0NLU0laRV9MT0cyIDEyCi0jZGVmaW5lIFBUX0JMT0NLQ09VTlQgKFBUX1NBTVBMRVMvUFRfQkxPQ0tTQU1QTEVTKQotI2RlZmluZSBQVF9JTklUUFRSIChQVF9TQU1QTEVTLzItMSkKLQotI2RlZmluZSBQVF9TVEFURV9JTkFDVElWRSAwCi0jZGVmaW5lIFBUX1NUQVRFX0FDVElWQVRFRCAxCi0jZGVmaW5lIFBUX1NUQVRFX1BMQVlJTkcgMgotCi0vKiBwYXNzdGhyb3VnaCBzdHJ1Y3QgKi8KLXN0cnVjdCBwdF9kYXRhCi17Ci0JdTgJc2VsZWN0ZWQsIHN0YXRlLCBzcGNzX3RvX3VzZTsKLQlpbnQJaW50cl9ncHIsIGVuYWJsZV9ncHIsIHBvc19ncHI7Ci0JdTMyCWJsb2Nrc19wbGF5ZWQsIGJsb2Nrc19jb3BpZWQsIG9sZF9zcGNzWzNdOwotCXUzMglwbGF5cHRyLCBjb3B5cHRyOwotCXUzMglwcmVwZW5kX3NpemU7Ci0JdTgJKmJ1ZjsKLQl1OAlhYzNkYXRhOwotCi0JY2hhcgkqcGF0Y2hfbmFtZSwgKmludHJfZ3ByX25hbWUsICplbmFibGVfZ3ByX25hbWUsICpwb3NfZ3ByX25hbWU7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXNwaW5sb2NrX3QgbG9jazsKLX07Ci0KLS8qCi0gIFBhc3N0aHJvdWdoIGNhbiBiZSBkb25lIGluIHR3byBtZXRob2RzOgotCi0gIE1ldGhvZCAxIDogdHJhbQotICAgICBJbiBvcmlnaW5hbCBlbXUxMGsxLCB3ZSBjb3VsZG4ndCBieXBhc3MgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlcnMuIEV2ZW4gYXQgNDhrSHoKLSAgICAgKHRoZSBpbnRlcm5hbCBzYW1wbGUgcmF0ZSBvZiB0aGUgZW11MTBrMSkgdGhlIHNhbXBsZXMgd291bGQgZ2V0IG1lc3NlZCB1cC4KLSAgICAgVG8gb3ZlciBjb21lIHRoaXMsIHNhbXBsZXMgYXJlIGNvcGllZCBpbnRvIHRoZSB0cmFtIGFuZCBhIHNwZWNpYWwgZHNwIHBhdGNoIGNvcGllcwotICAgICB0aGUgc2FtcGxlcyBvdXQgYW5kIGdlbmVyYXRlcyBpbnRlcnJ1cHRzIHdoZW4gYSBibG9jayBoYXMgZmlubmlzaGVkIHBsYXlpbmcuCi0KLSAgTWV0aG9kIDIgOiBJbnRlcnBvbGF0b3IgYnlwYXNzCi0KLSAgICAgQ3JlYXRpdmUgZml4ZWQgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnQgcHJvYmxlbSBpbiBlbXUxMGsxIHJldiA3IGFuZCBoaWdoZXIKLSAgICAgKGluY2x1ZGluZyB0aGUgZW11MTBrMiAoYXVkaWd5KSkuIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgcmVndWxhciwgYW5kIG11Y2ggc2ltcGxlcgotICAgICBwbGF5YmFjayBtZXRob2QuIAotCi0KLSAgSW4gYm90aCBtZXRob2RzLCBkc3AgY29kZSBpcyB1c2VkIHRvIG11eCBhdWRpbyBhbmQgcGFzc3Rocm91Z2guIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzcGRpZgotICBkb2Vzbid0IHJlY2VpdmUgYXVkaW8gYW5kIHBhc3Rocm91Z2ggZGF0YSBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgc3BkaWYgZmxhZyBTUENTX05PVEFVRElPREFUQQotICBpcyBzZXQgdG8gdGVsbCAKLQotICovCi0KLS8vIGVtdTEwazEgcmV2cyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNyBjYW4gdXNlIG1ldGhvZDIKLQotI2RlZmluZSBVU0VfUFRfTUVUSE9EMiAgKGNhcmQtPmlzX2F1ZGlneSkKLSNkZWZpbmUgVVNFX1BUX01FVEhPRDEJIVVTRV9QVF9NRVRIT0QyCi0KLXNzaXplX3QgZW11MTBrMV9wdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLQotaW50IGVtdTEwazFfcHRfc2V0dXAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpOwotdm9pZCBlbXUxMGsxX3B0X3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCk7Ci12b2lkIGVtdTEwazFfcHRfd2F2ZW91dF91cGRhdGUoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpOwotCi0jZW5kaWYgLyogX1BBU1NUSFJPVUdIX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5jIGIvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTU2MTguLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgcmVjbWdyLmMgLS0gUmVjb3JkaW5nIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0KLXZvaWQgZW11MTBrMV9yZXNldF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlEUEYoMiwgImVtdTEwazFfcmVzZXRfcmVjb3JkKClcbiIpOwotCi0Jc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGJ1ZmZlci0+c2l6ZXJlZywgMCwgQURDQlNfQlVGU0laRV9OT05FKTsKLQotCXNibGl2ZV93cml0ZXB0cihjYXJkLCBidWZmZXItPnNpemVyZWcsIDAsIGJ1ZmZlci0+c2l6ZXJlZ3ZhbCk7CQotCi0Jd2hpbGUgKHNibGl2ZV9yZWFkcHRyKGNhcmQsIGJ1ZmZlci0+aWR4cmVnLCAwKSkKLQkJdWRlbGF5KDUpOwotfQotCi12b2lkIGVtdTEwazFfc3RhcnRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCi17Ci0JRFBGKDIsICJlbXUxMGsxX3N0YXJ0X3JlY29yZCgpXG4iKTsKLQotCWlmIChidWZmZXItPmFkY2N0bCkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFEQ0NSLCAwLCBidWZmZXItPmFkY2N0bCk7Ci19Ci0KLXZvaWQgZW11MTBrMV9zdG9wX3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCURQRigyLCAiZW11MTBrMV9zdG9wX3JlY29yZCgpXG4iKTsKLQotCS8qIERpc2FibGUgcmVjb3JkIHRyYW5zZmVyICovCi0JaWYgKGJ1ZmZlci0+YWRjY3RsKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQURDQ1IsIDAsIDApOwotfQotCi12b2lkIGVtdTEwazFfc2V0X3JlY29yZF9zcmMoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KQotewotCXN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIgPSAmd2lpbnN0LT5idWZmZXI7Ci0KLQlEUEYoMiwgImVtdTEwazFfc2V0X3JlY29yZF9zcmMoKVxuIik7Ci0KLQlzd2l0Y2ggKHdpaW5zdC0+cmVjc3JjKSB7Ci0KLQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJRFBGKDIsICJyZWNvcmRpbmcgc291cmNlOiBBQzk3XG4iKTsKLQkJYnVmZmVyLT5zaXplcmVnID0gQURDQlM7Ci0JCWJ1ZmZlci0+YWRkcnJlZyA9IEFEQ0JBOwotCQlidWZmZXItPmlkeHJlZyA9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDSURYX0lEWCA6IEFEQ0lEWF9JRFg7Ci0KLQkJc3dpdGNoICh3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUpIHsKLQkJY2FzZSAweEJCODA6Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFEQ0NSX1NBTVBMRVJBVEVfNDg7Ci0JCQlicmVhazsKLQkJY2FzZSAweEFDNDQ6Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFEQ0NSX1NBTVBMRVJBVEVfNDQ7Ci0JCQlicmVhazsKLQkJY2FzZSAweDdEMDA6Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFEQ0NSX1NBTVBMRVJBVEVfMzI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDVEQzA6Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFEQ0NSX1NBTVBMRVJBVEVfMjQ7Ci0JCQlicmVhazsKLQkJY2FzZSAweDU2MjI6Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFEQ0NSX1NBTVBMRVJBVEVfMjI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDNFODA6Ci0JCQlidWZmZXItPmFkY2N0bCA9IEFEQ0NSX1NBTVBMRVJBVEVfMTY7Ci0JCQlicmVhazsKLQkJLy8gRklYTUU6IGF1ZGlneSBzdXBwb3J0cyAxMmtIeiByZWNvcmRpbmcKLQkJLyoKLQkJY2FzZSA/Pz8/OgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBX0FEQ0NSX1NBTVBMRVJBVEVfMTI7Ci0JCQlicmVhazsKLQkJKi8KLQkJY2FzZSAweDJCMTE6Ci0JCQlidWZmZXItPmFkY2N0bCA9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfU0FNUExFUkFURV8xMSA6IEFEQ0NSX1NBTVBMRVJBVEVfMTE7Ci0JCQlicmVhazsKLQkJY2FzZSAweDFGNDA6Ci0JCQlidWZmZXItPmFkY2N0bCA9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfU0FNUExFUkFURV84IDogQURDQ1JfU0FNUExFUkFURV84OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnVmZmVyLT5hZGNjdGwgfD0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENDUl9MQ0hBTkVOQUJMRSA6IEFEQ0NSX0xDSEFORU5BQkxFOwotCi0JCWlmICh3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9PSAyKQotCQkJYnVmZmVyLT5hZGNjdGwgfD0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENDUl9SQ0hBTkVOQUJMRSA6IEFEQ0NSX1JDSEFORU5BQkxFOwotCi0JCWJyZWFrOwotCi0JY2FzZSBXQVZFUkVDT1JEX01JQzoKLQkJRFBGKDIsICJyZWNvcmRpbmcgc291cmNlOiBNSUNcbiIpOwotCQlidWZmZXItPnNpemVyZWcgPSBNSUNCUzsKLQkJYnVmZmVyLT5hZGRycmVnID0gTUlDQkE7Ci0JCWJ1ZmZlci0+aWR4cmVnID0gTUlDSURYX0lEWDsKLQkJYnVmZmVyLT5hZGNjdGwgPSAwOwotCQlicmVhazsKLQotCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJRFBGKDIsICJyZWNvcmRpbmcgc291cmNlOiBGWFxuIik7Ci0JCWJ1ZmZlci0+c2l6ZXJlZyA9IEZYQlM7Ci0JCWJ1ZmZlci0+YWRkcnJlZyA9IEZYQkE7Ci0JCWJ1ZmZlci0+aWR4cmVnID0gRlhJRFhfSURYOwotCQlidWZmZXItPmFkY2N0bCA9IDA7Ci0KLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEZYV0MsIDAsIHdpaW5zdC0+Znh3Yyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0KLQlEUEQoMiwgImJ1cyBhZGR4OiAlI2x4XG4iLCAodW5zaWduZWQgbG9uZykgYnVmZmVyLT5kbWFfaGFuZGxlKTsKLQotCXNibGl2ZV93cml0ZXB0cihjYXJkLCBidWZmZXItPmFkZHJyZWcsIDAsICh1MzIpYnVmZmVyLT5kbWFfaGFuZGxlKTsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5oIGIvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODc2NmEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHJlY21nci5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpZm5kZWYgX1JFQ09SRE1HUl9ICi0jZGVmaW5lIF9SRUNPUkRNR1JfSAotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJjYXJkd2kuaCIKLQotLyogUmVjb3JkaW5nIHJlc291cmNlcyAqLwotI2RlZmluZSBXQVZFUkVDT1JEX0FDOTcJCTB4MDEKLSNkZWZpbmUgV0FWRVJFQ09SRF9NSUMJCTB4MDIKLSNkZWZpbmUgV0FWRVJFQ09SRF9GWAkJMHgwMwotCi12b2lkIGVtdTEwazFfcmVzZXRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpOwotdm9pZCBlbXUxMGsxX3N0YXJ0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3YXZlaW5fYnVmZmVyICopOwotdm9pZCBlbXUxMGsxX3N0b3BfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdhdmVpbl9idWZmZXIgKik7Ci12b2lkIGVtdTEwazFfc2V0X3JlY29yZF9zcmMoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpOwotCi0jZW5kaWYgLyogX1JFQ09SRE1HUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5jIGIvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwZDMwNy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgdGltZXIuYwotICogICAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBpbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKiAzLzYvMjAwMAlJbXByb3ZlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgdGltZXIgZGVsYXlzICBSdWkgU291c2EgKi8KLQotLyogNC8zLzIwMDAJSW1wbGVtZW50ZWQgdGltZXIgbGlzdCB1c2luZyBsaXN0LmggCSAgICAgUnVpIFNvdXNhICovCi0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi0vKiBUcnkgdG8gc2NoZWR1bGUgb25seSBvbmNlIHBlciBmcmFnbWVudCAqLwotCi12b2lkIGVtdTEwazFfdGltZXJfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXVfdGltZXIgKnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0KLQlzcGluX2xvY2soJmNhcmQtPnRpbWVyX2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgewotCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7Ci0KLQkJaWYgKHQtPnN0YXRlICYgVElNRVJfU1RBVEVfQUNUSVZFKSB7Ci0JCQl0LT5jb3VudCsrOwotCQkJaWYgKHQtPmNvdW50ID09IHQtPmNvdW50X21heCkgewotCQkJCXQtPmNvdW50ID0gMDsKLQkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZ0LT50YXNrbGV0KTsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZjYXJkLT50aW1lcl9sb2NrKTsKLQotCXJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX3RpbWVyX2luc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIsIHUxNiBkZWxheSkKLXsKLQlzdHJ1Y3QgZW11X3RpbWVyICp0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoZGVsYXkgPCA1KQotCQlkZWxheSA9IDU7Ci0KLQl0aW1lci0+ZGVsYXkgPSBkZWxheTsKLQl0aW1lci0+c3RhdGUgPSBUSU1FUl9TVEFURV9JTlNUQUxMRUQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JdGltZXItPmNvdW50X21heCA9IHRpbWVyLT5kZWxheSAvIChjYXJkLT50aW1lcl9kZWxheSA8IDEwMjQgPyBjYXJkLT50aW1lcl9kZWxheSA6IDEwMjQpOwotCXRpbWVyLT5jb3VudCA9IHRpbWVyLT5jb3VudF9tYXggLSAxOwotCi0JbGlzdF9hZGQoJnRpbWVyLT5saXN0LCAmY2FyZC0+dGltZXJzKTsKLQotCWlmIChjYXJkLT50aW1lcl9kZWxheSA+IGRlbGF5KSB7Ci0JCWlmIChjYXJkLT50aW1lcl9kZWxheSA9PSBUSU1FUl9TVE9QUEVEKQotCQkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIElOVEVfSU5URVJWQUxUSU1FUkVOQik7Ci0KLQkJY2FyZC0+dGltZXJfZGVsYXkgPSBkZWxheTsKLQkJZGVsYXkgPSAoZGVsYXkgPCAxMDI0ID8gZGVsYXkgOiAxMDI0KTsKLQotCQllbXUxMGsxX3RpbWVyX3NldChjYXJkLCBkZWxheSk7Ci0KLQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgewotCQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOwotCi0JCQl0LT5jb3VudF9tYXggPSB0LT5kZWxheSAvIGRlbGF5OwotCQkJLyogZG9uJ3Qgd2FudCB0byB0aGluayBtdWNoLCBqdXN0IGZvcmNlIHNjaGVkdWxpbmcgCi0JCQkgICBvbiB0aGUgbmV4dCBpbnRlcnJ1cHQgKi8KLQkJCXQtPmNvdW50ID0gdC0+Y291bnRfbWF4IC0gMTsKLQkJfQotCi0JCURQRCgyLCAidGltZXIgcmF0ZSAtLT4gJXVcbiIsIGRlbGF5KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl91bmluc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIpCi17Ci0Jc3RydWN0IGVtdV90aW1lciAqdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1MTYgZGVsYXkgPSBUSU1FUl9TVE9QUEVEOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAodGltZXItPnN0YXRlID09IFRJTUVSX1NUQVRFX1VOSU5TVEFMTEVEKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JbGlzdF9kZWwoJnRpbWVyLT5saXN0KTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKLQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOwotCi0JCWlmICh0LT5kZWxheSA8IGRlbGF5KQotCQkJZGVsYXkgPSB0LT5kZWxheTsKLQl9Ci0KLQlpZiAoY2FyZC0+dGltZXJfZGVsYXkgIT0gZGVsYXkpIHsKLQkJY2FyZC0+dGltZXJfZGVsYXkgPSBkZWxheTsKLQotCQlpZiAoZGVsYXkgPT0gVElNRVJfU1RPUFBFRCkKLQkJCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgSU5URV9JTlRFUlZBTFRJTUVSRU5CKTsKLQkJZWxzZSB7Ci0JCQlkZWxheSA9IChkZWxheSA8IDEwMjQgPyBkZWxheSA6IDEwMjQpOwotCi0JCQllbXUxMGsxX3RpbWVyX3NldChjYXJkLCBkZWxheSk7Ci0KLQkJCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKLQkJCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7Ci0KLQkJCQl0LT5jb3VudF9tYXggPSB0LT5kZWxheSAvIGRlbGF5OwotCQkJCXQtPmNvdW50ID0gdC0+Y291bnRfbWF4IC0gMTsKLQkJCX0KLQkJfQotCi0JCURQRCgyLCAidGltZXIgcmF0ZSAtLT4gJXVcbiIsIGRlbGF5KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQl0aW1lci0+c3RhdGUgPSBUSU1FUl9TVEFURV9VTklOU1RBTExFRDsKLQotCXJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX3RpbWVyX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQl0aW1lci0+c3RhdGUgfD0gVElNRVJfU1RBVEVfQUNUSVZFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX3RpbWVyX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0JdGltZXItPnN0YXRlICY9IH5USU1FUl9TVEFURV9BQ1RJVkU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTQzYjQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHRpbWVyLmgKLSAqICAgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotCi0jaWZuZGVmIF9USU1FUl9ICi0jZGVmaW5lIF9USU1FUl9ICi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0KLXN0cnVjdCBlbXVfdGltZXIgCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwotCXU4IHN0YXRlOyAKLQl1MTYgY291bnQ7CQkJCS8qIGN1cnJlbnQgbnVtYmVyIG9mIGludGVycnVwdHMgKi8KLQl1MTYgY291bnRfbWF4OwkJCQkvKiBudW1iZXIgb2YgaW50ZXJydXB0cyBuZWVkZWQgdG8gc2NoZWR1bGUgdGhlIGJoICovCi0JdTE2IGRlbGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGRlbGF5ICovCi19OwotCi12b2lkIGVtdTEwazFfdGltZXJfaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdGltZXIgKiwgdTE2KTsKLXZvaWQgZW11MTBrMV90aW1lcl91bmluc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOwotdm9pZCBlbXUxMGsxX3RpbWVyX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdGltZXIgKik7Ci12b2lkIGVtdTEwazFfdGltZXJfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdGltZXIgKik7Ci0KLSNkZWZpbmUgVElNRVJfU1RPUFBFRCAJCQkweGZmZmYgCi0jZGVmaW5lIFRJTUVSX1NUQVRFX0lOU1RBTExFRCAJCTB4MDEKLSNkZWZpbmUgVElNRVJfU1RBVEVfQUNUSVZFCQkweDAyCi0jZGVmaW5lIFRJTUVSX1NUQVRFX1VOSU5TVEFMTEVEIAkweDA0Ci0KLSNlbmRpZiAvKiBfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGI2MDIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICB2b2ljZW1nci5jIC0gVm9pY2UgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlICJ2b2ljZW1nci5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLQotI2RlZmluZSBQSVRDSF80ODAwMCAweDAwMDA0MDAwCi0jZGVmaW5lIFBJVENIXzk2MDAwIDB4MDAwMDgwMDAKLSNkZWZpbmUgUElUQ0hfODUwMDAgMHgwMDAwNzE1NQotI2RlZmluZSBQSVRDSF84MDcyNiAweDAwMDA2YmEyCi0jZGVmaW5lIFBJVENIXzY3ODgyIDB4MDAwMDVhODIKLSNkZWZpbmUgUElUQ0hfNTcwODEgMHgwMDAwNGMxYwotCi1zdGF0aWMgdTMyIGVtdTEwazFfc2VsZWN0X2ludGVycHJvbShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLAotCQkJCSAgICBzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSkKLXsKLQlpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0PT1QSVRDSF80ODAwMCkKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzA7Ci0JZWxzZSBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0PFBJVENIXzQ4MDAwKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMTsKLQllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF85NjAwMCkKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzA7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfODUwMDApCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV82OwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzgwNzI2KQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNTsKLQllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF82Nzg4MikKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzQ7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfNTcwODEpCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8zOwotCWVsc2UgIAotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMjsKLX0KLQotCi0vKioKLSAqIGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyIC0KLSAqCi0gKiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSBidWZmZXIgZm9yIGEgdm9pY2UuIFR3byBwYWdlIHRhYmxlcyBhcmUga2VwdCBmb3IgZWFjaCBidWZmZXIuCi0gKiBPbmUgKGRtYV9oYW5kbGUpIGtlZXBzIHRyYWNrIG9mIHRoZSBob3N0IG1lbW9yeSBwYWdlcyB1c2VkIGFuZCB0aGUgb3RoZXIgKHZpcnR1YWxwYWdldGFibGUpCi0gKiBpcyBwYXNzZWQgdG8gdGhlIGRldmljZSBzbyB0aGF0IGl0IGNhbiBkbyBETUEgdG8gaG9zdCBtZW1vcnkuCi0gKgotICovCi1pbnQgZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHZvaWNlX21lbSAqbWVtLCB1MzIgcGFnZXMpCi17Ci0JdTMyIHBhZ2VpbmRleCwgcGFnZWNvdW50OwotCXUzMiBidXNhZGR4OwotCWludCBpOwotCi0JRFBEKDIsICJyZXF1ZXN0ZWQgcGFnZXMgaXM6ICVkXG4iLCBwYWdlcyk7Ci0KLQlpZiAoKG1lbS0+ZW11cGFnZWluZGV4ID0gZW11MTBrMV9hZGR4bWdyX2FsbG9jKHBhZ2VzICogUEFHRV9TSVpFLCBjYXJkKSkgPCAwKQotCXsKLQkJRFBGKDEsICJjb3VsZG4ndCBhbGxvY2F0ZSBlbXUxMGsxIGFkZHJlc3Mgc3BhY2VcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRmlsbCBpbiB2aXJ0dWFsIG1lbW9yeSB0YWJsZSAqLwotCWZvciAocGFnZWNvdW50ID0gMDsgcGFnZWNvdW50IDwgcGFnZXM7IHBhZ2Vjb3VudCsrKSB7Ci0JCWlmICgobWVtLT5hZGRyW3BhZ2Vjb3VudF0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUsICZtZW0tPmRtYV9oYW5kbGVbcGFnZWNvdW50XSkpCi0JCQk9PSBOVUxMKSB7Ci0JCQltZW0tPnBhZ2VzID0gcGFnZWNvdW50OwotCQkJRFBGKDEsICJjb3VsZG4ndCBhbGxvY2F0ZSBkbWEgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCURQRCgyLCAiVmlydHVhbCBBZGR4OiAlcFxuIiwgbWVtLT5hZGRyW3BhZ2Vjb3VudF0pOwotCi0JCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRTsgaSsrKSB7Ci0JCQlidXNhZGR4ID0gKHUzMikgbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0gKyBpICogRU1VUEFHRVNJWkU7Ci0KLQkJCURQRCgzLCAiQnVzIEFkZHg6ICUjeFxuIiwgYnVzYWRkeCk7Ci0KLQkJCXBhZ2VpbmRleCA9IG1lbS0+ZW11cGFnZWluZGV4ICsgcGFnZWNvdW50ICogUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkUgKyBpOwotCi0JCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2VpbmRleF0gPSBjcHVfdG9fbGUzMigoYnVzYWRkeCAqIDIpIHwgcGFnZWluZGV4KTsKLQkJfQotCX0KLQotCW1lbS0+cGFnZXMgPSBwYWdlY291bnQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBlbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyIC0KLSAqCi0gKiBmcmVlcyB0aGUgbWVtb3J5IGJ1ZmZlciBmb3IgYSB2b2ljZS4KLSAqLwotdm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB2b2ljZV9tZW0gKm1lbSkKLXsKLQl1MzIgcGFnZWNvdW50LCBwYWdlaW5kZXg7Ci0JaW50IGk7Ci0KLQlpZiAobWVtLT5lbXVwYWdlaW5kZXggPCAwKQotCQlyZXR1cm47Ci0KLQlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IG1lbS0+cGFnZXM7IHBhZ2Vjb3VudCsrKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFLAotCQkJCQltZW0tPmFkZHJbcGFnZWNvdW50XSwKLQkJCQkJbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0pOwotCi0JCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRTsgaSsrKSB7Ci0JCQlwYWdlaW5kZXggPSBtZW0tPmVtdXBhZ2VpbmRleCArIHBhZ2Vjb3VudCAqIFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFICsgaTsKLQkJCSgodTMyICopIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkcilbcGFnZWluZGV4XSA9Ci0JCQkJY3B1X3RvX2xlMzIoKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpIHwgcGFnZWluZGV4KTsKLQkJfQotCX0KLQotCWVtdTEwazFfYWRkeG1ncl9mcmVlKGNhcmQsIG1lbS0+ZW11cGFnZWluZGV4KTsKLQltZW0tPmVtdXBhZ2VpbmRleCA9IC0xOwotfQotCi1pbnQgZW11MTBrMV92b2ljZV9hbGxvYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSkKLXsKLQl1OCAqdm9pY2V0YWJsZSA9IGNhcmQtPnZvaWNldGFibGU7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV92b2ljZV9hbGxvYygpXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSArPSAyKQotCQkJaWYgKCh2b2ljZXRhYmxlW2ldID09IFZPSUNFX1VTQUdFX0ZSRUUpICYmICh2b2ljZXRhYmxlW2kgKyAxXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSkgewotCQkJCXZvaWNldGFibGVbaV0gPSB2b2ljZS0+dXNhZ2U7Ci0JCQkJdm9pY2V0YWJsZVtpICsgMV0gPSB2b2ljZS0+dXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9HOyBpKyspCi0JCQlpZiAodm9pY2V0YWJsZVtpXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSB7Ci0JCQkJdm9pY2V0YWJsZVtpXSA9IHZvaWNlLT51c2FnZTsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaSA+PSBOVU1fRykKLQkJcmV0dXJuIC0xOwotCi0Jdm9pY2UtPmNhcmQgPSBjYXJkOwotCXZvaWNlLT5udW0gPSBpOwotCi0JZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgewotCQlEUEQoMiwgIiB2b2ljZSBhbGxvY2F0ZWQgLT4gJWRcbiIsIHZvaWNlLT5udW0gKyBpKTsKLQotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLCBJRkFUTiwgMHhmZmZmLAotCQkJCQkJCURDWVNVU1YsIDAsCi0JCQkJCQkJVlRGVCwgMHgwMDAwZmZmZiwKLQkJCQkJCQlQVFJYLCAwLAotCQkJCQkJCVRBR0xJU1RfRU5EKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWUoc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHZvaWNlLT5jYXJkOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VfZnJlZSgpXG4iKTsKLQotCWlmICh2b2ljZS0+dXNhZ2UgPT0gVk9JQ0VfVVNBR0VfRlJFRSkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgewotCQlEUEQoMiwgIiB2b2ljZSByZWxlYXNlZCAtPiAlZFxuIiwgdm9pY2UtPm51bSArIGkpOwotCi0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGksIERDWVNVU1YsIDAsIAotCQkJCQkJCVZURlQsIDB4MDAwMGZmZmYsCi0JCQkJCQkJUFRSWF9QSVRDSFRBUkdFVCwgMCwKLQkJCQkJCQlDVkNGLCAweDAwMDBmZmZmLAotCQkJCQkJCS8vQ1BGLCAwLAotCQkJCQkJCVRBR0xJU1RfRU5EKTsKLQkJCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0gKyBpLCAwKTsKLQl9Ci0KLQl2b2ljZS0+dXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWNhcmQtPnZvaWNldGFibGVbdm9pY2UtPm51bV0gPSBWT0lDRV9VU0FHRV9GUkVFOwotCi0JaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykKLQkJY2FyZC0+dm9pY2V0YWJsZVt2b2ljZS0+bnVtICsgMV0gPSBWT0lDRV9VU0FHRV9GUkVFOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi12b2lkIGVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHZvaWNlLT5jYXJkOwotCXUzMiBzdGFydDsKLQlpbnQgaTsKLQotCURQRigyLCAiZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cCgpXG4iKTsKLQotCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKLQkJLyogU2V0IHN0ZXJlbyBiaXQgKi8KLQkJc3RhcnQgPSAyODsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSwgQ1BGX1NURVJFT19NQVNLKTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSArIDEsIENQRl9TVEVSRU9fTUFTSyk7Ci0JfSBlbHNlIHsKLQkJc3RhcnQgPSAzMDsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSwgMCk7Ci0JfQotCi0JaWYoISh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkpCi0JCXN0YXJ0ICo9IDI7Ci0KLQl2b2ljZS0+c3RhcnQgKz0gc3RhcnQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaSsrKSB7Ci0JCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0ZYUlQxLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcpOwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfRlhSVDIsIHZvaWNlLT5udW0gKyBpLCB2b2ljZS0+cGFyYW1zW2ldLnNlbmRfcm91dGluZzIpOwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsICBBX1NFTkRBTU9VTlRTLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX2hnZmUpOwotCQl9IGVsc2UgewotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEZYUlQsIHZvaWNlLT5udW0gKyBpLCB2b2ljZS0+cGFyYW1zW2ldLnNlbmRfcm91dGluZyA8PCAxNik7Ci0JCX0KLQotCQkvKiBTdG9wIENBICovCi0JCS8qIEFzc3VtcHRpb24gdGhhdCBQVCBpcyBhbHJlYWR5IDAgc28gbm8gaGFybSBvdmVyd3JpdGluZyAqLwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgUFRSWCwgdm9pY2UtPm51bSArIGksICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmKSA8PCA4KQotCQkJCXwgKCh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4ZmYwMCkgPj4gOCkpOwotCi0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGksCi0JCQkJLyogQ1NMLCBTVCwgQ0EgKi8KLQkJCQkgICAgRFNMLCB2b2ljZS0+ZW5kbG9vcCB8ICh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4ZmYwMDAwMDApLAotCQkJCSAgICBQU1NULCB2b2ljZS0+c3RhcnRsb29wIHwgKCh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4MDBmZjAwMDApIDw8IDgpLAotCQkJCSAgICBDQ0NBLCAodm9pY2UtPnN0YXJ0KSB8ICBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20oY2FyZCx2b2ljZSkgfAotCQkJCSAgICAgICAgKCh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkgPyAwIDogQ0NDQV84QklUU0VMRUNUKSwKLQkJCQkgICAgLyogQ2xlYXIgZmlsdGVyIGRlbGF5IG1lbW9yeSAqLwotCQkJCSAgICBaMSwgMCwKLQkJCQkgICAgWjIsIDAsCi0JCQkJICAgIC8qIEludmFsaWRhdGUgbWFwcyAqLwotCQkJCSAgICBNQVBBLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCi0JCQkJICAgIE1BUEIsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKLQkJCQkvKiBtb2R1bGF0aW9uIGVudmVsb3BlICovCi0JCQkJICAgIENWQ0YsIDB4MDAwMGZmZmYsCi0JCQkJICAgIFZURlQsIDB4MDAwMGZmZmYsCi0JCQkJICAgIEFUS0hMRE0sIDAsCi0JCQkJICAgIERDWVNVU00sIDB4MDA3ZiwKLQkJCQkgICAgTEZPVkFMMSwgMHg4MDAwLAotCQkJCSAgICBMRk9WQUwyLCAweDgwMDAsCi0JCQkJICAgIEZNTU9ELCAwLAotCQkJCSAgICBUUkVNRlJRLCAwLAotCQkJCSAgICBGTTJGUlEyLCAwLAotCQkJCSAgICBFTlZWQUwsIDB4ODAwMCwKLQkJCQkvKiB2b2x1bWUgZW52ZWxvcGUgKi8KLQkJCQkgICAgQVRLSExEViwgMHg3ZjdmLAotCQkJCSAgICBFTlZWT0wsIDB4ODAwMCwKLQkJCQkvKiBmaWx0ZXIgZW52ZWxvcGUgKi8KLQkJCQkgICAgUEVGRV9GSUxURVJBTU9VTlQsIDB4N2YsCi0JCQkJLyogcGl0Y2ggZW52ZWxvcGUgKi8KLQkJCQkgICAgUEVGRV9QSVRDSEFNT1VOVCwgMCwgVEFHTElTVF9FTkQpOwotCi0JCXZvaWNlLT5wYXJhbXNbaV0uZmNfdGFyZ2V0ID0gMHhmZmZmOwotCX0KLX0KLQotdm9pZCBlbXUxMGsxX3ZvaWNlc19zdGFydChzdHJ1Y3QgZW11X3ZvaWNlICpmaXJzdF92b2ljZSwgdW5zaWduZWQgaW50IG51bV92b2ljZXMsIGludCBzZXQpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpcnN0X3ZvaWNlLT5jYXJkOwotCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlOwotCXVuc2lnbmVkIGludCB2b2ljZW51bTsKLQlpbnQgajsKLQotCURQRigyLCAiZW11MTBrMV92b2ljZXNfc3RhcnQoKVxuIik7Ci0KLQlmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCBudW1fdm9pY2VzOyB2b2ljZW51bSsrKQotCXsKLQkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlbnVtOwotCi0JCWlmICghc2V0KSB7Ci0JCQl1MzIgY3JhLCBjY2lzLCBjcywgc2FtcGxlOwotCQkJaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgewotCQkJCWNyYSA9IDY0OwotCQkJCWNjaXMgPSAyODsKLQkJCQljcyA9IDQ7Ci0JCQl9IGVsc2UgewotCQkJCWNyYSA9IDY0OwotCQkJCWNjaXMgPSAzMDsKLQkJCQljcyA9IDI7Ci0JCQl9Ci0KLQkJCWlmKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTXzE2QklUKSB7Ci0JCQkJc2FtcGxlID0gMHgwMDAwMDAwMDsKLQkJCX0gZWxzZSB7Ci0JCQkJc2FtcGxlID0gMHg4MDgwODA4MDsJCQotCQkJCWNjaXMgKj0gMjsKLQkJCX0KLQotCQkJZm9yKGogPSAwOyBqIDwgY3M7IGorKykKLQkgICAgICAgIAkgICAgICAgIHNibGl2ZV93cml0ZXB0cihjYXJkLCBDRDAgKyBqLCB2b2ljZS0+bnVtLCBzYW1wbGUpOwotCi0JCQkvKiBSZXNldCBjYWNoZSAqLwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZS0+bnVtLCAwKTsKLQkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCi0JCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZS0+bnVtICsgMSwgMCk7Ci0KLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlLT5udW0sIGNyYSk7Ci0KLQkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCi0JCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9SRUFEQUREUkVTUywgdm9pY2UtPm51bSArIDEsIGNyYSk7Ci0KLQkJCS8qIEZpbGwgY2FjaGUgKi8KLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSwgY2Npcyk7Ci0JCX0KLQotCQlmb3IgKGogPSAwOyBqIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaisrKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBqLAotCQkJCSAgICBJRkFUTiwgKHZvaWNlLT5wYXJhbXNbal0uaW5pdGlhbF9mYyA8PCA4KSB8IHZvaWNlLT5wYXJhbXNbal0uaW5pdGlhbF9hdHRuLAotCQkJCSAgICBWVEZULCAodm9pY2UtPnBhcmFtc1tqXS52b2x1bWVfdGFyZ2V0IDw8IDE2KSB8IHZvaWNlLT5wYXJhbXNbal0uZmNfdGFyZ2V0LAotCQkJCSAgICBDVkNGLCAodm9pY2UtPnBhcmFtc1tqXS52b2x1bWVfdGFyZ2V0IDw8IDE2KSB8IHZvaWNlLT5wYXJhbXNbal0uZmNfdGFyZ2V0LAotCQkJCSAgICBEQ1lTVVNWLCAodm9pY2UtPnBhcmFtc1tqXS5ieWFtcGxfZW52X3N1c3RhaW4gPDwgOCkgfCB2b2ljZS0+cGFyYW1zW2pdLmJ5YW1wbF9lbnZfZGVjYXksCi0JCQkJICAgIFRBR0xJU1RfRU5EKTsKLQkKLQkJCWVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKGNhcmQsIHZvaWNlLT5udW0gKyBqKTsKLQkJfQotCX0KLQotCi0gICAgICAgIGZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IG51bV92b2ljZXM7IHZvaWNlbnVtKyspCi0JewotCQl2b2ljZSA9IGZpcnN0X3ZvaWNlICsgdm9pY2VudW07Ci0KLQkJZm9yIChqID0gMDsgaiA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGorKykgewotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFBUUlhfUElUQ0hUQVJHRVQsIHZvaWNlLT5udW0gKyBqLCB2b2ljZS0+cGl0Y2hfdGFyZ2V0KTsKLQotCQkJaWYgKGogPT0gMCkKLQkJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGX0NVUlJFTlRQSVRDSCwgdm9pY2UtPm51bSwgdm9pY2UtPnBpdGNoX3RhcmdldCk7Ci0KLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBJUCwgdm9pY2UtPm51bSArIGosIHZvaWNlLT5pbml0aWFsX3BpdGNoKTsKLQkJfQotCX0KLX0KLQotdm9pZCBlbXUxMGsxX3ZvaWNlc19zdG9wKHN0cnVjdCBlbXVfdm9pY2UgKmZpcnN0X3ZvaWNlLCBpbnQgbnVtX3ZvaWNlcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZmlyc3Rfdm9pY2UtPmNhcmQ7Ci0Jc3RydWN0IGVtdV92b2ljZSAqdm9pY2U7Ci0JdW5zaWduZWQgaW50IHZvaWNlX251bTsKLQlpbnQgajsKLQotCURQRigyLCAiZW11MTBrMV92b2ljZV9zdG9wKClcbiIpOwotCi0gICAgICAgIGZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgbnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCi0JewotCQl2b2ljZSA9IGZpcnN0X3ZvaWNlICsgdm9pY2VfbnVtOwotCi0JCWZvciAoaiA9IDA7IGogPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBqKyspIHsKLQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGosCi0JCQkJCQlQVFJYX1BJVENIVEFSR0VULCAwLAotCQkJCQkJQ1BGX0NVUlJFTlRQSVRDSCwgMCwKLQkJCQkJCUlGQVROLCAweGZmZmYsCi0JCQkJCQlWVEZULCAweDAwMDBmZmZmLAotCQkJCQkJQ1ZDRiwgMHgwMDAwZmZmZiwKLQkJCQkJCUlQLCAwLAotCQkJCQkJVEFHTElTVF9FTkQpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5oIGIvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5YThjYi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHNibGl2ZV92b2ljZS5oIC0tIEVNVSBWb2ljZSBSZXNvdXJjZSBNYW5hZ2VyIGhlYWRlciBmaWxlCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9WT0lDRU1HUl9ICi0jZGVmaW5lIF9WT0lDRU1HUl9ICi0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi0vKiBzdHJ1Y3QgZW11X3ZvaWNlLnVzYWdlIGZsYWdzICovCi0jZGVmaW5lIFZPSUNFX1VTQUdFX0ZSRUUJCTB4MDEKLSNkZWZpbmUgVk9JQ0VfVVNBR0VfTUlESQkJMHgwMgotI2RlZmluZSBWT0lDRV9VU0FHRV9QTEFZQkFDSwkJMHgwNAotCi0vKiBzdHJ1Y3QgZW11X3ZvaWNlLmZsYWdzIGZsYWdzICovCi0jZGVmaW5lIFZPSUNFX0ZMQUdTX1NURVJFTwkJMHgwMgotI2RlZmluZSBWT0lDRV9GTEFHU18xNkJJVAkJMHgwNAotCi1zdHJ1Y3Qgdm9pY2VfcGFyYW0KLXsKLQkvKiBGWCBidXMgYW1vdW50IHNlbmQgKi8KLQotCXUzMiBzZW5kX3JvdXRpbmc7Ci0JLy8gYXVkaWd5IG9ubHk6Ci0JdTMyIHNlbmRfcm91dGluZzI7Ci0KLQl1MzIgc2VuZF9kY2JhOwotCS8vIGF1ZGlneSBvbmx5OgotCXUzMiBzZW5kX2hnZmU7Ci0KLQotCXUzMiBpbml0aWFsX2ZjOwotCXUzMiBmY190YXJnZXQ7Ci0KLQl1MzIgaW5pdGlhbF9hdHRuOwotCXUzMiB2b2x1bWVfdGFyZ2V0OwotCi0JdTMyIGJ5YW1wbF9lbnZfc3VzdGFpbjsKLQl1MzIgYnlhbXBsX2Vudl9kZWNheTsKLX07Ci0KLXN0cnVjdCB2b2ljZV9tZW0gewotCWludCBlbXVwYWdlaW5kZXg7Ci0Jdm9pZCAqYWRkcltCVUZNQVhQQUdFU107Ci0JZG1hX2FkZHJfdCBkbWFfaGFuZGxlW0JVRk1BWFBBR0VTXTsKLQl1MzIgcGFnZXM7Ci19OwotCi1zdHJ1Y3QgZW11X3ZvaWNlCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQl1OCB1c2FnZTsJCS8qIEZyZWUsIE1JREksIHBsYXliYWNrICovCi0JdTggbnVtOwkJCS8qIFZvaWNlIElEICovCi0JdTggZmxhZ3M7CQkvKiBTdGVyZW8vbW9ubywgOC8xNiBiaXQgKi8KLQotCXUzMiBzdGFydGxvb3A7Ci0JdTMyIGVuZGxvb3A7Ci0JdTMyIHN0YXJ0OwotCi0JdTMyIGluaXRpYWxfcGl0Y2g7Ci0JdTMyIHBpdGNoX3RhcmdldDsKLQotCXN0cnVjdCB2b2ljZV9wYXJhbSBwYXJhbXNbMl07Ci0KLQlzdHJ1Y3Qgdm9pY2VfbWVtIG1lbTsKLX07Ci0KLWludCBlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB2b2ljZV9tZW0gKiwgdTMyKTsKLXZvaWQgZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB2b2ljZV9tZW0gKik7Ci1pbnQgZW11MTBrMV92b2ljZV9hbGxvYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdm9pY2UgKik7Ci12b2lkIGVtdTEwazFfdm9pY2VfZnJlZShzdHJ1Y3QgZW11X3ZvaWNlICopOwotdm9pZCBlbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKHN0cnVjdCBlbXVfdm9pY2UgKik7Ci12b2lkIGVtdTEwazFfdm9pY2VzX3N0YXJ0KHN0cnVjdCBlbXVfdm9pY2UgKiwgdW5zaWduZWQgaW50LCBpbnQpOwotdm9pZCBlbXUxMGsxX3ZvaWNlc19zdG9wKHN0cnVjdCBlbXVfdm9pY2UgKiwgaW50KTsKLQotI2VuZGlmIC8qIF9WT0lDRU1HUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXB1NDAxLmMgYi9zb3VuZC9vc3MvbXB1NDAxLmMKaW5kZXggMjc5NmMwZS4uYTY5MGNhNSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21wdTQwMS5jCisrKyBiL3NvdW5kL29zcy9tcHU0MDEuYwpAQCAtMTAwMyw3ICsxMDAzLDggQEAKIAkJfQogCQlpZiAoIWRldmMtPnNoYXJlZF9pcnEpCiAJCXsKLQkJCWlmIChyZXF1ZXN0X2lycShkZXZjLT5pcnEsIG1wdWludHIsIDAsICJtcHU0MDEiLCAodm9pZCAqKW0pIDwgMCkKKwkJCWlmIChyZXF1ZXN0X2lycShkZXZjLT5pcnEsIG1wdWludHIsIDAsICJtcHU0MDEiLAorCQkJCQlod19jb25maWcpIDwgMCkKIAkJCXsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IEZhaWxlZCB0byBhbGxvY2F0ZSBJUlElZFxuIiwgZGV2Yy0+aXJxKTsKIAkJCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTExMiw3ICsxMTEzLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2lycToKLQlmcmVlX2lycShkZXZjLT5pcnEsICh2b2lkICopbSk7CisJZnJlZV9pcnEoZGV2Yy0+aXJxLCBod19jb25maWcpOwogb3V0X21pZGlkZXY6CiAJc291bmRfdW5sb2FkX21pZGlkZXYobSk7CiBvdXRfZXJyOgpAQCAtMTIyNyw3ICsxMjI4LDcgQEAKIAlpZiAobiAhPSAtMSkgewogCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOwogCQlpZiAoaHdfY29uZmlnLT5hbHdheXNfZGV0ZWN0ID09IDAgJiYgaHdfY29uZmlnLT5pcnEgPiAwKQotCQkJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsICh2b2lkICopbik7CisJCQlmcmVlX2lycShod19jb25maWctPmlycSwgaHdfY29uZmlnKTsKIAkJcD1tcHU0MDFfc3ludGhfb3BlcmF0aW9uc1tuXTsKIAkJc291bmRfdW5sb2FkX21pZGlkZXYobik7CiAJCXNvdW5kX3VubG9hZF90aW1lcmRldihod19jb25maWctPnNsb3RzWzJdKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Ni5oIGIvc291bmQvb3NzL25tMjU2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYWRlOTAuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL25tMjU2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotI2lmbmRlZiBfTk0yNTZfSF8KLSNkZWZpbmUgX05NMjU2X0hfCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSAiYWM5Ny5oIgotCi0vKiBUaGUgcmV2aXNpb25zIHRoYXQgd2UgY3VycmVudGx5IGhhbmRsZS4gICovCi1lbnVtIG5tMjU2cmV2IHsKLSAgICBSRVZfTk0yNTZBViwgUkVWX05NMjU2WlgKLX07Ci0KLS8qIFBlci1jYXJkIHN0cnVjdHVyZS4gKi8KLXN0cnVjdCBubTI1Nl9pbmZvIAotewotICAgIC8qIE1hZ2ljIG51bWJlciB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoaXMgc3RydWN0IGlzIHZhbGlkLiAqLwotI2RlZmluZSBOTV9NQUdJQ19TSUcgMHg1NWFhMDBmZgotICAgIGludCBtYWdzaWc7Ci0KLSAgICAvKiBSZXZpc2lvbiBudW1iZXIgKi8KLSAgICBlbnVtIG5tMjU2cmV2IHJldjsKLQotICAgIHN0cnVjdCBhYzk3X2h3aW50IG1kZXY7Ci0KLSAgICAvKiBPdXIgYXVkaW8gZGV2aWNlIG51bWJlcnMuICovCi0gICAgaW50IGRldlsyXTsKLQotICAgIC8qIFRoZSAjIG9mIHRpbWVzIGVhY2ggZGV2aWNlIGhhcyBiZWVuIG9wZW5lZC4gKFNob3VsZCBvbmx5IGJlIAotICAgICAgIDAgb3IgMSkuICovCi0gICAgaW50IG9wZW5jbnRbMl07Ci0KLSAgICAvKiBXZSB1c2UgdHdvIGRldmljZXMsIGJlY2F1c2Ugd2UgY2FuIGRvIHNpbXVsdGFuZW91cyBwbGF5IGFuZCByZWNvcmQuCi0gICAgICAgVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCBkZXZpY2UgaXMgYmVpbmcgdXNlZCBmb3Igd2hhdCBwdXJwb3NlOwotICAgICAgIHRoZXNlIGFyZSB0aGUgYWN0dWFsIGRldmljZSBudW1iZXJzLiAqLwotICAgIGludCBkZXZfZm9yX3BsYXk7Ci0gICAgaW50IGRldl9mb3JfcmVjb3JkOwotCi0Jc3BpbmxvY2tfdCBsb2NrOwotCQotICAgIC8qIFRoZSBtaXhlciBkZXZpY2UuICovCi0gICAgaW50IG1peGVyX29zc19kZXY7Ci0KLSAgICAvKiAKLSAgICAgKiBDYW4gb25seSBiZSBvcGVuZWQgb25jZSBmb3IgZWFjaCBvcGVyYXRpb24uICBUaGVzZSBhcmVuJ3Qgc2V0Ci0gICAgICogdW50aWwgYW4gYWN0dWFsIEkvTyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkOyB0aGlzIGFsbG93cyBvbmUKLSAgICAgKiBkZXZpY2UgdG8gYmUgb3BlbiBmb3IgcmVhZC93cml0ZSB3aXRob3V0IGluaGliaXRpbmcgSS9PIHRvCi0gICAgICogdGhlIG90aGVyIGRldmljZS4KLSAgICAgKi8KLSAgICBpbnQgaXNfb3Blbl9wbGF5OwotICAgIGludCBpc19vcGVuX3JlY29yZDsKLQotICAgIC8qIE5vbi16ZXJvIGlmIHdlJ3JlIGN1cnJlbnRseSBwbGF5aW5nIGEgc2FtcGxlLiAqLwotICAgIGludCBwbGF5aW5nOwotICAgIC8qIERpdHRvIGZvciByZWNvcmRpbmcgYSBzYW1wbGUuICovCi0gICAgaW50IHJlY29yZGluZzsKLQotICAgIC8qIFRoZSB0d28gbWVtb3J5IHBvcnRzLiAgKi8KLSAgICBzdHJ1Y3Qgbm0yNTZfcG9ydHMgewotCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBvcnQuICovCi0JdTMyIHBoeXNhZGRyOwotCS8qIE91ciBtYXBwZWQtaW4gcG9pbnRlci4gKi8KLQljaGFyIF9faW9tZW0gKnB0cjsKLQkvKiBQVFIncyBvZmZzZXQgd2l0aGluIHRoZSBwaHlzaWNhbCBwb3J0LiAgKi8KLQl1MzIgc3RhcnRfb2Zmc2V0OwotCS8qIEFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gICovCi0JdTMyIGVuZF9vZmZzZXQ7Ci0gICAgfSBwb3J0WzJdOwotCi0gICAgLyogVGhlIGZvbGxvd2luZyBhcmUgb2Zmc2V0cyB3aXRoaW4gbWVtb3J5IHBvcnQgMS4gKi8KLSAgICB1MzIgY29lZmZCdWY7Ci0gICAgdTMyIGFsbENvZWZmQnVmOwotCi0gICAgLyogUmVjb3JkIGFuZCBwbGF5YmFjayBidWZmZXJzLiAqLwotICAgIHUzMiBhYnVmMSwgYWJ1ZjI7Ci0KLSAgICAvKiBPZmZzZXQgb2YgdGhlIEFDOTcgbWl4ZXIgaW4gbWVtb3J5IHBvcnQgMi4gKi8KLSAgICB1MzIgbWl4ZXI7Ci0KLSAgICAvKiBPZmZzZXQgb2YgdGhlIG1peGVyIHN0YXR1cyByZWdpc3RlciBpbiBtZW1vcnkgcG9ydCAyLiAgKi8KLSAgICB1MzIgbWl4ZXJfc3RhdHVzX29mZnNldDsKLQotICAgIC8qIE5vbi16ZXJvIGlmIHdlIGhhdmUgd3JpdHRlbiBpbml0aWFsIHZhbHVlcyB0byB0aGUgbWl4ZXIuICovCi0gICAgdTggbWl4ZXJfdmFsdWVzX2luaXQ7Ci0KLSAgICAvKiAKLSAgICAgKiBTdGF0dXMgbWFzayBiaXQ7ICgqbWl4ZXJfc3RhdHVzX2xvYyAmIG1peGVyX3N0YXR1c19tYXNrKSA9PSAwIG1lYW5zCi0gICAgICogaXQncyByZWFkeS4gIAotICAgICAqLwotICAgIHUxNiBtaXhlcl9zdGF0dXNfbWFzazsKLQotICAgIC8qIFRoZSBzaXplcyBvZiB0aGUgcGxheWJhY2sgYW5kIHJlY29yZCByaW5nIGJ1ZmZlcnMuICovCi0gICAgdTMyIHBsYXliYWNrQnVmZmVyU2l6ZTsKLSAgICB1MzIgcmVjb3JkQnVmZmVyU2l6ZTsKLQotICAgIC8qIEFyZSB0aGUgY29lZmZpY2llbnQgdmFsdWVzIGluIHRoZSBtZW1vcnkgY2FjaGUgY3VycmVudD8gKi8KLSAgICB1OCBjb2VmZnNDdXJyZW50OwotCi0gICAgLyogRm9yIHdyaXRlcywgdGhlIGFtb3VudCB3ZSBsYXN0IHdyb3RlLiAqLwotICAgIHUzMiByZXF1ZXN0ZWRfYW10OwotICAgIC8qIFRoZSBzdGFydCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHBsYXlpbmcuICovCi0gICAgdTMyIGN1clBsYXlQb3M7Ci0KLSAgICAvKiBUaGUgYW1vdW50IG9mIGRhdGEgd2Ugd2VyZSByZXF1ZXN0ZWQgdG8gcmVjb3JkLiAqLwotICAgIHUzMiByZXF1ZXN0ZWRSZWNBbXQ7Ci0gICAgLyogVGhlIG9mZnNldCBvZiB0aGUgY3VycmVudGx5LXJlY29yZGluZyBibG9jay4gKi8KLSAgICB1MzIgY3VyUmVjUG9zOwotICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICovCi0gICAgY2hhciAqcmVjQnVmOwotCi0gICAgLyogT3VyIElSUSBudW1iZXIuICovCi0gICAgaW50IGlycTsKLQotICAgIC8qIEEgZmxhZyBpbmRpY2F0aW5nIGhvdyBtYW55IHRpbWVzIHdlJ3ZlIGdyYWJiZWQgdGhlIElSUS4gKi8KLSAgICBpbnQgaGFzX2lycTsKLQotICAgIC8qIFRoZSBjYXJkIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICovCi0gICAgaXJxX2hhbmRsZXJfdCBpbnRyb3V0aW5lOwotCi0gICAgLyogQ3VycmVudCBhdWRpbyBjb25maWcsIGNhY2hlZC4gKi8KLSAgICBzdHJ1Y3Qgc2luZm8gewotCXUzMiBzYW1wbGVyYXRlOwotCXU4IGJpdHM7Ci0JdTggc3RlcmVvOwotICAgIH0gc2luZm9bMl07IC8qIGdvZXMgd2l0aCBlYWNoIGRldmljZSAqLwotCi0gICAgLyogVGhlIGNhcmRzIGFyZSBzdG9yZWQgaW4gYSBjaGFpbjsgIHRoaXMgaXMgdGhlIG5leHQgY2FyZC4gKi8KLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqbmV4dF9jYXJkOwotfTsKLQotLyogVGhlIEJJT1Mgc2lnbmF0dXJlLiAqLwotI2RlZmluZSBOTV9TSUdOQVRVUkUgMHg0ZTRkMDAwMAotLyogU2lnbmF0dXJlIG1hc2suICovCi0jZGVmaW5lIE5NX1NJR19NQVNLIDB4ZmZmZjAwMDAKLQotLyogU2l6ZSBvZiB0aGUgc2Vjb25kIG1lbW9yeSBhcmVhLiAqLwotI2RlZmluZSBOTV9QT1JUMl9TSVpFIDQwOTYKLQotLyogVGhlIGJhc2Ugb2Zmc2V0IG9mIHRoZSBtaXhlciBpbiB0aGUgc2Vjb25kIG1lbW9yeSBhcmVhLiAqLwotI2RlZmluZSBOTV9NSVhFUl9PRkZTRVQgMHg2MDAKLQotLyogVGhlIG1heGltdW0gc2l6ZSBvZiBhIGNvZWZmaWNpZW50IGVudHJ5LiAqLwotI2RlZmluZSBOTV9NQVhfQ09FRkZJQ0lFTlQgMHg1MDAwCi0KLS8qIFRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIuICovCi0jZGVmaW5lIE5NX0lOVF9SRUcgMHhhMDQKLS8qIEFuZCBpdHMgYml0cy4gKi8KLSNkZWZpbmUgTk1fUExBWUJBQ0tfSU5UIDB4NDAKLSNkZWZpbmUgTk1fUkVDT1JEX0lOVCAweDEwMAotI2RlZmluZSBOTV9NSVNDX0lOVF8xIDB4NDAwMAotI2RlZmluZSBOTV9NSVNDX0lOVF8yIDB4MQotI2RlZmluZSBOTV9BQ0tfSU5UKENBUkQsIFgpIG5tMjU2X3dyaXRlUG9ydDE2KChDQVJEKSwgMiwgTk1fSU5UX1JFRywgKFgpIDw8IDEpCi0KLS8qIFRoZSBBVidzICJtaXhlciByZWFkeSIgc3RhdHVzIGJpdCBhbmQgbG9jYXRpb24uICovCi0jZGVmaW5lIE5NX01JWEVSX1NUQVRVU19PRkZTRVQgMHhhMDQKLSNkZWZpbmUgTk1fTUlYRVJfUkVBRFlfTUFTSyAweDA4MDAKLSNkZWZpbmUgTk1fTUlYRVJfUFJFU0VOQ0UgMHhhMDYKLSNkZWZpbmUgTk1fUFJFU0VOQ0VfTUFTSyAweDAwNTAKLSNkZWZpbmUgTk1fUFJFU0VOQ0VfVkFMVUUgMHgwMDQwCi0KLS8qCi0gKiBGb3IgdGhlIFpYLiAgSXQgdXNlcyB0aGUgc2FtZSBpbnRlcnJ1cHQgcmVnaXN0ZXIsIGJ1dCBpdCBob2xkcyAzMgotICogYml0cyBpbnN0ZWFkIG9mIDE2LgotICovCi0jZGVmaW5lIE5NMl9QTEFZQkFDS19JTlQgMHgxMDAwMAotI2RlZmluZSBOTTJfUkVDT1JEX0lOVCAweDgwMDAwCi0jZGVmaW5lIE5NMl9NSVNDX0lOVF8xIDB4OAotI2RlZmluZSBOTTJfTUlTQ19JTlRfMiAweDIKLSNkZWZpbmUgTk0yX0FDS19JTlQoQ0FSRCwgWCkgbm0yNTZfd3JpdGVQb3J0MzIoKENBUkQpLCAyLCBOTV9JTlRfUkVHLCAoWCkpCi0KLS8qIFRoZSBaWCdzICJtaXhlciByZWFkeSIgc3RhdHVzIGJpdCBhbmQgbG9jYXRpb24uICovCi0jZGVmaW5lIE5NMl9NSVhFUl9TVEFUVVNfT0ZGU0VUIDB4YTA2Ci0jZGVmaW5lIE5NMl9NSVhFUl9SRUFEWV9NQVNLIDB4MDgwMAotCi0vKiBUaGUgcGxheWJhY2sgcmVnaXN0ZXJzIHN0YXJ0IGZyb20gaGVyZS4gKi8KLSNkZWZpbmUgTk1fUExBWUJBQ0tfUkVHX09GRlNFVCAweDAKLS8qIFRoZSByZWNvcmQgcmVnaXN0ZXJzIHN0YXJ0IGZyb20gaGVyZS4gKi8KLSNkZWZpbmUgTk1fUkVDT1JEX1JFR19PRkZTRVQgMHgyMDAKLQotLyogVGhlIHJhdGUgcmVnaXN0ZXIgaXMgbG9jYXRlZCAyIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZWdpc3RlciBhcmVhLiAqLwotI2RlZmluZSBOTV9SQVRFX1JFR19PRkZTRVQgMgotCi0vKiBNb25vL3N0ZXJlbyBmbGFnLCBudW1iZXIgb2YgYml0cyBvbiBwbGF5YmFjaywgYW5kIHJhdGUgbWFzay4gKi8KLSNkZWZpbmUgTk1fUkFURV9TVEVSRU8gMQotI2RlZmluZSBOTV9SQVRFX0JJVFNfMTYgMgotI2RlZmluZSBOTV9SQVRFX01BU0sgMHhmMAotCi0vKiBQbGF5YmFjayBlbmFibGUgcmVnaXN0ZXIuICovCi0jZGVmaW5lIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDEpCi0jZGVmaW5lIE5NX1BMQVlCQUNLX0VOQUJMRV9GTEFHIDEKLSNkZWZpbmUgTk1fUExBWUJBQ0tfT05FU0hPVCAyCi0jZGVmaW5lIE5NX1BMQVlCQUNLX0ZSRUVSVU4gNAotCi0vKiBNdXRlcyB0aGUgYXVkaW8gb3V0cHV0LiAqLwotI2RlZmluZSBOTV9BVURJT19NVVRFX1JFRyAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MTgpCi0jZGVmaW5lIE5NX0FVRElPX01VVEVfTEVGVCAweDgwMDAKLSNkZWZpbmUgTk1fQVVESU9fTVVURV9SSUdIVCAweDAwODAKLQotLyogUmVjb3JkaW5nIGVuYWJsZSByZWdpc3Rlci4gKi8KLSNkZWZpbmUgTk1fUkVDT1JEX0VOQUJMRV9SRUcgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMCkKLSNkZWZpbmUgTk1fUkVDT1JEX0VOQUJMRV9GTEFHIDEKLSNkZWZpbmUgTk1fUkVDT1JEX0ZSRUVSVU4gMgotCi0jZGVmaW5lIE5NX1JCVUZGRVJfU1RBUlQgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHg0KQotI2RlZmluZSBOTV9SQlVGRkVSX0VORCAgIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4MTApCi0jZGVmaW5lIE5NX1JCVUZGRVJfV01BUksgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHhjKQotI2RlZmluZSBOTV9SQlVGRkVSX0NVUlJQIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4OCkKLQotI2RlZmluZSBOTV9QQlVGRkVSX1NUQVJUIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHg0KQotI2RlZmluZSBOTV9QQlVGRkVSX0VORCAgIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxNCkKLSNkZWZpbmUgTk1fUEJVRkZFUl9XTUFSSyAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4YykKLSNkZWZpbmUgTk1fUEJVRkZFUl9DVVJSUCAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4OCkKLQotLyogQSBmZXcgdHJpdmlhbCByb3V0aW5lcyB0byBtYWtlIGl0IGVhc2llciB0byB3b3JrIHdpdGggdGhlIHJlZ2lzdGVycwotICAgb24gdGhlIGNoaXAuICovCi0KLS8qIFRoaXMgaXMgYSBjb21tb24gY29kZSBwb3J0aW9uIHVzZWQgdG8gZml4IHVwIHRoZSBwb3J0IG9mZnNldHMuICovCi0jZGVmaW5lIE5NX0ZJWF9QT1JUIFwKLSAgaWYgKHBvcnQgPCAxIHx8IHBvcnQgPiAyIHx8IGNhcmQgPT0gTlVMTCkgXAotICAgICAgcmV0dXJuIC0xOyBcCi1cCi0gICAgaWYgKG9mZnNldCA8IGNhcmQtPnBvcnRbcG9ydCAtIDFdLnN0YXJ0X29mZnNldCBcCi0JfHwgb2Zmc2V0ID49IGNhcmQtPnBvcnRbcG9ydCAtIDFdLmVuZF9vZmZzZXQpIHsgXAotCXByaW50ayAoS0VSTl9FUlIgIkJhZCBhY2Nlc3M6IHBvcnQgJWQsIG9mZnNldCAweCV4XG4iLCBwb3J0LCBvZmZzZXQpOyBcCi0JcmV0dXJuIC0xOyBcCi0gICAgfSBcCi0gICAgb2Zmc2V0IC09IGNhcmQtPnBvcnRbcG9ydCAtIDFdLnN0YXJ0X29mZnNldDsKLQotI2RlZmluZSBERUZ3cml0ZVBvcnRYKFgsIGZ1bmMpIFwKLXN0YXRpYyBpbmxpbmUgaW50IG5tMjU2X3dyaXRlUG9ydCMjWCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsXAotCQkJCSAgICAgIGludCBwb3J0LCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpXAote1wKLSAgICB1IyNYIF9faW9tZW0gKmFkZHI7XAotXAotICAgIGlmIChubTI1Nl9kZWJ1ZyA+IDEpXAotICAgICAgICBwcmludGsgKEtFUk5fREVCVUcgIldyaXRpbmcgMHgleCB0byAlZDoweCV4XG4iLCB2YWx1ZSwgcG9ydCwgb2Zmc2V0KTtcCi1cCi0gICAgTk1fRklYX1BPUlQ7XAotXAotICAgIGFkZHIgPSAodSMjWCBfX2lvbWVtICopKGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCk7XAotICAgIGZ1bmMgKHZhbHVlLCBhZGRyKTtcCi0gICAgcmV0dXJuIDA7XAotfQotCi1ERUZ3cml0ZVBvcnRYICg4LCB3cml0ZWIpCi1ERUZ3cml0ZVBvcnRYICgxNiwgd3JpdGV3KQotREVGd3JpdGVQb3J0WCAoMzIsIHdyaXRlbCkKLQotI2RlZmluZSBERUZyZWFkUG9ydFgoWCwgZnVuYykgXAotc3RhdGljIGlubGluZSB1IyNYIG5tMjU2X3JlYWRQb3J0IyNYIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCxcCi0JCQkJCWludCBwb3J0LCBpbnQgb2Zmc2V0KVwKLXtcCi0gICAgdSMjWCBfX2lvbWVtICphZGRyO1wKLVwKLSAgICBOTV9GSVhfUE9SVFwKLVwKLSAgICBhZGRyID0gKHUjI1ggX19pb21lbSAqKShjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQpO1wKLSAgICByZXR1cm4gZnVuYyhhZGRyKTtcCi19Ci0KLURFRnJlYWRQb3J0WCAoOCwgcmVhZGIpCi1ERUZyZWFkUG9ydFggKDE2LCByZWFkdykKLURFRnJlYWRQb3J0WCAoMzIsIHJlYWRsKQotCi1zdGF0aWMgaW5saW5lIGludAotbm0yNTZfd3JpdGVCdWZmZXI4IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgdTggKnNyYywgaW50IHBvcnQsIGludCBvZmZzZXQsCi0JCSAgICAgIGludCBhbXQpCi17Ci0gICAgTk1fRklYX1BPUlQ7Ci0gICAgbWVtY3B5X3RvaW8gKGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCwgc3JjLCBhbXQpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotbm0yNTZfcmVhZEJ1ZmZlcjggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCB1OCAqZHN0LCBpbnQgcG9ydCwgaW50IG9mZnNldCwKLQkJICAgICBpbnQgYW10KQotewotICAgIE5NX0ZJWF9QT1JUOwotICAgIG1lbWNweV9mcm9taW8gKGRzdCwgY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0LCBhbXQpOwotICAgIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgY29lZmZpY2llbnQgY2FjaGUuICovCi1zdGF0aWMgaW50IG5tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpOwotCi0jZW5kaWYKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYyBiL3NvdW5kL29zcy9ubTI1Nl9hdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGNkMTU1Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9ubTI1Nl9hdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MiArMCwwIEBACi0vKiAKLSAqIEF1ZGlvIGRyaXZlciBmb3IgdGhlIE5lb01hZ2ljIDI1NkFWIGFuZCAyNTZaWCBjaGlwc2V0cyBpbiBuYXRpdmUKLSAqIG1vZGUsIHdpdGggQUM5NyBtaXhlciBzdXBwb3J0LgotICoKLSAqIE92ZXJhbGwgZGVzaWduIGFuZCBwYXJ0cyBvZiB0aGlzIGNvZGUgc3RvbGVuIGZyb20gdmlkY18qLmMgYW5kCi0gKiBza2VsZXRvbi5jLgotICoKLSAqIFllYWgsIHRoZXJlIGFyZSBhIGxvdCBvZiBtYWdpYyBjb25zdGFudHMgaW4gaGVyZS4gIFlvdSB0ZWxsIE1FIHdoYXQKLSAqIHRoZXkgYXJlLiAgSSBqdXN0IGdldCB0aGlzIHN0dWZmIHBzeWNoaWNhbGx5LCByZW1lbWJlcj8gCi0gKgotICogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gYnkgc29tZW9uZSB3aG8gd2lzaGVzIHRvIHJlbWFpbiBhbm9ueW1vdXMuIAotICogSXQgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIHNoYXJlIGFuZCBlbmpveS4gIFRyeSB0byBtYWtlIGEgcHJvZml0Ci0gKiBvZmYgb2YgaXQ7IGdvIG9uLCBJIGRhcmUgeW91LiAgCi0gKgotICogQ2hhbmdlczoKLSAqIDExLTEwLTIwMDAJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+Ci0gKgkJQWRkZWQgc29tZSBfX2luaXQKLSAqIDE5LTA0LTIwMDEJTWFyY3VzIE1laXNzbmVyIDxtbUBjYWxkZXJhLmRlPgotICoJCVBvcnRlZCB0byAyLjQgUENJIEFQSS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotc3RhdGljIGludCBubTI1Nl9kZWJ1ZzsKLXN0YXRpYyBpbnQgZm9yY2VfbG9hZDsKLQotI2luY2x1ZGUgIm5tMjU2LmgiCi0jaW5jbHVkZSAibm0yNTZfY29lZmYuaCIKLQotLyogCi0gKiBUaGUgc2l6ZSBvZiB0aGUgcGxheWJhY2sgcmVzZXJ2ZS4gIFdoZW4gdGhlIHBsYXliYWNrIGJ1ZmZlciBoYXMgbGVzcwotICogdGhhbiBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUgYnl0ZXMgdG8gb3V0cHV0LCB3ZSByZXF1ZXN0IGEgbmV3Ci0gKiBidWZmZXIuCi0gKi8KLSNkZWZpbmUgTk0yNTZfUExBWV9XTUFSS19TSVpFIDUxMgotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBubTI1Nl9hdWRpb19kcml2ZXI7Ci0KLXN0YXRpYyBpbnQgbm0yNTZfZ3JhYkludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpOwotc3RhdGljIGludCBubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgbm0yNTZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotc3RhdGljIGlycXJldHVybl90IG5tMjU2X2ludGVycnVwdF96eCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLQotLyogVGhlc2UgYmVsb25nIGluIGxpbnV4L3BjaS5oLiAqLwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8gMHg4MDA1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTyAweDgwMDYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU8gMHg4MDE2Ci0KLS8qIExpc3Qgb2YgY2FyZHMuICAqLwotc3RhdGljIHN0cnVjdCBubTI1Nl9pbmZvICpubWNhcmRfbGlzdDsKLQotLyogUmVsZWFzZSB0aGUgbWFwcGVkLWluIG1lbW9yeSBmb3IgQ0FSRC4gICovCi1zdGF0aWMgdm9pZAotbm0yNTZfcmVsZWFzZV9wb3J0cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JaWYgKGNhcmQtPnBvcnRbeF0ucHRyICE9IE5VTEwpIHsKLQkgICAgaW91bm1hcCAoY2FyZC0+cG9ydFt4XS5wdHIpOwotCSAgICBjYXJkLT5wb3J0W3hdLnB0ciA9IE5VTEw7Ci0JfQotICAgIH0KLX0KLQotLyogCi0gKiBNYXAgaW4gdGhlIG1lbW9yeSBwb3J0cyBmb3IgQ0FSRCwgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeSBtYXBwZWQgaW4KLSAqIGFuZCBoYXZlIGJlZW4gY29uZmlndXJlZC4gIElmIHN1Y2Nlc3NmdWwsIGEgemVybyB2YWx1ZSBpcyByZXR1cm5lZDsKLSAqIG90aGVyd2lzZSBhbnkgcHJldmlvdXNseSBtYXBwZWQtaW4gYXJlYXMgYXJlIHJlbGVhc2VkIGFuZCBhIG5vbi16ZXJvCi0gKiB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqCi0gKiBUaGlzIGlzIGludm9rZWQgdHdpY2UsIG9uY2UgZm9yIGVhY2ggcG9ydC4gIElkZWFsbHkgaXQgd291bGQgb25seSBiZQotICogY2FsbGVkIG9uY2UsIGJ1dCB3ZSBub3cgbmVlZCB0byBtYXAgaW4gdGhlIHNlY29uZCBwb3J0IGluIG9yZGVyIHRvCi0gKiBjaGVjayBob3cgbXVjaCBtZW1vcnkgdGhlIGNhcmQgaGFzIG9uIHRoZSAyNTZaWC4KLSAqLwotc3RhdGljIGludAotbm0yNTZfcmVtYXBfcG9ydHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotCWlmIChjYXJkLT5wb3J0W3hdLnB0ciA9PSBOVUxMICYmIGNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCA+IDApIHsKLQkgICAgdTMyIHBoeXNhZGRyIAotCQk9IGNhcmQtPnBvcnRbeF0ucGh5c2FkZHIgKyBjYXJkLT5wb3J0W3hdLnN0YXJ0X29mZnNldDsKLQkgICAgdTMyIHNpemUgCi0JCT0gY2FyZC0+cG9ydFt4XS5lbmRfb2Zmc2V0IC0gY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQ7Ci0KLQkgICAgY2FyZC0+cG9ydFt4XS5wdHIgPSBpb3JlbWFwX25vY2FjaGUgKHBoeXNhZGRyLCBzaXplKTsKLQkJCQkJCSAgCi0JICAgIGlmIChjYXJkLT5wb3J0W3hdLnB0ciA9PSBOVUxMKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBVbmFibGUgdG8gcmVtYXAgcG9ydCAlZFxuIiwgeCArIDEpOwotCQlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogTG9jYXRlIHRoZSBjYXJkIGluIG91ciBsaXN0LiAqLwotc3RhdGljIHN0cnVjdCBubTI1Nl9pbmZvICoKLW5tMjU2X2ZpbmRfY2FyZCAoaW50IGRldikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKLQotICAgIGZvciAoY2FyZCA9IG5tY2FyZF9saXN0OyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0X2NhcmQpCi0JaWYgKGNhcmQtPmRldlswXSA9PSBkZXYgfHwgY2FyZC0+ZGV2WzFdID09IGRldikKLQkgICAgcmV0dXJuIGNhcmQ7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIERpdHRvLCBidXQgZmluZCB0aGUgY2FyZCBzdHJ1Y3QgY29ycmVzcG9uZGluZyB0byB0aGUgbWl4ZXIgZGV2aWNlIERFViAKLSAqIGluc3RlYWQuIAotICovCi1zdGF0aWMgc3RydWN0IG5tMjU2X2luZm8gKgotbm0yNTZfZmluZF9jYXJkX2Zvcl9taXhlciAoaW50IGRldikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKLQotICAgIGZvciAoY2FyZCA9IG5tY2FyZF9saXN0OyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0X2NhcmQpCi0JaWYgKGNhcmQtPm1peGVyX29zc19kZXYgPT0gZGV2KQotCSAgICByZXR1cm4gY2FyZDsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHVzZWNhY2hlOwotc3RhdGljIGludCBidWZmZXJ0b3A7Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSB1c2luZyB0aGUgYmFuayBvZiBjYWNoZWQgY29lZmZpY2llbnRzLiAqLwotc3RhdGljIGludAotbm0yNTZfY2FjaGVkQ29lZmZpY2llbnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICByZXR1cm4gdXNlY2FjaGU7Ci19Ci0KLS8qIFRoZSBhY3R1YWwgcmF0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkLiAqLwotc3RhdGljIGludCBzYW1wbGVyYXRlc1s5XSA9IHsKLSAgICA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgOTk5OTk5OTkKLX07Ci0KLS8qCi0gKiBTZXQgdGhlIGNhcmQgc2FtcGxlcmF0ZSwgd29yZCBzaXplIGFuZCBzdGVyZW8gbW9kZSB0byBjb3JyZXNwb25kIHRvCi0gKiB0aGUgc2V0dGluZ3MgaW4gdGhlIENBUkQgc3RydWN0IGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSBpbiBERVYuCi0gKiBXZSBrZWVwIHR3byBzZXBhcmF0ZSBzZXRzIG9mIGluZm9ybWF0aW9uLCBvbmUgZm9yIGVhY2ggZGV2aWNlOyB0aGUKLSAqIGhhcmR3YXJlIGlzIG5vdCBhY3R1YWxseSBjb25maWd1cmVkIHVudGlsIGEgcmVhZCBvciB3cml0ZSBpcwotICogYXR0ZW1wdGVkLgotICovCi0KLXN0YXRpYyBpbnQKLW5tMjU2X3NldEluZm8gKGludCBkZXYsIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGludCB4OwotICAgIGludCB3OwotICAgIGludCB0YXJnZXRyYXRlOwotCi0gICAgaWYgKGNhcmQtPmRldlswXSA9PSBkZXYpCi0JdyA9IDA7Ci0gICAgZWxzZSBpZiAoY2FyZC0+ZGV2WzFdID09IGRldikKLQl3ID0gMTsKLSAgICBlbHNlCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICB0YXJnZXRyYXRlID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKLQotICAgIGlmICgoY2FyZC0+c2luZm9bd10uYml0cyAhPSA4ICYmIGNhcmQtPnNpbmZvW3ddLmJpdHMgIT0gMTYpCi0JfHwgdGFyZ2V0cmF0ZSA8IHNhbXBsZXJhdGVzWzBdCi0JfHwgdGFyZ2V0cmF0ZSA+IHNhbXBsZXJhdGVzWzddKQotCXJldHVybiAtRUlOVkFMOwotCi0gICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKLQlpZiAodGFyZ2V0cmF0ZSA8ICgoc2FtcGxlcmF0ZXNbeF0gKyBzYW1wbGVyYXRlc1t4ICsgMV0pIC8gMikpCi0JICAgIGJyZWFrOwotCi0gICAgaWYgKHggPCA4KSB7Ci0JdTggcmF0ZWJpdHMgPSAoKHggPDwgNCkgJiBOTV9SQVRFX01BU0spOwotCWlmIChjYXJkLT5zaW5mb1t3XS5iaXRzID09IDE2KQotCSAgICByYXRlYml0cyB8PSBOTV9SQVRFX0JJVFNfMTY7Ci0JaWYgKGNhcmQtPnNpbmZvW3ddLnN0ZXJlbykKLQkgICAgcmF0ZWJpdHMgfD0gTk1fUkFURV9TVEVSRU87Ci0KLQljYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZXNbeF07Ci0KLQotCWlmIChjYXJkLT5kZXZfZm9yX3BsYXkgPT0gZGV2ICYmIGNhcmQtPnBsYXlpbmcpIHsKLQkgICAgaWYgKG5tMjU2X2RlYnVnKQotCQlwcmludGsgKEtFUk5fREVCVUcgIlNldHRpbmcgcGxheSByYXRlYml0cyB0byAweCV4XG4iLAotCQkJcmF0ZWJpdHMpOwotCSAgICBubTI1Nl9sb2FkQ29lZmZpY2llbnQgKGNhcmQsIDAsIHgpOwotCSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLAotCQkJICAgICAgTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIE5NX1JBVEVfUkVHX09GRlNFVCwKLQkJCSAgICAgIHJhdGViaXRzKTsKLQl9Ci0KLQlpZiAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPT0gZGV2ICYmIGNhcmQtPnJlY29yZGluZykgewotCSAgICBpZiAobm0yNTZfZGVidWcpCi0JCXByaW50ayAoS0VSTl9ERUJVRyAiU2V0dGluZyByZWNvcmQgcmF0ZWJpdHMgdG8gMHgleFxuIiwKLQkJCXJhdGViaXRzKTsKLQkgICAgbm0yNTZfbG9hZENvZWZmaWNpZW50IChjYXJkLCAxLCB4KTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwKLQkJCSAgICAgIE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgTk1fUkFURV9SRUdfT0ZGU0VULAotCQkJICAgICAgcmF0ZWJpdHMpOwotCX0KLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKiBTdGFydCB0aGUgcGxheSBwcm9jZXNzIGdvaW5nLiAqLwotc3RhdGljIHZvaWQKLXN0YXJ0UGxheSAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaWYgKCEgY2FyZC0+cGxheWluZykgewotCWNhcmQtPnBsYXlpbmcgPSAxOwotCWlmIChubTI1Nl9ncmFiSW50ZXJydXB0IChjYXJkKSA9PSAwKSB7Ci0JICAgIG5tMjU2X3NldEluZm8gKGNhcmQtPmRldl9mb3JfcGxheSwgY2FyZCk7Ci0KLQkgICAgLyogRW5hYmxlIHBsYXliYWNrIGVuZ2luZSBhbmQgaW50ZXJydXB0cy4gKi8KLQkgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRywKLQkJCSAgICAgIE5NX1BMQVlCQUNLX0VOQUJMRV9GTEFHIHwgTk1fUExBWUJBQ0tfRlJFRVJVTik7Ci0KLQkgICAgLyogRW5hYmxlIGJvdGggY2hhbm5lbHMuICovCi0JICAgIG5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBOTV9BVURJT19NVVRFX1JFRywgMHgwKTsKLQl9Ci0gICAgfQotfQotCi0vKiAKLSAqIFJlcXVlc3Qgb25lIGNodW5rIG9mIEFNVCBieXRlcyBmcm9tIHRoZSByZWNvcmRpbmcgZGV2aWNlLiAgV2hlbiB0aGUKLSAqIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdGhlIGRhdGEgd2lsbCBiZSBjb3BpZWQgaW50byBCVUZGRVIgYW5kIHRoZQotICogZnVuY3Rpb24gRE1BYnVmX2lucHV0aW50ciB3aWxsIGJlIGludm9rZWQuCi0gKi8KLQotc3RhdGljIHZvaWQKLW5tMjU2X3N0YXJ0UmVjb3JkaW5nIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgY2hhciAqYnVmZmVyLCB1MzIgYW10KQotewotICAgIHUzMiBlbmRwb3M7Ci0gICAgaW50IGVuYWJsZUVuZ2luZSA9IDA7Ci0gICAgdTMyIHJpbmdzaXplID0gY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgaWYgKGFtdCA+IChyaW5nc2l6ZSAvIDIpKSB7Ci0JLyoKLQkgKiBPZiBjb3Vyc2UgdGhpcyB3b24ndCBhY3R1YWxseSB3b3JrIHJpZ2h0LCBiZWNhdXNlIHRoZQotCSAqIGNhbGxlciBpcyBnb2luZyB0byBhc3N1bWUgd2Ugd2lsbCBnaXZlIHdoYXQgd2UgZ290IGFza2VkCi0JICogZm9yLgotCSAqLwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBSZWFkIHJlcXVlc3QgdG9vIGxhcmdlOiAlZFxuIiwgYW10KTsKLQlhbXQgPSByaW5nc2l6ZSAvIDI7Ci0gICAgfQotCi0gICAgaWYgKGFtdCA8IDgpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogUmVhZCByZXF1ZXN0IHRvbyBzbWFsbDsgJWRcbiIsIGFtdCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLSAgICAvKgotICAgICAqIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgcmVjb3JkaW5nLCBzZXQgdXAgdGhlIHN0YXJ0IGFuZCBlbmQgcmVnaXN0ZXJzCi0gICAgICogZm9yIHRoZSByZWNvcmRpbmcgZW5naW5lLgotICAgICAqLwotICAgIGlmICghIGNhcmQtPnJlY29yZGluZykgewotCWNhcmQtPnJlY29yZGluZyA9IDE7Ci0JaWYgKG5tMjU2X2dyYWJJbnRlcnJ1cHQgKGNhcmQpID09IDApIHsKLQkgICAgY2FyZC0+Y3VyUmVjUG9zID0gMDsKLQkgICAgbm0yNTZfc2V0SW5mbyAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQsIGNhcmQpOwotCSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9TVEFSVCwgY2FyZC0+YWJ1ZjIpOwotCSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9FTkQsCi0JCQkJIGNhcmQtPmFidWYyICsgcmluZ3NpemUpOwotCi0JICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX0NVUlJQLAotCQkJCSBjYXJkLT5hYnVmMiArIGNhcmQtPmN1clJlY1Bvcyk7Ci0JICAgIGVuYWJsZUVuZ2luZSA9IDE7Ci0JfQotCWVsc2UgewotCSAgICAvKiBOb3Qgc3VyZSB3aGF0IGVsc2UgdG8gZG8gaGVyZS4gICovCi0JICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICAgIC8qIAotICAgICAqIElmIHdlIGhhcHBlbiB0byBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBhIGJpdCAoZHVlIHRvIGEKLSAgICAgKiBkZWxheWVkIGludGVycnVwdCkgaXQncyBPSy4gIFNvIG1pZ2h0IGFzIHdlbGwgc2V0IHRoZSB3YXRlcm1hcmsKLSAgICAgKiByaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIHdlIHdhbnQuCi0gICAgICovCi0gICAgZW5kcG9zID0gY2FyZC0+YWJ1ZjIgKyAoKGNhcmQtPmN1clJlY1BvcyArIGFtdCkgJSByaW5nc2l6ZSk7Ci0KLSAgICBjYXJkLT5yZWNCdWYgPSBidWZmZXI7Ci0gICAgY2FyZC0+cmVxdWVzdGVkUmVjQW10ID0gYW10OwotICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX1dNQVJLLCBlbmRwb3MpOwotICAgIC8qIEVuYWJsZSByZWNvcmRpbmcgZW5naW5lIGFuZCBpbnRlcnJ1cHRzLiAqLwotICAgIGlmIChlbmFibGVFbmdpbmUpCi0Jbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgTk1fUkVDT1JEX0VOQUJMRV9SRUcsCi0JCQkgICAgTk1fUkVDT1JEX0VOQUJMRV9GTEFHIHwgTk1fUkVDT1JEX0ZSRUVSVU4pOwotCi0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7Ci19Ci0KLS8qIFN0b3AgdGhlIHBsYXkgZW5naW5lLiAqLwotc3RhdGljIHZvaWQKLXN0b3BQbGF5IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICAvKiBTaHV0IG9mZiBzb3VuZCBmcm9tIGJvdGggY2hhbm5lbHMuICovCi0gICAgbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIE5NX0FVRElPX01VVEVfUkVHLAotCQkgICAgICAgTk1fQVVESU9fTVVURV9MRUZUIHwgTk1fQVVESU9fTVVURV9SSUdIVCk7Ci0gICAgLyogRGlzYWJsZSBwbGF5IGVuZ2luZS4gKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9QTEFZQkFDS19FTkFCTEVfUkVHLCAwKTsKLSAgICBpZiAoY2FyZC0+cGxheWluZykgewotCW5tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKGNhcmQpOwotCi0JLyogUmVzZXQgdGhlIHJlbGV2YW50IHN0YXRlIGJpdHMuICovCi0JY2FyZC0+cGxheWluZyA9IDA7Ci0JY2FyZC0+Y3VyUGxheVBvcyA9IDA7Ci0gICAgfQotfQotCi0vKiBTdG9wIHJlY29yZGluZy4gKi8KLXN0YXRpYyB2b2lkCi1zdG9wUmVjb3JkIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICAvKiBEaXNhYmxlIHJlY29yZGluZyBlbmdpbmUuICovCi0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgTk1fUkVDT1JEX0VOQUJMRV9SRUcsIDApOwotCi0gICAgaWYgKGNhcmQtPnJlY29yZGluZykgewotCW5tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKGNhcmQpOwotCi0JY2FyZC0+cmVjb3JkaW5nID0gMDsKLQljYXJkLT5jdXJSZWNQb3MgPSAwOwotICAgIH0KLX0KLQotLyoKLSAqIFJpbmcgYnVmZmVycywgbWFuLiAgVGhhdCdzIHdoZXJlIHRoZSBoaXAtaG9wLCB3aWxkLW4td29vbHkgYWN0aW9uJ3MgYXQuCi0gKiAxOTcyPyAgKFdlbGwsIEkgc3VwcG9zZSBpdCB3YXMgY2hlZXAtbi1lYXN5IHRvIGltcGxlbWVudC4pCi0gKgotICogV3JpdGUgQU1UIGJ5dGVzIG9mIEJVRkZFUiB0byB0aGUgcGxheWJhY2sgcmluZyBidWZmZXIsIGFuZCBzdGFydCB0aGUKLSAqIHBsYXliYWNrIGVuZ2luZSBydW5uaW5nLiAgSXQgd2lsbCBvbmx5IGFjY2VwdCB1cCB0byAxLzIgb2YgdGhlIHRvdGFsCi0gKiBzaXplIG9mIHRoZSByaW5nIGJ1ZmZlci4gIE5vIGNoZWNrIGlzIG1hZGUgdGhhdCB3ZSdyZSBhYm91dCB0byBvdmVyd3JpdGUKLSAqIHRoZSBjdXJyZW50bHktcGxheWluZyBzYW1wbGUuCi0gKi8KLQotc3RhdGljIHZvaWQKLW5tMjU2X3dyaXRlX2Jsb2NrIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgY2hhciAqYnVmZmVyLCB1MzIgYW10KQotewotICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZTsKLSAgICB1MzIgZW5kc3RvcDsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgaWYgKGFtdCA+IChyaW5nc2l6ZSAvIDIpKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFdyaXRlIHJlcXVlc3QgdG9vIGxhcmdlOiAlZFxuIiwgYW10KTsKLQlhbXQgPSAocmluZ3NpemUgLyAyKTsKLSAgICB9Ci0KLSAgICBpZiAoYW10IDwgTk0yNTZfUExBWV9XTUFSS19TSVpFKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFdyaXRlIHJlcXVlc3QgdG9vIHNtYWxsOiAlZFxuIiwgYW10KTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgY2FyZC0+Y3VyUGxheVBvcyAlPSByaW5nc2l6ZTsKLQotICAgIGNhcmQtPnJlcXVlc3RlZF9hbXQgPSBhbXQ7Ci0KLSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0KLSAgICBpZiAoKGNhcmQtPmN1clBsYXlQb3MgKyBhbXQpID49IHJpbmdzaXplKSB7Ci0JdTMyIHJlbSA9IHJpbmdzaXplIC0gY2FyZC0+Y3VyUGxheVBvczsKLQotCW5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgYnVmZmVyLCAxLAotCQkJICAgICAgY2FyZC0+YWJ1ZjEgKyBjYXJkLT5jdXJQbGF5UG9zLAotCQkJICAgICAgcmVtKTsKLQlpZiAoYW10ID4gcmVtKQotCSAgICBubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciArIHJlbSwgMSwgY2FyZC0+YWJ1ZjEsCi0JCQkJICBhbXQgLSByZW0pOwotICAgIH0gCi0gICAgZWxzZQotCW5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgYnVmZmVyLCAxLAotCQkJICAgICAgY2FyZC0+YWJ1ZjEgKyBjYXJkLT5jdXJQbGF5UG9zLAotCQkJICAgICAgYW10KTsKLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIHN0YXJ0LW4tc3RvcC1uLWxpbWl0IHJlZ2lzdGVycywgYW5kIHN0YXJ0IHRoYXQgZW5naW5lCi0gICAgICogZ29pbicuIAotICAgICAqCi0gICAgICogTm9ybWFsbHkgd2UganVzdCBsZXQgaXQgd3JhcCBhcm91bmQgdG8gYXZvaWQgdGhlIGNsaWNrLWNsaWNrCi0gICAgICogYWN0aW9uIHNjZW5lLgotICAgICAqLwotICAgIGlmICghIGNhcmQtPnBsYXlpbmcpIHsKLQkvKiBUaGUgUEJVRkZFUl9FTkQgcmVnaXN0ZXIgaW4gdGhpcyBjYXNlIHBvaW50cyB0byBvbmUgc2FtcGxlCi0JICAgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KLQlpbnQgdyA9IChjYXJkLT5kZXZfZm9yX3BsYXkgPT0gY2FyZC0+ZGV2WzBdID8gMCA6IDEpOwotCWludCBzYW1wc2l6ZSA9IChjYXJkLT5zaW5mb1t3XS5iaXRzID09IDE2ID8gMiA6IDEpOwotCi0JaWYgKGNhcmQtPnNpbmZvW3ddLnN0ZXJlbykKLQkgICAgc2FtcHNpemUgKj0gMjsKLQotCS8qIE5lZWQgdG8gc2V0IHRoZSBub3Qtbm9ybWFsbHktY2hhbmdpbmctcmVnaXN0ZXJzIHVwLiAqLwotCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX1NUQVJULAotCQkJICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MpOwotCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX0VORCwKLQkJCSAgICAgY2FyZC0+YWJ1ZjEgKyByaW5nc2l6ZSAtIHNhbXBzaXplKTsKLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9DVVJSUCwKLQkJCSAgICAgY2FyZC0+YWJ1ZjEgKyBjYXJkLT5jdXJQbGF5UG9zKTsKLSAgICB9Ci0gICAgZW5kc3RvcCA9IChjYXJkLT5jdXJQbGF5UG9zICsgYW10IC0gTk0yNTZfUExBWV9XTUFSS19TSVpFKSAlIHJpbmdzaXplOwotICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX1dNQVJLLCBjYXJkLT5hYnVmMSArIGVuZHN0b3ApOwotCi0gICAgaWYgKCEgY2FyZC0+cGxheWluZykKLQlzdGFydFBsYXkgKGNhcmQpOwotCi0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7Ci19Ci0KLS8qICBXZSBqdXN0IGdvdCBhIGNhcmQgcGxheWJhY2sgaW50ZXJydXB0OyBwcm9jZXNzIGl0LiAgKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9nZXRfbmV3X2Jsb2NrIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICAvKiBDaGVjayB0byBzZWUgaG93IG11Y2ggZ290IHBsYXllZCBzbyBmYXIuICovCi0gICAgdTMyIGFtdCA9IG5tMjU2X3JlYWRQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfQ1VSUlApIC0gY2FyZC0+YWJ1ZjE7Ci0KLSAgICBpZiAoYW10ID49IGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBTb3VuZCBwbGF5YmFjayBwb2ludGVyIGludmFsaWQhXG4iKTsKLQlhbXQgPSAwOwotICAgIH0KLQotICAgIGlmIChhbXQgPCBjYXJkLT5jdXJQbGF5UG9zKQotCWFtdCA9IChjYXJkLT5wbGF5YmFja0J1ZmZlclNpemUgLSBjYXJkLT5jdXJQbGF5UG9zKSArIGFtdDsKLSAgICBlbHNlCi0JYW10IC09IGNhcmQtPmN1clBsYXlQb3M7Ci0KLSAgICBpZiAoY2FyZC0+cmVxdWVzdGVkX2FtdCA+IChhbXQgKyBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUpKSB7Ci0JdTMyIGVuZHN0b3AgPQotCSAgICBjYXJkLT5jdXJQbGF5UG9zICsgY2FyZC0+cmVxdWVzdGVkX2FtdCAtIE5NMjU2X1BMQVlfV01BUktfU0laRTsKLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9XTUFSSywgY2FyZC0+YWJ1ZjEgKyBlbmRzdG9wKTsKLSAgICB9IAotICAgIGVsc2UgewotCWNhcmQtPmN1clBsYXlQb3MgKz0gY2FyZC0+cmVxdWVzdGVkX2FtdDsKLQkvKiBHZXQgYSBuZXcgYmxvY2sgdG8gd3JpdGUuICBUaGlzIHdpbGwgZXZlbnR1YWxseSBpbnZva2UKLQkgICBubTI1Nl93cml0ZV9ibG9jayAoKSBvciBzdG9wUGxheSAoKS4gICovCi0JRE1BYnVmX291dHB1dGludHIgKGNhcmQtPmRldl9mb3JfcGxheSwgMSk7Ci0gICAgfQotfQotCi0vKiAKLSAqIFJlYWQgdGhlIGxhc3QtcmVjb3JkZWQgYmxvY2sgZnJvbSB0aGUgcmluZyBidWZmZXIsIGNvcHkgaXQgaW50byB0aGUKLSAqIHNhdmVkIGJ1ZmZlciBwb2ludGVyLCBhbmQgaW52b2tlIERNQXVmX2lucHV0aW50cigpIHdpdGggdGhlIHJlY29yZGluZwotICogZGV2aWNlLiAKLSAqLwotCi1zdGF0aWMgdm9pZAotbm0yNTZfcmVhZF9ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogR3JhYiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgcmVjb3JkaW5nIHBvaW50ZXIuICovCi0gICAgdTMyIGN1cnJwdHIgPSBubTI1Nl9yZWFkUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX0NVUlJQKSAtIGNhcmQtPmFidWYyOwotICAgIHUzMiBhbXRUb1JlYWQgPSBjYXJkLT5yZXF1ZXN0ZWRSZWNBbXQ7Ci0gICAgdTMyIHJpbmdzaXplID0gY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZTsKLQotICAgIGlmIChjdXJycHRyID49IGNhcmQtPnJlY29yZEJ1ZmZlclNpemUpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogU291bmQgYnVmZmVyIHJlY29yZCBwb2ludGVyIGludmFsaWQhXG4iKTsKLSAgICAgICAgY3VycnB0ciA9IDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGlzIHRlc3QgaXMgcHJvYmFibHkgcmVkdW5kYW50OyB3ZSBzaG91bGRuJ3QgYmUgaGVyZSB1bmxlc3MKLSAgICAgKiBpdCdzIHRydWUuCi0gICAgICovCi0gICAgaWYgKGNhcmQtPnJlY29yZGluZykgewotCS8qIElmIHdlIHdyYXBwZWQgYXJvdW5kLCBjb3B5IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhcnQgb2Ygb3VyCi0JICAgcmVjb3JkaW5nIGJ1ZmZlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCi0JaWYgKGN1cnJwdHIgPCBjYXJkLT5jdXJSZWNQb3MpIHsKLQkgICAgdTMyIGFtdCA9IG1pbiAocmluZ3NpemUgLSBjYXJkLT5jdXJSZWNQb3MsIGFtdFRvUmVhZCk7Ci0KLQkgICAgbm0yNTZfcmVhZEJ1ZmZlcjggKGNhcmQsIGNhcmQtPnJlY0J1ZiwgMSwKLQkJCQkgY2FyZC0+YWJ1ZjIgKyBjYXJkLT5jdXJSZWNQb3MsCi0JCQkJIGFtdCk7Ci0JICAgIGFtdFRvUmVhZCAtPSBhbXQ7Ci0JICAgIGNhcmQtPmN1clJlY1BvcyArPSBhbXQ7Ci0JICAgIGNhcmQtPnJlY0J1ZiArPSBhbXQ7Ci0JICAgIGlmIChjYXJkLT5jdXJSZWNQb3MgPT0gcmluZ3NpemUpCi0JCWNhcmQtPmN1clJlY1BvcyA9IDA7Ci0JfQotCi0JaWYgKChjYXJkLT5jdXJSZWNQb3MgPCBjdXJycHRyKSAmJiAoYW10VG9SZWFkID4gMCkpIHsKLQkgICAgdTMyIGFtdCA9IG1pbiAoY3VycnB0ciAtIGNhcmQtPmN1clJlY1BvcywgYW10VG9SZWFkKTsKLQkgICAgbm0yNTZfcmVhZEJ1ZmZlcjggKGNhcmQsIGNhcmQtPnJlY0J1ZiwgMSwKLQkJCQkgY2FyZC0+YWJ1ZjIgKyBjYXJkLT5jdXJSZWNQb3MsIGFtdCk7Ci0JICAgIGNhcmQtPmN1clJlY1BvcyA9ICgoY2FyZC0+Y3VyUmVjUG9zICsgYW10KSAlIHJpbmdzaXplKTsKLQl9Ci0JY2FyZC0+cmVjQnVmID0gTlVMTDsKLQljYXJkLT5yZXF1ZXN0ZWRSZWNBbXQgPSAwOwotCURNQWJ1Zl9pbnB1dGludHIgKGNhcmQtPmRldl9mb3JfcmVjb3JkKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZS4gCi0gKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9pbml0SHcgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIC8qIFJlc2V0IGV2ZXJ5dGhpbmcuICovCi0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHgwLCAweDExKTsKLSAgICBubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgMHgyMTQsIDApOwotCi0gICAgc3RvcFJlY29yZCAoY2FyZCk7Ci0gICAgc3RvcFBsYXkgKGNhcmQpOwotfQotCi0vKiAKLSAqIEhhbmRsZSBhIHBvdGVudGlhbCBpbnRlcnJ1cHQgZm9yIHRoZSBkZXZpY2UgcmVmZXJyZWQgdG8gYnkgREVWX0lELiAKLSAqCi0gKiBJIGRvbid0IGxpa2UgdGhlIGN1dC1uLXBhc3RlIGpvYiBoZXJlIGVpdGhlciBiZXR3ZWVuIHRoZSB0d28gcm91dGluZXMsCi0gKiBidXQgdGhlcmUgYXJlIHN1ZmZpY2llbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGludGVycnVwdCBoYW5kbGVycwotICogdGhhdCBwYXJhbWV0ZXJpemluZyBpdCBpc24ndCBhbGwgdGhhdCBncmVhdCBlaXRoZXIuICAoQ291bGQgdXNlIGEgbWFjcm8sCi0gKiBJIHN1cHBvc2UuLi55dWNreSBibGVhaC4pCi0gKi8KLQotc3RhdGljIGlycXJldHVybl90Ci1ubTI1Nl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldl9pZDsKLSAgICB1MTYgc3RhdHVzOwotICAgIHN0YXRpYyBpbnQgYmFkaW50cmNvdW50OwotICAgIGludCBoYW5kbGVkID0gMDsKLQotICAgIGlmICgoY2FyZCA9PSBOVUxMKSB8fCAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIGNhcmQgcG9pbnRlclxuIik7Ci0JcmV0dXJuIElSUV9OT05FOwotICAgIH0KLQotICAgIHN0YXR1cyA9IG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIE5NX0lOVF9SRUcpOwotCi0gICAgLyogTm90IG91cnMuICovCi0gICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0JaWYgKGJhZGludHJjb3VudCsrID4gMTAwMCkgewotCSAgICAvKgotCSAgICAgKiBJJ20gbm90IHN1cmUgaWYgdGhlIGJlc3QgdGhpbmcgaXMgdG8gc3RvcCB0aGUgY2FyZCBmcm9tCi0JICAgICAqIHBsYXlpbmcgb3IganVzdCByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKGFmdGVyIGFsbCwgd2UncmUgaW4KLQkgICAgICogYSBiYWQgc2l0dWF0aW9uLCBzbyBkb2luZyBmYW5jeSBzdHVmZiBtYXkgbm90IGJlIHN1Y2ggYSBnb29kCi0JICAgICAqIGlkZWEpLgotCSAgICAgKgotCSAgICAgKiBJIHdvcnJ5IGFib3V0IHRoZSBjYXJkIGVuZ2luZSBjb250aW51aW5nIHRvIHBsYXkgbm9pc2UKLQkgICAgICogb3ZlciBhbmQgb3ZlciwgaG93ZXZlci0tdGhhdCBjb3VsZCBiZWNvbWUgYSB2ZXJ5Ci0JICAgICAqIG9ibm94aW91cyBwcm9ibGVtLiAgQW5kIHdlIGtub3cgdGhhdCB3aGVuIHRoaXMgdXN1YWxseQotCSAgICAgKiBoYXBwZW5zIHRoaW5ncyBhcmUgZmFpcmx5IHNhZmUsIGl0IGp1c3QgbWVhbnMgdGhlIHVzZXIncwotCSAgICAgKiBpbnNlcnRlZCBhIFBDTUNJQSBjYXJkIGFuZCBzb21lb25lJ3Mgc3BhbW1pbmcgdXMgd2l0aCBJUlEgOXMuCi0JICAgICAqLwotCi0JICAgIGhhbmRsZWQgPSAxOwotCSAgICBpZiAoY2FyZC0+cGxheWluZykKLQkJc3RvcFBsYXkgKGNhcmQpOwotCSAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKQotCQlzdG9wUmVjb3JkIChjYXJkKTsKLQkgICAgYmFkaW50cmNvdW50ID0gMDsKLQl9Ci0JcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Ci0gICAgfQotCi0gICAgYmFkaW50cmNvdW50ID0gMDsKLQotICAgIC8qIFJhdGhlciBib3Jpbmc7IGNoZWNrIGZvciBpbmRpdmlkdWFsIGludGVycnVwdHMgYW5kIHByb2Nlc3MgdGhlbS4gKi8KLQotICAgIGlmIChzdGF0dXMgJiBOTV9QTEFZQkFDS19JTlQpIHsKLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NX1BMQVlCQUNLX0lOVDsKLQlOTV9BQ0tfSU5UIChjYXJkLCBOTV9QTEFZQkFDS19JTlQpOwotCi0JaWYgKGNhcmQtPnBsYXlpbmcpCi0JICAgIG5tMjU2X2dldF9uZXdfYmxvY2sgKGNhcmQpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTV9SRUNPUkRfSU5UKSB7Ci0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTV9SRUNPUkRfSU5UOwotCU5NX0FDS19JTlQgKGNhcmQsIE5NX1JFQ09SRF9JTlQpOwotCi0JaWYgKGNhcmQtPnJlY29yZGluZykKLQkgICAgbm0yNTZfcmVhZF9ibG9jayAoY2FyZCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NX01JU0NfSU5UXzEpIHsKLQl1OCBjYnl0ZTsKLQotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk1fTUlTQ19JTlRfMTsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKLQlOTV9BQ0tfSU5UIChjYXJkLCBOTV9NSVNDX0lOVF8xKTsKLQlubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fSU5UX1JFRywgMHg4MDAwKTsKLQljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOwotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSB8IDIpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTV9NSVNDX0lOVF8yKSB7Ci0JdTggY2J5dGU7Ci0KLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzI7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMlxuIik7Ci0JTk1fQUNLX0lOVCAoY2FyZCwgTk1fTUlTQ19JTlRfMik7Ci0JY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgJiB+Mik7Ci0gICAgfQotCi0gICAgLyogVW5rbm93biBpbnRlcnJ1cHQuICovCi0gICAgaWYgKHN0YXR1cykgewotCWhhbmRsZWQgPSAxOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAotCQlzdGF0dXMpOwotCS8qIFByYXkuICovCi0JTk1fQUNLX0lOVCAoY2FyZCwgc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgYSBwb3RlbnRpYWwgaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlIHJlZmVycmVkIHRvIGJ5IERFVl9JRC4KLSAqIFRoaXMgaGFuZGxlciBpcyBmb3IgdGhlIDI1NlpYLCBhbmQgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBub24tWlgKLSAqIHJvdXRpbmUuCi0gKi8KLQotc3RhdGljIGlycXJldHVybl90Ci1ubTI1Nl9pbnRlcnJ1cHRfenggKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldl9pZDsKLSAgICB1MzIgc3RhdHVzOwotICAgIHN0YXRpYyBpbnQgYmFkaW50cmNvdW50OwotICAgIGludCBoYW5kbGVkID0gMDsKLQotICAgIGlmICgoY2FyZCA9PSBOVUxMKSB8fCAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIGNhcmQgcG9pbnRlclxuIik7Ci0JcmV0dXJuIElSUV9OT05FOwotICAgIH0KLQotICAgIHN0YXR1cyA9IG5tMjU2X3JlYWRQb3J0MzIgKGNhcmQsIDIsIE5NX0lOVF9SRUcpOwotCi0gICAgLyogTm90IG91cnMuICovCi0gICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0JaWYgKGJhZGludHJjb3VudCsrID4gMTAwMCkgewotCSAgICBwcmludGsgKEtFUk5fRVJSICJOTTI1NjogUmVsZWFzaW5nIGludGVycnVwdCwgb3ZlciAxMDAwIGludmFsaWQgaW50ZXJydXB0c1xuIik7Ci0JICAgIC8qCi0JICAgICAqIEknbSBub3Qgc3VyZSBpZiB0aGUgYmVzdCB0aGluZyBpcyB0byBzdG9wIHRoZSBjYXJkIGZyb20KLQkgICAgICogcGxheWluZyBvciBqdXN0IHJlbGVhc2UgdGhlIGludGVycnVwdCAoYWZ0ZXIgYWxsLCB3ZSdyZSBpbgotCSAgICAgKiBhIGJhZCBzaXR1YXRpb24sIHNvIGRvaW5nIGZhbmN5IHN0dWZmIG1heSBub3QgYmUgc3VjaCBhIGdvb2QKLQkgICAgICogaWRlYSkuCi0JICAgICAqCi0JICAgICAqIEkgd29ycnkgYWJvdXQgdGhlIGNhcmQgZW5naW5lIGNvbnRpbnVpbmcgdG8gcGxheSBub2lzZQotCSAgICAgKiBvdmVyIGFuZCBvdmVyLCBob3dldmVyLS10aGF0IGNvdWxkIGJlY29tZSBhIHZlcnkKLQkgICAgICogb2Jub3hpb3VzIHByb2JsZW0uICBBbmQgd2Uga25vdyB0aGF0IHdoZW4gdGhpcyB1c3VhbGx5Ci0JICAgICAqIGhhcHBlbnMgdGhpbmdzIGFyZSBmYWlybHkgc2FmZSwgaXQganVzdCBtZWFucyB0aGUgdXNlcidzCi0JICAgICAqIGluc2VydGVkIGEgUENNQ0lBIGNhcmQgYW5kIHNvbWVvbmUncyBzcGFtbWluZyB1cyB3aXRoIAotCSAgICAgKiBJUlEgOXMuCi0JICAgICAqLwotCi0JICAgIGhhbmRsZWQgPSAxOwotCSAgICBpZiAoY2FyZC0+cGxheWluZykKLQkJc3RvcFBsYXkgKGNhcmQpOwotCSAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKQotCQlzdG9wUmVjb3JkIChjYXJkKTsKLQkgICAgYmFkaW50cmNvdW50ID0gMDsKLQl9Ci0JcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Ci0gICAgfQotCi0gICAgYmFkaW50cmNvdW50ID0gMDsKLQotICAgIC8qIFJhdGhlciBib3Jpbmc7IGNoZWNrIGZvciBpbmRpdmlkdWFsIGludGVycnVwdHMgYW5kIHByb2Nlc3MgdGhlbS4gKi8KLQotICAgIGlmIChzdGF0dXMgJiBOTTJfUExBWUJBQ0tfSU5UKSB7Ci0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTTJfUExBWUJBQ0tfSU5UOwotCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfUExBWUJBQ0tfSU5UKTsKLQotCWlmIChjYXJkLT5wbGF5aW5nKQotCSAgICBubTI1Nl9nZXRfbmV3X2Jsb2NrIChjYXJkKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk0yX1JFQ09SRF9JTlQpIHsKLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NMl9SRUNPUkRfSU5UOwotCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfUkVDT1JEX0lOVCk7Ci0KLQlpZiAoY2FyZC0+cmVjb3JkaW5nKQotCSAgICBubTI1Nl9yZWFkX2Jsb2NrIChjYXJkKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzEpIHsKLQl1OCBjYnl0ZTsKLQotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk0yX01JU0NfSU5UXzE7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMVxuIik7Ci0JTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9NSVNDX0lOVF8xKTsKLQljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOwotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSB8IDIpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTTJfTUlTQ19JTlRfMikgewotCXU4IGNieXRlOwotCi0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMjsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKLQlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX01JU0NfSU5UXzIpOwotCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7Ci0Jbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlICYgfjIpOwotICAgIH0KLQotICAgIC8qIFVua25vd24gaW50ZXJydXB0LiAqLwotICAgIGlmIChzdGF0dXMpIHsKLQloYW5kbGVkID0gMTsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKLQkJc3RhdHVzKTsKLQkvKiBQcmF5LiAqLwotCU5NMl9BQ0tfSU5UIChjYXJkLCBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLX0KLQotLyogCi0gKiBSZXF1ZXN0IG91ciBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2dyYWJJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGlmIChjYXJkLT5oYXNfaXJxKysgPT0gMCkgewotCWlmIChyZXF1ZXN0X2lycSAoY2FyZC0+aXJxLCBjYXJkLT5pbnRyb3V0aW5lLCBJUlFGX1NIQVJFRCwKLQkJCSAiTk0yNTZfYXVkaW8iLCBjYXJkKSA8IDApIHsKLQkgICAgcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IGNhbid0IG9idGFpbiBJUlEgJWRcbiIsIGNhcmQtPmlycSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiAKLSAqIFJlbGVhc2Ugb3VyIGludGVycnVwdC4gCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGlmIChjYXJkLT5oYXNfaXJxIDw9IDApIHsKLQlwcmludGsgKEtFUk5fRVJSICJubTI1NjogdG9vIG1hbnkgY2FsbHMgdG8gcmVsZWFzZUludGVycnVwdFxuIik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBjYXJkLT5oYXNfaXJxLS07Ci0gICAgaWYgKGNhcmQtPmhhc19pcnEgPT0gMCkgewotCWZyZWVfaXJxIChjYXJkLT5pcnEsIGNhcmQpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdhaXRzIGZvciB0aGUgbWl4ZXIgdG8gYmVjb21lIHJlYWR5IHRvIGJlIHdyaXR0ZW47IHJldHVybnMgYSB6ZXJvIHZhbHVlCi0gKiBpZiBpdCB0aW1lZCBvdXQuCi0gKi8KLQotc3RhdGljIGludAotbm0yNTZfaXNSZWFkeSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7Ci0gICAgaW50IHQyID0gMTA7Ci0gICAgdTMyIHRlc3RhZGRyOwotICAgIHUxNiB0ZXN0YjsKLSAgICBpbnQgZG9uZSA9IDA7Ci0KLSAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIGlzUmVhZHkhXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB0ZXN0YWRkciA9IGNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQ7Ci0gICAgdGVzdGIgPSBjYXJkLT5taXhlcl9zdGF0dXNfbWFzazsKLQotICAgIC8qIAotICAgICAqIExvb3AgYXJvdW5kIHdhaXRpbmcgZm9yIHRoZSBtaXhlciB0byBiZWNvbWUgcmVhZHkuIAotICAgICAqLwotICAgIHdoaWxlICghIGRvbmUgJiYgdDItLSA+IDApIHsKLQlpZiAoKG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIHRlc3RhZGRyKSAmIHRlc3RiKSA9PSAwKQotCSAgICBkb25lID0gMTsKLQllbHNlCi0JICAgIHVkZWxheSAoMTAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRvbmU7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBBQzk3IG1peGVyIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgYSBwb3NpdGl2ZQotICogdmFsdWUgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9yZWFkQUM5N1JlZyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKLQotICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gcmVhZEFDOTdSZWchXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAocmVnIDwgMTI4KSB7Ci0JaW50IHJlczsKLQotCW5tMjU2X2lzUmVhZHkgKGRldik7Ci0JcmVzID0gbm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgY2FyZC0+bWl4ZXIgKyByZWcpOwotCS8qIE1hZ2ljIGRlbGF5LiAgQmxlYWggeXVja3kuICAqLwotICAgICAgICB1ZGVsYXkgKDEwMDApOwotCXJldHVybiByZXM7Ci0gICAgfQotICAgIGVsc2UKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogCi0gKiBXcml0ZXMgVkFMVUUgdG8gQUM5NyBtaXhlciByZWdpc3RlciBSRUcuICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IKLSAqIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X3dyaXRlQUM5N1JlZyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICBpbnQgdHJpZXMgPSAyOwotICAgIGludCBkb25lID0gMDsKLSAgICB1MzIgYmFzZTsKLQotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKLQotICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gd3JpdGVBQzk3UmVnIVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgYmFzZSA9IGNhcmQtPm1peGVyOwotCi0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotCi0gICAgbm0yNTZfaXNSZWFkeSAoZGV2KTsKLQotICAgIC8qIFdhaXQgZm9yIHRoZSB3cml0ZSB0byB0YWtlLCB0b28uICovCi0gICAgd2hpbGUgKCh0cmllcy0tID4gMCkgJiYgIWRvbmUpIHsKLQlubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgYmFzZSArIHJlZywgdmFsdWUpOwotCWlmIChubTI1Nl9pc1JlYWR5IChkZXYpKSB7Ci0JICAgIGRvbmUgPSAxOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICB9Ci0KLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLSAgICB1ZGVsYXkgKDEwMDApOwotCi0gICAgcmV0dXJuICEgZG9uZTsKLX0KLQotLyogCi0gKiBJbml0aWFsIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBBQzk3IG1peGVyLgotICogV2hpbGUgbW9zdCBvZiB0aGVzZSBhcmUgaWRlbnRpY2FsIHRvIHRoZSByZXNldCB2YWx1ZXMsIHdlIGRvIHRoaXMKLSAqIHNvIHRoYXQgd2UgaGF2ZSBtb3N0IG9mIHRoZSByZWdpc3RlciBjb250ZW50cyBjYWNoZWQtLXRoaXMgYXZvaWRzCi0gKiByZWFkaW5nIGZyb20gdGhlIG1peGVyIGRpcmVjdGx5ICh3aGljaCBzZWVtcyB0byBiZSBwcm9ibGVtYXRpYywKLSAqIHByb2JhYmx5IGR1ZSB0byBpZ25vcmFuY2UpLgotICovCi1zdHJ1Y3QgaW5pdGlhbFZhbHVlcyAKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OwotICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwotfTsKLQotc3RhdGljIHN0cnVjdCBpbml0aWFsVmFsdWVzIG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbXSA9IAotewotICAgIHsgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMHg4MDAwIH0sCi0gICAgeyBBQzk3X0hFQURQSE9ORV9WT0wsICAgICAweDgwMDAgfSwKLSAgICB7IEFDOTdfTUFTVEVSX1ZPTF9NT05PLCAgIDB4MDAwMCB9LAotICAgIHsgQUM5N19QQ0JFRVBfVk9MLCAgICAgICAgMHgwMDAwIH0sCi0gICAgeyBBQzk3X1BIT05FX1ZPTCwgICAgICAgICAweDAwMDggfSwKLSAgICB7IEFDOTdfTUlDX1ZPTCwgICAgICAgICAgIDB4ODAwMCB9LAotICAgIHsgQUM5N19MSU5FSU5fVk9MLCAgICAgICAgMHg4ODA4IH0sCi0gICAgeyBBQzk3X0NEX1ZPTCwgICAgICAgICAgICAweDg4MDggfSwKLSAgICB7IEFDOTdfVklERU9fVk9MLCAgICAgICAgIDB4ODgwOCB9LAotICAgIHsgQUM5N19BVVhfVk9MLCAgICAgICAgICAgMHg4ODA4IH0sCi0gICAgeyBBQzk3X1BDTU9VVF9WT0wsICAgICAgICAweDA4MDggfSwKLSAgICB7IEFDOTdfUkVDT1JEX1NFTEVDVCwgICAgIDB4MDAwMCB9LAotICAgIHsgQUM5N19SRUNPUkRfR0FJTiwgICAgICAgMHgwQjBCIH0sCi0gICAgeyBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgICAweDAwMDAgfSwKLSAgICB7IDB4ZmZmZiwgMHhmZmZmIH0KLX07Ci0KLS8qIEluaXRpYWxpemUgdGhlIEFDOTcgaW50byBhIGtub3duIHN0YXRlLiAgKi8KLXN0YXRpYyBpbnQKLW5tMjU2X3Jlc2V0QUM5NyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIHJlc2V0QUM5NyFcbiIpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIC8qIFJlc2V0IHRoZSBtaXhlci4gICdUaXMgbWFnaWMhICAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmMwLCAxKTsKLS8vICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjYywgMHg4Nyk7CS8qIFRoaXMgY3Jhc2hlcyBEZWxsIGxhdGl0dWRlcyAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmNjLCAweDgwKTsKLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjYywgMHgwKTsKLQotICAgIGlmICghIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0KSB7Ci0JZm9yICh4ID0gMDsgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1t4XS5wb3J0ICE9IDB4ZmZmZjsgeCsrKSB7Ci0JICAgIGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsCi0JCQkgICAgICAgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1t4XS5wb3J0LAotCQkJICAgICAgIG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbeF0udmFsdWUpOwotCSAgICBjYXJkLT5taXhlcl92YWx1ZXNfaW5pdCA9IDE7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKgotICogV2UgZG9uJ3QgZG8gYW55dGhpbmcgcGFydGljdWxhcmx5IHNwZWNpYWwgaGVyZTsgaXQganVzdCBwYXNzZXMgdGhlCi0gKiBtaXhlciBpb2N0bCB0byB0aGUgQUM5NyBkcml2ZXIuCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2RlZmF1bHRfbWl4ZXJfaW9jdGwgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmRfZm9yX21peGVyIChkZXYpOwotICAgIGlmIChjYXJkICE9IE5VTEwpCi0JcmV0dXJuIGFjOTdfbWl4ZXJfaW9jdGwgKCYoY2FyZC0+bWRldiksIGNtZCwgYXJnKTsKLSAgICBlbHNlCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBubTI1Nl9taXhlcl9vcGVyYXRpb25zID0gewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5pZAk9ICJOZW9NYWdpYyIsCi0JLm5hbWUJPSAiTk0yNTZBQzk3TWl4ZXIiLAotCS5pb2N0bAk9IG5tMjU2X2RlZmF1bHRfbWl4ZXJfaW9jdGwKLX07Ci0KLS8qCi0gKiBEZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgT1NTIG1peGVyLiAgVGhlc2UgYXJlIHNldCBsYXN0LCBhZnRlciB0aGUKLSAqIG1peGVyIGlzIGluaXRpYWxpemVkLgotICoKLSAqIEkgImxvdmUiIEMgc29tZXRpbWVzLiAgR290IGJyYWNlcz8KLSAqLwotc3RhdGljIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgbWl4ZXJfZGVmYXVsdHNbXSA9IHsKLSAgICB7IFNPVU5EX01JWEVSX1ZPTFVNRSwgIHsgeyA4NSwgODUgfSB9IH0sCi0gICAgeyBTT1VORF9NSVhFUl9TUEVBS0VSLCB7IHsgMTAwIH0gfSB9LAotICAgIHsgU09VTkRfTUlYRVJfUENNLCAgICAgeyB7IDY1LCA2NSB9IH0gfSwKLSAgICB7IFNPVU5EX01JWEVSX0NELCAgICAgIHsgeyA2NSwgNjUgfSB9IH0sCi0gICAgeyAtMSwgICAgICAgICAgICAgICAgICB7ICB7IDAsICAwIH0gfSB9Ci19OwotCi0KLS8qIEluc3RhbGxzIHRoZSBBQzk3IG1peGVyIGludG8gQ0FSRC4gICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotbm0yNTZfaW5zdGFsbF9taXhlciAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgaW50IG1peGVyOwotCi0gICAgY2FyZC0+bWRldi5yZXNldF9kZXZpY2UgPSBubTI1Nl9yZXNldEFDOTc7Ci0gICAgY2FyZC0+bWRldi5yZWFkX3JlZyA9IG5tMjU2X3JlYWRBQzk3UmVnOwotICAgIGNhcmQtPm1kZXYud3JpdGVfcmVnID0gbm0yNTZfd3JpdGVBQzk3UmVnOwotICAgIGNhcmQtPm1kZXYuZHJpdmVyX3ByaXZhdGUgPSAodm9pZCAqKWNhcmQ7Ci0KLSAgICBpZiAoYWM5N19pbml0ICgmKGNhcmQtPm1kZXYpKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICBtaXhlciA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCk7Ci0gICAgaWYgKG51bV9taXhlcnMgPj0gTUFYX01JWEVSX0RFVikgewotCXByaW50ayAoIk5NMjU2IG1peGVyOiBVbmFibGUgdG8gYWxsb2MgbWl4ZXJkZXZcbiIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtaXhlcl9kZXZzW21peGVyXSA9ICZubTI1Nl9taXhlcl9vcGVyYXRpb25zOwotICAgIGNhcmQtPm1peGVyX29zc19kZXYgPSBtaXhlcjsKLQotICAgIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcy4gICovCi0gICAgYWM5N19zZXRfdmFsdWVzICgmKGNhcmQtPm1kZXYpLCBtaXhlcl9kZWZhdWx0cyk7Ci0KLSAgICBwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXplZCBBQzk3IG1peGVyXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogCi0gKiBTZWUgaWYgdGhlIHNpZ25hdHVyZSBsZWZ0IGJ5IHRoZSBOTTI1NiBCSU9TIGlzIGludGFjdDsgaWYgc28sIHdlIHVzZQotICogdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBhcyB0aGUgZW5kIG9mIG91ciBhdWRpbyBidWZmZXIgaW4gdGhlIHZpZGVvCi0gKiBSQU0uCi0gKi8KLQotc3RhdGljIHZvaWQgX19kZXZpbml0Ci1ubTI1Nl9wZWVrX2Zvcl9zaWcgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIHUzMiBwb3J0MW9mZnNldCAKLQk9IGNhcmQtPnBvcnRbMF0ucGh5c2FkZHIgKyBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSAweDA0MDA7Ci0gICAgLyogVGhlIHNpZ25hdHVyZSBpcyBsb2NhdGVkIDFLIGJlbG93IHRoZSBlbmQgb2YgdmlkZW8gUkFNLiAgKi8KLSAgICBjaGFyIF9faW9tZW0gKnRlbXAgPSBpb3JlbWFwX25vY2FjaGUgKHBvcnQxb2Zmc2V0LCAxNik7Ci0gICAgLyogRGVmYXVsdCBidWZmZXIgZW5kIGlzIDUxMjAgYnl0ZXMgYmVsb3cgdGhlIHRvcCBvZiBSQU0uICAqLwotICAgIHUzMiBkZWZhdWx0X3ZhbHVlID0gY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gMHgxNDAwOwotICAgIHUzMiBzaWc7Ci0KLSAgICAvKiBJbnN0YWxsIHRoZSBkZWZhdWx0IHZhbHVlIGZpcnN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlcGVhdGVkbHkKLSAgICAgICBkbyBpdCBpZiB0aGVyZSBpcyBhIHByb2JsZW0uICAqLwotICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IGRlZmF1bHRfdmFsdWU7Ci0KLSAgICBpZiAodGVtcCA9PSBOVUxMKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFVuYWJsZSB0byBzY2FuIGZvciBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU1cbiIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgc2lnID0gcmVhZGwgKHRlbXApOwotICAgIGlmICgoc2lnICYgTk1fU0lHX01BU0spID09IE5NX1NJR05BVFVSRSkgewotCXUzMiBwb2ludGVyID0gcmVhZGwgKHRlbXAgKyA0KTsKLQotCS8qCi0JICogSWYgaXQncyBvYnZpb3VzbHkgaW52YWxpZCwgZG9uJ3QgdXNlIGl0ICh0aGUgcG9ydCBhbHJlYWR5IGhhcyBhCi0JICogc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBzZXQpLgotCSAqLwotCWlmIChwb2ludGVyICE9IDB4ZmZmZmZmZmYpCi0JICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IHBvaW50ZXI7Ci0KLQlwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IEZvdW5kIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTTogMHgleFxuIiwKLQkJcG9pbnRlcik7Ci0gICAgfQotCi0gICAgaW91bm1hcCAodGVtcCk7Ci19Ci0KLS8qIAotICogSW5zdGFsbCBhIGRyaXZlciBmb3IgdGhlIFBDSSBkZXZpY2UgcmVmZXJlbmNlZCBieSBQQ0lERVYuCi0gKiBWRVJTVFIgaXMgYSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIHN0cmluZy4KLSAqLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotbm0yNTZfaW5zdGFsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBlbnVtIG5tMjU2cmV2IHJldiwgY2hhciAqdmVyc3RyKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkOwotICAgIGludCB4OwotCi0gICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCi0JICAgIHJldHVybiAwOwotCi0gICAgY2FyZCA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IG5tMjU2X2luZm8pLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoY2FyZCA9PSBOVUxMKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IG91dCBvZiBtZW1vcnkhXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjYXJkLT5tYWdzaWcgPSBOTV9NQUdJQ19TSUc7Ci0gICAgY2FyZC0+cGxheWluZyAgPSAwOwotICAgIGNhcmQtPnJlY29yZGluZyA9IDA7Ci0gICAgY2FyZC0+cmV2ID0gcmV2OwotICAgIHNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKLQotICAgIC8qIEluaXQgdGhlIG1lbW9yeSBwb3J0IGluZm8uICAqLwotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQljYXJkLT5wb3J0W3hdLnBoeXNhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwY2lkZXYsIHgpOwotCWNhcmQtPnBvcnRbeF0ucHRyID0gTlVMTDsKLQljYXJkLT5wb3J0W3hdLnN0YXJ0X29mZnNldCA9IDA7Ci0JY2FyZC0+cG9ydFt4XS5lbmRfb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICAvKiBQb3J0IDIgaXMgZWFzeS4gICovCi0gICAgY2FyZC0+cG9ydFsxXS5zdGFydF9vZmZzZXQgPSAwOwotICAgIGNhcmQtPnBvcnRbMV0uZW5kX29mZnNldCA9IE5NX1BPUlQyX1NJWkU7Ci0KLSAgICAvKiBZdWNrLiAgQnV0IHdlIGhhdmUgdG8gbWFwIGluIHBvcnQgMiBzbyB3ZSBjYW4gY2hlY2sgaG93IG11Y2ggUkFNIHRoZQotICAgICAgIGNhcmQgaGFzLiAgKi8KLSAgICBpZiAobm0yNTZfcmVtYXBfcG9ydHMgKGNhcmQpKSB7Ci0Ja2ZyZWUgKGNhcmQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIFRoZSBOTTI1NiBoYXMgdHdvIG1lbW9yeSBwb3J0cy4gIFRoZSBmaXJzdCBwb3J0IGlzIG5vdGhpbmcKLSAgICAgKiBtb3JlIHRoYW4gYSBjaHVuayBvZiB2aWRlbyBSQU0sIHdoaWNoIGlzIHVzZWQgYXMgdGhlIEkvTyByaW5nCi0gICAgICogYnVmZmVyLiAgVGhlIHNlY29uZCBwb3J0IGhhcyB0aGUgYWN0dWFsIGp1aWN5IHN0dWZmIChsaWtlIHRoZQotICAgICAqIG1peGVyIGFuZCB0aGUgcGxheWJhY2sgZW5naW5lIGNvbnRyb2wgcmVnaXN0ZXJzKS4KLSAgICAgKi8KLQotICAgIGlmIChjYXJkLT5yZXYgPT0gUkVWX05NMjU2QVYpIHsKLQkvKiBPaywgdHJ5IHRvIHNlZSBpZiB0aGlzIGlzIGEgbm9uLUFDOTcgdmVyc2lvbiBvZiB0aGUgaGFyZHdhcmUuICovCi0JaW50IHB2YWwgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBOTV9NSVhFUl9QUkVTRU5DRSk7Ci0JaWYgKChwdmFsICYgTk1fUFJFU0VOQ0VfTUFTSykgIT0gTk1fUFJFU0VOQ0VfVkFMVUUpIHsKLQkgICAgaWYgKCEgZm9yY2VfbG9hZCkgewotCQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogVGhpcyBkb2Vzbid0IGxvb2sgdG8gbWUgbGlrZSB0aGUgQUM5Ny1jb21wYXRpYmxlIHZlcnNpb24uXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIFlvdSBjYW4gZm9yY2UgdGhlIGRyaXZlciB0byBsb2FkIGJ5IHBhc3NpbmcgaW4gdGhlIG1vZHVsZVxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBwYXJhbWV0ZXI6XG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgICAgICAgICBmb3JjZV9sb2FkID0gMVxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIlxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBNb3JlIGxpa2VseSwgeW91IHNob3VsZCBiZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgU0ItMTYgb3JcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgQ1M0MjMyIGRyaXZlciBpbnN0ZWFkLiAgKElmIHlvdXIgQklPUyBoYXMgc2V0dGluZ3MgZm9yXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIElSUSBhbmQvb3IgRE1BIGZvciB0aGUgc291bmQgY2FyZCwgdGhpcyBpcyAqbm90KiB0aGUgY29ycmVjdFxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBkcml2ZXIgdG8gdXNlLilcbiIpOwotCQlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKLQkJa2ZyZWUgKGNhcmQpOwotCQlyZXR1cm4gMDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBGb3JjaW5nIGRyaXZlciBsb2FkIGFzIHBlciB1c2VyIHJlcXVlc3QuXG4iKTsKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgLyogICBwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IENvbmdyYXR1bGF0aW9ucy4gWW91J3JlIG5vdCBydW5uaW5nIEV1bmljZS5cbiIpKi87Ci0JfQotCWNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDI1NjAgKiAxMDI0OwotCWNhcmQtPmludHJvdXRpbmUgPSBubTI1Nl9pbnRlcnJ1cHQ7Ci0JY2FyZC0+bWl4ZXJfc3RhdHVzX29mZnNldCA9IE5NX01JWEVSX1NUQVRVU19PRkZTRVQ7Ci0JY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2sgPSBOTV9NSVhFUl9SRUFEWV9NQVNLOwotICAgIH0gCi0gICAgZWxzZSB7Ci0JLyogTm90IHN1cmUgaWYgdGhlcmUgaXMgYW55IHJlbGV2YW50IGRldGVjdCBmb3IgdGhlIFpYIG9yIG5vdC4gICovCi0JaWYgKG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHhhMGIpICE9IDApCi0JICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDYxNDQgKiAxMDI0OwotCWVsc2UKLQkgICAgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gNDA5NiAqIDEwMjQ7Ci0KLQljYXJkLT5pbnRyb3V0aW5lID0gbm0yNTZfaW50ZXJydXB0X3p4OwotCWNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQgPSBOTTJfTUlYRVJfU1RBVFVTX09GRlNFVDsKLQljYXJkLT5taXhlcl9zdGF0dXNfbWFzayA9IE5NMl9NSVhFUl9SRUFEWV9NQVNLOwotICAgIH0KLQotICAgIGlmIChidWZmZXJ0b3AgPj0gOTgzMDQgJiYgYnVmZmVydG9wIDwgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0KQotCWNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IGJ1ZmZlcnRvcDsKLSAgICBlbHNlCi0Jbm0yNTZfcGVla19mb3Jfc2lnIChjYXJkKTsKLQotICAgIGNhcmQtPnBvcnRbMF0uc3RhcnRfb2Zmc2V0ID0gY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gOTgzMDQ7Ci0KLSAgICBwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IE1hcHBpbmcgcG9ydCAxIGZyb20gMHgleCAtIDB4JXhcbiIsCi0JICAgIGNhcmQtPnBvcnRbMF0uc3RhcnRfb2Zmc2V0LCBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQpOwotCi0gICAgaWYgKG5tMjU2X3JlbWFwX3BvcnRzIChjYXJkKSkgewotCWtmcmVlIChjYXJkKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBTZWUgaWYgd2UgY2FuIGdldCB0aGUgaW50ZXJydXB0LiAqLwotCi0gICAgY2FyZC0+aXJxID0gcGNpZGV2LT5pcnE7Ci0gICAgY2FyZC0+aGFzX2lycSA9IDA7Ci0KLSAgICBpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgIT0gMCkgewotCW5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOwotCWtmcmVlIChjYXJkKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKLQotICAgIC8qCi0gICAgICoJSW5pdCB0aGUgYm9hcmQuCi0gICAgICovCi0KLSAgICBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemUgPSAxNjM4NDsKLSAgICBjYXJkLT5yZWNvcmRCdWZmZXJTaXplID0gMTYzODQ7Ci0KLSAgICBjYXJkLT5jb2VmZkJ1ZiA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIE5NX01BWF9DT0VGRklDSUVOVDsKLSAgICBjYXJkLT5hYnVmMiA9IGNhcmQtPmNvZWZmQnVmIC0gY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZTsKLSAgICBjYXJkLT5hYnVmMSA9IGNhcmQtPmFidWYyIC0gY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplOwotICAgIGNhcmQtPmFsbENvZWZmQnVmID0gY2FyZC0+YWJ1ZjIgLSAoTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0KTsKLQotICAgIC8qIEZpeGVkIHNldHRpbmcuICovCi0gICAgY2FyZC0+bWl4ZXIgPSBOTV9NSVhFUl9PRkZTRVQ7Ci0gICAgY2FyZC0+bWl4ZXJfdmFsdWVzX2luaXQgPSAwOwotCi0gICAgY2FyZC0+aXNfb3Blbl9wbGF5ID0gMDsKLSAgICBjYXJkLT5pc19vcGVuX3JlY29yZCA9IDA7Ci0KLSAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMDsKLQotICAgIGNhcmQtPm9wZW5jbnRbMF0gPSAwOyBjYXJkLT5vcGVuY250WzFdID0gMDsKLQotICAgIC8qIFJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncywgYnV0IGxhcmdlbHkgdW5uZWNlc3NhcnkuICovCi0gICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotCWNhcmQtPnNpbmZvW3hdLmJpdHMgPSA4OwotCWNhcmQtPnNpbmZvW3hdLnN0ZXJlbyA9IDA7Ci0JY2FyZC0+c2luZm9beF0uc2FtcGxlcmF0ZSA9IDgwMDA7Ci0gICAgfQotCi0gICAgbm0yNTZfaW5pdEh3IChjYXJkKTsKLQotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQlpZiAoKGNhcmQtPmRldlt4XSA9Ci0JICAgICBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KEFVRElPX0RSSVZFUl9WRVJTSU9OLAotCQkJCSAgICAiTk0yNTYiLCAmbm0yNTZfYXVkaW9fZHJpdmVyLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCi0JCQkJICAgIERNQV9OT0RNQSwgQUZNVF9VOCB8IEFGTVRfUzE2X0xFLAotCQkJCSAgICBOVUxMLCAtMSwgLTEpKSA+PSAwKSB7Ci0JICAgIC8qIDFLIG1pbmltdW0gYnVmZmVyIHNpemUuICovCi0JICAgIGF1ZGlvX2RldnNbY2FyZC0+ZGV2W3hdXS0+bWluX2ZyYWdtZW50ID0gMTA7Ci0JICAgIC8qIE1heGltdW0gb2YgOEsgYnVmZmVyIHNpemUuICovCi0JICAgIGF1ZGlvX2RldnNbY2FyZC0+ZGV2W3hdXS0+bWF4X2ZyYWdtZW50ID0gMTM7Ci0JfQotCWVsc2UgewotCSAgICBwcmludGsoS0VSTl9FUlIgIk5NMjU2OiBUb28gbWFueSBQQ00gZGV2aWNlcyBhdmFpbGFibGVcbiIpOwotCSAgICBubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKLQkgICAga2ZyZWUgKGNhcmQpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gICAgcGNpX3NldF9kcnZkYXRhKHBjaWRldixjYXJkKTsKLQotICAgIC8qIEluc2VydCB0aGUgY2FyZCBpbiB0aGUgbGlzdC4gICovCi0gICAgY2FyZC0+bmV4dF9jYXJkID0gbm1jYXJkX2xpc3Q7Ci0gICAgbm1jYXJkX2xpc3QgPSBjYXJkOwotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZWQgTmVvTWFnaWMgJXMgYXVkaW8gaW4gUENJIG5hdGl2ZSBtb2RlXG4iLAotCSAgIHZlcnN0cik7Ci0KLSAgICAvKiAKLSAgICAgKiBBbmQgb3VyIG1peGVyLiAgKFdlIHNob3VsZCBhbGxvdyBzdXBwb3J0IGZvciBvdGhlciBtaXhlcnMsIG1heWJlLikKLSAgICAgKi8KLQotICAgIG5tMjU2X2luc3RhbGxfbWl4ZXIgKGNhcmQpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludCBfX2RldmluaXQKLW5tMjU2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQotewotICAgIGlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8pCi0JcmV0dXJuIG5tMjU2X2luc3RhbGwocGNpZGV2LCBSRVZfTk0yNTZBViwgIjI1NkFWIik7Ci0gICAgaWYgKHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTykKLQlyZXR1cm4gbm0yNTZfaW5zdGFsbChwY2lkZXYsIFJFVl9OTTI1NlpYLCAiMjU2WlgiKTsKLSAgICBpZiAocGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU8pCi0JcmV0dXJuIG5tMjU2X2luc3RhbGwocGNpZGV2LCBSRVZfTk0yNTZaWCwgIjI1NlhMKyIpOwotICAgIHJldHVybiAtMTsgLyogc2hvdWxkIG5vdCBjb21lIGhlcmUgLi4uICovCi19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdAotbm0yNTZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpIHsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqeGNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwqbmV4dF9jYXJkID0gTlVMTDsKLQotICAgIGZvciAoY2FyZCA9IG5tY2FyZF9saXN0OyBjYXJkICE9IE5VTEw7IGNhcmQgPSBuZXh0X2NhcmQpIHsKLQluZXh0X2NhcmQgPSBjYXJkLT5uZXh0X2NhcmQ7Ci0JaWYgKGNhcmQgPT0geGNhcmQpIHsKLQkgICAgc3RvcFBsYXkgKGNhcmQpOwotCSAgICBzdG9wUmVjb3JkIChjYXJkKTsKLQkgICAgaWYgKGNhcmQtPmhhc19pcnEpCi0JCWZyZWVfaXJxIChjYXJkLT5pcnEsIGNhcmQpOwotCSAgICBubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKLQkgICAgc291bmRfdW5sb2FkX21peGVyZGV2IChjYXJkLT5taXhlcl9vc3NfZGV2KTsKLQkgICAgc291bmRfdW5sb2FkX2F1ZGlvZGV2IChjYXJkLT5kZXZbMF0pOwotCSAgICBzb3VuZF91bmxvYWRfYXVkaW9kZXYgKGNhcmQtPmRldlsxXSk7Ci0JICAgIGtmcmVlIChjYXJkKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBpZiAobm1jYXJkX2xpc3QgPT0gY2FyZCkKLSAgICAJbm1jYXJkX2xpc3QgPSBuZXh0X2NhcmQ7Ci19Ci0KLS8qCi0gKiBPcGVuIHRoZSBkZXZpY2UKLSAqCi0gKiBERVYgIC0gZGV2aWNlCi0gKiBNT0RFIC0gbW9kZSB0byBvcGVuIGRldmljZSAobG9naWNhbCBPUiBvZiBPUEVOX1JFQUQgYW5kIE9QRU5fV1JJVEUpCi0gKgotICogQ2FsbGVkIHdoZW4gb3BlbmluZyB0aGUgRE1BYnVmICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjI1OSkKLSAqLwotc3RhdGljIGludAotbm0yNTZfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLSAgICBpbnQgdzsKLQkKLSAgICBpZiAoY2FyZCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGNhcmQtPmRldlswXSA9PSBkZXYpCi0JdyA9IDA7Ci0gICAgZWxzZSBpZiAoY2FyZC0+ZGV2WzFdID09IGRldikKLQl3ID0gMTsKLSAgICBlbHNlCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoY2FyZC0+b3BlbmNudFt3XSA+IDApCi0JcmV0dXJuIC1FQlVTWTsKLQotICAgIC8qIE5vIGJpdHMgc2V0PyBIdWg/ICovCi0gICAgaWYgKCEgKChtb2RlICYgT1BFTl9SRUFEKSB8fCAobW9kZSAmIE9QRU5fV1JJVEUpKSkKLQlyZXR1cm4gLUVJTzsKLQotICAgIC8qCi0gICAgICogSWYgaXQncyBvcGVuIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLCBhbmQgdGhlIGNhcmQncyBjdXJyZW50bHkKLSAgICAgKiBiZWluZyByZWFkIG9yIHdyaXR0ZW4gdG8sIHRoZW4gZG8gdGhlIG9wcG9zaXRlIG9mIHdoYXQgaGFzCi0gICAgICogYWxyZWFkeSBiZWVuIGRvbmUuICBPdGhlcndpc2UsIGRvbid0IHNwZWNpZnkgYW55IG1vZGUgdW50aWwgdGhlCi0gICAgICogdXNlciBhY3R1YWxseSB0cmllcyB0byBkbyBJL08uICAoU29tZSBwcm9ncmFtcyBvcGVuIHRoZSBkZXZpY2UKLSAgICAgKiBmb3IgYm90aCByZWFkIGFuZCB3cml0ZSwgYnV0IG9ubHkgYWN0dWFsbHkgZG8gcmVhZGluZyBvciB3cml0aW5nLikKLSAgICAgKi8KLQotICAgIGlmICgobW9kZSAmIE9QRU5fV1JJVEUpICYmIChtb2RlICYgT1BFTl9SRUFEKSkgewotCWlmIChjYXJkLT5pc19vcGVuX3BsYXkpCi0JICAgIG1vZGUgPSBPUEVOX1dSSVRFOwotCWVsc2UgaWYgKGNhcmQtPmlzX29wZW5fcmVjb3JkKQotCSAgICBtb2RlID0gT1BFTl9SRUFEOwotCWVsc2UgbW9kZSA9IDA7Ci0gICAgfQotCQotICAgIGlmIChtb2RlICYgT1BFTl9XUklURSkgewotCWlmIChjYXJkLT5pc19vcGVuX3BsYXkgPT0gMCkgewotCSAgICBjYXJkLT5kZXZfZm9yX3BsYXkgPSBkZXY7Ci0JICAgIGNhcmQtPmlzX29wZW5fcGxheSA9IDE7Ci0JfQotCWVsc2UKLQkgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSAmIE9QRU5fUkVBRCkgewotCWlmIChjYXJkLT5pc19vcGVuX3JlY29yZCA9PSAwKSB7Ci0JICAgIGNhcmQtPmRldl9mb3JfcmVjb3JkID0gZGV2OwotCSAgICBjYXJkLT5pc19vcGVuX3JlY29yZCA9IDE7Ci0JfQotCWVsc2UKLQkgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0KLSAgICBjYXJkLT5vcGVuY250W3ddKys7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDbG9zZSB0aGUgZGV2aWNlCi0gKgotICogREVWICAtIGRldmljZQotICoKLSAqIENhbGxlZCB3aGVuIGNsb3NpbmcgdGhlIERNQWJ1ZiAgICAgICAgICAgICAgIChkbWFidWYuYzo0NzcpCi0gKiAgICAgIGFmdGVyIGhhbHRfeGZlcgotICovCi1zdGF0aWMgdm9pZAotbm0yNTZfYXVkaW9fY2xvc2UoaW50IGRldikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQkKLSAgICBpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JaW50IHc7Ci0KLQlpZiAoY2FyZC0+ZGV2WzBdID09IGRldikKLQkgICAgdyA9IDA7Ci0JZWxzZSBpZiAoY2FyZC0+ZGV2WzFdID09IGRldikKLQkgICAgdyA9IDE7Ci0JZWxzZQotCSAgICByZXR1cm47Ci0KLQljYXJkLT5vcGVuY250W3ddLS07Ci0JaWYgKGNhcmQtPm9wZW5jbnRbd10gPD0gMCkgewotCSAgICBjYXJkLT5vcGVuY250W3ddID0gMDsKLQotCSAgICBpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldikgewotCQlzdG9wUGxheSAoY2FyZCk7Ci0JCWNhcmQtPmlzX29wZW5fcGxheSA9IDA7Ci0JCWNhcmQtPmRldl9mb3JfcGxheSA9IC0xOwotCSAgICB9Ci0KLQkgICAgaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldikgewotCQlzdG9wUmVjb3JkIChjYXJkKTsKLQkJY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAwOwotCQljYXJkLT5kZXZfZm9yX3JlY29yZCA9IC0xOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogU3RhbmRhcmQgaW9jdGwgaGFuZGxlci4gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCi17Ci0gICAgaW50IHJldDsKLSAgICB1MzIgb2xkaW5mbzsKLSAgICBpbnQgdzsKLQotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmIChkZXYgPT0gY2FyZC0+ZGV2WzBdKQotCXcgPSAwOwotICAgIGVsc2UKLQl3ID0gMTsKLQotICAgIC8qIAotICAgICAqIFRoZSBjb2RlIGhlcmUgaXMgbWVzc3kuICBUaGVyZSBhcmUgcHJvYmFibHkgYmV0dGVyIHdheXMgdG8gZG8KLSAgICAgKiBpdC4gIChJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGFuZGxlIGl0IHRoZSBzYW1lIHdheSB0aGUgQUM5NyBtaXhlciAKLSAgICAgKiBpcyBkb25lLikKLSAgICAgKi8KLSAgICBzd2l0Y2ggKGNtZCkKLQl7Ci0JY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKLQkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkgICAgaWYgKHJldCAhPSAwKSB7Ci0JCW9sZGluZm8gPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOwotCQljYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlID0gcmV0OwotCQlyZXQgPSBubTI1Nl9zZXRJbmZvKGRldiwgY2FyZCk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJICAgIGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGUgPSBvbGRpbmZvOwotCSAgICB9Ci0JICAgIGlmIChyZXQgPT0gMCkKLQkJcmV0ID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0JICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKLQkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkgICAgY2FyZC0+c2luZm9bd10uc3RlcmVvID0gcmV0ID8gMSA6IDA7Ci0JICAgIHJldCA9IG5tMjU2X3NldEluZm8gKGRldiwgY2FyZCk7Ci0JICAgIGlmIChyZXQgPT0gMCkKLQkJcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvOwotCi0JICAgIGJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6Ci0JICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JICAgIGlmIChyZXQgPCAxIHx8IHJldCA+IDMpCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyArIDE7Ci0JICAgIGVsc2UgewotCQljYXJkLT5zaW5mb1t3XS5zdGVyZW8gPSByZXQgLSAxOwotCQlyZXQgPSBubTI1Nl9zZXRJbmZvIChkZXYsIGNhcmQpOwotCQlpZiAocmV0ID09IDApCi0JCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gKyAxOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvICsgMTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURk1UOgotCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCSAgICBpZiAocmV0ICE9IDApIHsKLQkJb2xkaW5mbyA9IGNhcmQtPnNpbmZvW3ddLmJpdHM7Ci0JCWNhcmQtPnNpbmZvW3ddLmJpdHMgPSByZXQ7Ci0JCXJldCA9IG5tMjU2X3NldEluZm8gKGRldiwgY2FyZCk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJICAgIGNhcmQtPnNpbmZvW3ddLmJpdHMgPSBvbGRpbmZvOwotCSAgICB9Ci0JICAgIGlmIChyZXQgPT0gMCkKLQkJcmV0ID0gY2FyZC0+c2luZm9bd10uYml0czsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLmJpdHM7Ci0JICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIC1FSU5WQUw7Ci0JfQotICAgIHJldHVybiBwdXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZyk7Ci19Ci0KLS8qCi0gKiBHaXZlbiB0aGUgc291bmQgZGV2aWNlIERFViBhbmQgYW4gYXNzb2NpYXRlZCBwaHlzaWNhbCBidWZmZXIgUEhZU0JVRiwgCi0gKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgYnVmZmVyIGluIGtlcm5lbCBzcGFjZS4gCi0gKgotICogVGhpcyByb3V0aW5lIHNob3VsZCBleGlzdCBhcyBwYXJ0IG9mIHRoZSBzb3VuZGNvcmUgcm91dGluZXMuCi0gKi8KLQotc3RhdGljIGNoYXIgKgotbm0yNTZfZ2V0RE1BYnVmZmVyIChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNidWYpCi17Ci0gICAgc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07Ci0gICAgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhZGV2LT5kbWFwX291dDsKLSAgICBjaGFyICpkbWFfc3RhcnQgPQotCShjaGFyICopKHBoeXNidWYgLSAodW5zaWduZWQgbG9uZylkbWFwLT5yYXdfYnVmX3BoeXMgCi0JCSArICh1bnNpZ25lZCBsb25nKWRtYXAtPnJhd19idWYpOwotCi0gICAgcmV0dXJuIGRtYV9zdGFydDsKLX0KLQotCi0vKgotICogT3V0cHV0IGEgYmxvY2sgdG8gc291bmQgZGV2aWNlCi0gKgotICogZGV2ICAgICAgICAgIC0gZGV2aWNlIG51bWJlcgotICogYnVmICAgICAgICAgIC0gcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIKLSAqIHRvdGFsX2NvdW50ICAtIHRvdGFsIGJ5dGUgY291bnQgaW4gYnVmZmVyCi0gKiBpbnRyZmxhZyAgICAgLSBzZXQgaWYgdGhpcyBoYXMgYmVlbiBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgCi0gKgkJCQkgICh2aWEgRE1BYnVmX291dHB1dGludHIpCi0gKiByZXN0YXJ0X2RtYSAgLSBzZXQgaWYgZW5naW5lIG5lZWRzIHRvIGJlIHJlLWluaXRpYWxpc2VkCi0gKgotICogQ2FsbGVkIHdoZW46Ci0gKiAgMS4gU3RhcnRpbmcgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzoxMzI3KQotICogIDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6MTUwNCkKLSAqICAzLiBBIG5ldyBidWZmZXIgbmVlZHMgdG8gYmUgc2VudCB0byB0aGUgZGV2aWNlICAgICAgKGRtYWJ1Zi5jOjE1NzkpCi0gKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9hdWRpb19vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYnVmLAotCQkJCSAgICAgICBpbnQgdG90YWxfY291bnQsIGludCBpbnRyZmxhZykKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkICE9IE5VTEwpIHsKLQljaGFyICpkbWFfYnVmID0gbm0yNTZfZ2V0RE1BYnVmZmVyIChkZXYsIHBoeXNidWYpOwotCWNhcmQtPmlzX29wZW5fcGxheSA9IDE7Ci0JY2FyZC0+ZGV2X2Zvcl9wbGF5ID0gZGV2OwotCW5tMjU2X3dyaXRlX2Jsb2NrIChjYXJkLCBkbWFfYnVmLCB0b3RhbF9jb3VudCk7Ci0gICAgfQotfQotCi0vKiBEaXR0bywgYnV0IGRvIHJlY29yZGluZyBpbnN0ZWFkLiAgKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9hdWRpb19zdGFydF9pbnB1dChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNidWYsIGludCBjb3VudCwKLQkJCWludCBpbnRyZmxhZykKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkICE9IE5VTEwpIHsKLQljaGFyICpkbWFfYnVmID0gbm0yNTZfZ2V0RE1BYnVmZmVyIChkZXYsIHBoeXNidWYpOwotCWNhcmQtPmlzX29wZW5fcmVjb3JkID0gMTsKLQljYXJkLT5kZXZfZm9yX3JlY29yZCA9IGRldjsKLQlubTI1Nl9zdGFydFJlY29yZGluZyAoY2FyZCwgZG1hX2J1ZiwgY291bnQpOwotICAgIH0KLX0KLQotLyogCi0gKiBQcmVwYXJlIGZvciBpbnB1dHRpbmcgc2FtcGxlcyB0byBERVYuIAotICogRWFjaCByZXF1ZXN0ZWQgYnVmZmVyIHdpbGwgYmUgQlNJWkUgYnllcyBsb25nLCB3aXRoIGEgdG90YWwgb2YKLSAqIEJDT1VOVCBidWZmZXJzLiAKLSAqLwotCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCA9PSBOVUxMKSAKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmIChjYXJkLT5pc19vcGVuX3JlY29yZCAmJiBjYXJkLT5kZXZfZm9yX3JlY29yZCAhPSBkZXYpCi0JcmV0dXJuIC1FQlVTWTsKLQotICAgIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZmxhZ3MgfD0gRE1BX05PRE1BOwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogUHJlcGFyZSBmb3Igb3V0cHV0dGluZyBzYW1wbGVzIHRvIGBkZXYnCi0gKgotICogRWFjaCBidWZmZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCB3aWxsIGJlIGBic2l6ZScgYnl0ZXMgbG9uZywKLSAqIHdpdGggYSB0b3RhbCBvZiBgYmNvdW50JyBidWZmZXJzLgotICoKLSAqIENhbGxlZCB3aGVuOgotICogIDEuIEEgdHJpZ2dlciBlbmFibGVzIGF1ZGlvIG91dHB1dCAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6OTc4KQotICogIDIuIFdlIGdldCBhIHdyaXRlIGJ1ZmZlciB3aXRob3V0IGRtYV9tb2RlIHNldHVwICAgICAoZG1hYnVmLmM6MTE1MikKLSAqICAzLiBXZSByZXN0YXJ0IGEgdHJhbnNmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjEzMjQpCi0gKi8KLQotc3RhdGljIGludAotbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkID09IE5VTEwpCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoY2FyZC0+aXNfb3Blbl9wbGF5ICYmIGNhcmQtPmRldl9mb3JfcGxheSAhPSBkZXYpCi0JcmV0dXJuIC1FQlVTWTsKLQotICAgIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9OT0RNQTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBERVYuICAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2F1ZGlvX3Jlc2V0KGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JaWYgKGNhcmQtPmRldl9mb3JfcGxheSA9PSBkZXYpCi0JICAgIHN0b3BQbGF5IChjYXJkKTsKLQlpZiAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPT0gZGV2KQotCSAgICBzdG9wUmVjb3JkIChjYXJkKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX2xvY2FsX3FsZW4oaW50IGRldikKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgbm0yNTZfYXVkaW9fZHJpdmVyID0KLXsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQkJPSBubTI1Nl9hdWRpb19vcGVuLAotCS5jbG9zZQkJCT0gbm0yNTZfYXVkaW9fY2xvc2UsCi0JLm91dHB1dF9ibG9jawkJPSBubTI1Nl9hdWRpb19vdXRwdXRfYmxvY2ssCi0JLnN0YXJ0X2lucHV0CQk9IG5tMjU2X2F1ZGlvX3N0YXJ0X2lucHV0LAotCS5pb2N0bAkJCT0gbm0yNTZfYXVkaW9faW9jdGwsCi0JLnByZXBhcmVfZm9yX2lucHV0CT0gbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCi0JLnByZXBhcmVfZm9yX291dHB1dAk9IG5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKLQkuaGFsdF9pbwkJPSBubTI1Nl9hdWRpb19yZXNldCwKLQkubG9jYWxfcWxlbgkJPSBubTI1Nl9hdWRpb19sb2NhbF9xbGVuLAotfTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5tMjU2X3BjaV90YmxbXSA9IHsKLQl7UENJX1ZFTkRPUl9JRF9ORU9NQUdJQywgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NkFWX0FVRElPLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05FT01BR0lDLCBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU8sCi0JUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMH0sCi0Je1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDB9LAotCXswLH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbm0yNTZfcGNpX3RibCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5tMjU2X3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gIm5tMjU2X2F1ZGlvIiwKLQkuaWRfdGFibGUJPSBubTI1Nl9wY2lfdGJsLAotCS5wcm9iZQkJPSBubTI1Nl9wcm9iZSwKLQkucmVtb3ZlCQk9IG5tMjU2X3JlbW92ZSwKLX07Ci0KLW1vZHVsZV9wYXJhbSh1c2VjYWNoZSwgYm9vbCwgMCk7Ci1tb2R1bGVfcGFyYW0oYnVmZmVydG9wLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKG5tMjU2X2RlYnVnLCBib29sLCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShmb3JjZV9sb2FkLCBib29sLCAwKTsKLQotc3RhdGljIGludCBfX2luaXQgZG9faW5pdF9ubTI1Nih2b2lkKQotewotICAgIHByaW50ayAoS0VSTl9JTkZPICJOZW9NYWdpYyAyNTZBVi8yNTZaWCBhdWRpbyBkcml2ZXIsIHZlcnNpb24gMS4xcFxuIik7Ci0gICAgcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm5tMjU2X3BjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9ubTI1NiAodm9pZCkKLXsKLSAgICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5tMjU2X3BjaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChkb19pbml0X25tMjU2KTsKLW1vZHVsZV9leGl0KGNsZWFudXBfbm0yNTYpOwotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oIGIvc291bmQvb3NzL25tMjU2X2NvZWZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzA3ZjMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL25tMjU2X2NvZWZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0Njk3ICswLDAgQEAKLSNpZm5kZWYgTk0yNTZfQ09FRkZfSAotI2RlZmluZSBOTTI1Nl9DT0VGRl9ICi0KLSNkZWZpbmUgTk1fVE9UQUxfQ09FRkZfQ09VTlQgMHgzMTU4Ci0KLXN0YXRpYyBjaGFyIGNvZWZmaWNpZW50c1tOTV9UT1RBTF9DT0VGRl9DT1VOVCAqIDRdID0geyAKLQkweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRCLCAweEZGLCAweEE1LCAweDAxLCAweEVGLCAweEZDLCAweDIxLAotCTB4MDUsIDB4ODcsIDB4RjcsIDB4NjIsIDB4MTEsIDB4RTksIDB4NDUsIDB4NUUsIDB4RjksIDB4QjUsIDB4MDEsCi0JMHhERSwgMHhGRiwgMHhBNCwgMHhGRiwgMHg2MCwgMHgwMCwgMHhDQSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ2LCAweDA2LAotCTB4NEMsIDB4RjMsIDB4RUQsIDB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsIDB4RjMsIDB4NEUsIDB4MDUsIDB4QjEsCi0JMHhGRCwgMHhFMSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJBLCAweDAwLCAweDVDLCAweEZGLCAweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLAotCTB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsCi0JMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwKLQkweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLCAweEZELCAweDRFLCAweDA1LCAweDRBLCAweEYzLAotCTB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsIDB4RDYsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQSwgMHhGRiwKLQkweDYwLCAweDAwLCAweEE0LCAweEZGLCAweERFLCAweEZGLCAweEI1LCAweDAxLCAweDVFLCAweEY5LCAweEU5LAotCTB4NDUsIDB4NjIsIDB4MTEsIDB4ODcsIDB4RjcsIDB4MjEsIDB4MDUsIDB4RUYsIDB4RkMsIDB4QTUsIDB4MDEsCi0JMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwKLQkweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLAotCTB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsCi0JMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKLQkweENBLCAweDAxLCAweDk1LCAweEZDLCAweEVBLCAweDA1LCAweEJCLCAweEY1LCAweDI1LCAweDE3LCAweDNDLAotCTB4NDMsIDB4OEQsIDB4RjYsIDB4NDMsIDB4MDMsIDB4RjUsIDB4RkUsIDB4MjYsIDB4MDAsIDB4MjAsIDB4MDAsCi0JMHhFMiwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0RCwgMHhGRiwgMHhDNSwKLQkweDAxLCAweDRDLCAweEZDLCAweDI2LCAweDA3LCAweEEzLCAweEYxLCAweEFCLCAweDJDLCAweEJCLCAweDMzLAotCTB4OEYsIDB4RjEsIDB4Q0EsIDB4MDYsIDB4QTYsIDB4RkMsIDB4ODUsIDB4MDEsIDB4NkYsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENSwgMHhGRiwgMHhCQywgMHgwMCwKLQkweEYwLCAweEZELCAweEVDLCAweDA0LCAweEQ5LCAweEYzLCAweEIxLCAweDNFLCAweENELCAweDFFLCAweEMxLAotCTB4RjMsIDB4QUYsIDB4MDYsIDB4NDksIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCQiwgMHgwMCwgMHhFOSwgMHhGRSwgMHgzOCwKLQkweDAxLCAweDRCLCAweEZGLCAweDI4LCAweEZFLCAweDNBLCAweDQ4LCAweDA0LCAweDBBLCAweDJFLCAweEZBLAotCTB4REYsIDB4MDMsIDB4OEEsIDB4RkQsIDB4NjAsIDB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHg5OCwgMHgwMSwgMHgwRCwgMHhGRCwKLQkweEUwLCAweDA0LCAweDE0LCAweEY4LCAweEMzLCAweDBGLCAweDg5LCAweDQ2LCAweDRDLCAweEZBLCAweDM4LAotCTB4MDEsIDB4MjUsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NzMsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgwRiwKLQkweDA3LCAweDg0LCAweEYyLCAweDI5LCAweDI1LCAweDFBLCAweDNBLCAweDY3LCAweEYyLCAweEY2LCAweDA1LAotCTB4NDEsIDB4RkQsIDB4MjQsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgxNSwgMHgwMCwgMHg5NywgMHhGRiwgMHgzNywgMHgwMSwgMHgyMiwgMHhGRCwgMHgyMywgMHgwNiwKLQkweDJGLCAweEYyLCAweDExLCAweDM5LCAweDdCLCAweDI2LCAweDUwLCAweEYyLCAweDFCLCAweDA3LCAweDMyLAotCTB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhDOCwgMHhGRiwgMHg2NCwgMHgwMCwgMHg5QiwgMHhGRiwgMHhFRSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg5MywKLQkweEY5LCAweDEwLCAweDQ2LCAweDAzLCAweDExLCAweEE3LCAweEY3LCAweDEyLCAweDA1LCAweEY2LCAweEZDLAotCTB4QTIsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsCi0JMHgwMCwgMHg2QSwgMHhGRiwgMHg1MywgMHgwMSwgMHhBNiwgMHhGRCwgMHhBNiwgMHgwMywgMHhBMSwgMHhGQSwKLQkweERFLCAweDA4LCAweDc2LCAweDQ4LCAweDBDLCAweEZGLCAweERFLCAweEZFLCAweDczLCAweDAxLCAweEM5LAotCTB4RkUsIDB4Q0EsIDB4MDAsIDB4QTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMSwgMHgwMSwgMHg1MiwgMHhGQywgMHg5MywgMHgwNiwgMHgxMCwgMHhGNCwgMHg3OCwKLQkweDFELCAweDkwLCAweDNGLCAweDNFLCAweEY0LCAweEFBLCAweDA0LCAweDE5LCAweEZFLCAweEE0LCAweDAwLAotCTB4RTIsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjgsCi0JMHhGRiwgMHg5MywgMHgwMSwgMHg5MiwgMHhGQywgMHhFMiwgMHgwNiwgMHg4MywgMHhGMSwgMHg4QywgMHgzMiwKLQkweEVELCAweDJELCAweDkwLCAweEYxLCAweDFFLCAweDA3LCAweDU3LCAweEZDLCAweEJELCAweDAxLCAweDUxLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTIsIDB4MDAsCi0JMHg0MiwgMHgwMCwgMHhDNCwgMHhGRSwgMHg5NCwgMHgwMywgMHgwMiwgMHhGNiwgMHg4OSwgMHg0MiwgMHg3NiwKLQkweDE4LCAweDVDLCAweEY1LCAweDEyLCAweDA2LCAweDg0LCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4NTMsCi0JMHhGRSwgMHg1MywgMHgwMiwgMHgzOSwgMHhGRCwgMHhBOSwgMHgwMiwgMHhGMiwgMHg0OCwgMHhCOSwgMHgwNCwKLQkweDU0LCAweEZDLCAweENBLCAweDAyLCAweDE2LCAweEZFLCAweDIwLCAweDAxLCAweDdGLCAweEZGLCAweDIwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzMsIDB4MDEsCi0JMHhBNywgMHhGQywgMHhDMCwgMHgwNSwgMHgxRSwgMHhGNiwgMHhEOCwgMHgxNSwgMHhFNywgMHg0MywgMHgyMCwKLQkweEY3LCAweEVGLCAweDAyLCAweDI3LCAweEZGLCAweDBBLCAweDAwLCAweDJFLCAweDAwLCAweERELCAweEZGLAotCTB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0QsIDB4MDEsIDB4NDMsCi0JMHhGQywgMHgyQSwgMHgwNywgMHhCQywgMHhGMSwgMHg2NCwgMHgyQiwgMHhFMywgMHgzNCwgMHhBMywgMHhGMSwKLQkweEFFLCAweDA2LCAweEJELCAweEZDLCAweDc3LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4RDQsIDB4MDAsIDB4QzgsIDB4RkQsCi0JMHgyQSwgMHgwNSwgMHg3RCwgMHhGMywgMHhDQSwgMHgzRCwgMHgyMiwgMHgyMCwgMHg3NiwgMHhGMywgMHhDOCwKLQkweDA2LCAweDQxLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUMsIDB4MDAsIDB4MDgsIDB4RkYsIDB4RkQsIDB4MDAsIDB4QjUsCi0JMHhGRiwgMHg0QiwgMHhGRCwgMHhGNCwgMHg0NywgMHgzMCwgMHgwQiwgMHhCQywgMHhGOSwgMHgxNywgMHgwNCwKLQkweDZFLCAweEZELCAweDZELCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MkMsIDB4MDAsIDB4NTQsIDB4RkYsIDB4OEQsIDB4MDEsIDB4MjYsIDB4RkQsIDB4QUQsIDB4MDQsCi0JMHg4MiwgMHhGOCwgMHg4NywgMHgwRSwgMHhGOSwgMHg0NiwgMHgwQywgMHhGQiwgMHhENCwgMHgwMCwgMHg1RCwKLQkweDAwLCAweDVFLCAweEZGLCAweDgyLCAweDAwLCAweEJELCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MDEsIDB4MDcsIDB4QkUsCi0JMHhGMiwgMHhENiwgMHgyMywgMHgxRiwgMHgzQiwgMHhBNSwgMHhGMiwgMHhDNSwgMHgwNSwgMHg2MiwgMHhGRCwKLQkweDEwLCAweDAxLCAweEFCLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LAotCTB4MDAsIDB4OEUsIDB4RkYsIDB4NDksIDB4MDEsIDB4MDQsIDB4RkQsIDB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsCi0JMHhGRSwgMHgzNywgMHhDQiwgMHgyNywgMHgyMSwgMHhGMiwgMHgyMywgMHgwNywgMHgzNCwgMHhGQywgMHhERCwKLQkweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLCAweDAwLCAweENFLCAweEZGLAotCTB4NTYsIDB4MDAsIDB4QjksIDB4RkYsIDB4QjgsIDB4RkYsIDB4RjcsIDB4MDEsIDB4RTIsIDB4RjgsIDB4OEQsCi0JMHg0NSwgMHg0NiwgMHgxMiwgMHgzQywgMHhGNywgMHg0MywgMHgwNSwgMHhERiwgMHhGQywgMHhBQywgMHgwMSwKLQkweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLAotCTB4RkYsIDB4NDYsIDB4MDEsIDB4QzMsIDB4RkQsIDB4NkQsIDB4MDMsIDB4MTQsIDB4RkIsIDB4QkUsIDB4MDcsCi0JMHhBNiwgMHg0OCwgMHhGOCwgMHhGRiwgMHg3MCwgMHhGRSwgMHhBRSwgMHgwMSwgMHhBQSwgMHhGRSwgMHhEOSwKLQkweDAwLCAweDlBLCAweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4REUsIDB4MDEsIDB4NUQsIDB4RkMsIDB4NzQsIDB4MDYsIDB4NjMsIDB4RjQsIDB4MjMsIDB4MUMsIDB4NjYsCi0JMHg0MCwgMHhBQSwgMHhGNCwgMHg2NSwgMHgwNCwgMHg0NCwgMHhGRSwgMHg4QiwgMHgwMCwgMHhFRSwgMHhGRiwKLQkweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLAotCTB4MDEsIDB4ODAsIDB4RkMsIDB4RjcsIDB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsCi0JMHg4MywgMHhGMSwgMHgxMywgMHgwNywgMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywKLQkweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVELCAweEZGLCAweDA1LCAweDAwLCAweDVELCAweDAwLAotCTB4OTUsIDB4RkUsIDB4RTIsIDB4MDMsIDB4N0YsIDB4RjUsIDB4Q0MsIDB4NDEsIDB4QzcsIDB4MTksIDB4RkYsCi0JMHhGNCwgMHgzNywgMHgwNiwgMHg3NSwgMHhGQywgMHhENiwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkwLCAweEZGLCAweEY0LCAweDAwLCAweDcyLCAweEZFLCAweDE4LAotCTB4MDIsIDB4QUEsIDB4RkQsIDB4QUIsIDB4MDEsIDB4REYsIDB4NDgsIDB4Q0EsIDB4MDUsIDB4RTEsIDB4RkIsCi0JMHgwNSwgMHgwMywgMHhGNywgMHhGRCwgMHgyRSwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQzLCAweEZGLCAweEJCLCAweDAxLCAweEJBLCAweEZDLAotCTB4OTUsIDB4MDUsIDB4ODMsIDB4RjYsIDB4OEMsIDB4MTQsIDB4ODcsIDB4NDQsIDB4QkIsIDB4RjcsIDB4OTgsCi0JMHgwMiwgMHg1QSwgMHhGRiwgMHhFRSwgMHhGRiwgMHgzQywgMHgwMCwgMHhEOCwgMHhGRiwgMHgwQSwgMHgwMCwKLQkweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLAotCTB4MDcsIDB4REMsIDB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsCi0JMHhENSwgMHhGQywgMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwKLQkweDAwLCAweDA3LCAweDAwLCAweEJFLCAweEZGLCAweEVBLCAweDAwLCAweEEyLCAweEZELCAweDY1LCAweDA1LAotCTB4MjgsIDB4RjMsIDB4REIsIDB4M0MsIDB4NzgsIDB4MjEsIDB4MzAsIDB4RjMsIDB4REYsIDB4MDYsIDB4M0EsCi0JMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEIyLCAweEZGLCAweDlELCAweDAwLCAweDI3LCAweEZGLCAweEMzLCAweDAwLCAweDFGLCAweDAwLCAweDc2LAotCTB4RkMsIDB4QTMsIDB4NDcsIDB4NjAsIDB4MEMsIDB4NEEsIDB4RjksIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkQsCi0JMHg3OSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwKLQkweDAwLCAweDU4LCAweEZGLCAweDgyLCAweDAxLCAweDNGLCAweEZELCAweDc4LCAweDA0LCAweEYyLCAweEY4LAotCTB4NTAsIDB4MEQsIDB4NUUsIDB4NDcsIDB4RDUsIDB4RkIsIDB4NkYsIDB4MDAsIDB4OTYsIDB4MDAsIDB4NDAsCi0JMHhGRiwgMHg5MSwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLCAweEYyLCAweDgxLAotCTB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsIDB4RkIsIDB4MDAsCi0JMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NSwKLQkweEZGLCAweDVCLCAweDAxLCAweEU5LCAweEZDLCAweDczLCAweDA2LCAweEQ4LCAweEYxLCAweEU1LCAweDM2LAotCTB4MTksIDB4MjksIDB4RjgsIDB4RjEsIDB4MjksIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsIDB4MDEsIDB4NDIsCi0JMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMywgMHhGRiwgMHg0NywgMHgwMCwKLQkweEQ3LCAweEZGLCAweDgyLCAweEZGLCAweDUzLCAweDAyLCAweDM5LCAweEY4LCAweEZELCAweDQ0LCAweDhELAotCTB4MTMsIDB4RDMsIDB4RjYsIDB4NzIsIDB4MDUsIDB4Q0EsIDB4RkMsIDB4QjUsIDB4MDEsIDB4NDUsIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3NSwgMHhGRiwgMHgzOSwKLQkweDAxLCAweEUwLCAweEZELCAweDMzLCAweDAzLCAweDg3LCAweEZCLCAweEEyLCAweDA2LCAweENCLCAweDQ4LAotCTB4RUEsIDB4MDAsIDB4MDEsIDB4RkUsIDB4RTksIDB4MDEsIDB4OEEsIDB4RkUsIDB4RTgsIDB4MDAsIDB4OTUsCi0JMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQSwgMHgwMSwKLQkweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LCAweENFLCAweDFBLCAweDMyLCAweDQxLCAweDFGLAotCTB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjAsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1QiwgMHhGRiwgMHhBQiwgMHgwMSwgMHg2RiwKLQkweEZDLCAweDA4LCAweDA3LCAweDdFLCAweEYxLCAweDIxLCAweDMwLCAweDY3LCAweDMwLCAweDdELCAweEYxLAotCTB4MDUsIDB4MDcsIDB4NzMsIDB4RkMsIDB4QTgsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwNSwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3NywgMHgwMCwgMHg2NywgMHhGRSwKLQkweDJELCAweDA0LCAweDA0LCAweEY1LCAweDA3LCAweDQxLCAweDFCLCAweDFCLCAweEE2LCAweEY0LCAweDVBLAotCTB4MDYsIDB4NjcsIDB4RkMsIDB4REIsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFNSwgMHgwMCwgMHg5MSwgMHhGRSwgMHhEQywgMHgwMSwgMHgxQSwKLQkweEZFLCAweEIzLCAweDAwLCAweEMzLCAweDQ4LCAweEUxLCAweDA2LCAweDZFLCAweEZCLCAweDQwLCAweDAzLAotCTB4REEsIDB4RkQsIDB4M0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMywgMHgwMSwgMHhDRiwgMHhGQywgMHg2NywgMHgwNSwKLQkweEVBLCAweEY2LCAweDQ0LCAweDEzLCAweDFFLCAweDQ1LCAweDVFLCAweEY4LCAweDNGLCAweDAyLCAweDhFLAotCTB4RkYsIDB4RDAsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOSwgMHgwMSwgMHgzNiwgMHhGQywgMHgyOCwgMHgwNywgMHgwMSwKLQkweEYyLCAweENFLCAweDI4LCAweDIzLCAweDM3LCAweEUwLCAweEYxLCAweDZCLCAweDA2LCAweEVGLCAweEZDLAotCTB4NTcsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEIsCi0JMHgwMCwgMHhCNCwgMHhGRiwgMHgwMCwgMHgwMSwgMHg3RSwgMHhGRCwgMHg5QywgMHgwNSwgMHhEQywgMHhGMiwKLQkweEU0LCAweDNCLCAweENELCAweDIyLCAweEVFLCAweEYyLCAweEYzLCAweDA2LCAweDM1LCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjgsIDB4RkYsCi0JMHg4RSwgMHgwMCwgMHg0NiwgMHhGRiwgMHg4QSwgMHgwMCwgMHg4NiwgMHgwMCwgMHhBNywgMHhGQiwgMHg0OCwKLQkweDQ3LCAweDk1LCAweDBELCAweEQ5LCAweEY4LCAweDg0LCAweDA0LCAweDM5LCAweEZELCAweDg1LCAweDAxLAotCTB4NTcsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsCi0JMHhGRiwgMHg3NiwgMHgwMSwgMHg1OSwgMHhGRCwgMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywKLQkweEI2LCAweDQ3LCAweEE0LCAweEZDLCAweDA3LCAweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLAotCTB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCi0JMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywgMHhEQSwgMHgwNiwgMHgzRiwgMHhGMywgMHgyQywgMHgyMSwgMHgxMSwKLQkweDNELCAweDNBLCAweEYzLCAweDU4LCAweDA1LCAweEFBLCAweEZELCAweEU1LCAweDAwLCAweEMxLCAweEZGLAotCTB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NkIsCi0JMHgwMSwgMHhDRiwgMHhGQywgMHg5NiwgMHgwNiwgMHhCNywgMHhGMSwgMHhDNiwgMHgzNSwgMHg2NCwgMHgyQSwKLQkweEQ0LCAweEYxLCAweDJCLCAweDA3LCAweDNELCAweEZDLCAweEQyLCAweDAxLCAweDQ1LCAweEZGLCAweDMyLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MzksIDB4MDAsIDB4RjQsIDB4RkYsCi0JMHg0RSwgMHhGRiwgMHhBQywgMHgwMiwgMHg5OCwgMHhGNywgMHg2NSwgMHg0NCwgMHhENiwgMHgxNCwgMHg2QywKLQkweEY2LCAweDlGLCAweDA1LCAweEI2LCAweEZDLCAweEJELCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RkUsCi0JMHhGRCwgMHhGOCwgMHgwMiwgMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwgMHg0OCwgMHhFMywgMHgwMSwKLQkweDkxLCAweEZELCAweDI1LCAweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLCAweDhGLCAweEZGLCAweDFDLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDUsIDB4MDEsIDB4NzgsIDB4RkMsCi0JMHgyRiwgMHgwNiwgMHgxMywgMHhGNSwgMHg3QywgMHgxOSwgMHhGNywgMHg0MSwgMHg5QiwgMHhGNSwgMHhEMSwKLQkweDAzLCAweDlGLCAweEZFLCAweDU3LCAweDAwLCAweDA4LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NjEsIDB4RkMsIDB4MTYsCi0JMHgwNywgMHg4NSwgMHhGMSwgMHhFNiwgMHgyRSwgMHg5RSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGMywgMHgwNiwKLQkweDg0LCAweEZDLCAweDlELCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDA0LAotCTB4MDAsIDB4RjYsIDB4RkYsIDB4RUIsIDB4RkYsIDB4OTEsIDB4MDAsIDB4M0IsIDB4RkUsIDB4NzUsIDB4MDQsCi0JMHg5MiwgMHhGNCwgMHgzNiwgMHg0MCwgMHg2RSwgMHgxQywgMHg1MCwgMHhGNCwgMHg3QiwgMHgwNiwgMHg1QiwKLQkweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLAotCTB4OUMsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsIDB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsCi0JMHhGRiwgMHg5QywgMHg0OCwgMHhGRCwgMHgwNywgMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwKLQkweDQ5LCAweDAxLCAweDZFLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAotCTB4MDAsIDB4NDksIDB4RkYsIDB4QUEsIDB4MDEsIDB4RTQsIDB4RkMsIDB4MzgsIDB4MDUsIDB4NTQsIDB4RjcsCi0JMHhGRSwgMHgxMSwgMHhBQSwgMHg0NSwgMHgwOSwgMHhGOSwgMHhFMiwgMHgwMSwgMHhDNCwgMHhGRiwgMHhCMywKLQkweEZGLCAweDU5LCAweDAwLCAweENELCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjIsIDB4MDcsIDB4MkIsIDB4RjIsIDB4ODAsCi0JMHgyNywgMHgzQiwgMHgzOCwgMHgwQSwgMHhGMiwgMHg0NCwgMHgwNiwgMHgwQiwgMHhGRCwgMHg0NSwgMHgwMSwKLQkweDkwLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE5LAotCTB4RkYsIDB4MTUsIDB4MDEsIDB4NUIsIDB4RkQsIDB4RDAsIDB4MDUsIDB4OTcsIDB4RjIsIDB4RTYsIDB4M0EsCi0JMHgyMSwgMHgyNCwgMHhCMSwgMHhGMiwgMHgwNCwgMHgwNywgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLCAweDAwLAotCTB4NjUsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsIDB4Q0QsCi0JMHgwRSwgMHg2QSwgMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywgMHhGRiwKLQkweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDZBLAotCTB4MDEsIDB4NzQsIDB4RkQsIDB4MEEsIDB4MDQsIDB4RDUsIDB4RjksIDB4RUQsIDB4MEEsIDB4MDMsIDB4NDgsCi0JMHg3QywgMHhGRCwgMHg5RSwgMHhGRiwgMHgwQSwgMHgwMSwgMHgwMSwgMHhGRiwgMHhBRiwgMHgwMCwgMHhBQiwKLQkweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLAotCTB4NDIsIDB4RkMsIDB4QzMsIDB4MDYsIDB4ODcsIDB4RjMsIDB4RDcsIDB4MUYsIDB4RkUsIDB4M0QsIDB4OTEsCi0JMHhGMywgMHgxRCwgMHgwNSwgMHhEMSwgMHhGRCwgMHhDRSwgMHgwMCwgMHhDQywgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc1LCAweEZGLCAweDdBLCAweDAxLCAweEI4LAotCTB4RkMsIDB4QjQsIDB4MDYsIDB4OUUsIDB4RjEsIDB4QTIsIDB4MzQsIDB4QUQsIDB4MkIsIDB4QjYsIDB4RjEsCi0JMHgyOSwgMHgwNywgMHg0NSwgMHhGQywgMHhDQiwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLCAweDAwLCAweDFCLCAweEZGLAotCTB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsIDB4MDcsIDB4RjYsIDB4Q0EsCi0JMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDgwLCAweEZGLCAweDFDLCAweDAxLCAweDFDLCAweEZFLCAweEJELAotCTB4MDIsIDB4NkUsIDB4RkMsIDB4N0QsIDB4MDQsIDB4RjMsIDB4NDgsIDB4RTIsIDB4MDIsIDB4MUYsIDB4RkQsCi0JMHg2MCwgMHgwMiwgMHg0QywgMHhGRSwgMHgwNiwgMHgwMSwgMHg4OSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENGLCAweDAxLCAweDg4LCAweEZDLCAweDA5LCAweDA2LAotCTB4NzEsIDB4RjUsIDB4MkIsIDB4MTgsIDB4QjIsIDB4NDIsIDB4MjAsIDB4RjYsIDB4ODMsIDB4MDMsIDB4Q0YsCi0JMHhGRSwgMHgzQywgMHgwMCwgMHgxNSwgMHgwMCwgMHhFNiwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEJGLCAweDAxLCAweDU0LCAweEZDLCAweDIwLCAweDA3LCAweDk0LAotCTB4RjEsIDB4QTYsIDB4MkQsIDB4RDAsIDB4MzIsIDB4ODUsIDB4RjEsIDB4REQsIDB4MDYsIDB4OTYsIDB4RkMsCi0JMHg5MCwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwKLQkweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLCAweEZFLCAweEI5LCAweDA0LCAweDI3LCAweEY0LAotCTB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsIDB4OTksIDB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsCi0JMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMiwgMHhGRiwKLQkweEM3LCAweDAwLCAweEQwLCAweEZFLCAweDY1LCAweDAxLCAweEY2LCAweEZFLCAweEQ5LCAweEZFLCAweDZBLAotCTB4NDgsIDB4MUYsIDB4MDksIDB4ODcsIDB4RkEsIDB4QjMsIDB4MDMsIDB4QTAsIDB4RkQsIDB4NTYsIDB4MDEsCi0JMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RCwKLQkweEZGLCAweEEwLCAweDAxLCAweEZCLCAweEZDLCAweDA3LCAweDA1LCAweEJGLCAweEY3LCAweEJCLCAweDEwLAotCTB4MkIsIDB4NDYsIDB4QkIsIDB4RjksIDB4ODMsIDB4MDEsIDB4RkEsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NjgsCi0JMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwKLQkweEUxLCAweDAxLCAweDMxLCAweEZDLCAweDE5LCAweDA3LCAweDVCLCAweEYyLCAweDMwLCAweDI2LCAweDRCLAotCTB4MzksIDB4M0IsIDB4RjIsIDB4MUEsIDB4MDYsIDB4MjksIDB4RkQsIDB4MzMsIDB4MDEsIDB4OTksIDB4RkYsCi0JMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwKLQkweDAxLCAweDNBLCAweEZELCAweDAwLCAweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LAotCTB4NzksIDB4RjIsIDB4MTIsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDNCwgMHhGRiwgMHg3MCwgMHgwMCwgMHg4NCwgMHhGRiwKLQkweDE5LCAweDAwLCAweDRELCAweDAxLCAweDIyLCAweEZBLCAweDcwLCAweDQ2LCAweDBBLCAweDEwLCAweEZDLAotCTB4RjcsIDB4RUIsIDB4MDQsIDB4MDgsIDB4RkQsIDB4OUEsIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg1RSwgMHgwMSwgMHg5MCwKLQkweEZELCAweEQyLCAweDAzLCAweDQ3LCAweEZBLCAweEMzLCAweDA5LCAweDQ4LCAweDQ4LCAweDVBLCAweEZFLAotCTB4MzMsIDB4RkYsIDB4NDUsIDB4MDEsIDB4RTIsIDB4RkUsIDB4QkUsIDB4MDAsIDB4QTUsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QiwgMHhGQywKLQkweEE5LCAweDA2LCAweEQyLCAweEYzLCAweDgxLCAweDFFLCAweEU0LCAweDNFLCAweEVGLCAweEYzLCAweERFLAotCTB4MDQsIDB4RjksIDB4RkQsIDB4QjcsIDB4MDAsIDB4RDgsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwKLQkweDA2LCAweDhDLCAweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LAotCTB4NEUsIDB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHhFNCwgMHhGRiwgMHgxRCwgMHgwMCwgMHgyRCwgMHgwMCwgMHhFQSwgMHhGRSwgMHg1NiwgMHgwMywKLQkweDZELCAweEY2LCAweDE3LCAweDQzLCAweDcwLCAweDE3LCAweEE2LCAweEY1LCAweEYzLCAweDA1LCAweDkxLAotCTB4RkMsIDB4Q0MsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHg4NiwgMHhGRiwgMHgwRSwgMHgwMSwgMHgzQiwgMHhGRSwgMHg4MiwgMHgwMiwgMHhFMCwgMHhGQywgMHg3MywKLQkweDAzLCAweEY2LCAweDQ4LCAweEU5LCAweDAzLCAweEFELCAweEZDLCAweDlDLCAweDAyLCAweDJELCAweEZFLAotCTB4MTQsIDB4MDEsIDB4ODMsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5OSwgMHhGQywgMHhFMSwgMHgwNSwgMHhEMSwgMHhGNSwKLQkweERDLCAweDE2LCAweDY1LCAweDQzLCAweEFELCAweEY2LCAweDMxLCAweDAzLCAweDAwLCAweEZGLCAweDIwLAotCTB4MDAsIDB4MjMsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsCi0JMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwgMHhGMSwgMHg2MiwKLQkweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLCAweDgyLCAweDAxLAotCTB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RDMsCi0JMHhGRiwgMHhDMSwgMHgwMCwgMHhFNywgMHhGRCwgMHhGQSwgMHgwNCwgMHhDNCwgMHhGMywgMHg3RSwgMHgzRSwKLQkweDE5LCAweDFGLCAweEIwLCAweEYzLCAweEI1LCAweDA2LCAweDQ3LCAweEZDLCAweEU0LCAweDAxLCAweDM2LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjgsIDB4MDAsCi0JMHhGMCwgMHhGRSwgMHgyQiwgMHgwMSwgMHg2MywgMHhGRiwgMHhGNiwgMHhGRCwgMHgyQywgMHg0OCwgMHg0NywKLQkweDBBLCAweDE0LCAweEZBLCAweEVCLCAweDAzLCAweDg0LCAweEZELCAweDYzLCAweDAxLCAweDY0LCAweEZGLAotCTB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTYsCi0JMHgwMSwgMHgxMywgMHhGRCwgMHhENSwgMHgwNCwgMHgyQywgMHhGOCwgMHg3RCwgMHgwRiwgMHhBMywgMHg0NiwKLQkweDc2LCAweEZBLCAweDIyLCAweDAxLCAweDMyLCAweDAwLCAweDc2LCAweEZGLCAweDc2LCAweDAwLCAweEMxLAotCTB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTQsIDB4MDEsCi0JMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwgMHhERCwgMHgyNCwgMHg1NCwgMHgzQSwgMHg3NCwKLQkweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLCAweDAxLCAweEEzLCAweEZGLCAweDExLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTUsIDB4RkYsIDB4M0IsIDB4MDEsIDB4MUIsCi0JMHhGRCwgMHgyRCwgMHgwNiwgMHgyNCwgMHhGMiwgMHhEMywgMHgzOCwgMHhDNiwgMHgyNiwgMHg0NSwgMHhGMiwKLQkweDFELCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjEsIDB4MDAsIDB4QTIsIDB4RkYsIDB4RTIsIDB4RkYsCi0JMHhBRSwgMHgwMSwgMHg2QiwgMHhGOSwgMHhGMiwgMHg0NSwgMHg0QSwgMHgxMSwgMHg4RiwgMHhGNywgMHgxRCwKLQkweDA1LCAweEYxLCAweEZDLCAweEE0LCAweDAxLCAweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NTEsIDB4MDEsIDB4QUMsIDB4RkQsIDB4OUEsCi0JMHgwMywgMHhCQSwgMHhGQSwgMHg5RSwgMHgwOCwgMHg4MSwgMHg0OCwgMHg0MCwgMHhGRiwgMHhDNiwgMHhGRSwKLQkweDgwLCAweDAxLCAweEMyLCAweEZFLCAweENFLCAweDAwLCAweDlGLCAweEZGLCAweDE3LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTUsIDB4RkMsIDB4OEMsIDB4MDYsCi0JMHgyMiwgMHhGNCwgMHgyQywgMHgxRCwgMHhDMCwgMHgzRiwgMHg1NSwgMHhGNCwgMHg5QiwgMHgwNCwgMHgyMywKLQkweEZFLCAweDlGLCAweDAwLCAweEU0LCAweEZGLCAweEY5LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLAotCTB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTYsIDB4MDEsIDB4OEUsIDB4RkMsIDB4RTcsIDB4MDYsIDB4ODEsCi0JMHhGMSwgMHg0OCwgMHgzMiwgMHgzNCwgMHgyRSwgMHg4RCwgMHhGMSwgMHgxQywgMHgwNywgMHg1QSwgMHhGQywKLQkweEJCLCAweDAxLCAweDUzLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU5LAotCTB4RkYsIDB4MEYsIDB4MDAsIDB4NDgsIDB4MDAsIDB4QjksIDB4RkUsIDB4QTYsIDB4MDMsIDB4RTQsIDB4RjUsCi0JMHg2MCwgMHg0MiwgMHhDMSwgMHgxOCwgMHg0NywgMHhGNSwgMHgxQSwgMHgwNiwgMHg4MSwgMHhGQywgMHhEMiwKLQkweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhCLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4NUEsIDB4RkUsIDB4NDYsIDB4MDIsIDB4NTIsIDB4RkQsIDB4NzAsIDB4MDIsIDB4RUQsCi0JMHg0OCwgMHhGNSwgMHgwNCwgMHgzQiwgMHhGQywgMHhENywgMHgwMiwgMHgwRiwgMHhGRSwgMHgyMywgMHgwMSwKLQkweDdFLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLAotCTB4RkYsIDB4QzEsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QjcsIDB4MDUsIDB4MzQsIDB4RjYsIDB4OEUsIDB4MTUsCi0JMHgwQiwgMHg0NCwgMHg0MiwgMHhGNywgMHhEQywgMHgwMiwgMHgzMiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgzMSwKLQkweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ3LCAweEZGLAotCTB4Q0UsIDB4MDEsIDB4NDEsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QzIsIDB4RjEsIDB4MUIsIDB4MkIsIDB4MjUsCi0JMHgzNSwgMHhBOCwgMHhGMSwgMHhBNywgMHgwNiwgMHhDMiwgMHhGQywgMHg3NCwgMHgwMSwgMHg3OCwgMHhGRiwKLQkweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweEM3LCAweEZGLCAweEQ5LAotCTB4MDAsIDB4QkYsIDB4RkQsIDB4MzgsIDB4MDUsIDB4NjksIDB4RjMsIDB4OTYsIDB4M0QsIDB4NkYsIDB4MjAsCi0JMHg2NiwgMHhGMywgMHhDRSwgMHgwNiwgMHgzRiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFFLCAweEZGLCAweEE5LCAweDAwLCAweDBGLCAweEZGLAotCTB4RjAsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MUIsIDB4RkQsIDB4RTQsIDB4NDcsIDB4NzMsIDB4MEIsIDB4QTIsCi0JMHhGOSwgMHgyMywgMHgwNCwgMHg2OCwgMHhGRCwgMHg3MCwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU1LCAweEZGLCAweDhCLCAweDAxLCAweDJCLAotCTB4RkQsIDB4QTEsIDB4MDQsIDB4OUIsIDB4RjgsIDB4NDIsIDB4MEUsIDB4MEYsIDB4NDcsIDB4MzgsIDB4RkIsCi0JMHhCRSwgMHgwMCwgMHg2QSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4NSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMCwKLQkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLAotCTB4RkQsIDB4MDYsIDB4Q0IsIDB4RjIsIDB4OEEsIDB4MjMsIDB4NTgsIDB4M0IsIDB4QjQsIDB4RjIsIDB4QkEsCi0JMHgwNSwgMHg2QSwgMHhGRCwgMHgwQiwgMHgwMSwgMHhBRSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhDLCAweEZGLCAweDRELCAweDAxLCAweEZFLCAweEZDLCAweDU2LAotCTB4MDYsIDB4RjcsIDB4RjEsIDB4QkYsIDB4MzcsIDB4MTUsIDB4MjgsIDB4MTgsIDB4RjIsIDB4MjUsIDB4MDcsCi0JMHgzNCwgMHhGQywgMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywKLQkweDAwLCAweENGLCAweEZGLCAweDUyLCAweDAwLCAweEMwLCAweEZGLCAweEFDLCAweEZGLCAweDBDLCAweDAyLAotCTB4QkMsIDB4RjgsIDB4NkQsIDB4NDUsIDB4OEUsIDB4MTIsIDB4MjQsIDB4RjcsIDB4NEQsIDB4MDUsIDB4REIsCi0JMHhGQywgMHhBRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDI0LCAweDAwLCAweDcxLCAweEZGLCAweDQzLCAweDAxLCAweEM5LCAweEZELCAweDYwLCAweDAzLCAweDJFLAotCTB4RkIsIDB4N0UsIDB4MDcsIDB4QUYsIDB4NDgsIDB4MkQsIDB4MDAsIDB4NTgsIDB4RkUsIDB4QkIsIDB4MDEsCi0JMHhBMywgMHhGRSwgMHhERCwgMHgwMCwgMHg5OSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM3LCAweEZGLCAweERELCAweDAxLCAweDYwLCAweEZDLCAweDZELCAweDA2LCAweDc2LCAweEY0LAotCTB4RDgsIDB4MUIsIDB4OTUsIDB4NDAsIDB4QzMsIDB4RjQsIDB4NTYsIDB4MDQsIDB4NEUsIDB4RkUsIDB4ODUsCi0JMHgwMCwgMHhGMSwgMHhGRiwgMHhGNCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweDYwLCAweEZGLCAweEEyLCAweDAxLCAweDdDLCAweEZDLCAweEZCLCAweDA2LCAweDdDLCAweEYxLCAweDE1LAotCTB4MzEsIDB4NzMsIDB4MkYsIDB4ODEsIDB4RjEsIDB4MTAsIDB4MDcsIDB4NjcsIDB4RkMsIDB4QjEsIDB4MDEsCi0JMHg1OCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMiwKLQkweDAwLCAweDYzLCAweDAwLCAweDhBLCAweEZFLCAweEYzLCAweDAzLCAweDYzLCAweEY1LCAweEExLCAweDQxLAotCTB4MTIsIDB4MUEsIDB4RUIsIDB4RjQsIDB4M0YsIDB4MDYsIDB4NzIsIDB4RkMsIDB4RDcsIDB4MDEsIDB4MzksCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwgMHhGRiwgMHhGMSwgMHgwMCwKLQkweDc5LCAweEZFLCAweDBBLCAweDAyLCAweEMzLCAweEZELCAweDczLCAweDAxLCAweERCLCAweDQ4LCAweDA3LAotCTB4MDYsIDB4QzcsIDB4RkIsIDB4MTIsIDB4MDMsIDB4RjEsIDB4RkQsIDB4MzEsIDB4MDEsIDB4NzgsIDB4RkYsCi0JMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQSwKLQkweDAxLCAweEJGLCAweEZDLCAweDhCLCAweDA1LCAweDk5LCAweEY2LCAweDQzLCAweDE0LCAweEE5LCAweDQ0LAotCTB4REUsIDB4RjcsIDB4ODUsIDB4MDIsIDB4NjUsIDB4RkYsIDB4RTcsIDB4RkYsIDB4M0YsIDB4MDAsIDB4RDYsCi0JMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhENSwgMHgwMSwKLQkweDNBLCAweEZDLCAweDJBLCAweDA3LCAweEUzLCAweEYxLCAweEQxLCAweDI5LCAweDQ2LCAweDM2LCAweEM1LAotCTB4RjEsIDB4ODcsIDB4MDYsIDB4REEsIDB4RkMsIDB4NjQsIDB4MDEsIDB4ODAsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQywgMHhGRiwgMHhFRiwgMHgwMCwgMHg5QSwKLQkweEZELCAweDcyLCAweDA1LCAweDE2LCAweEYzLCAweEE1LCAweDNDLCAweEM0LCAweDIxLCAweDIxLCAweEYzLAotCTB4RTQsIDB4MDYsIDB4MzksIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyRSwgMHhGRiwgMHhCNiwgMHgwMCwKLQkweDM2LCAweDAwLCAweDQ3LCAweEZDLCAweDkwLCAweDQ3LCAweEE0LCAweDBDLCAweDMxLCAweEY5LCAweDVBLAotCTB4MDQsIDB4NEUsIDB4RkQsIDB4N0MsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHg4MCwgMHgwMSwgMHg0NSwgMHhGRCwgMHg2QywKLQkweDA0LCAweDBCLCAweEY5LCAweDBCLCAweDBELCAweDczLCAweDQ3LCAweDAyLCAweEZDLCAweDU4LCAweDAwLAotCTB4QTMsIDB4MDAsIDB4MzksIDB4RkYsIDB4OTQsIDB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNywgMHhGQywgMHhFQiwgMHgwNiwKLQkweDBCLCAweEYzLCAweDM1LCAweDIyLCAweDUyLCAweDNDLCAweEZELCAweEYyLCAweDg0LCAweDA1LCAweDhELAotCTB4RkQsIDB4RjYsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxRCwgMHgwMCwgMHg4MywgMHhGRiwgMHg1RSwgMHgwMSwgMHhFMywgMHhGQywgMHg3QiwgMHgwNiwgMHhEMCwKLQkweEYxLCAweEE1LCAweDM2LCAweDYyLCAweDI5LCAweEVGLCAweEYxLCAweDI5LCAweDA3LCAweDM5LCAweEZDLAotCTB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDUsCi0JMHhGRiwgMHg0NCwgMHgwMCwgMHhERCwgMHhGRiwgMHg3NywgMHhGRiwgMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwKLQkweERDLCAweDQ0LCAweEQ1LCAweDEzLCAweEJDLCAweEY2LCAweDdDLCAweDA1LCAweEM1LCAweEZDLCAweEI3LAotCTB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsCi0JMHg3NiwgMHhGRiwgMHgzNSwgMHgwMSwgMHhFNywgMHhGRCwgMHgyNiwgMHgwMywgMHhBMSwgMHhGQiwgMHg2NCwKLQkweDA2LCAweEQyLCAweDQ4LCAweDIxLCAweDAxLCAweEU4LCAweEZELCAweEY3LCAweDAxLCAweDgzLCAweEZFLAotCTB4RUMsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksCi0JMHhGRiwgMHhEOSwgMHgwMSwgMHg2RCwgMHhGQywgMHg0QiwgMHgwNiwgMHhDRCwgMHhGNCwgMHg4MywgMHgxQSwKLQkweDVGLCAweDQxLCAweDNBLCAweEY1LCAweDBDLCAweDA0LCAweDdCLCAweEZFLCAweDZDLCAweDAwLCAweEZFLAotCTB4RkYsIDB4RUYsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUEsIDB4RkYsCi0JMHhBRCwgMHgwMSwgMHg2QywgMHhGQywgMHgwQywgMHgwNywgMHg3RiwgMHhGMSwgMHhEQywgMHgyRiwgMHhBRCwKLQkweDMwLCAweDdELCAweEYxLCAweDAxLCAweDA3LCAweDc2LCAweEZDLCAweEE2LCAweDAxLCAweDVFLCAweEZGLAotCTB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsCi0JMHgwMCwgMHg1RCwgMHhGRSwgMHgzRSwgMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwKLQkweDkzLCAweEY0LCAweDYyLCAweDA2LCAweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTcsIDB4RkYsIDB4RTIsIDB4MDAsIDB4OTgsIDB4RkUsCi0JMHhDRiwgMHgwMSwgMHgzMywgMHhGRSwgMHg3RCwgMHgwMCwgMHhCQiwgMHg0OCwgMHgxRiwgMHgwNywgMHg1NCwKLQkweEZCLCAweDRDLCAweDAzLCAweEQzLCAweEZELCAweDNGLCAweDAxLCAweDczLCAweEZGLCAweDIzLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjEsIDB4MDEsIDB4RDMsCi0JMHhGQywgMHg1RCwgMHgwNSwgMHgwMSwgMHhGNywgMHhGQiwgMHgxMiwgMHgzRiwgMHg0NSwgMHg4MywgMHhGOCwKLQkweDJBLCAweDAyLCAweDlBLCAweEZGLCAweENBLCAweEZGLCAweDRFLCAweDAwLCAweEQxLCAweEZGLCAweDBDLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4REEsIDB4MDEsIDB4MzUsIDB4RkMsCi0JMHgyNywgMHgwNywgMHgwOSwgMHhGMiwgMHg4NSwgMHgyOCwgMHg2MywgMHgzNywgMHhFOSwgMHhGMSwgMHg2MywKLQkweDA2LCAweEY1LCAweEZDLCAweDUzLCAweDAxLCAweDg5LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsCi0JMHgwNSwgMHhDQywgMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwKLQkweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLAotCTB4MDAsIDB4QjksIDB4RkYsIDB4OEEsIDB4MDAsIDB4NEQsIDB4RkYsIDB4N0QsIDB4MDAsIDB4OUMsIDB4MDAsCi0JMHg3QiwgMHhGQiwgMHgzMSwgMHg0NywgMHhEOSwgMHgwRCwgMHhDMCwgMHhGOCwgMHg4RiwgMHgwNCwgMHgzNCwKLQkweEZELCAweDg3LCAweDAxLCAweDU2LCAweEZGLCAweDJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MjksIDB4MDAsIDB4NUUsIDB4RkYsIDB4NzQsIDB4MDEsIDB4NUYsIDB4RkQsIDB4MzUsIDB4MDQsIDB4N0MsCi0JMHhGOSwgMHhEOCwgMHgwQiwgMHhDOSwgMHg0NywgMHhENCwgMHhGQywgMHhGMCwgMHhGRiwgMHhERCwgMHgwMCwKLQkweDE5LCAweEZGLCAweEE0LCAweDAwLCAweEFGLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDUsIDB4MDYsIDB4NEYsIDB4RjMsCi0JMHhFMCwgMHgyMCwgMHg0NSwgMHgzRCwgMHg0RCwgMHhGMywgMHg0QiwgMHgwNSwgMHhCMywgMHhGRCwgMHhFMCwKLQkweDAwLCAweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLAotCTB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsIDB4RjEsIDB4ODYsCi0JMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywgMHhEMSwgMHgwMSwKLQkweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweERBLCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkEsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QkYsIDB4MDIsIDB4NzUsIDB4RjcsIDB4NDIsIDB4NDQsCi0JMHgyMCwgMHgxNSwgMHg1NSwgMHhGNiwgMHhBOSwgMHgwNSwgMHhCMiwgMHhGQywgMHhCRiwgMHgwMSwgMHg0MSwKLQkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLCAweEZGLAotCTB4MjcsIDB4MDEsIDB4MDUsIDB4RkUsIDB4RUIsIDB4MDIsIDB4MTQsIDB4RkMsIDB4NTAsIDB4MDUsIDB4RUEsCi0JMHg0OCwgMHgxQiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgzMiwgMHgwMiwgMHg2NCwgMHhGRSwgMHhGQSwgMHgwMCwKLQkweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ0LAotCTB4MDEsIDB4N0MsIDB4RkMsIDB4MjcsIDB4MDYsIDB4MjgsIDB4RjUsIDB4MzEsIDB4MTksIDB4MjEsIDB4NDIsCi0JMHhCOCwgMHhGNSwgMHhDMCwgMHgwMywgMHhBQSwgMHhGRSwgMHg1MSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhFQSwKLQkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU0LCAweEZGLCAweEI3LCAweDAxLAotCTB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsIDB4OUYsIDB4MkUsIDB4RTMsIDB4MzEsIDB4N0UsCi0JMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwgMHgwMSwgMHg2NCwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEU4LCAweEZGLCAweDk2LCAweDAwLCAweDMxLAotCTB4RkUsIDB4ODQsIDB4MDQsIDB4NzksIDB4RjQsIDB4MDcsIDB4NDAsIDB4QkEsIDB4MUMsIDB4M0UsIDB4RjQsCi0JMHg4MiwgMHgwNiwgMHg1OCwgMHhGQywgMHhFMCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDE4LCAweDAwLCAweDlELCAweEZGLCAweEQzLCAweDAwLCAweEI4LCAweEZFLCAweDkzLCAweDAxLAotCTB4QTEsIDB4RkUsIDB4OEUsIDB4RkYsIDB4OTIsIDB4NDgsIDB4M0QsIDB4MDgsIDB4RTEsIDB4RkEsIDB4ODYsCi0JMHgwMywgMHhCNiwgMHhGRCwgMHg0QywgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweEE4LCAweDAxLCAweEU5LCAweEZDLCAweDJELAotCTB4MDUsIDB4NkIsIDB4RjcsIDB4QjYsIDB4MTEsIDB4QzgsIDB4NDUsIDB4MzAsIDB4RjksIDB4Q0QsIDB4MDEsCi0JMHhEMCwgMHhGRiwgMHhBQywgMHhGRiwgMHg1QywgMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERGLCAweDAxLCAweDMzLCAweEZDLCAweDIwLCAweDA3LAotCTB4MzUsIDB4RjIsIDB4MzYsIDB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsIDB4RjIsIDB4M0IsIDB4MDYsIDB4MTEsCi0JMHhGRCwgMHg0MSwgMHgwMSwgMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDEwLCAweDAwLCAweEE3LCAweEZGLCAweDE5LCAweDAxLCAweDUzLCAweEZELCAweERCLCAweDA1LCAweDg4LAotCTB4RjIsIDB4QUQsIDB4M0EsIDB4NkQsIDB4MjQsIDB4QTQsIDB4RjIsIDB4MDgsIDB4MDcsIDB4MzIsIDB4RkMsCi0JMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRiwKLQkweEZGLCAweDdCLCAweDAwLCAweDZDLCAweEZGLCAweDQ0LCAweDAwLCAweDAxLCAweDAxLCAweEI2LCAweEZBLAotCTB4QzgsIDB4NDYsIDB4MTMsIDB4MEYsIDB4NTEsIDB4RjgsIDB4QzQsIDB4MDQsIDB4MUIsIDB4RkQsIDB4OTIsCi0JMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKLQkweDYzLCAweEZGLCAweDY3LCAweDAxLCAweDdBLCAweEZELCAweEZFLCAweDAzLCAweEVFLCAweEY5LCAweEFBLAotCTB4MEEsIDB4MTYsIDB4NDgsIDB4QUMsIDB4RkQsIDB4ODYsIDB4RkYsIDB4MTcsIDB4MDEsIDB4RkEsIDB4RkUsCi0JMHhCMywgMHgwMCwgMHhBQSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKLQkweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLCAweEJELCAweDA2LCAweDk3LCAweEYzLCAweDhBLCAweDFGLAotCTB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsIDB4MDUsIDB4REEsIDB4RkQsIDB4QzksIDB4MDAsIDB4Q0YsCi0JMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3MywgMHhGRiwKLQkweDdELCAweDAxLCAweEIzLCAweEZDLCAweEJCLCAweDA2LCAweDlBLCAweEYxLCAweDYwLCAweDM0LCAweEY1LAotCTB4MkIsIDB4QjAsIDB4RjEsIDB4MjgsIDB4MDcsIDB4NDcsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgxNywKLQkweDAwLCAweDEwLCAweEZGLCAweDE1LCAweDAzLCAweERELCAweEY2LCAweDlFLCAweDQzLCAweDZDLCAweDE2LAotCTB4RjEsIDB4RjUsIDB4RDMsIDB4MDUsIDB4OUYsIDB4RkMsIDB4QzYsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxOSwgMHgwMSwKLQkweDIzLCAweEZFLCAweEIwLCAweDAyLCAweDg3LCAweEZDLCAweDQxLCAweDA0LCAweEY0LCAweDQ4LCAweDFDLAotCTB4MDMsIDB4MDYsIDB4RkQsIDB4NkUsIDB4MDIsIDB4NDUsIDB4RkUsIDB4MDksIDB4MDEsIDB4ODgsIDB4RkYsCi0JMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRSwgMHgwMSwgMHg4QywKLQkweEZDLCAweDAwLCAweDA2LCAweDg2LCAweEY1LCAweEUwLCAweDE3LCAweERCLCAweDQyLCAweDNGLCAweEY2LAotCTB4NzEsIDB4MDMsIDB4RDksIDB4RkUsIDB4MzYsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RiwgMHhGRiwgMHhDMSwgMHgwMSwgMHg1MiwgMHhGQywKLQkweDIyLCAweDA3LCAweDk4LCAweEYxLCAweDVFLCAweDJELCAweDEzLCAweDMzLCAweDg3LCAweEYxLCAweEQ4LAotCTB4MDYsIDB4OUIsIDB4RkMsIDB4OEQsIDB4MDEsIDB4NkIsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwMywgMHgwMCwgMHhGQywgMHhGRiwgMHhEQywgMHhGRiwgMHhBRiwgMHgwMCwgMHgwNywgMHhGRSwgMHhDOCwKLQkweDA0LCAweDEwLCAweEY0LCAweDJELCAweDNGLCAweDBGLCAweDFFLCAweEVELCAweEYzLCAweEEwLCAweDA2LAotCTB4NEUsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhBMywgMHhGRiwgMHhDMywgMHgwMCwgMHhENywgMHhGRSwgMHg1OCwgMHgwMSwgMHgwRiwgMHhGRiwKLQkweEE2LCAweEZFLCAweDVELCAweDQ4LCAweDYxLCAweDA5LCAweDZFLCAweEZBLCAweEMwLCAweDAzLCAweDk5LAotCTB4RkQsIDB4NTksIDB4MDEsIDB4NjgsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5RSwgMHgwMSwgMHgwMCwgMHhGRCwgMHhGQywgMHgwNCwgMHhENywKLQkweEY3LCAweDc1LCAweDEwLCAweDQ4LCAweDQ2LCAweEU0LCAweEY5LCAweDZFLCAweDAxLCAweDA2LCAweDAwLAotCTB4OEUsIDB4RkYsIDB4NkIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNiwgMHgwNywgMHg2NywgMHhGMiwKLQkweEU1LCAweDI1LCAweDg3LCAweDM5LCAweDQ3LCAweEYyLCAweDEwLCAweDA2LCAweDMwLCAweEZELCAweDJGLAotCTB4MDEsIDB4OUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHg5RCwgMHhGRiwgMHgyRCwgMHgwMSwgMHgzMywgMHhGRCwgMHgwQiwgMHgwNiwgMHg0RCwgMHhGMiwgMHhBNSwKLQkweDM5LCAweEJGLCAweDI1LCAweDZELCAweEYyLCAweDE1LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAotCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzUsIDB4RkYsIDB4NkQsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHgwRCwgMHgwMCwgMHg2MywgMHgwMSwgMHhGOSwgMHhGOSwgMHg1NSwgMHg0NiwKLQkweDUxLCAweDEwLCAweEUzLCAweEY3LCAweEY3LCAweDA0LCAweDAzLCAweEZELCAweDlELCAweDAxLCAweDRFLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsCi0JMHg1QiwgMHgwMSwgMHg5NiwgMHhGRCwgMHhDNiwgMHgwMywgMHg2MSwgMHhGQSwgMHg4MSwgMHgwOSwgMHg1NywKLQkweDQ4LCAweDhELCAweEZFLCAweDFCLCAweEZGLCAweDUyLCAweDAxLCAweERCLCAweEZFLCAweEMyLCAweDAwLAotCTB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsCi0JMHgwMSwgMHg0RCwgMHhGQywgMHhBMywgMHgwNiwgMHhFNCwgMHhGMywgMHgzNiwgMHgxRSwgMHgxNiwgMHgzRiwKLQkweDA1LCAweEY0LCAweENGLCAweDA0LCAweDAyLCAweEZFLCAweEIyLCAweDAwLCAweERCLCAweEZGLCAweEZDLAotCTB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4OEIsIDB4MDEsCi0JMHg5RCwgMHhGQywgMHhENSwgMHgwNiwgMHg4OSwgMHhGMSwgMHgzNSwgMHgzMywgMHgzQSwgMHgyRCwgMHg5QSwKLQkweEYxLCAweDIzLCAweDA3LCAweDUxLCAweEZDLCAweEMyLCAweDAxLCAweDRGLCAweEZGLCAweDJGLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MzMsIDB4MDAsIDB4REYsCi0JMHhGRSwgMHg2OCwgMHgwMywgMHg0RSwgMHhGNiwgMHhFRSwgMHg0MiwgMHhCQiwgMHgxNywgMHg5MCwgMHhGNSwKLQkweEZDLCAweDA1LCAweDhFLCAweEZDLCAweENELCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NDIsIDB4RkUsIDB4NzQsIDB4MDIsCi0JMHhGOSwgMHhGQywgMHgzOSwgMHgwMywgMHhGNSwgMHg0OCwgMHgyNCwgMHgwNCwgMHg5NCwgMHhGQywgMHhBOSwKLQkweDAyLCAweDI3LCAweEZFLCAweDE4LCAweDAxLCAweDgyLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzcsIDB4MDEsIDB4OUQsIDB4RkMsIDB4RDgsCi0JMHgwNSwgMHhFNywgMHhGNSwgMHg5MSwgMHgxNiwgMHg4OSwgMHg0MywgMHhDRCwgMHhGNiwgMHgxRSwgMHgwMywKLQkweDBCLCAweEZGLCAweDFBLCAweDAwLCAweDI2LCAweDAwLCAweEUwLCAweEZGLCAweDA4LCAweDAwLCAweEZELAotCTB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzksIDB4MDEsIDB4NDgsIDB4RkMsIDB4MjgsIDB4MDcsCi0JMHhBRCwgMHhGMSwgMHgxOSwgMHgyQywgMHgzRiwgMHgzNCwgMHg5NywgMHhGMSwgMHhCRSwgMHgwNiwgMHhCMCwKLQkweEZDLCAweDdGLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RDAsIDB4RkYsIDB4QzcsIDB4MDAsIDB4REUsIDB4RkQsIDB4MDgsIDB4MDUsIDB4QjAsCi0JMHhGMywgMHg0QSwgMHgzRSwgMHg2NCwgMHgxRiwgMHhBMCwgMHhGMywgMHhCQiwgMHgwNiwgMHg0NSwgMHhGQywKLQkweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEE5LAotCTB4RkYsIDB4QjQsIDB4MDAsIDB4RjcsIDB4RkUsIDB4MUQsIDB4MDEsIDB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsCi0JMHgxRCwgMHg0OCwgMHg4OSwgMHgwQSwgMHhGQiwgMHhGOSwgMHhGOCwgMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwKLQkweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLAotCTB4NTIsIDB4RkYsIDB4OTMsIDB4MDEsIDB4MTgsIDB4RkQsIDB4QzksIDB4MDQsIDB4NDUsIDB4RjgsIDB4MzYsCi0JMHgwRiwgMHhCQiwgMHg0NiwgMHhBMSwgMHhGQSwgMHgwQywgMHgwMSwgMHgzRSwgMHgwMCwgMHg3MCwgMHhGRiwKLQkweDdBLCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LAotCTB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MDksIDB4MDcsIDB4OUQsIDB4RjIsIDB4OTIsIDB4MjQsCi0JMHg4RiwgMHgzQSwgMHg4MiwgMHhGMiwgMHhFMSwgMHgwNSwgMHg1MCwgMHhGRCwgMHgxQiwgMHgwMSwgMHhBNiwKLQkweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE3LCAweDAwLCAweDkzLCAweEZGLAotCTB4M0YsIDB4MDEsIDB4MTUsIDB4RkQsIDB4MzYsIDB4MDYsIDB4MTksIDB4RjIsIDB4OTcsIDB4MzgsIDB4MTEsCi0JMHgyNywgMHgzQiwgMHhGMiwgMHgxRiwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwgMHgwMSwgMHgzRCwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LAotCTB4RkYsIDB4RDYsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsCi0JMHg3NywgMHhGNywgMHgyOCwgMHgwNSwgMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZELCAweEZGLCAweDRFLCAweDAxLAotCTB4QjMsIDB4RkQsIDB4OEQsIDB4MDMsIDB4RDQsIDB4RkEsIDB4NUQsIDB4MDgsIDB4OEQsIDB4NDgsIDB4NzQsCi0JMHhGRiwgMHhBRSwgMHhGRSwgMHg4RCwgMHgwMSwgMHhCQiwgMHhGRSwgMHhEMSwgMHgwMCwgMHg5RSwgMHhGRiwKLQkweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU3LAotCTB4RkMsIDB4ODUsIDB4MDYsIDB4MzQsIDB4RjQsIDB4RTAsIDB4MUMsIDB4RjAsIDB4M0YsIDB4NkQsIDB4RjQsCi0JMHg4QywgMHgwNCwgMHgyQywgMHhGRSwgMHg5OSwgMHgwMCwgMHhFNywgMHhGRiwgMHhGOCwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDk4LCAweDAxLCAweDhBLCAweEZDLAotCTB4RUMsIDB4MDYsIDB4N0YsIDB4RjEsIDB4MDQsIDB4MzIsIDB4N0IsIDB4MkUsIDB4OEEsIDB4RjEsIDB4MUEsCi0JMHgwNywgMHg1RCwgMHhGQywgMHhCOCwgMHgwMSwgMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDA2LCAweDAwLCAweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LAotCTB4MDMsIDB4QzcsIDB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsCi0JMHg3RCwgMHhGQywgMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywKLQkweDAwLCAweDhELCAweEZGLCAweEZDLCAweDAwLCAweDYxLCAweEZFLCAweDM5LCAweDAyLCAweDZCLCAweEZELAotCTB4MzcsIDB4MDIsIDB4RUIsIDB4NDgsIDB4MzEsIDB4MDUsIDB4MjEsIDB4RkMsIDB4RTQsIDB4MDIsIDB4MDgsCi0JMHhGRSwgMHgyNiwgMHgwMSwgMHg3QywgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEMwLCAweDAxLCAweEFGLCAweEZDLCAweEFELCAweDA1LCAweDRBLAotCTB4RjYsIDB4NDQsIDB4MTUsIDB4MkYsIDB4NDQsIDB4NjQsIDB4RjcsIDB4QzksIDB4MDIsIDB4M0QsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwKLQkweDAwLCAweDQ3LCAweEZGLCAweEQwLCAweDAxLCAweDQwLCAweEZDLCAweDJBLCAweDA3LCAweENBLCAweEYxLAotCTB4RDEsIDB4MkEsIDB4NjUsIDB4MzUsIDB4QUUsIDB4RjEsIDB4QTAsIDB4MDYsIDB4QzcsIDB4RkMsIDB4NzAsCi0JMHgwMSwgMHg3QSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwKLQkweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LCAweEYzLCAweDYxLAotCTB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsIDB4RTYsIDB4MDEsCi0JMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNSwKLQkweDAwLCAweDE2LCAweEZGLCAweEUzLCAweDAwLCAweEU0LCAweEZGLCAweEVCLCAweEZDLCAweEQyLCAweDQ3LAotCTB4QjYsIDB4MEIsIDB4ODksIDB4RjksIDB4MkYsIDB4MDQsIDB4NjIsIDB4RkQsIDB4NzIsIDB4MDEsIDB4NUUsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwKLQkweDg4LCAweDAxLCAweDMxLCAweEZELCAweDk1LCAweDA0LCAweEI0LCAweEY4LCAweEZDLCAweDBELCAweDI2LAotCTB4NDcsIDB4NjQsIDB4RkIsIDB4QTcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4NTEsIDB4RkYsIDB4ODksIDB4MDAsCi0JMHhCQSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwKLQkweDAxLCAweDM0LCAweEZDLCAweEY5LCAweDA2LCAweEQ5LCAweEYyLCAweDNGLCAweDIzLCAweDkwLCAweDNCLAotCTB4QzQsIDB4RjIsIDB4QUUsIDB4MDUsIDB4NzIsIDB4RkQsIDB4MDcsIDB4MDEsIDB4QjAsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1MSwgMHgwMSwKLQkweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLCAweDgyLCAweDM3LCAweDYwLCAweDI4LCAweDBFLAotCTB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg0RiwgMHgwMCwgMHhDNywgMHhGRiwgMHhBMCwKLQkweEZGLCAweDIwLCAweDAyLCAweDk2LCAweEY4LCAweDRFLCAweDQ1LCAweEQ3LCAweDEyLCAweDBELCAweEY3LAotCTB4NTgsIDB4MDUsIDB4RDYsIDB4RkMsIDB4QjAsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg0MCwgMHgwMSwgMHhEMCwgMHhGRCwKLQkweDUzLCAweDAzLCAweDQ3LCAweEZCLCAweDNGLCAweDA3LCAweEI4LCAweDQ4LCAweDYyLCAweDAwLCAweDNGLAotCTB4RkUsIDB4QzgsIDB4MDEsIDB4OUMsIDB4RkUsIDB4RTAsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQywgMHgwMSwgMHg2MywgMHhGQywgMHg2NiwKLQkweDA2LCAweDg5LCAweEY0LCAweDhDLCAweDFCLCAweEMzLCAweDQwLCAweERELCAweEY0LCAweDQ2LCAweDA0LAotCTB4NTgsIDB4RkUsIDB4ODAsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBNSwgMHgwMSwgMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwKLQkweDdELCAweEYxLCAweENGLCAweDMwLCAweEI4LCAweDJGLCAweDgwLCAweEYxLCAweDBELCAweDA3LCAweDZBLAotCTB4RkMsIDB4QUUsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OSwgMHgwMCwgMHg4MCwgMHhGRSwgMHgwNCwgMHgwNCwgMHg0OCwKLQkweEY1LCAweDc0LCAweDQxLCAweDVELCAweDFBLCAweEQ3LCAweEY0LCAweDQ3LCAweDA2LCAweDZGLCAweEZDLAotCTB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTMsCi0JMHhGRiwgMHhFRCwgMHgwMCwgMHg4MCwgMHhGRSwgMHhGRCwgMHgwMSwgMHhEQywgMHhGRCwgMHgzQywgMHgwMSwKLQkweEQ1LCAweDQ4LCAweDQ1LCAweDA2LCAweEFFLCAweEZCLCAweDFGLCAweDAzLCAweEVBLCAweEZELCAweDM0LAotCTB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsCi0JMHg0NCwgMHhGRiwgMHhCOCwgMHgwMSwgMHhDMywgMHhGQywgMHg4MSwgMHgwNSwgMHhCMCwgMHhGNiwgMHhGQSwKLQkweDEzLCAweENDLCAweDQ0LCAweDAyLCAweEY4LCAweDcxLCAweDAyLCAweDcxLCAweEZGLCAweEUxLCAweEZGLAotCTB4NDIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsCi0JMHhGRiwgMHhENiwgMHgwMSwgMHgzOSwgMHhGQywgMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwKLQkweDg1LCAweDM2LCAweENDLCAweEYxLCAweDdGLCAweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLAotCTB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QkEsIDB4RkYsCi0JMHhGNCwgMHgwMCwgMHg5MSwgMHhGRCwgMHg3RSwgMHgwNSwgMHgwNSwgMHhGMywgMHg2RSwgMHgzQywgMHgxMCwKLQkweDIyLCAweDEyLCAweEYzLCAweEU5LCAweDA2LCAweDM4LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzUsCi0JMHhGRiwgMHhBOSwgMHgwMCwgMHg0RCwgMHgwMCwgMHgxOSwgMHhGQywgMHg3QywgMHg0NywgMHhFOCwgMHgwQywKLQkweDE4LCAweEY5LCAweDY2LCAweDA0LCAweDQ4LCAweEZELCAweDdFLCAweDAxLCAweDVBLCAweEZGLCAweDJCLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUEsIDB4RkYsIDB4N0QsIDB4MDEsCi0JMHg0QiwgMHhGRCwgMHg2MCwgMHgwNCwgMHgyNCwgMHhGOSwgMHhDNiwgMHgwQywgMHg4NiwgMHg0NywgMHgzMCwKLQkweEZDLCAweDQxLCAweDAwLCAweEIwLCAweDAwLCAweDMyLCAweEZGLCAweDk4LCAweDAwLCAweEI0LCAweEZGLAotCTB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzgsCi0JMHhGQywgMHhFNiwgMHgwNiwgMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwgMHgzQywgMHgwRSwgMHhGMywKLQkweDc4LCAweDA1LCAweDk2LCAweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLCAweDA4LCAweDAwLCAweDAxLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NjIsIDB4MDEsIDB4REQsIDB4RkMsCi0JMHg4MywgMHgwNiwgMHhDOSwgMHhGMSwgMHg2NiwgMHgzNiwgMHhBQywgMHgyOSwgMHhFNywgMHhGMSwgMHgyQSwKLQkweDA3LCAweDNBLCAweEZDLCAweEQ1LCAweDAxLCAweDQzLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAotCTB4MEIsIDB4MDAsIDB4RDYsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RTQsIDB4RkYsIDB4NkIsIDB4RkYsIDB4N0IsCi0JMHgwMiwgMHhGMCwgMHhGNywgMHhCQSwgMHg0NCwgMHgxRSwgMHgxNCwgMHhBNSwgMHhGNiwgMHg4NiwgMHgwNSwKLQkweEMxLCAweEZDLCAweEI5LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzIsIDB4MDEsIDB4RUQsIDB4RkQsIDB4MTksIDB4MDMsCi0JMHhCQiwgMHhGQiwgMHgyNiwgMHgwNiwgMHhENywgMHg0OCwgMHg1OCwgMHgwMSwgMHhDRiwgMHhGRCwgMHgwNCwKLQkweDAyLCAweDdELCAweEZFLCAweEVGLCAweDAwLCAweDkyLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsCi0JMHhGNCwgMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwgMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwKLQkweDY2LCAweDAwLCAweDAxLCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJCLAotCTB4MDAsIDB4NTksIDB4RkYsIDB4QjAsIDB4MDEsIDB4NjksIDB4RkMsIDB4MEYsIDB4MDcsIDB4ODAsIDB4RjEsCi0JMHg5NiwgMHgyRiwgMHhGMiwgMHgzMCwgMHg3QywgMHhGMSwgMHhGRCwgMHgwNiwgMHg3QSwgMHhGQywgMHhBMywKLQkweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEY0LCAweEZGLAotCTB4RjIsIDB4RkYsIDB4ODMsIDB4MDAsIDB4NTMsIDB4RkUsIDB4NEUsIDB4MDQsIDB4RDAsIDB4RjQsIDB4QUIsCi0JMHg0MCwgMHhCMiwgMHgxQiwgMHg3RiwgMHhGNCwgMHg2OSwgMHgwNiwgMHg2MiwgMHhGQywgMHhERCwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDk4LCAweEZGLCAweERFLAotCTB4MDAsIDB4OUYsIDB4RkUsIDB4QzIsIDB4MDEsIDB4NEIsIDB4RkUsIDB4NDgsIDB4MDAsIDB4QjMsIDB4NDgsCi0JMHg1RSwgMHgwNywgMHgzQiwgMHhGQiwgMHg1OSwgMHgwMywgMHhDRCwgMHhGRCwgMHg0MiwgMHgwMSwgMHg3MSwKLQkweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LCAweEZGLAotCTB4QUYsIDB4MDEsIDB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsIDB4NUMsCi0JMHg0NSwgMHhBOSwgMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwgMHgwMCwKLQkweEQwLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERCLAotCTB4MDEsIDB4MzUsIDB4RkMsIDB4MjUsIDB4MDcsIDB4MTMsIDB4RjIsIDB4M0EsIDB4MjgsIDB4QTAsIDB4MzcsCi0JMHhGMiwgMHhGMSwgMHg1QSwgMHgwNiwgMHhGQiwgMHhGQywgMHg0RiwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxQSwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEFGLCAweEZGLCAweDA5LCAweDAxLAotCTB4NkUsIDB4RkQsIDB4QjQsIDB4MDUsIDB4QkMsIDB4RjIsIDB4NzMsIDB4M0IsIDB4NjQsIDB4MjMsIDB4RDIsCi0JMHhGMiwgMHhGQiwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDExLCAweDAwLCAweEJCLCAweEZGLCAweDg3LCAweDAwLCAweDU0LCAweEZGLCAweDcwLAotCTB4MDAsIDB4QjMsIDB4MDAsIDB4NEUsIDB4RkIsIDB4MUEsIDB4NDcsIDB4MUYsIDB4MEUsIDB4QTgsIDB4RjgsCi0JMHg5QiwgMHgwNCwgMHgyRSwgMHhGRCwgMHg4QSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLCAweDAxLCAweDY1LCAweEZELAotCTB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsIDB4MDMsIDB4RkQsIDB4RDksCi0JMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwgMHgwMCwKLQkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQwLAotCTB4MDYsIDB4NUUsIDB4RjMsIDB4OTQsIDB4MjAsIDB4N0IsIDB4M0QsIDB4NjAsIDB4RjMsIDB4M0UsIDB4MDUsCi0JMHhCQiwgMHhGRCwgMHhEQiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDIwLCAweDAwLCAweDc5LCAweEZGLCAweDcyLCAweDAxLCAweEM0LCAweEZDLCAweEE0LCAweDA2LAotCTB4QUIsIDB4RjEsIDB4NDYsIDB4MzUsIDB4RjcsIDB4MkEsIDB4QzYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDAsCi0JMHhGQywgMHhDRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwKLQkweERCLCAweEZGLCAweDMzLCAweDAwLCAweDAxLCAweDAwLCAweDM4LCAweEZGLCAweEQzLCAweDAyLCAweDUzLAotCTB4RjcsIDB4MUYsIDB4NDQsIDB4NjksIDB4MTUsIDB4M0YsIDB4RjYsIDB4QjIsIDB4MDUsIDB4QUQsIDB4RkMsCi0JMHhDMSwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwKLQkweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLCAweEZFLCAweERFLCAweDAyLCAweDJFLCAweEZDLAotCTB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsIDB4NUUsIDB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsCi0JMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDNCLCAweEZGLCAweEQzLCAweDAxLCAweDdGLCAweEZDLCAweDFGLCAweDA2LCAweDNDLCAweEY1LCAweEU2LAotCTB4MTgsIDB4NEQsIDB4NDIsIDB4RDUsIDB4RjUsIDB4QUYsIDB4MDMsIDB4QjQsIDB4RkUsIDB4NEIsIDB4MDAsCi0JMHgwRSwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywKLQkweEZGLCAweEJBLCAweDAxLCAweDVCLCAweEZDLCAweDFCLCAweDA3LCAweDhCLCAweEYxLCAweDU4LCAweDJFLAotCTB4MjYsIDB4MzIsIDB4ODAsIDB4RjEsIDB4RUEsIDB4MDYsIDB4OEMsIDB4RkMsIDB4OTcsIDB4MDEsIDB4NjYsCi0JMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhFNiwgMHhGRiwKLQkweDlDLCAweDAwLCAweDI3LCAweEZFLCAweDk0LCAweDA0LCAweDYxLCAweEY0LCAweEQ3LCAweDNGLCAweDA2LAotCTB4MUQsIDB4MkIsIDB4RjQsIDB4ODksIDB4MDYsIDB4NTYsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwKLQkweEZFLCAweDg2LCAweDAxLCAweEJBLCAweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LAotCTB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsIDB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNiwgMHgwMSwKLQkweEVFLCAweEZDLCAweDIzLCAweDA1LCAweDgzLCAweEY3LCAweDZFLCAweDExLCAweEU1LCAweDQ1LCAweDU3LAotCTB4RjksIDB4QjgsIDB4MDEsIDB4REMsIDB4RkYsIDB4QTUsIDB4RkYsIDB4NUYsIDB4MDAsIDB4Q0EsIDB4RkYsCi0JMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzRCwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMiwKLQkweEZDLCAweDFFLCAweDA3LCAweDQwLCAweEYyLCAweEVCLCAweDI2LCAweEI1LCAweDM4LCAweDFGLCAweEYyLAotCTB4MzIsIDB4MDYsIDB4MTgsIDB4RkQsIDB4M0QsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHhBNCwgMHhGRiwgMHgxRCwgMHgwMSwgMHg0QywgMHhGRCwKLQkweEU2LCAweDA1LCAweDdCLCAweEYyLCAweDcxLCAweDNBLCAweEI4LCAweDI0LCAweDk3LCAweEYyLCAweDBCLAotCTB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwRiwgMHgwMCwgMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywKLQkweDAxLCAweDhCLCAweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LAotCTB4MTUsIDB4RkQsIDB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyOCwgMHgwMCwgMHg2NCwgMHhGRiwgMHg2NSwgMHgwMSwgMHg4MSwgMHhGRCwgMHhGMiwgMHgwMywKLQkweDA4LCAweEZBLCAweDY4LCAweDBBLCAweDI1LCAweDQ4LCAweERFLCAweEZELCAweDZFLCAweEZGLCAweDI0LAotCTB4MDEsIDB4RjMsIDB4RkUsIDB4QjYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NiwgMHhGQywgMHhCOCwgMHgwNiwgMHhBOCwKLQkweEYzLCAweDNGLCAweDFGLCAweDY0LCAweDNFLCAweEJBLCAweEYzLCAweDAxLCAweDA1LCAweEUyLCAweEZELAotCTB4QzQsIDB4MDAsIDB4RDIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsCi0JMHgwMCwgMHg3MSwgMHhGRiwgMHg4MSwgMHgwMSwgMHhBRSwgMHhGQywgMHhDMSwgMHgwNiwgMHg5NSwgMHhGMSwKLQkweDFFLCAweDM0LCAweDNFLCAweDJDLCAweEFCLCAweEYxLCAweDI3LCAweDA3LCAweDQ5LCAweEZDLCAweEM4LAotCTB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsCi0JMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwgMHhGNiwgMHg3NywKLQkweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLCAweEM4LCAweDAxLAotCTB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsCi0JMHhGRiwgMHgxNiwgMHgwMSwgMHgyQSwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMSwgMHhGQywgMHgwNiwgMHgwNCwKLQkweEY1LCAweDQ4LCAweDU2LCAweDAzLCAweEVELCAweEZDLCAweDdCLCAweDAyLCAweDNFLCAweEZFLCAweDBDLAotCTB4MDEsIDB4ODYsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCi0JMHhDQywgMHgwMSwgMHg4RiwgMHhGQywgMHhGOCwgMHgwNSwgMHg5QiwgMHhGNSwgMHg5NiwgMHgxNywgMHgwMiwKLQkweDQzLCAweDVFLCAweEY2LCAweDVGLCAweDAzLCAweEU0LCAweEZFLCAweDMwLCAweDAwLCAweDFCLCAweDAwLAotCTB4RTQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsCi0JMHgwMSwgMHg0RiwgMHhGQywgMHgyNCwgMHgwNywgMHg5QywgMHhGMSwgMHgxNywgMHgyRCwgMHg1NywgMHgzMywKLQkweDhBLCAweEYxLCAweEQzLCAweDA2LCAweDlGLCAweEZDLCAweDhBLCAweDAxLCAweDZELCAweEZGLCAweDI1LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RDksIDB4RkYsIDB4QjQsIDB4MDAsCi0JMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywgMHhGQywgMHgzRSwgMHg1QiwgMHgxRSwgMHhEQiwKLQkweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzAsIDB4MDAsIDB4REUsIDB4RkUsIDB4NEIsCi0JMHgwMSwgMHgyNywgMHhGRiwgMHg3MywgMHhGRSwgMHg0RiwgMHg0OCwgMHhBMiwgMHgwOSwgMHg1NCwgMHhGQSwKLQkweENDLCAweDAzLCAweDkzLCAweEZELCAweDVDLCAweDAxLCAweDY3LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUMsIDB4MDEsIDB4MDUsIDB4RkQsCi0JMHhGMSwgMHgwNCwgMHhGMCwgMHhGNywgMHgyRCwgMHgxMCwgMHg2MSwgMHg0NiwgMHgwRCwgMHhGQSwgMHg1OCwKLQkweDAxLCAweDEzLCAweDAwLCAweDg3LCAweEZGLCAweDZFLCAweDAwLCAweEM0LCAweEZGLCAweDBFLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTQsCi0JMHgwNywgMHg3MywgMHhGMiwgMHg5OSwgMHgyNSwgMHhDMiwgMHgzOSwgMHg1NCwgMHhGMiwgMHgwNSwgMHgwNiwKLQkweDM3LCAweEZELCAweDJCLCAweDAxLCAweDlFLCAweEZGLCAweDEzLCAweDAwLCAweEZGLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4MzEsIDB4MDEsIDB4MkMsIDB4RkQsIDB4MTUsIDB4MDYsCi0JMHg0MSwgMHhGMiwgMHg2QSwgMHgzOSwgMHgwQSwgMHgyNiwgMHg2MSwgMHhGMiwgMHgxNywgMHgwNywgMHgzMSwKLQkweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAotCTB4QzYsIDB4RkYsIDB4NjksIDB4MDAsIDB4OTEsIDB4RkYsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MDEsIDB4RDAsCi0JMHhGOSwgMHgzOSwgMHg0NiwgMHg5OCwgMHgxMCwgMHhDQiwgMHhGNywgMHgwMiwgMHgwNSwgMHhGRSwgMHhGQywKLQkweDlGLCAweDAxLCAweDRELCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LAotCTB4MDAsIDB4NjksIDB4RkYsIDB4NTgsIDB4MDEsIDB4OUQsIDB4RkQsIDB4QjksIDB4MDMsIDB4N0IsIDB4RkEsCi0JMHg0MCwgMHgwOSwgMHg2MywgMHg0OCwgMHhCRiwgMHhGRSwgMHgwMywgMHhGRiwgMHg1RiwgMHgwMSwgMHhENCwKLQkweEZFLCAweEM1LCAweDAwLCAweEEyLCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NEYsIDB4RkMsIDB4OUMsIDB4MDYsIDB4RjUsIDB4RjMsIDB4RUEsCi0JMHgxRCwgMHg0NywgMHgzRiwgMHgxQiwgMHhGNCwgMHhDMSwgMHgwNCwgMHgwQiwgMHhGRSwgMHhBQywgMHgwMCwKLQkweERFLCAweEZGLCAweEZCLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZBLAotCTB4RkYsIDB4OEUsIDB4MDEsIDB4OTksIDB4RkMsIDB4REIsIDB4MDYsIDB4ODYsIDB4RjEsIDB4RjIsIDB4MzIsCi0JMHg4MiwgMHgyRCwgMHg5NiwgMHhGMSwgMHgyMSwgMHgwNywgMHg1MywgMHhGQywgMHhDMCwgMHgwMSwgMHg1MCwKLQkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU2LCAweEZGLCAweDE3LCAweDAwLAotCTB4MzksIDB4MDAsIDB4RDQsIDB4RkUsIDB4N0EsIDB4MDMsIDB4MkYsIDB4RjYsIDB4QzcsIDB4NDIsIDB4MDYsCi0JMHgxOCwgMHg3QiwgMHhGNSwgMHgwNSwgMHgwNiwgMHg4QSwgMHhGQywgMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDg4LCAweEZGLCAweDA3LCAweDAxLCAweDQ5LAotCTB4RkUsIDB4NjcsIDB4MDIsIDB4MTMsIDB4RkQsIDB4RkYsIDB4MDIsIDB4RjQsIDB4NDgsIDB4NUYsIDB4MDQsCi0JMHg3QSwgMHhGQywgMHhCNiwgMHgwMiwgMHgyMCwgMHhGRSwgMHgxQiwgMHgwMSwgMHg4MSwgMHhGRiwgMHgxRiwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM2LCAweDAxLAotCTB4QTEsIDB4RkMsIDB4Q0YsIDB4MDUsIDB4RkMsIDB4RjUsIDB4NDcsIDB4MTYsIDB4QjAsIDB4NDMsIDB4RUUsCi0JMHhGNiwgMHgwQywgMHgwMywgMHgxNiwgMHhGRiwgMHgxNCwgMHgwMCwgMHgyOSwgMHgwMCwgMHhERiwgMHhGRiwKLQkweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweENBLCAweDAxLCAweDQ2LAotCTB4RkMsIDB4MjksIDB4MDcsIDB4QjMsIDB4RjEsIDB4RDEsIDB4MkIsIDB4ODEsIDB4MzQsIDB4OUMsIDB4RjEsCi0JMHhCOCwgMHgwNiwgMHhCNSwgMHhGQywgMHg3QywgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENFLCAweEZGLCAweENDLCAweDAwLCAweEQ1LCAweEZELAotCTB4MTYsIDB4MDUsIDB4OUIsIDB4RjMsIDB4MTgsIDB4M0UsIDB4QjEsIDB4MUYsIDB4OEYsIDB4RjMsIDB4QzAsCi0JMHgwNiwgMHg0MywgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE1LCAweDAwLCAweEFBLCAweEZGLCAweEIxLCAweDAwLCAweEZFLCAweEZFLCAweDEwLCAweDAxLCAweDkyLAotCTB4RkYsIDB4OTQsIDB4RkQsIDB4MEQsIDB4NDgsIDB4Q0IsIDB4MEEsIDB4RTIsIDB4RjksIDB4MDQsIDB4MDQsCi0JMHg3NywgMHhGRCwgMHg2OSwgMHgwMSwgMHg2MiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkxLCAweDAxLCAweDFFLCAweEZELCAweEJFLCAweDA0LAotCTB4NUUsIDB4RjgsIDB4RjAsIDB4MEUsIDB4RDMsIDB4NDYsIDB4Q0IsIDB4RkEsIDB4RjYsIDB4MDAsIDB4NEIsCi0JMHgwMCwgMHg2OSwgMHhGRiwgMHg3RCwgMHgwMCwgMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLCAweDA2LCAweDA3LCAweEFBLAotCTB4RjIsIDB4NDYsIDB4MjQsIDB4QzgsIDB4M0EsIDB4OTAsIDB4RjIsIDB4RDYsIDB4MDUsIDB4NTcsIDB4RkQsCi0JMHgxNywgMHgwMSwgMHhBOCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwKLQkweDAwLCAweDkxLCAweEZGLCAweDQzLCAweDAxLCAweDBFLCAweEZELCAweDQwLCAweDA2LCAweDBGLCAweEYyLAotCTB4NUIsIDB4MzgsIDB4NUMsIDB4MjcsIDB4MzAsIDB4RjIsIDB4MjEsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsCi0JMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQywgMHhGRiwKLQkweDVBLCAweDAwLCAweEFGLCAweEZGLCAweENBLCAweEZGLCAweEQ4LCAweDAxLCAweDFDLCAweEY5LCAweEI4LAotCTB4NDUsIDB4REEsIDB4MTEsIDB4NjAsIDB4RjcsIDB4MzMsIDB4MDUsIDB4RTcsIDB4RkMsIDB4QTksIDB4MDEsCi0JMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2RSwKLQkweEZGLCAweDRCLCAweDAxLCAweEI5LCAweEZELCAweDgwLCAweDAzLCAweEVFLCAweEZBLCAweDFELCAweDA4LAotCTB4OTgsIDB4NDgsIDB4QTgsIDB4RkYsIDB4OTUsIDB4RkUsIDB4OUEsIDB4MDEsIDB4QjQsIDB4RkUsIDB4RDQsCi0JMHgwMCwgMHg5QywgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweERGLCAweDAxLCAweDVBLCAweEZDLCAweDdFLCAweDA2LCAweDQ3LCAweEY0LCAweDk0LCAweDFDLCAweDFGLAotCTB4NDAsIDB4ODUsIDB4RjQsIDB4N0QsIDB4MDQsIDB4MzYsIDB4RkUsIDB4OTMsIDB4MDAsIDB4RUEsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5QiwKLQkweDAxLCAweDg2LCAweEZDLCAweEYxLCAweDA2LCAweDdFLCAweEYxLCAweEMwLCAweDMxLCAweEMyLCAweDJFLAotCTB4ODcsIDB4RjEsIDB4MTcsIDB4MDcsIDB4NUYsIDB4RkMsIDB4QjYsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwOSwgMHgwMCwgMHg1NCwgMHgwMCwKLQkweEE0LCAweEZFLCAweEM5LCAweDAzLCAweEFBLCAweEY1LCAweDBDLCAweDQyLCAweDU2LCAweDE5LCAweDFFLAotCTB4RjUsIDB4MkIsIDB4MDYsIDB4N0EsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RSwgMHhGRiwgMHhGOSwgMHgwMCwgMHg2OCwgMHhGRSwgMHgyQywKLQkweDAyLCAweDg0LCAweEZELCAweEZGLCAweDAxLCAweEU2LCAweDQ4LCAweDZFLCAweDA1LCAweDA3LCAweEZDLAotCTB4RjEsIDB4MDIsIDB4MDEsIDB4RkUsIDB4MjksIDB4MDEsIDB4N0IsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCRSwgMHgwMSwgMHhCNCwgMHhGQywKLQkweEE0LCAweDA1LCAweDYxLCAweEY2LCAweEZCLCAweDE0LCAweDUzLCAweDQ0LCAweDg2LCAweEY3LCAweEI2LAotCTB4MDIsIDB4NDksIDB4RkYsIDB4RjcsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwgMHgzRSwgMHhGQywgMHgyQiwKLQkweDA3LCAweEQwLCAweEYxLCAweDg5LCAweDJBLCAweEE2LCAweDM1LCAweEI0LCAweEYxLCAweDk5LCAweDA2LAotCTB4Q0QsIDB4RkMsIDB4NkQsIDB4MDEsIDB4N0MsIDB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsCi0JMHgwMCwgMHgwNiwgMHgwMCwgMHhDMiwgMHhGRiwgMHhFMywgMHgwMCwgMHhBRSwgMHhGRCwgMHg1MiwgMHgwNSwKLQkweDQ0LCAweEYzLCAweDJBLCAweDNELCAweDA2LCAweDIxLCAweDQ3LCAweEYzLCAweEQ4LCAweDA2LCAweDNDLAotCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhCMCwgMHhGRiwgMHhBMiwgMHgwMCwgMHgxRCwgMHhGRiwgMHhENiwgMHgwMCwgMHhGQywgMHhGRiwgMHhCQywKLQkweEZDLCAweEMwLCAweDQ3LCAweEZBLCAweDBCLCAweDcwLCAweEY5LCAweDNDLCAweDA0LCAweDVDLCAweEZELAotCTB4NzUsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCi0JMHgwMCwgMHg1NywgMHhGRiwgMHg4NiwgMHgwMSwgMHgzNiwgMHhGRCwgMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwKLQkweEI3LCAweDBELCAweDNELCAweDQ3LCAweDkxLCAweEZCLCAweDkxLCAweDAwLCAweDgzLCAweDAwLCAweDRBLAotCTB4RkYsIDB4OEMsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNSwgMHgwNiwgMHhFNywgMHhGMiwgMHhGMiwKLQkweDIyLCAweEM3LCAweDNCLCAweEQ0LCAweEYyLCAweEEyLCAweDA1LCAweDdBLCAweEZELCAweDAyLCAweDAxLAotCTB4QjIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODgsCi0JMHhGRiwgMHg1NSwgMHgwMSwgMHhGMiwgMHhGQywgMHg2NywgMHgwNiwgMHhFNCwgMHhGMSwgMHg0NCwgMHgzNywKLQkweEFBLCAweDI4LCAweDA1LCAweEYyLCAweDI3LCAweDA3LCAweDM2LCAweEZDLCAweERBLCAweDAxLCAweDQxLAotCTB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDIsIDB4RkYsIDB4NEMsIDB4MDAsCi0JMHhDRCwgMHhGRiwgMHg5NCwgMHhGRiwgMHgzNCwgMHgwMiwgMHg3MCwgMHhGOCwgMHgyRSwgMHg0NSwgMHgyMCwKLQkweDEzLCAweEY2LCAweEY2LCAweDYyLCAweDA1LCAweEQxLCAweEZDLCAweEIyLCAweDAxLCAweDQ2LCAweEZGLAotCTB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsCi0JMHgwMSwgMHhENiwgMHhGRCwgMHg0NiwgMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwKLQkweDk4LCAweDAwLCAweDI2LCAweEZFLCAweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LAotCTB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsCi0JMHg2NiwgMHhGQywgMHg1RSwgMHgwNiwgMHg5QywgMHhGNCwgMHg0MCwgMHgxQiwgMHhFRiwgMHg0MCwgMHhGNywKLQkweEY0LCAweDM1LCAweDA0LCAweDYyLCAweEZFLCAweDdBLCAweDAwLCAweEY3LCAweEZGLCAweEYyLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4QTcsIDB4MDEsIDB4NzUsCi0JMHhGQywgMHgwMywgMHgwNywgMHg3RCwgMHhGMSwgMHg4QSwgMHgzMCwgMHhGRiwgMHgyRiwgMHg3RSwgMHhGMSwKLQkweDBBLCAweDA3LCAweDZFLCAweEZDLCAweEFDLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDUsIDB4MDAsIDB4RjAsIDB4RkYsIDB4RkMsIDB4RkYsIDB4NkUsIDB4MDAsIDB4NzYsIDB4RkUsCi0JMHgxNSwgMHgwNCwgMHgyQywgMHhGNSwgMHg0OSwgMHg0MSwgMHhBOSwgMHgxQSwgMHhDMywgMHhGNCwgMHg0RiwKLQkweDA2LCAweDZDLCAweEZDLCAweEQ5LCAweDAxLCAweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAotCTB4MUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsCi0JMHhGRCwgMHgwNSwgMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywKLQkweEU0LCAweEZELCAweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsIDB4RkYsIDB4QjYsIDB4MDEsIDB4QzgsIDB4RkMsIDB4NzcsIDB4MDUsCi0JMHhDNywgMHhGNiwgMHhCMSwgMHgxMywgMHhFRCwgMHg0NCwgMHgyNiwgMHhGOCwgMHg1RCwgMHgwMiwgMHg3RCwKLQkweEZGLCAweERBLCAweEZGLCAweDQ2LCAweDAwLCAweEQ0LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAotCTB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzgsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjMsCi0JMHhGMSwgMHgzRSwgMHgyOSwgMHhDNiwgMHgzNiwgMHhENCwgMHhGMSwgMHg3NywgMHgwNiwgMHhFNiwgMHhGQywKLQkweDVDLCAweDAxLCAweDg0LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLAotCTB4MDAsIDB4QjcsIDB4RkYsIDB4RjksIDB4MDAsIDB4ODksIDB4RkQsIDB4OEEsIDB4MDUsIDB4RjQsIDB4RjIsCi0JMHgzNywgMHgzQywgMHg1QiwgMHgyMiwgMHgwMywgMHhGMywgMHhFRCwgMHgwNiwgMHgzNywgMHhGQywgMHhFNiwKLQkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI2LCAweEZGLAotCTB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsIDB4RkIsIDB4NjksCi0JMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwgMHg4MSwgMHgwMSwKLQkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVCLAotCTB4RkYsIDB4N0EsIDB4MDEsIDB4NTAsIDB4RkQsIDB4NTQsIDB4MDQsIDB4M0QsIDB4RjksIDB4ODIsIDB4MEMsCi0JMHg5QSwgMHg0NywgMHg1RSwgMHhGQywgMHgyQSwgMHgwMCwgMHhCRCwgMHgwMCwgMHgyQiwgMHhGRiwgMHg5QiwKLQkweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4RTIsIDB4MDYsIDB4MjgsIDB4RjMsIDB4OUUsIDB4MjEsIDB4QzAsCi0JMHgzQywgMHgxRiwgMHhGMywgMHg2QywgMHgwNSwgMHg5RSwgMHhGRCwgMHhFRCwgMHgwMCwgMHhCRCwgMHhGRiwKLQkweDA3LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLCAweDgwLCAweEZGLCAweDY2LAotCTB4MDEsIDB4RDgsIDB4RkMsIDB4OEIsIDB4MDYsIDB4QzEsIDB4RjEsIDB4MjcsIDB4MzYsIDB4RjYsIDB4MjksCi0JMHhERiwgMHhGMSwgMHgyQSwgMHgwNywgMHgzQiwgMHhGQywgMHhENCwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwKLQkweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ3LCAweEZGLCAweDNFLCAweDAwLCAweEVBLCAweEZGLAotCTB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsIDB4OTksIDB4NDQsIDB4NjgsIDB4MTQsIDB4OEUsCi0JMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc5LCAweEZGLCAweDJGLCAweDAxLCAweEY0LAotCTB4RkQsIDB4MEMsIDB4MDMsIDB4RDQsIDB4RkIsIDB4RTksIDB4MDUsIDB4REUsIDB4NDgsIDB4OEYsIDB4MDEsCi0JMHhCNiwgMHhGRCwgMHgxMSwgMHgwMiwgMHg3NiwgMHhGRSwgMHhGMiwgMHgwMCwgMHg5MSwgMHhGRiwgMHgxQiwKLQkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LCAweDAxLCAweDczLCAweEZDLAotCTB4M0IsIDB4MDYsIDB4RjUsIDB4RjQsIDB4RUQsIDB4MTksIDB4QjcsIDB4NDEsIDB4NzEsIDB4RjUsIDB4RUIsCi0JMHgwMywgMHg5MCwgMHhGRSwgMHg2MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LCAweEZGLCAweEIyLCAweDAxLCAweDY1LCAweEZDLCAweDEyLAotCTB4MDcsIDB4ODIsIDB4RjEsIDB4NTAsIDB4MkYsIDB4MzgsIDB4MzEsIDB4N0MsIDB4RjEsIDB4RjksIDB4MDYsCi0JMHg3RSwgMHhGQywgMHhBMSwgMHgwMSwgMHg2MSwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDg4LCAweDAwLCAweDQ5LCAweEZFLCAweDVELCAweDA0LAotCTB4QjcsIDB4RjQsIDB4N0QsIDB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsIDB4RjQsIDB4NzAsIDB4MDYsIDB4NUYsCi0JMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwKLQkweDlBLCAweEZGLCAweERCLCAweDAwLCAweEE2LCAweEZFLCAweEI0LCAweDAxLCAweDY0LCAweEZFLCAweDEyLAotCTB4MDAsIDB4QUEsIDB4NDgsIDB4OUUsIDB4MDcsIDB4MjEsIDB4RkIsIDB4NjYsIDB4MDMsIDB4QzYsIDB4RkQsCi0JMHg0NSwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKLQkweDAwLCAweDQ4LCAweEZGLCAweEFELCAweDAxLCAweERELCAweEZDLCAweDQ4LCAweDA1LCAweDMwLCAweEY3LAotCTB4NkIsIDB4MTIsIDB4N0QsIDB4NDUsIDB4Q0YsIDB4RjgsIDB4MDEsIDB4MDIsIDB4QjIsIDB4RkYsIDB4QkQsCi0JMHhGRiwgMHg1NCwgMHgwMCwgMHhDRSwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDNGLCAweEZGLCAweERDLCAweDAxLCAweDM0LCAweEZDLCAweDI0LCAweDA3LCAweDFDLCAweEYyLCAweEYwLAotCTB4MjcsIDB4REYsIDB4MzcsIDB4RkIsIDB4RjEsIDB4NTEsIDB4MDYsIDB4MDEsIDB4RkQsIDB4NEIsIDB4MDEsCi0JMHg4RCwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQywKLQkweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELCAweEJGLCAweDA1LCAweEFELCAweEYyLCAweDNCLCAweDNCLAotCTB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsIDB4MDYsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQywgMHhGRiwgMHg4NCwgMHgwMCwKLQkweDVCLCAweEZGLCAweDY0LCAweDAwLCAweEM5LCAweDAwLCAweDIyLCAweEZCLCAweDAyLCAweDQ3LCAweDY0LAotCTB4MEUsIDB4OEYsIDB4RjgsIDB4QTcsIDB4MDQsIDB4MjksIDB4RkQsIDB4OEMsIDB4MDEsIDB4NTQsIDB4RkYsCi0JMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RSwKLQkweDAxLCAweDZCLCAweEZELCAweDFELCAweDA0LCAweEFGLCAweEY5LCAweDUxLCAweDBCLCAweEVDLCAweDQ3LAotCTB4MzMsIDB4RkQsIDB4QzEsIDB4RkYsIDB4RjcsIDB4MDAsIDB4MEMsIDB4RkYsIDB4QUEsIDB4MDAsIDB4QUQsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwKLQkweDQwLCAweEZDLCAweENCLCAweDA2LCAweDZFLCAweEYzLCAweDQ5LCAweDIwLCAweEIwLCAweDNELCAweDczLAotCTB4RjMsIDB4MzEsIDB4MDUsIDB4QzQsIDB4RkQsIDB4RDYsIDB4MDAsIDB4QzgsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NywgMHhGRiwgMHg3NSwgMHgwMSwgMHhCRiwKLQkweEZDLCAweEFCLCAweDA2LCAweEE2LCAweEYxLCAweDA1LCAweDM1LCAweDQwLCAweDJCLCAweEJGLCAweEYxLAotCTB4MkEsIDB4MDcsIDB4NDIsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgyRiwgMHgwMCwgMHgwNywgMHgwMCwgMHgyQywgMHhGRiwKLQkweEU2LCAweDAyLCAweDMxLCAweEY3LCAweEZBLCAweDQzLCAweEIzLCAweDE1LCAweDI5LCAweEY2LCAweEJDLAotCTB4MDUsIDB4QTksIDB4RkMsIDB4QzIsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMSwgMHgwMSwgMHgxMiwgMHhGRSwgMHhEMSwKLQkweDAyLCAweDQ3LCAweEZDLCAweEQ3LCAweDA0LCAweEYwLCAweDQ4LCAweDhELCAweDAyLCAweDQ1LCAweEZELAotCTB4NEQsIDB4MDIsIDB4NTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMSwgMHgwMSwgMHg4MywgMHhGQywgMHgxNiwgMHgwNiwKLQkweDUxLCAweEY1LCAweDlCLCAweDE4LCAweDc1LCAweDQyLCAweEYzLCAweEY1LCAweDlELCAweDAzLCAweEJGLAotCTB4RkUsIDB4NDUsIDB4MDAsIDB4MTEsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHg1MiwgMHhGRiwgMHhCQywgMHgwMSwgMHg1OCwgMHhGQywgMHgxRCwgMHgwNywgMHg4RSwKLQkweEYxLCAweDExLCAweDJFLCAweDZCLCAweDMyLCAweDgxLCAweEYxLCAweEU1LCAweDA2LCAweDkwLCAweEZDLAotCTB4OTQsIDB4MDEsIDB4NjcsIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhFMywgMHhGRiwgMHhBMSwgMHgwMCwgMHgxRSwgMHhGRSwgMHhBMywgMHgwNCwgMHg0OSwgMHhGNCwKLQkweEE4LCAweDNGLCAweDUyLCAweDFELCAweDE5LCAweEY0LCAweDkwLCAweDA2LCAweDUzLCAweEZDLCAweEUxLAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsCi0JMHhDQywgMHgwMCwgMHhDNiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhEMiwgMHhGRSwgMHgyNiwgMHhGRiwgMHg3QywKLQkweDQ4LCAweEJFLCAweDA4LCAweEFFLCAweEZBLCAweEEwLCAweDAzLCAweEE5LCAweEZELCAweDUyLCAweDAxLAotCTB4NkIsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsCi0JMHhGRiwgMHhBMywgMHgwMSwgMHhGMywgMHhGQywgMHgxOCwgMHgwNSwgMHg5QiwgMHhGNywgMHgyNywgMHgxMSwKLQkweDAyLCAweDQ2LCAweDdGLCAweEY5LCAweEEzLCAweDAxLCAweEU4LCAweEZGLCAweDlGLCAweEZGLCAweDYzLAotCTB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsCi0JMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxQywgMHgwNywgMHg0QiwgMHhGMiwgMHhBMCwgMHgyNiwgMHhGMiwKLQkweDM4LCAweDJBLCAweEYyLCAweDI4LCAweDA2LCAweDFGLCAweEZELCAweDM5LCAweDAxLCAweDk2LCAweEZGLAotCTB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MjIsCi0JMHgwMSwgMHg0NSwgMHhGRCwgMHhGMSwgMHgwNSwgMHg2RCwgMHhGMiwgMHgzOCwgMHgzQSwgMHgwMywgMHgyNSwKLQkweDhCLCAweEYyLCAweDBFLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDNBLCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4NzUsIDB4MDAsIDB4N0EsIDB4RkYsCi0JMHgyQiwgMHgwMCwgMHgyRCwgMHgwMSwgMHg2MSwgMHhGQSwgMHg5NywgMHg0NiwgMHhBMCwgMHgwRiwgMHgyMCwKLQkweEY4LCAweERBLCAweDA0LCAweDEwLCAweEZELCAweDk3LCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjIsIDB4MDEsIDB4ODcsCi0JMHhGRCwgMHhFNSwgMHgwMywgMHgyMSwgMHhGQSwgMHgyNSwgMHgwQSwgMHgzMywgMHg0OCwgMHgwRiwgMHhGRSwKLQkweDU3LCAweEZGLCAweDMxLCAweDAxLCAweEVDLCAweEZFLCAweEI5LCAweDAwLCAweEE3LCAweEZGLCAweDE1LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDgsIDB4RkMsCi0JMHhCMiwgMHgwNiwgMHhCOSwgMHhGMywgMHhGMywgMHgxRSwgMHg5OCwgMHgzRSwgMHhDRiwgMHhGMywgMHhGMywKLQkweDA0LCAweEVCLCAweEZELCAweEJGLCAweDAwLCAweEQ0LCAweEZGLCAweEZGLCAweEZGLCAweDAzLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzAsIDB4RkYsIDB4ODQsIDB4MDEsIDB4QTksIDB4RkMsIDB4QzcsCi0JMHgwNiwgMHg5MSwgMHhGMSwgMHhEQywgMHgzMywgMHg4NywgMHgyQywgMHhBNSwgMHhGMSwgMHgyNiwgMHgwNywKLQkweDRCLCAweEZDLCAweEM2LCAweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LAotCTB4MDAsIDB4RTIsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjMsIDB4MDAsIDB4RkEsIDB4RkUsIDB4M0EsIDB4MDMsCi0JMHg5RCwgMHhGNiwgMHg1MCwgMHg0MywgMHgwMCwgMHgxNywgMHhDNiwgMHhGNSwgMHhFNiwgMHgwNSwgMHg5NywKLQkweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLAotCTB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTMsIDB4MDEsIDB4MzEsIDB4RkUsIDB4OTUsIDB4MDIsIDB4QkEsCi0JMHhGQywgMHhDQiwgMHgwMywgMHhGNywgMHg0OCwgMHg5MSwgMHgwMywgMHhEMywgMHhGQywgMHg4OCwgMHgwMiwKLQkweDM4LCAweEZFLCAweDEwLCAweDAxLCAweDg1LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LAotCTB4MDAsIDB4M0QsIDB4RkYsIDB4Q0IsIDB4MDEsIDB4OTMsIDB4RkMsIDB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsCi0JMHg0QiwgMHgxNywgMHgyQSwgMHg0MywgMHg3RCwgMHhGNiwgMHg0RCwgMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwKLQkweDAwLCAweDFFLCAweDAwLCAweEUzLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLAotCTB4NEQsIDB4RkYsIDB4QzQsIDB4MDEsIDB4NEQsIDB4RkMsIDB4MjUsIDB4MDcsIDB4QTEsIDB4RjEsIDB4Q0UsCi0JMHgyQywgMHg5OSwgMHgzMywgMHg4RSwgMHhGMSwgMHhDRCwgMHgwNiwgMHhBNCwgMHhGQywgMHg4NywgMHgwMSwKLQkweDZFLCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZFLCAweEZGLCAweEQ3LAotCTB4RkYsIDB4QkEsIDB4MDAsIDB4RjQsIDB4RkQsIDB4RTUsIDB4MDQsIDB4RTQsIDB4RjMsIDB4Q0EsIDB4M0UsCi0JMHhBNywgMHgxRSwgMHhDQSwgMHhGMywgMHhBQywgMHgwNiwgMHg0QSwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwKLQkweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJELCAweDAwLAotCTB4RTUsIDB4RkUsIDB4M0UsIDB4MDEsIDB4M0YsIDB4RkYsIDB4NDEsIDB4RkUsIDB4NDEsIDB4NDgsIDB4RTQsCi0JMHgwOSwgMHgzQiwgMHhGQSwgMHhEOSwgMHgwMywgMHg4RCwgMHhGRCwgMHg1RiwgMHgwMSwgMHg2NiwgMHhGRiwKLQkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LAotCTB4MDEsIDB4MEIsIDB4RkQsIDB4RTYsIDB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsCi0JMHgzNywgMHhGQSwgMHg0MiwgMHgwMSwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywKLQkweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLAotCTB4MzEsIDB4RkMsIDB4MTEsIDB4MDcsIDB4N0YsIDB4RjIsIDB4NEUsIDB4MjUsIDB4RkQsIDB4MzksIDB4NjAsCi0JMHhGMiwgMHhGQiwgMHgwNSwgMHgzRSwgMHhGRCwgMHgyNiwgMHgwMSwgMHhBMCwgMHhGRiwgMHgxMiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE1LCAweDAwLCAweDk4LCAweEZGLCAweDM1LCAweDAxLCAweDI1LAotCTB4RkQsIDB4MUUsIDB4MDYsIDB4MzUsIDB4RjIsIDB4MkUsIDB4MzksIDB4NTUsIDB4MjYsIDB4NTYsIDB4RjIsCi0JMHgxQSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY2LCAweDAwLCAweDk4LCAweEZGLCAweEY0LCAweEZGLAotCTB4OEUsIDB4MDEsIDB4QTcsIDB4RjksIDB4MUQsIDB4NDYsIDB4REYsIDB4MTAsIDB4QjMsIDB4RjcsIDB4MEQsCi0JMHgwNSwgMHhGOCwgMHhGQywgMHhBMSwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELAotCTB4MDMsIDB4OTQsIDB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsCi0JMHg2QywgMHgwMSwgMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUxLCAweEZDLCAweDk2LCAweDA2LAotCTB4MDcsIDB4RjQsIDB4OUUsIDB4MUQsIDB4NzcsIDB4M0YsIDB4MzIsIDB4RjQsIDB4QjIsIDB4MDQsIDB4MTUsCi0JMHhGRSwgMHhBNywgMHgwMCwgMHhFMCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDkxLCAweDAxLCAweDk0LCAweEZDLCAweEUwLCAweDA2LCAweDg0LAotCTB4RjEsIDB4QUYsIDB4MzIsIDB4Q0EsIDB4MkQsIDB4OTIsIDB4RjEsIDB4MUYsIDB4MDcsIDB4NTYsIDB4RkMsCi0JMHhCRSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNywKLQkweEZGLCAweDE0LCAweDAwLCAweDNGLCAweDAwLCAweEM5LCAweEZFLCAweDhDLCAweDAzLCAweDExLCAweEY2LAotCTB4OUUsIDB4NDIsIDB4NTAsIDB4MTgsIDB4NjYsIDB4RjUsIDB4MEQsIDB4MDYsIDB4ODYsIDB4RkMsIDB4RDAsCi0JMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QSwgMHhGRiwKLQkweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LCAweDAyLCAweEYyLAotCTB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsIDB4MUUsIDB4MDEsCi0JMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKLQkweEZGLCAweEM0LCAweDAxLCAweEE1LCAweEZDLCAweEM1LCAweDA1LCAweDEzLCAweEY2LCAweEZELCAweDE1LAotCTB4RDQsIDB4NDMsIDB4MEYsIDB4RjcsIDB4RjksIDB4MDIsIDB4MjEsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MkMsCi0JMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OSwgMHhGRiwKLQkweENDLCAweDAxLCAweDQ0LCAweEZDLCAweDI5LCAweDA3LCAweEI5LCAweEYxLCAweDg5LCAweDJCLCAweEMzLAotCTB4MzQsIDB4QTAsIDB4RjEsIDB4QjEsIDB4MDYsIDB4QkEsIDB4RkMsIDB4NzksIDB4MDEsIDB4NzYsIDB4RkYsCi0JMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHhDQiwgMHhGRiwgMHhEMSwKLQkweDAwLCAweENDLCAweEZELCAweDI0LCAweDA1LCAweDg3LCAweEYzLCAweEU0LCAweDNELCAweEZELCAweDFGLAotCTB4N0YsIDB4RjMsIDB4QzYsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQywgMHhGRiwgMHhBRSwgMHgwMCwgMHgwNSwgMHhGRiwKLQkweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELCAweEZELCAweDQ3LCAweDBFLCAweDBCLCAweEM4LAotCTB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHg4RiwgMHgwMSwgMHgyMywKLQkweEZELCAweEIyLCAweDA0LCAweDc2LCAweEY4LCAweEFBLCAweDBFLCAweEVELCAweDQ2LCAweEY3LCAweEZBLAotCTB4REYsIDB4MDAsIDB4NTcsIDB4MDAsIDB4NjIsIDB4RkYsIDB4ODAsIDB4MDAsIDB4QkQsIDB4RkYsIDB4MTAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywKLQkweDAzLCAweDA3LCAweEI3LCAweEYyLCAweEZDLCAweDIzLCAweDAzLCAweDNCLCAweDlFLCAweEYyLCAweENCLAotCTB4MDUsIDB4NUYsIDB4RkQsIDB4MTIsIDB4MDEsIDB4QUEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg4RiwgMHhGRiwgMHg0NywgMHgwMSwgMHgwOCwgMHhGRCwgMHg0OSwKLQkweDA2LCAweDA1LCAweEYyLCAweDFELCAweDM4LCAweEE2LCAweDI3LCAweDI2LCAweEYyLCAweDIzLCAweDA3LAotCTB4MzMsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHhDRCwgMHhGRiwgMHg1NywgMHgwMCwgMHhCNiwgMHhGRiwgMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwKLQkweEY1LCAweEY4LCAweDlCLCAweDQ1LCAweDIyLCAweDEyLCAweDQ4LCAweEY3LCAweDNELCAweDA1LCAweEUyLAotCTB4RkMsIDB4QUIsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyNCwgMHgwMCwgMHg2RiwgMHhGRiwgMHg0OCwgMHgwMSwgMHhDMCwgMHhGRCwgMHg3MywgMHgwMywgMHgwNywKLQkweEZCLCAweERELCAweDA3LCAweEExLCAweDQ4LCAweERELCAweEZGLCAweDdELCAweEZFLCAweEE3LCAweDAxLAotCTB4QUQsIDB4RkUsIDB4RDgsIDB4MDAsIDB4OUIsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QywgMHhGQywgMHg3OCwgMHgwNiwgMHg1QSwgMHhGNCwKLQkweDQ5LCAweDFDLCAweDRFLCAweDQwLCAweDlFLCAweEY0LCAweDZELCAweDA0LCAweDNGLCAweEZFLCAweDhFLAotCTB4MDAsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHg2MiwgMHhGRiwgMHg5RSwgMHgwMSwgMHg4MiwgMHhGQywgMHhGNSwgMHgwNiwgMHg3RCwgMHhGMSwgMHg3QiwKLQkweDMxLCAweDA5LCAweDJGLCAweDg0LCAweEYxLCAweDE1LCAweDA3LCAweDYyLCAweEZDLCAweEI0LCAweDAxLAotCTB4NTYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHg1QSwgMHgwMCwgMHg5QSwgMHhGRSwgMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwKLQkweEExLCAweDE5LCAweDA5LCAweEY1LCAweDMzLCAweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OEYsIDB4RkYsIDB4RjUsIDB4MDAsCi0JMHg2RiwgMHhGRSwgMHgxRSwgMHgwMiwgMHg5RCwgMHhGRCwgMHhDNywgMHgwMSwgMHhFMSwgMHg0OCwgMHhBQiwKLQkweDA1LCAweEVFLCAweEZCLCAweEZFLCAweDAyLCAweEZCLCAweEZELCAweDJDLCAweDAxLCAweDdBLCAweEZGLAotCTB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkMsCi0JMHgwMSwgMHhCOCwgMHhGQywgMHg5QSwgMHgwNSwgMHg3NywgMHhGNiwgMHhCMSwgMHgxNCwgMHg3NywgMHg0NCwKLQkweEE5LCAweEY3LCAweEEyLCAweDAyLCAweDU0LCAweEZGLCAweEYxLCAweEZGLCAweDNBLCAweDAwLCAweEQ4LAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4RkYsIDB4RDMsIDB4MDEsCi0JMHgzQywgMHhGQywgMHgyQSwgMHgwNywgMHhEOCwgMHhGMSwgMHgzRiwgMHgyQSwgMHhFNiwgMHgzNSwgMHhCQiwKLQkweEYxLCAweDkyLCAweDA2LCAweEQyLCAweEZDLCAweDY5LCAweDAxLCAweDdFLCAweEZGLCAweDFGLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4RTgsIDB4MDAsIDB4QTYsCi0JMHhGRCwgMHg1RiwgMHgwNSwgMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwgMHgyMSwgMHgzNywgMHhGMywKLQkweERELCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjQsIDB4RkYsIDB4QzksIDB4MDAsCi0JMHgxMywgMHgwMCwgMHg4RCwgMHhGQywgMHhBRSwgMHg0NywgMHgzRSwgMHgwQywgMHg1NiwgMHhGOSwgMHg0OCwKLQkweDA0LCAweDU2LCAweEZELCAweDc4LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODMsIDB4MDEsIDB4M0MsIDB4RkQsIDB4N0UsCi0JMHgwNCwgMHhFNiwgMHhGOCwgMHg3MiwgMHgwRCwgMHg1MiwgMHg0NywgMHhCRSwgMHhGQiwgMHg3QSwgMHgwMCwKLQkweDkwLCAweDAwLCAweDQzLCAweEZGLCAweDhGLCAweDAwLCAweEI3LCAweEZGLCAweDExLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RjEsIDB4MDYsCi0JMHhGNSwgMHhGMiwgMHhBNywgMHgyMiwgMHhGRiwgMHgzQiwgMHhFNCwgMHhGMiwgMHg5NiwgMHgwNSwgMHg4MSwKLQkweEZELCAweEZELCAweDAwLCAweEI1LCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLAotCTB4MUMsIDB4MDAsIDB4ODYsIDB4RkYsIDB4NTksIDB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsCi0JMHhGMSwgMHgwNCwgMHgzNywgMHhGMywgMHgyOCwgMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywKLQkweEQ4LCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQzLAotCTB4RkYsIDB4NDksIDB4MDAsIDB4RDQsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NDksIDB4MDIsIDB4NEIsIDB4RjgsCi0JMHgwRCwgMHg0NSwgMHg2OCwgMHgxMywgMHhERiwgMHhGNiwgMHg2QywgMHgwNSwgMHhDQywgMHhGQywgMHhCNCwKLQkweDAxLCAweDQ1LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAotCTB4NzQsIDB4RkYsIDB4M0EsIDB4MDEsIDB4REQsIDB4RkQsIDB4MzksIDB4MDMsIDB4N0IsIDB4RkIsIDB4QzEsCi0JMHgwNiwgMHhDNywgMHg0OCwgMHhDRiwgMHgwMCwgMHgwRCwgMHhGRSwgMHhFMywgMHgwMSwgMHg4RSwgMHhGRSwKLQkweEU3LCAweDAwLCAweDk1LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAotCTB4RkYsIDB4REEsIDB4MDEsIDB4NjksIDB4RkMsIDB4NTcsIDB4MDYsIDB4QUYsIDB4RjQsIDB4RjUsIDB4MUEsCi0JMHgxRCwgMHg0MSwgMHgxMSwgMHhGNSwgMHgyNSwgMHgwNCwgMHg2QywgMHhGRSwgMHg3NCwgMHgwMCwgMHhGOSwKLQkweEZGLCAweEYxLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLCAweEZGLAotCTB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsCi0JMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwKLQkweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYxLCAweEZGLCAweEY5LCAweEZGLCAweDc0LAotCTB4MDAsIDB4NkMsIDB4RkUsIDB4MjUsIDB4MDQsIDB4MTEsIDB4RjUsIDB4MUQsIDB4NDEsIDB4RjUsIDB4MUEsCi0JMHhBRiwgMHhGNCwgMHg1NywgMHgwNiwgMHg2OSwgMHhGQywgMHhEQSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU3LCAweDAwLCAweDhFLCAweEZFLAotCTB4RTMsIDB4MDEsIDB4MEQsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4QzcsIDB4NDgsIDB4QzEsIDB4MDYsIDB4N0IsCi0JMHhGQiwgMHgzOSwgMHgwMywgMHhERCwgMHhGRCwgMHgzQSwgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMywgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLCAweEI0LCAweDAxLCAweENDLAotCTB4RkMsIDB4NkMsIDB4MDUsIDB4REYsIDB4RjYsIDB4NjgsIDB4MTMsIDB4MEQsIDB4NDUsIDB4NEIsIDB4RjgsCi0JMHg0OSwgMHgwMiwgMHg4OCwgMHhGRiwgMHhENCwgMHhGRiwgMHg0OSwgMHgwMCwgMHhEMywgMHhGRiwgMHgwQiwKLQkweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LCAweDAxLCAweDM3LCAweEZDLAotCTB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsIDB4REMsIDB4RjEsIDB4NkYsCi0JMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEI1LCAweEZGLCAweEZELCAweDAwLCAweDgxLCAweEZELCAweDk2LAotCTB4MDUsIDB4RTQsIDB4RjIsIDB4RkYsIDB4M0IsIDB4QTcsIDB4MjIsIDB4RjUsIDB4RjIsIDB4RjEsIDB4MDYsCi0JMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwKLQkweDAwLCAweEI3LCAweEZGLCAweDhGLCAweDAwLCAweDQzLCAweEZGLCAweDkwLCAweDAwLCAweDdBLCAweDAwLAotCTB4QkUsIDB4RkIsIDB4NTIsIDB4NDcsIDB4NzIsIDB4MEQsIDB4RTYsIDB4RjgsIDB4N0UsIDB4MDQsIDB4M0MsCi0JMHhGRCwgMHg4MywgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc4LCAweDAxLCAweDU2LCAweEZELCAweDQ4LCAweDA0LCAweDU2LAotCTB4RjksIDB4M0UsIDB4MEMsIDB4QUUsIDB4NDcsIDB4OEQsIDB4RkMsIDB4MTMsIDB4MDAsIDB4QzksIDB4MDAsCi0JMHgyNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLCAweEZDLCAweERELCAweDA2LCAweDM3LCAweEYzLAotCTB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsIDB4NUYsIDB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsCi0JMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRiwgMHgwMCwKLQkweDdFLCAweEZGLCAweDY5LCAweDAxLCAweEQyLCAweEZDLCAweDkyLCAweDA2LCAweEJCLCAweEYxLCAweEU2LAotCTB4MzUsIDB4M0YsIDB4MkEsIDB4RDgsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsCi0JMHg0NSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEOCwgMHhGRiwgMHgzQSwKLQkweDAwLCAweEYxLCAweEZGLCAweDU0LCAweEZGLCAweEEyLCAweDAyLCAweEE5LCAweEY3LCAweDc3LCAweDQ0LAotCTB4QjEsIDB4MTQsIDB4NzcsIDB4RjYsIDB4OUEsIDB4MDUsIDB4QjgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NDIsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwKLQkweDJDLCAweDAxLCAweEZCLCAweEZELCAweEZFLCAweDAyLCAweEVFLCAweEZCLCAweEFCLCAweDA1LCAweEUxLAotCTB4NDgsIDB4QzcsIDB4MDEsIDB4OUQsIDB4RkQsIDB4MUUsIDB4MDIsIDB4NkYsIDB4RkUsIDB4RjUsIDB4MDAsCi0JMHg4RiwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwKLQkweDAxLCAweDc3LCAweEZDLCAweDMzLCAweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLAotCTB4OEQsIDB4RjUsIDB4REEsIDB4MDMsIDB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwgMHhCNCwgMHgwMSwKLQkweDYyLCAweEZDLCAweDE1LCAweDA3LCAweDg0LCAweEYxLCAweDA5LCAweDJGLCAweDdCLCAweDMxLCAweDdELAotCTB4RjEsIDB4RjUsIDB4MDYsIDB4ODIsIDB4RkMsIDB4OUUsIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNiwgMHhGRiwgMHhFRCwgMHhGRiwgMHg4RSwgMHgwMCwgMHgzRiwKLQkweEZFLCAweDZELCAweDA0LCAweDlFLCAweEY0LCAweDRFLCAweDQwLCAweDQ5LCAweDFDLCAweDVBLCAweEY0LAotCTB4NzgsIDB4MDYsIDB4NUMsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxOCwgMHgwMCwgMHg5QiwgMHhGRiwgMHhEOCwgMHgwMCwgMHhBRCwgMHhGRSwgMHhBNywgMHgwMSwKLQkweDdELCAweEZFLCAweERELCAweEZGLCAweEExLCAweDQ4LCAweERELCAweDA3LCAweDA3LCAweEZCLCAweDczLAotCTB4MDMsIDB4QzAsIDB4RkQsIDB4NDgsIDB4MDEsIDB4NkYsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwKLQkweDA1LCAweDQ4LCAweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLAotCTB4QkUsIDB4RkYsIDB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERCwgMHgwMSwgMHgzMywgMHhGQywgMHgyMywgMHgwNywKLQkweDI2LCAweEYyLCAweEE2LCAweDI3LCAweDFELCAweDM4LCAweDA1LCAweEYyLCAweDQ5LCAweDA2LCAweDA4LAotCTB4RkQsIDB4NDcsIDB4MDEsIDB4OEYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgwRSwgMHgwMCwgMHhBQSwgMHhGRiwgMHgxMiwgMHgwMSwgMHg1RiwgMHhGRCwgMHhDQiwgMHgwNSwgMHg5RSwKLQkweEYyLCAweDAzLCAweDNCLCAweEZDLCAweDIzLCAweEI3LCAweEYyLCAweDAzLCAweDA3LCAweDMzLCAweEZDLAotCTB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkQsCi0JMHhGRiwgMHg4MCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg1NywgMHgwMCwgMHhERiwgMHgwMCwgMHhGNywgMHhGQSwKLQkweEVELCAweDQ2LCAweEFBLCAweDBFLCAweDc2LCAweEY4LCAweEIyLCAweDA0LCAweDIzLCAweEZELCAweDhGLAotCTB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCi0JMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwgMHhGOSwgMHgwRSwKLQkweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLCAweDA1LCAweEZGLAotCTB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCi0JMHhGRiwgMHhFNSwgMHgwMSwgMHg0MSwgMHhGQywgMHhDNiwgMHgwNiwgMHg3RiwgMHhGMywgMHhGRCwgMHgxRiwKLQkweEU0LCAweDNELCAweDg3LCAweEYzLCAweDI0LCAweDA1LCAweENDLCAweEZELCAweEQxLCAweDAwLCAweENCLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzYsIDB4RkYsCi0JMHg3OSwgMHgwMSwgMHhCQSwgMHhGQywgMHhCMSwgMHgwNiwgMHhBMCwgMHhGMSwgMHhDMywgMHgzNCwgMHg4OSwKLQkweDJCLCAweEI5LCAweEYxLCAweDI5LCAweDA3LCAweDQ0LCAweEZDLCAweENDLCAweDAxLCAweDQ5LCAweEZGLAotCTB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4MEQsCi0JMHgwMCwgMHgyMSwgMHhGRiwgMHhGOSwgMHgwMiwgMHgwRiwgMHhGNywgMHhENCwgMHg0MywgMHhGRCwgMHgxNSwKLQkweDEzLCAweEY2LCAweEM1LCAweDA1LCAweEE1LCAweEZDLCAweEM0LCAweDAxLCAweDQwLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDEsCi0JMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywgMHg5QiwgMHgwNCwgMHhGMiwgMHg0OCwgMHhDNiwKLQkweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLCAweEZFLCAweDA0LCAweDAxLCAweDhBLCAweEZGLAotCTB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDAsIDB4MDEsIDB4ODYsCi0JMHhGQywgMHgwRCwgMHgwNiwgMHg2NiwgMHhGNSwgMHg1MCwgMHgxOCwgMHg5RSwgMHg0MiwgMHgxMSwgMHhGNiwKLQkweDhDLCAweDAzLCAweEM5LCAweEZFLCAweDNGLCAweDAwLCAweDE0LCAweDAwLCAweEU3LCAweEZGLCAweDA3LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkUsIDB4MDEsIDB4NTYsIDB4RkMsCi0JMHgxRiwgMHgwNywgMHg5MiwgMHhGMSwgMHhDQSwgMHgyRCwgMHhBRiwgMHgzMiwgMHg4NCwgMHhGMSwgMHhFMCwKLQkweDA2LCAweDk0LCAweEZDLCAweDkxLCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLAotCTB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTAsIDB4RkYsIDB4QTcsIDB4MDAsIDB4MTUsIDB4RkUsIDB4QjIsCi0JMHgwNCwgMHgzMiwgMHhGNCwgMHg3NywgMHgzRiwgMHg5RSwgMHgxRCwgMHgwNywgMHhGNCwgMHg5NiwgMHgwNiwKLQkweDUxLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LAotCTB4MDAsIDB4QTEsIDB4RkYsIDB4QzksIDB4MDAsIDB4Q0QsIDB4RkUsIDB4NkMsIDB4MDEsIDB4RUEsIDB4RkUsCi0JMHhGMywgMHhGRSwgMHg3MCwgMHg0OCwgMHhGRiwgMHgwOCwgMHg5NCwgMHhGQSwgMHhBRCwgMHgwMywgMHhBMywKLQkweEZELCAweDU1LCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTEsIDB4MDEsIDB4RjgsIDB4RkMsIDB4MEQsIDB4MDUsIDB4QjMsCi0JMHhGNywgMHhERiwgMHgxMCwgMHgxRCwgMHg0NiwgMHhBNywgMHhGOSwgMHg4RSwgMHgwMSwgMHhGNCwgMHhGRiwKLQkweDk4LCAweEZGLCAweDY2LCAweDAwLCAweEM3LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LAotCTB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MUEsIDB4MDcsIDB4NTYsIDB4RjIsCi0JMHg1NSwgMHgyNiwgMHgyRSwgMHgzOSwgMHgzNSwgMHhGMiwgMHgxRSwgMHgwNiwgMHgyNSwgMHhGRCwgMHgzNSwKLQkweDAxLCAweDk4LCAweEZGLCAweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAotCTB4QTAsIDB4RkYsIDB4MjYsIDB4MDEsIDB4M0UsIDB4RkQsIDB4RkIsIDB4MDUsIDB4NjAsIDB4RjIsIDB4RkQsCi0JMHgzOSwgMHg0RSwgMHgyNSwgMHg3RiwgMHhGMiwgMHgxMSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMywgMHgwMSwKLQkweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMzLCAweEZGLCAweDcxLAotCTB4MDAsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4NDIsIDB4MDEsIDB4MzcsIDB4RkEsIDB4N0MsIDB4NDYsCi0JMHhFNywgMHgwRiwgMHgwOCwgMHhGOCwgMHhFNiwgMHgwNCwgMHgwQiwgMHhGRCwgMHg5OSwgMHgwMSwgMHg0RiwKLQkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLAotCTB4NUYsIDB4MDEsIDB4OEQsIDB4RkQsIDB4RDksIDB4MDMsIDB4M0IsIDB4RkEsIDB4RTQsIDB4MDksIDB4NDEsCi0JMHg0OCwgMHg0MSwgMHhGRSwgMHgzRiwgMHhGRiwgMHgzRSwgMHgwMSwgMHhFNSwgMHhGRSwgMHhCRCwgMHgwMCwKLQkweEE2LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LAotCTB4MDEsIDB4NEEsIDB4RkMsIDB4QUMsIDB4MDYsIDB4Q0EsIDB4RjMsIDB4QTcsIDB4MUUsIDB4Q0EsIDB4M0UsCi0JMHhFNCwgMHhGMywgMHhFNSwgMHgwNCwgMHhGNCwgMHhGRCwgMHhCQSwgMHgwMCwgMHhENywgMHhGRiwgMHhGRSwKLQkweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDg3LCAweDAxLAotCTB4QTQsIDB4RkMsIDB4Q0QsIDB4MDYsIDB4OEUsIDB4RjEsIDB4OTksIDB4MzMsIDB4Q0UsIDB4MkMsIDB4QTEsCi0JMHhGMSwgMHgyNSwgMHgwNywgMHg0RCwgMHhGQywgMHhDNCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUzLCAweEZGLCAweDFFLCAweDAwLCAweDJBLCAweDAwLCAweEVGLAotCTB4RkUsIDB4NEQsIDB4MDMsIDB4N0QsIDB4RjYsIDB4MkEsIDB4NDMsIDB4NEIsIDB4MTcsIDB4QjAsIDB4RjUsCi0JMHhFRiwgMHgwNSwgMHg5MywgMHhGQywgMHhDQiwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDFFLCAweDAwLCAweDg1LCAweEZGLCAweDEwLCAweDAxLCAweDM4LCAweEZFLCAweDg4LCAweDAyLAotCTB4RDMsIDB4RkMsIDB4OTEsIDB4MDMsIDB4RjcsIDB4NDgsIDB4Q0IsIDB4MDMsIDB4QkEsIDB4RkMsIDB4OTUsCi0JMHgwMiwgMHgzMSwgMHhGRSwgMHgxMywgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweEM5LCAweDAxLCAweDk3LCAweEZDLCAweEU2LAotCTB4MDUsIDB4QzYsIDB4RjUsIDB4MDAsIDB4MTcsIDB4NTAsIDB4NDMsIDB4OUQsIDB4RjYsIDB4M0EsIDB4MDMsCi0JMHhGQSwgMHhGRSwgMHgyMywgMHgwMCwgMHgyMSwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDMwLCAweDAwLCAweDRDLCAweEZGLCAweEM2LCAweDAxLCAweDRCLCAweEZDLCAweDI2LCAweDA3LAotCTB4QTUsIDB4RjEsIDB4ODcsIDB4MkMsIDB4REMsIDB4MzMsIDB4OTEsIDB4RjEsIDB4QzcsIDB4MDYsIDB4QTksCi0JMHhGQywgMHg4NCwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwKLQkweEZGLCAweEZGLCAweEQ0LCAweEZGLCAweEJGLCAweDAwLCAweEVCLCAweEZELCAweEYzLCAweDA0LCAweENGLAotCTB4RjMsIDB4OTgsIDB4M0UsIDB4RjMsIDB4MUUsIDB4QjksIDB4RjMsIDB4QjIsIDB4MDYsIDB4NDgsIDB4RkMsCi0JMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBNywKLQkweEZGLCAweEI5LCAweDAwLCAweEVDLCAweEZFLCAweDMxLCAweDAxLCAweDU3LCAweEZGLCAweDBGLCAweEZFLAotCTB4MzMsIDB4NDgsIDB4MjUsIDB4MEEsIDB4MjEsIDB4RkEsIDB4RTUsIDB4MDMsIDB4ODcsIDB4RkQsIDB4NjIsCi0JMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwKLQkweDUwLCAweEZGLCAweDk3LCAweDAxLCAweDEwLCAweEZELCAweERBLCAweDA0LCAweDIwLCAweEY4LCAweEEwLAotCTB4MEYsIDB4OTcsIDB4NDYsIDB4NjEsIDB4RkEsIDB4MkQsIDB4MDEsIDB4MkIsIDB4MDAsIDB4N0EsIDB4RkYsCi0JMHg3NSwgMHgwMCwgMHhDMiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwKLQkweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBFLCAweDA3LCAweDhCLCAweEYyLCAweDAzLCAweDI1LAotCTB4MzgsIDB4M0EsIDB4NkQsIDB4RjIsIDB4RjEsIDB4MDUsIDB4NDUsIDB4RkQsIDB4MjIsIDB4MDEsIDB4QTIsCi0JMHhGRiwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NiwgMHhGRiwKLQkweDM5LCAweDAxLCAweDFGLCAweEZELCAweDI4LCAweDA2LCAweDJBLCAweEYyLCAweEYyLCAweDM4LCAweEEwLAotCTB4MjYsIDB4NEIsIDB4RjIsIDB4MUMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0MsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MywgMHgwMCwgMHg5RiwKLQkweEZGLCAweEU4LCAweEZGLCAweEEzLCAweDAxLCAweDdGLCAweEY5LCAweDAyLCAweDQ2LCAweDI3LCAweDExLAotCTB4OUIsIDB4RjcsIDB4MTgsIDB4MDUsIDB4RjMsIDB4RkMsIDB4QTMsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QiwgMHhGRiwgMHg1MiwgMHgwMSwKLQkweEE5LCAweEZELCAweEEwLCAweDAzLCAweEFFLCAweEZBLCAweEJFLCAweDA4LCAweDdDLCAweDQ4LCAweDI2LAotCTB4RkYsIDB4RDIsIDB4RkUsIDB4NzksIDB4MDEsIDB4QzYsIDB4RkUsIDB4Q0MsIDB4MDAsIDB4QTAsIDB4RkYsCi0JMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMSwgMHgwMSwgMHg1MywKLQkweEZDLCAweDkwLCAweDA2LCAweDE5LCAweEY0LCAweDUyLCAweDFELCAweEE4LCAweDNGLCAweDQ5LCAweEY0LAotCTB4QTMsIDB4MDQsIDB4MUUsIDB4RkUsIDB4QTEsIDB4MDAsIDB4RTMsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2NywgMHhGRiwgMHg5NCwgMHgwMSwgMHg5MCwgMHhGQywKLQkweEU1LCAweDA2LCAweDgxLCAweEYxLCAweDZCLCAweDMyLCAweDExLCAweDJFLCAweDhFLCAweEYxLCAweDFELAotCTB4MDcsIDB4NTgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMSwgMHgwMCwgMHg0NSwgMHgwMCwgMHhCRiwgMHhGRSwgMHg5RCwKLQkweDAzLCAweEYzLCAweEY1LCAweDc1LCAweDQyLCAweDlCLCAweDE4LCAweDUxLCAweEY1LCAweDE2LCAweDA2LAotCTB4ODMsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHgwMSwgMHgwMSwgMHg1NiwgMHhGRSwgMHg0RCwgMHgwMiwgMHg0NSwgMHhGRCwKLQkweDhELCAweDAyLCAweEYwLCAweDQ4LCAweEQ3LCAweDA0LCAweDQ3LCAweEZDLCAweEQxLCAweDAyLCAweDEyLAotCTB4RkUsIDB4MjEsIDB4MDEsIDB4N0UsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMiwgMHgwMSwgMHhBOSwgMHhGQywgMHhCQywgMHgwNSwgMHgyOSwKLQkweEY2LCAweEIzLCAweDE1LCAweEZBLCAweDQzLCAweDMxLCAweEY3LCAweEU2LCAweDAyLCAweDJDLCAweEZGLAotCTB4MDcsIDB4MDAsIDB4MkYsIDB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsCi0JMHgwMCwgMHg0OCwgMHhGRiwgMHhDRSwgMHgwMSwgMHg0MiwgMHhGQywgMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwKLQkweDQwLCAweDJCLCAweDA1LCAweDM1LCAweEE2LCAweEYxLCAweEFCLCAweDA2LCAweEJGLCAweEZDLCAweDc1LAotCTB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsCi0JMHhDOCwgMHhGRiwgMHhENiwgMHgwMCwgMHhDNCwgMHhGRCwgMHgzMSwgMHgwNSwgMHg3MywgMHhGMywgMHhCMCwKLQkweDNELCAweDQ5LCAweDIwLCAweDZFLCAweEYzLCAweENCLCAweDA2LCAweDQwLCAweEZDLCAweEU2LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QUEsCi0JMHgwMCwgMHgwQywgMHhGRiwgMHhGNywgMHgwMCwgMHhDMSwgMHhGRiwgMHgzMywgMHhGRCwgMHhFQywgMHg0NywKLQkweDUxLCAweDBCLCAweEFGLCAweEY5LCAweDFELCAweDA0LCAweDZCLCAweEZELCAweDZFLCAweDAxLCAweDYwLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTQsIDB4RkYsCi0JMHg4QywgMHgwMSwgMHgyOSwgMHhGRCwgMHhBNywgMHgwNCwgMHg4RiwgMHhGOCwgMHg2NCwgMHgwRSwgMHgwMiwKLQkweDQ3LCAweDIyLCAweEZCLCAweEM5LCAweDAwLCAweDY0LCAweDAwLCAweDVCLCAweEZGLCAweDg0LCAweDAwLAotCTB4QkMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsCi0JMHgwMSwgMHgzMywgMHhGQywgMHhGRiwgMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwKLQkweEFELCAweEYyLCAweEJGLCAweDA1LCAweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEQsIDB4RkYsIDB4NEIsIDB4MDEsCi0JMHgwMSwgMHhGRCwgMHg1MSwgMHgwNiwgMHhGQiwgMHhGMSwgMHhERiwgMHgzNywgMHhGMCwgMHgyNywgMHgxQywKLQkweEYyLCAweDI0LCAweDA3LCAweDM0LCAweEZDLCAweERDLCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4NTQsIDB4MDAsIDB4QkQsIDB4RkYsIDB4QjIsCi0JMHhGRiwgMHgwMSwgMHgwMiwgMHhDRiwgMHhGOCwgMHg3RCwgMHg0NSwgMHg2QiwgMHgxMiwgMHgzMCwgMHhGNywKLQkweDQ4LCAweDA1LCAweERELCAweEZDLCAweEFELCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzAsIDB4RkYsIDB4NDUsIDB4MDEsIDB4QzYsIDB4RkQsCi0JMHg2NiwgMHgwMywgMHgyMSwgMHhGQiwgMHg5RSwgMHgwNywgMHhBQSwgMHg0OCwgMHgxMiwgMHgwMCwgMHg2NCwKLQkweEZFLCAweEI0LCAweDAxLCAweEE2LCAweEZFLCAweERCLCAweDAwLCAweDlBLCAweEZGLCAweDE5LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsCi0JMHgwNiwgMHg2QywgMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwKLQkweDQ5LCAweEZFLCAweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZELAotCTB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4QTEsIDB4MDEsIDB4N0UsIDB4RkMsIDB4RjksIDB4MDYsCi0JMHg3QywgMHhGMSwgMHgzOCwgMHgzMSwgMHg1MCwgMHgyRiwgMHg4MiwgMHhGMSwgMHgxMiwgMHgwNywgMHg2NSwKLQkweEZDLCAweEIyLCAweDAxLCAweDU3LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLAotCTB4RUQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4OTAsIDB4RkUsIDB4RUIsIDB4MDMsIDB4NzEsCi0JMHhGNSwgMHhCNywgMHg0MSwgMHhFRCwgMHgxOSwgMHhGNSwgMHhGNCwgMHgzQiwgMHgwNiwgMHg3MywgMHhGQywKLQkweEQ3LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkxLAotCTB4RkYsIDB4RjIsIDB4MDAsIDB4NzYsIDB4RkUsIDB4MTEsIDB4MDIsIDB4QjYsIDB4RkQsIDB4OEYsIDB4MDEsCi0JMHhERSwgMHg0OCwgMHhFOSwgMHgwNSwgMHhENCwgMHhGQiwgMHgwQywgMHgwMywgMHhGNCwgMHhGRCwgMHgyRiwKLQkweDAxLCAweDc5LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAotCTB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsIDB4RjYsIDB4NjgsCi0JMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwgMHhFQSwgMHhGRiwKLQkweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LAotCTB4RkYsIDB4RDQsIDB4MDEsIDB4M0IsIDB4RkMsIDB4MkEsIDB4MDcsIDB4REYsIDB4RjEsIDB4RjYsIDB4MjksCi0JMHgyNywgMHgzNiwgMHhDMSwgMHhGMSwgMHg4QiwgMHgwNiwgMHhEOCwgMHhGQywgMHg2NiwgMHgwMSwgMHg4MCwKLQkweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEJELCAweEZGLAotCTB4RUQsIDB4MDAsIDB4OUUsIDB4RkQsIDB4NkMsIDB4MDUsIDB4MUYsIDB4RjMsIDB4QzAsIDB4M0MsIDB4OUUsCi0JMHgyMSwgMHgyOCwgMHhGMywgMHhFMiwgMHgwNiwgMHgzQSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDlCLCAweDAwLCAweDJCLAotCTB4RkYsIDB4QkQsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUUsIDB4RkMsIDB4OUEsIDB4NDcsIDB4ODIsIDB4MEMsCi0JMHgzRCwgMHhGOSwgMHg1NCwgMHgwNCwgMHg1MCwgMHhGRCwgMHg3QSwgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweDgxLCAweDAxLAotCTB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsIDB4MkQsIDB4MEQsIDB4NjksIDB4NDcsIDB4RUIsCi0JMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywgMHhGRiwgMHg5MywgMHgwMCwgMHhCNiwgMHhGRiwKLQkweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM3LAotCTB4RkMsIDB4RUQsIDB4MDYsIDB4MDMsIDB4RjMsIDB4NUIsIDB4MjIsIDB4MzcsIDB4M0MsIDB4RjQsIDB4RjIsCi0JMHg4QSwgMHgwNSwgMHg4OSwgMHhGRCwgMHhGOSwgMHgwMCwgMHhCNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwKLQkweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg0LCAweEZGLCAweDVDLCAweDAxLCAweEU2LCAweEZDLAotCTB4NzcsIDB4MDYsIDB4RDQsIDB4RjEsIDB4QzYsIDB4MzYsIDB4M0UsIDB4MjksIDB4RjMsIDB4RjEsIDB4MjksCi0JMHgwNywgMHgzOCwgMHhGQywgMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDBCLCAweDAwLCAweEQ0LCAweEZGLCAweDQ2LCAweDAwLCAweERBLCAweEZGLCAweDdELCAweEZGLCAweDVELAotCTB4MDIsIDB4MjYsIDB4RjgsIDB4RUQsIDB4NDQsIDB4QjEsIDB4MTMsIDB4QzcsIDB4RjYsIDB4NzcsIDB4MDUsCi0JMHhDOCwgMHhGQywgMHhCNiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIyLCAweDAwLCAweDc2LCAweEZGLCAweDM3LCAweDAxLCAweEU0LCAweEZELCAweDJDLCAweDAzLAotCTB4OTQsIDB4RkIsIDB4ODMsIDB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsIDB4MDEsIDB4RjUsIDB4RkQsIDB4RjAsCi0JMHgwMSwgMHg4NywgMHhGRSwgMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDM1LCAweDAwLCAweDM4LCAweEZGLCAweEQ5LCAweDAxLCAweDZDLCAweEZDLCAweDRGLCAweDA2LCAweEMzLAotCTB4RjQsIDB4QTksIDB4MUEsIDB4NDksIDB4NDEsIDB4MkMsIDB4RjUsIDB4MTUsIDB4MDQsIDB4NzYsIDB4RkUsCi0JMHg2RSwgMHgwMCwgMHhGQywgMHhGRiwgMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwKLQkweDAwLCAweDVBLCAweEZGLCAweEFDLCAweDAxLCAweDZFLCAweEZDLCAweDBBLCAweDA3LCAweDdFLCAweEYxLAotCTB4RkYsIDB4MkYsIDB4OEEsIDB4MzAsIDB4N0QsIDB4RjEsIDB4MDMsIDB4MDcsIDB4NzUsIDB4RkMsIDB4QTcsCi0JMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMiwgMHhGRiwKLQkweEY3LCAweEZGLCAweDdBLCAweDAwLCAweDYyLCAweEZFLCAweDM1LCAweDA0LCAweEY3LCAweEY0LCAweEVGLAotCTB4NDAsIDB4NDAsIDB4MUIsIDB4OUMsIDB4RjQsIDB4NUUsIDB4MDYsIDB4NjYsIDB4RkMsIDB4REIsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFMywKLQkweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLCAweDI2LCAweEZFLCAweDk4LCAweDAwLCAweEJGLCAweDQ4LAotCTB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsIDB4MDMsIDB4RDYsIDB4RkQsIDB4M0QsIDB4MDEsIDB4NzMsCi0JMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwKLQkweEIyLCAweDAxLCAweEQxLCAweEZDLCAweDYyLCAweDA1LCAweEY2LCAweEY2LCAweDIwLCAweDEzLCAweDJFLAotCTB4NDUsIDB4NzAsIDB4RjgsIDB4MzQsIDB4MDIsIDB4OTQsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4NEMsIDB4MDAsCi0JMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEQSwKLQkweDAxLCAweDM2LCAweEZDLCAweDI3LCAweDA3LCAweDA1LCAweEYyLCAweEFBLCAweDI4LCAweDQ0LCAweDM3LAotCTB4RTQsIDB4RjEsIDB4NjcsIDB4MDYsIDB4RjIsIDB4RkMsIDB4NTUsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCMiwgMHhGRiwgMHgwMiwgMHgwMSwKLQkweDdBLCAweEZELCAweEEyLCAweDA1LCAweEQ0LCAweEYyLCAweEM3LCAweDNCLCAweEYyLCAweDIyLCAweEU3LAotCTB4RjIsIDB4RjUsIDB4MDYsIDB4MzUsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCOSwgMHhGRiwgMHg4QywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4MywKLQkweDAwLCAweDkxLCAweDAwLCAweDkxLCAweEZCLCAweDNELCAweDQ3LCAweEI3LCAweDBELCAweENELCAweEY4LAotCTB4ODksIDB4MDQsIDB4MzYsIDB4RkQsIDB4ODYsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHg3NSwgMHgwMSwgMHg1QywgMHhGRCwKLQkweDNDLCAweDA0LCAweDcwLCAweEY5LCAweEZBLCAweDBCLCAweEMwLCAweDQ3LCAweEJDLCAweEZDLCAweEZDLAotCTB4RkYsIDB4RDYsIDB4MDAsIDB4MUQsIDB4RkYsIDB4QTIsIDB4MDAsIDB4QjAsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQywgMHhGQywgMHhEOCwKLQkweDA2LCAweDQ3LCAweEYzLCAweDA2LCAweDIxLCAweDJBLCAweDNELCAweDQ0LCAweEYzLCAweDUyLCAweDA1LAotCTB4QUUsIDB4RkQsIDB4RTMsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxRiwgMHgwMCwgMHg3QywgMHhGRiwgMHg2RCwgMHgwMSwgMHhDRCwgMHhGQywgMHg5OSwgMHgwNiwKLQkweEI0LCAweEYxLCAweEE2LCAweDM1LCAweDg5LCAweDJBLCAweEQwLCAweEYxLCAweDJCLCAweDA3LCAweDNFLAotCTB4RkMsIDB4RDEsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsCi0JMHhEOSwgMHhGRiwgMHgzNywgMHgwMCwgMHhGNywgMHhGRiwgMHg0OSwgMHhGRiwgMHhCNiwgMHgwMiwgMHg4NiwKLQkweEY3LCAweDUzLCAweDQ0LCAweEZCLCAweDE0LCAweDYxLCAweEY2LCAweEE0LCAweDA1LCAweEI0LCAweEZDLAotCTB4QkUsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsCi0JMHgwMCwgMHg3QiwgMHhGRiwgMHgyOSwgMHgwMSwgMHgwMSwgMHhGRSwgMHhGMSwgMHgwMiwgMHgwNywgMHhGQywKLQkweDZFLCAweDA1LCAweEU2LCAweDQ4LCAweEZGLCAweDAxLCAweDg0LCAweEZELCAweDJDLCAweDAyLCAweDY4LAotCTB4RkUsIDB4RjksIDB4MDAsIDB4OEUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzQSwgMHhGRiwgMHhENCwgMHgwMSwgMHg3QSwgMHhGQywgMHgyQiwgMHgwNiwgMHgxRSwgMHhGNSwgMHg1NiwKLQkweDE5LCAweDBDLCAweDQyLCAweEFBLCAweEY1LCAweEM5LCAweDAzLCAweEE0LCAweEZFLCAweDU0LCAweDAwLAotCTB4MDksIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTUsCi0JMHhGRiwgMHhCNiwgMHgwMSwgMHg1RiwgMHhGQywgMHgxNywgMHgwNywgMHg4NywgMHhGMSwgMHhDMiwgMHgyRSwKLQkweEMwLCAweDMxLCAweDdFLCAweEYxLCAweEYxLCAweDA2LCAweDg2LCAweEZDLCAweDlCLCAweDAxLCAweDYzLAotCTB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsCi0JMHg5MywgMHgwMCwgMHgzNiwgMHhGRSwgMHg3RCwgMHgwNCwgMHg4NSwgMHhGNCwgMHgxRiwgMHg0MCwgMHg5NCwKLQkweDFDLCAweDQ3LCAweEY0LCAweDdFLCAweDA2LCAweDVBLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RDQsIDB4MDAsIDB4QjQsCi0JMHhGRSwgMHg5QSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhBOCwgMHhGRiwgMHg5OCwgMHg0OCwgMHgxRCwgMHgwOCwKLQkweEVFLCAweEZBLCAweDgwLCAweDAzLCAweEI5LCAweEZELCAweDRCLCAweDAxLCAweDZFLCAweEZGLCAweDI1LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4QTksIDB4MDEsCi0JMHhFNywgMHhGQywgMHgzMywgMHgwNSwgMHg2MCwgMHhGNywgMHhEQSwgMHgxMSwgMHhCOCwgMHg0NSwgMHgxQywKLQkweEY5LCAweEQ4LCAweDAxLCAweENBLCAweEZGLCAweEFGLCAweEZGLCAweDVBLCAweDAwLCAweENDLCAweEZGLAotCTB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsCi0JMHhGQywgMHgyMSwgMHgwNywgMHgzMCwgMHhGMiwgMHg1QywgMHgyNywgMHg1QiwgMHgzOCwgMHgwRiwgMHhGMiwKLQkweDQwLCAweDA2LCAweDBFLCAweEZELCAweDQzLCAweDAxLCAweDkxLCAweEZGLCAweDE4LCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTcsIDB4MDEsIDB4NTcsIDB4RkQsCi0JMHhENiwgMHgwNSwgMHg5MCwgMHhGMiwgMHhDOCwgMHgzQSwgMHg0NiwgMHgyNCwgMHhBQSwgMHhGMiwgMHgwNiwKLQkweDA3LCAweDMyLCAweEZDLCAweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NjksIDB4RkYsIDB4NEIsIDB4MDAsIDB4RjYsCi0JMHgwMCwgMHhDQiwgMHhGQSwgMHhEMywgMHg0NiwgMHhGMCwgMHgwRSwgMHg1RSwgMHhGOCwgMHhCRSwgMHgwNCwKLQkweDFFLCAweEZELCAweDkxLCAweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NjksIDB4MDEsIDB4NzcsIDB4RkQsIDB4MDQsIDB4MDQsCi0JMHhFMiwgMHhGOSwgMHhDQiwgMHgwQSwgMHgwRCwgMHg0OCwgMHg5NCwgMHhGRCwgMHg5MiwgMHhGRiwgMHgxMCwKLQkweDAxLCAweEZFLCAweEZFLCAweEIxLCAweDAwLCAweEFBLCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDMsIDB4RkMsIDB4QzAsIDB4MDYsIDB4OEYsCi0JMHhGMywgMHhCMSwgMHgxRiwgMHgxOCwgMHgzRSwgMHg5QiwgMHhGMywgMHgxNiwgMHgwNSwgMHhENSwgMHhGRCwKLQkweENDLCAweDAwLCAweENFLCAweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIyLAotCTB4MDAsIDB4NzQsIDB4RkYsIDB4N0MsIDB4MDEsIDB4QjUsIDB4RkMsIDB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsCi0JMHg4MSwgMHgzNCwgMHhEMSwgMHgyQiwgMHhCMywgMHhGMSwgMHgyOSwgMHgwNywgMHg0NiwgMHhGQywgMHhDQSwKLQkweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERGLCAweEZGLAotCTB4MjksIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTYsIDB4RkYsIDB4MEMsIDB4MDMsIDB4RUUsIDB4RjYsIDB4QjAsCi0JMHg0MywgMHg0NywgMHgxNiwgMHhGQywgMHhGNSwgMHhDRiwgMHgwNSwgMHhBMSwgMHhGQywgMHhDNiwgMHgwMSwKLQkweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgxLAotCTB4RkYsIDB4MUIsIDB4MDEsIDB4MjAsIDB4RkUsIDB4QjYsIDB4MDIsIDB4N0EsIDB4RkMsIDB4NUYsIDB4MDQsCi0JMHhGNCwgMHg0OCwgMHhGRiwgMHgwMiwgMHgxMywgMHhGRCwgMHg2NywgMHgwMiwgMHg0OSwgMHhGRSwgMHgwNywKLQkweDAxLCAweDg4LCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLAotCTB4Q0YsIDB4MDEsIDB4OEEsIDB4RkMsIDB4MDUsIDB4MDYsIDB4N0IsIDB4RjUsIDB4MDYsIDB4MTgsIDB4QzcsCi0JMHg0MiwgMHgyRiwgMHhGNiwgMHg3QSwgMHgwMywgMHhENCwgMHhGRSwgMHgzOSwgMHgwMCwgMHgxNywgMHgwMCwKLQkweEU2LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLAotCTB4MDEsIDB4NTMsIDB4RkMsIDB4MjEsIDB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsCi0JMHg4NiwgMHhGMSwgMHhEQiwgMHgwNiwgMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwKLQkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERFLCAweEZGLCAweEFDLCAweDAwLAotCTB4MEIsIDB4RkUsIDB4QzEsIDB4MDQsIDB4MUIsIDB4RjQsIDB4NDcsIDB4M0YsIDB4RUEsIDB4MUQsIDB4RjUsCi0JMHhGMywgMHg5QywgMHgwNiwgMHg0RiwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEEyLCAweEZGLCAweEM1LCAweDAwLCAweEQ0LCAweEZFLCAweDVGLAotCTB4MDEsIDB4MDMsIDB4RkYsIDB4QkYsIDB4RkUsIDB4NjMsIDB4NDgsIDB4NDAsIDB4MDksIDB4N0IsIDB4RkEsCi0JMHhCOSwgMHgwMywgMHg5RCwgMHhGRCwgMHg1OCwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRELCAweEZGLCAweDlGLCAweDAxLCAweEZFLCAweEZDLAotCTB4MDIsIDB4MDUsIDB4Q0IsIDB4RjcsIDB4OTgsIDB4MTAsIDB4MzksIDB4NDYsIDB4RDAsIDB4RjksIDB4NzgsCi0JMHgwMSwgMHgwMCwgMHgwMCwgMHg5MSwgMHhGRiwgMHg2OSwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LAotCTB4MDcsIDB4NjEsIDB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsCi0JMHgyQywgMHhGRCwgMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDEzLCAweDAwLCAweDlFLCAweEZGLCAweDJCLCAweDAxLCAweDM3LCAweEZELCAweDA1LCAweDA2LAotCTB4NTQsIDB4RjIsIDB4QzIsIDB4MzksIDB4OTksIDB4MjUsIDB4NzMsIDB4RjIsIDB4MTQsIDB4MDcsIDB4MzEsCi0JMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEM0LCAweEZGLCAweDZFLCAweDAwLCAweDg3LCAweEZGLCAweDEzLCAweDAwLCAweDU4LCAweDAxLCAweDBELAotCTB4RkEsIDB4NjEsIDB4NDYsIDB4MkQsIDB4MTAsIDB4RjAsIDB4RjcsIDB4RjEsIDB4MDQsIDB4MDUsIDB4RkQsCi0JMHg5QywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywKLQkweDAwLCAweDY3LCAweEZGLCAweDVDLCAweDAxLCAweDkzLCAweEZELCAweENDLCAweDAzLCAweDU0LCAweEZBLAotCTB4QTIsIDB4MDksIDB4NEYsIDB4NDgsIDB4NzMsIDB4RkUsIDB4MjcsIDB4RkYsIDB4NEIsIDB4MDEsIDB4REUsCi0JMHhGRSwgMHhDMCwgMHgwMCwgMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLCAweEYzLCAweDVCLAotCTB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsIDB4QjQsIDB4MDAsCi0JMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2RCwKLQkweEZGLCAweDhBLCAweDAxLCAweDlGLCAweEZDLCAweEQzLCAweDA2LCAweDhBLCAweEYxLCAweDU3LCAweDMzLAotCTB4MTcsIDB4MkQsIDB4OUMsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEYsIDB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsCi0JMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFNCwgMHhGRiwgMHgxQiwgMHgwMCwKLQkweDMwLCAweDAwLCAweEU0LCAweEZFLCAweDVGLCAweDAzLCAweDVFLCAweEY2LCAweDAyLCAweDQzLCAweDk2LAotCTB4MTcsIDB4OUIsIDB4RjUsIDB4RjgsIDB4MDUsIDB4OEYsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4M0QsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NiwgMHhGRiwgMHgwQywgMHgwMSwgMHgzRSwKLQkweEZFLCAweDdCLCAweDAyLCAweEVELCAweEZDLCAweDU2LCAweDAzLCAweEY1LCAweDQ4LCAweDA2LCAweDA0LAotCTB4QTEsIDB4RkMsIDB4QTMsIDB4MDIsIDB4MkEsIDB4RkUsIDB4MTYsIDB4MDEsIDB4ODMsIDB4RkYsIDB4MUYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOCwgMHgwMSwKLQkweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LCAweEI2LCAweDE2LCAweDc3LCAweDQzLCAweEJELAotCTB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MjUsIDB4MDAsIDB4RTEsIDB4RkYsCi0JMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOCwgMHgwMSwgMHg0OSwKLQkweEZDLCAweDI3LCAweDA3LCAweEFCLCAweEYxLCAweDNFLCAweDJDLCAweDFFLCAweDM0LCAweDk1LCAweEYxLAotCTB4QzEsIDB4MDYsIDB4QUUsIDB4RkMsIDB4ODEsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhGRiwgMHhDNCwgMHgwMCwgMHhFMiwgMHhGRCwKLQkweDAxLCAweDA1LCAweEJBLCAweEYzLCAweDY0LCAweDNFLCAweDNGLCAweDFGLCAweEE4LCAweEYzLCAweEI4LAotCTB4MDYsIDB4NDYsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCNiwgMHgwMCwgMHhGMywgMHhGRSwgMHgyNCwgMHgwMSwgMHg2RSwKLQkweEZGLCAweERFLCAweEZELCAweDI1LCAweDQ4LCAweDY4LCAweDBBLCAweDA4LCAweEZBLCAweEYyLCAweDAzLAotCTB4ODEsIDB4RkQsIDB4NjUsIDB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgyRCwgMHgwMCwgMHg1MSwgMHhGRiwgMHg5NSwgMHgwMSwgMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwKLQkweDM5LCAweEY4LCAweDU5LCAweDBGLCAweEFGLCAweDQ2LCAweDhCLCAweEZBLCAweDE3LCAweDAxLCAweDM4LAotCTB4MDAsIDB4NzMsIDB4RkYsIDB4NzgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQiwgMHgwNywgMHg5NywKLQkweEYyLCAweEI4LCAweDI0LCAweDcxLCAweDNBLCAweDdCLCAweEYyLCAweEU2LCAweDA1LCAweDRDLCAweEZELAotCTB4MUQsIDB4MDEsIDB4QTQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHg5NCwgMHhGRiwgMHgzRCwgMHgwMSwgMHgxOCwgMHhGRCwgMHgzMiwgMHgwNiwgMHgxRiwgMHhGMiwKLQkweEI1LCAweDM4LCAweEVCLCAweDI2LCAweDQwLCAweEYyLCAweDFFLCAweDA3LCAweDMyLCAweEZDLCAweERGLAotCTB4MDEsIDB4M0QsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0EsIDB4RkYsCi0JMHg1RiwgMHgwMCwgMHhBNSwgMHhGRiwgMHhEQywgMHhGRiwgMHhCOCwgMHgwMSwgMHg1NywgMHhGOSwgMHhFNSwKLQkweDQ1LCAweDZFLCAweDExLCAweDgzLCAweEY3LCAweDIzLCAweDA1LCAweEVFLCAweEZDLCAweEE2LCAweDAxLAotCTB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsCi0JMHhGRiwgMHg0RiwgMHgwMSwgMHhCMCwgMHhGRCwgMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwKLQkweDg2LCAweDQ4LCAweDVBLCAweEZGLCAweEJBLCAweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLAotCTB4MDAsIDB4OUUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhFMCwgMHgwMSwgMHg1NiwgMHhGQywgMHg4OSwgMHgwNiwgMHgyQiwgMHhGNCwgMHgwNiwgMHgxRCwgMHhENywKLQkweDNGLCAweDYxLCAweEY0LCAweDk0LCAweDA0LCAweDI3LCAweEZFLCAweDlDLCAweDAwLCAweEU2LCAweEZGLAotCTB4RjgsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTcsCi0JMHgwMSwgMHg4QywgMHhGQywgMHhFQSwgMHgwNiwgMHg4MCwgMHhGMSwgMHgyNiwgMHgzMiwgMHg1OCwgMHgyRSwKLQkweDhCLCAweEYxLCAweDFCLCAweDA3LCAweDVCLCAweEZDLCAweEJBLCAweDAxLCAweDUzLCAweEZGLCAweDJELAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTksIDB4RkYsIDB4MEUsIDB4MDAsIDB4NEIsIDB4MDAsCi0JMHhCNCwgMHhGRSwgMHhBRiwgMHgwMywgMHhENSwgMHhGNSwgMHg0RCwgMHg0MiwgMHhFNiwgMHgxOCwgMHgzQywKLQkweEY1LCAweDFGLCAweDA2LCAweDdGLCAweEZDLCAweEQzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0YsCi0JMHgwMiwgMHg1RSwgMHhGRCwgMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywgMHgwNSwgMHgyRSwgMHhGQywKLQkweERFLCAweDAyLCAweDBDLCAweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLCAweDIwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4QzEsIDB4MDEsIDB4QUQsIDB4RkMsCi0JMHhCMiwgMHgwNSwgMHgzRiwgMHhGNiwgMHg2OSwgMHgxNSwgMHgxRiwgMHg0NCwgMHg1MywgMHhGNywgMHhEMywKLQkweDAyLCAweDM4LCAweEZGLCAweDAxLCAweDAwLCAweDMzLCAweDAwLCAweERCLCAweEZGLCAweDA5LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsCi0JMHgwNywgMHhDNiwgMHhGMSwgMHhGNywgMHgyQSwgMHg0NiwgMHgzNSwgMHhBQiwgMHhGMSwgMHhBNCwgMHgwNiwKLQkweEM0LCAweEZDLCAweDcyLCAweDAxLCAweDc5LCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDAyLAotCTB4MDAsIDB4MDQsIDB4MDAsIDB4QzYsIDB4RkYsIDB4REIsIDB4MDAsIDB4QkIsIDB4RkQsIDB4M0UsIDB4MDUsCi0JMHg2MCwgMHhGMywgMHg3QiwgMHgzRCwgMHg5NCwgMHgyMCwgMHg1RSwgMHhGMywgMHhEMCwgMHgwNiwgMHgzRSwKLQkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLAotCTB4QUUsIDB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsIDB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsCi0JMHhGRCwgMHhEQywgMHg0NywgMHg5NSwgMHgwQiwgMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwKLQkweDcxLCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLAotCTB4MDAsIDB4NTUsIDB4RkYsIDB4OEEsIDB4MDEsIDB4MkUsIDB4RkQsIDB4OUIsIDB4MDQsIDB4QTgsIDB4RjgsCi0JMHgxRiwgMHgwRSwgMHgxQSwgMHg0NywgMHg0RSwgMHhGQiwgMHhCMywgMHgwMCwgMHg3MCwgMHgwMCwgMHg1NCwKLQkweEZGLCAweDg3LCAweDAwLCAweEJCLCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsIDB4RkIsIDB4MDYsIDB4RDIsIDB4RjIsIDB4NjQsCi0JMHgyMywgMHg3MywgMHgzQiwgMHhCQywgMHhGMiwgMHhCNCwgMHgwNSwgMHg2RSwgMHhGRCwgMHgwOSwgMHgwMSwKLQkweEFGLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDFBLCAweDAwLCAweDhCLAotCTB4RkYsIDB4NEYsIDB4MDEsIDB4RkIsIDB4RkMsIDB4NUEsIDB4MDYsIDB4RjIsIDB4RjEsIDB4QTAsIDB4MzcsCi0JMHgzQSwgMHgyOCwgMHgxMywgMHhGMiwgMHgyNSwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwgMHgwMSwgMHg0MCwKLQkweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLCAweDAwLAotCTB4QzMsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsIDB4QjIsCi0JMHgxMiwgMHgxOSwgMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywgMHhGRiwKLQkweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcxLCAweEZGLCAweDQyLAotCTB4MDEsIDB4Q0QsIDB4RkQsIDB4NTksIDB4MDMsIDB4M0IsIDB4RkIsIDB4NUUsIDB4MDcsIDB4QjMsIDB4NDgsCi0JMHg0OCwgMHgwMCwgMHg0QiwgMHhGRSwgMHhDMiwgMHgwMSwgMHg5RiwgMHhGRSwgMHhERSwgMHgwMCwgMHg5OCwKLQkweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERELCAweDAxLAotCTB4NjIsIDB4RkMsIDB4NjksIDB4MDYsIDB4N0YsIDB4RjQsIDB4QjIsIDB4MUIsIDB4QUIsIDB4NDAsIDB4RDAsCi0JMHhGNCwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRSwgMHg4MywgMHgwMCwgMHhGMiwgMHhGRiwgMHhGNCwgMHhGRiwKLQkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweEEzLCAweDAxLCAweDdBLAotCTB4RkMsIDB4RkQsIDB4MDYsIDB4N0MsIDB4RjEsIDB4RjIsIDB4MzAsIDB4OTYsIDB4MkYsIDB4ODAsIDB4RjEsCi0JMHgwRiwgMHgwNywgMHg2OSwgMHhGQywgMHhCMCwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LCAweDAwLCAweDg1LCAweEZFLAotCTB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsIDB4RTEsIDB4RjQsIDB4NDMsCi0JMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFCLCAweDAwLCAweDkyLCAweEZGLCAweEVGLCAweDAwLCAweDdELCAweEZFLCAweDA0LCAweDAyLCAweENGLAotCTB4RkQsIDB4NTgsIDB4MDEsIDB4RDcsIDB4NDgsIDB4MjYsIDB4MDYsIDB4QkIsIDB4RkIsIDB4MTksIDB4MDMsCi0JMHhFRCwgMHhGRCwgMHgzMiwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEI5LCAweDAxLCAweEMxLCAweEZDLCAweDg2LCAweDA1LAotCTB4QTUsIDB4RjYsIDB4MUUsIDB4MTQsIDB4QkEsIDB4NDQsIDB4RjAsIDB4RjcsIDB4N0IsIDB4MDIsIDB4NkIsCi0JMHhGRiwgMHhFNCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhENiwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDMzLCAweDAwLCAweDQzLCAweEZGLCAweEQ1LCAweDAxLCAweDNBLCAweEZDLCAweDJBLCAweDA3LCAweEU3LAotCTB4RjEsIDB4QUMsIDB4MjksIDB4NjYsIDB4MzYsIDB4QzksIDB4RjEsIDB4ODMsIDB4MDYsIDB4REQsIDB4RkMsCi0JMHg2MiwgMHgwMSwgMHg4MSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwKLQkweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LCAweEZELCAweDc4LCAweDA1LCAweDBFLCAweEYzLAotCTB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsIDB4RTYsIDB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNCwgMHhGRiwKLQkweDk4LCAweDAwLCAweDMyLCAweEZGLCAweEIwLCAweDAwLCAweDQxLCAweDAwLCAweDMwLCAweEZDLCAweDg2LAotCTB4NDcsIDB4QzYsIDB4MEMsIDB4MjQsIDB4RjksIDB4NjAsIDB4MDQsIDB4NEIsIDB4RkQsIDB4N0QsIDB4MDEsCi0JMHg1QSwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1QSwKLQkweEZGLCAweDdFLCAweDAxLCAweDQ4LCAweEZELCAweDY2LCAweDA0LCAweDE4LCAweEY5LCAweEU4LCAweDBDLAotCTB4N0MsIDB4NDcsIDB4MTksIDB4RkMsIDB4NEQsIDB4MDAsIDB4QTksIDB4MDAsIDB4MzUsIDB4RkYsIDB4OTYsCi0JMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU5LCAweDA2LCAweDEyLCAweEYzLCAweDEwLCAweDIyLCAweDZFLAotCTB4M0MsIDB4MDUsIDB4RjMsIDB4N0UsIDB4MDUsIDB4OTEsIDB4RkQsIDB4RjQsIDB4MDAsIDB4QkEsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwKLQkweDAxLCAweEUwLCAweEZDLCAweDdGLCAweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LAotCTB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsIDB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhENSwgMHhGRiwgMHg0MiwgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDcxLCAweEZGLCAweDcxLCAweDAyLCAweDAyLCAweEY4LCAweENDLCAweDQ0LCAweEZBLCAweDEzLCAweEIwLAotCTB4RjYsIDB4ODEsIDB4MDUsIDB4QzMsIDB4RkMsIDB4QjgsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3NywgMHhGRiwgMHgzNCwgMHgwMSwgMHhFQSwKLQkweEZELCAweDFGLCAweDAzLCAweEFFLCAweEZCLCAweDQ1LCAweDA2LCAweEQ1LCAweDQ4LCAweDNDLCAweDAxLAotCTB4REMsIDB4RkQsIDB4RkQsIDB4MDEsIDB4ODAsIDB4RkUsIDB4RUQsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwgMHgwMSwgMHg2RiwgMHhGQywKLQkweDQ3LCAweDA2LCAweEQ3LCAweEY0LCAweDVELCAweDFBLCAweDc0LCAweDQxLCAweDQ4LCAweEY1LCAweDA0LAotCTB4MDQsIDB4ODAsIDB4RkUsIDB4NjksIDB4MDAsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwKLQkweDA3LCAweDgwLCAweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LAotCTB4NzgsIDB4RkMsIDB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsCi0JMHgwMCwgMHhGMywgMHhGRiwgMHhGNCwgMHhGRiwgMHg4MCwgMHgwMCwgMHg1OCwgMHhGRSwgMHg0NiwgMHgwNCwKLQkweERELCAweEY0LCAweEMzLCAweDQwLCAweDhDLCAweDFCLCAweDg5LCAweEY0LCAweDY2LCAweDA2LCAweDYzLAotCTB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHg5OCwgMHhGRiwgMHhFMCwgMHgwMCwgMHg5QywgMHhGRSwgMHhDOCwgMHgwMSwgMHgzRiwgMHhGRSwgMHg2MiwKLQkweDAwLCAweEI4LCAweDQ4LCAweDNGLCAweDA3LCAweDQ3LCAweEZCLCAweDUzLCAweDAzLCAweEQwLCAweEZELAotCTB4NDAsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCi0JMHgwMCwgMHg0NywgMHhGRiwgMHhCMCwgMHgwMSwgMHhENiwgMHhGQywgMHg1OCwgMHgwNSwgMHgwRCwgMHhGNywKLQkweEQ3LCAweDEyLCAweDRFLCAweDQ1LCAweDk2LCAweEY4LCAweDIwLCAweDAyLCAweEEwLCAweEZGLCAweEM3LAotCTB4RkYsIDB4NEYsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwgMHhGMiwgMHg2MCwKLQkweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLCAweDUxLCAweDAxLAotCTB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QjAsCi0JMHhGRiwgMHgwNywgMHgwMSwgMHg3MiwgMHhGRCwgMHhBRSwgMHgwNSwgMHhDNCwgMHhGMiwgMHg5MCwgMHgzQiwKLQkweDNGLCAweDIzLCAweEQ5LCAweEYyLCAweEY5LCAweDA2LCAweDM0LCAweEZDLCAweEU2LCAweDAxLCAweDM4LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QkEsIDB4RkYsIDB4ODksIDB4MDAsCi0JMHg1MSwgMHhGRiwgMHg3NywgMHgwMCwgMHhBNywgMHgwMCwgMHg2NCwgMHhGQiwgMHgyNiwgMHg0NywgMHhGQywKLQkweDBELCAweEI0LCAweEY4LCAweDk1LCAweDA0LCAweDMxLCAweEZELCAweDg4LCAweDAxLCAweDU2LCAweEZGLAotCTB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUUsIDB4RkYsIDB4NzIsCi0JMHgwMSwgMHg2MiwgMHhGRCwgMHgyRiwgMHgwNCwgMHg4OSwgMHhGOSwgMHhCNiwgMHgwQiwgMHhEMiwgMHg0NywKLQkweEVCLCAweEZDLCAweEU0LCAweEZGLCAweEUzLCAweDAwLCAweDE2LCAweEZGLCAweEE1LCAweDAwLCAweEFGLAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywgMHhCQSwgMHgyMCwgMHg2MSwgMHgzRCwgMHg1NiwKLQkweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLCAweDAwLCAweEM1LCAweEZGLCAweDA1LCAweDAwLAotCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsIDB4N0EsIDB4RkYsIDB4NzAsIDB4MDEsIDB4QzcsCi0JMHhGQywgMHhBMCwgMHgwNiwgMHhBRSwgMHhGMSwgMHg2NSwgMHgzNSwgMHhEMSwgMHgyQSwgMHhDQSwgMHhGMSwKLQkweDJBLCAweDA3LCAweDQwLCAweEZDLCAweEQwLCAweDAxLCAweDQ3LCAweEZGLCAweDMyLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDksIDB4MDAsIDB4REIsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4M0QsIDB4RkYsCi0JMHhDOSwgMHgwMiwgMHg2NCwgMHhGNywgMHgyRiwgMHg0NCwgMHg0NCwgMHgxNSwgMHg0QSwgMHhGNiwgMHhBRCwKLQkweDA1LCAweEFGLCAweEZDLCAweEMwLCAweDAxLCAweDQxLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0MsIDB4RkYsIDB4MjYsIDB4MDEsIDB4MDgsIDB4RkUsIDB4RTQsCi0JMHgwMiwgMHgyMSwgMHhGQywgMHgzMSwgMHgwNSwgMHhFQiwgMHg0OCwgMHgzNywgMHgwMiwgMHg2QiwgMHhGRCwKLQkweDM5LCAweDAyLCAweDYxLCAweEZFLCAweEZDLCAweDAwLCAweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDMsIDB4MDEsIDB4N0QsIDB4RkMsIDB4MjMsIDB4MDYsCi0JMHgzMiwgMHhGNSwgMHgwQywgMHgxOSwgMHgzOCwgMHg0MiwgMHhDNywgMHhGNSwgMHhCOCwgMHgwMywgMHhBRiwKLQkweEZFLCAweDRFLCAweDAwLCAweDBDLCAweDAwLCAweEVBLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLAotCTB4MkQsIDB4MDAsIDB4NTQsIDB4RkYsIDB4QjgsIDB4MDEsIDB4NUQsIDB4RkMsIDB4MUEsIDB4MDcsIDB4OEEsCi0JMHhGMSwgMHg3QiwgMHgyRSwgMHgwNCwgMHgzMiwgMHg3RiwgMHhGMSwgMHhFQywgMHgwNiwgMHg4QSwgMHhGQywKLQkweDk4LCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY4LAotCTB4RkYsIDB4RTcsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkMsIDB4RkUsIDB4OEMsIDB4MDQsIDB4NkQsIDB4RjQsCi0JMHhGMCwgMHgzRiwgMHhFMCwgMHgxQywgMHgzNCwgMHhGNCwgMHg4NSwgMHgwNiwgMHg1NywgMHhGQywgMHhFMCwKLQkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLCAweDlFLCAweEZGLAotCTB4RDEsIDB4MDAsIDB4QkIsIDB4RkUsIDB4OEQsIDB4MDEsIDB4QUUsIDB4RkUsIDB4NzQsIDB4RkYsIDB4OEQsCi0JMHg0OCwgMHg1RCwgMHgwOCwgMHhENCwgMHhGQSwgMHg4RCwgMHgwMywgMHhCMywgMHhGRCwgMHg0RSwgMHgwMSwKLQkweDZELCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRBLAotCTB4RkYsIDB4QTcsIDB4MDEsIDB4RUMsIDB4RkMsIDB4MjgsIDB4MDUsIDB4NzcsIDB4RjcsIDB4OTIsIDB4MTEsCi0JMHhENywgMHg0NSwgMHg0MywgMHhGOSwgMHhDMywgMHgwMSwgMHhENiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg1RSwKLQkweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAotCTB4REYsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUYsIDB4MDcsIDB4M0IsIDB4RjIsIDB4MTEsIDB4MjcsIDB4OTcsCi0JMHgzOCwgMHgxOSwgMHhGMiwgMHgzNiwgMHgwNiwgMHgxNSwgMHhGRCwgMHgzRiwgMHgwMSwgMHg5MywgMHhGRiwKLQkweDE3LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweEE2LCAweEZGLCAweDFCLAotCTB4MDEsIDB4NTAsIDB4RkQsIDB4RTEsIDB4MDUsIDB4ODIsIDB4RjIsIDB4OEYsIDB4M0EsIDB4OTIsIDB4MjQsCi0JMHg5RCwgMHhGMiwgMHgwOSwgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMwLCAweEZGLCAweDdBLCAweDAwLCAweDcwLCAweEZGLAotCTB4M0UsIDB4MDAsIDB4MEMsIDB4MDEsIDB4QTEsIDB4RkEsIDB4QkIsIDB4NDYsIDB4MzYsIDB4MEYsIDB4NDUsCi0JMHhGOCwgMHhDOSwgMHgwNCwgMHgxOCwgMHhGRCwgMHg5MywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDY2LCAweDAxLCAweDdELAotCTB4RkQsIDB4RjgsIDB4MDMsIDB4RkIsIDB4RjksIDB4ODksIDB4MEEsIDB4MUQsIDB4NDgsIDB4QzUsIDB4RkQsCi0JMHg3QSwgMHhGRiwgMHgxRCwgMHgwMSwgMHhGNywgMHhGRSwgMHhCNCwgMHgwMCwgMHhBOSwgMHhGRiwgMHgxNSwKLQkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ1LCAweEZDLAotCTB4QkIsIDB4MDYsIDB4QTAsIDB4RjMsIDB4NjQsIDB4MUYsIDB4NEEsIDB4M0UsIDB4QjAsIDB4RjMsIDB4MDgsCi0JMHgwNSwgMHhERSwgMHhGRCwgMHhDNywgMHgwMCwgMHhEMCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDdGLCAweDAxLCAweEIwLCAweEZDLCAweEJFLAotCTB4MDYsIDB4OTcsIDB4RjEsIDB4M0YsIDB4MzQsIDB4MTksIDB4MkMsIDB4QUQsIDB4RjEsIDB4MjgsIDB4MDcsCi0JMHg0OCwgMHhGQywgMHhDOSwgMHgwMSwgMHg0QiwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKLQkweDAwLCAweEUwLCAweEZGLCAweDI2LCAweDAwLCAweDFBLCAweDAwLCAweDBCLCAweEZGLCAweDFFLCAweDAzLAotCTB4Q0QsIDB4RjYsIDB4ODksIDB4NDMsIDB4OTEsIDB4MTYsIDB4RTcsIDB4RjUsIDB4RDgsIDB4MDUsIDB4OUQsCi0JMHhGQywgMHhDNywgMHgwMSwgMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDFGLCAweDAwLCAweDgyLCAweEZGLCAweDE4LCAweDAxLCAweDI3LCAweEZFLCAweEE5LCAweDAyLCAweDk0LAotCTB4RkMsIDB4MjQsIDB4MDQsIDB4RjUsIDB4NDgsIDB4MzksIDB4MDMsIDB4RjksIDB4RkMsIDB4NzQsIDB4MDIsCi0JMHg0MiwgMHhGRSwgMHgwQiwgMHgwMSwgMHg4NywgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwKLQkweDAwLCAweDNDLCAweEZGLCAweENELCAweDAxLCAweDhFLCAweEZDLCAweEZDLCAweDA1LCAweDkwLCAweEY1LAotCTB4QkIsIDB4MTcsIDB4RUUsIDB4NDIsIDB4NEUsIDB4RjYsIDB4NjgsIDB4MDMsIDB4REYsIDB4RkUsIDB4MzMsCi0JMHgwMCwgMHgxQSwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweDRGLCAweEZGLCAweEMyLCAweDAxLCAweDUxLCAweEZDLCAweDIzLCAweDA3LCAweDlBLCAweEYxLCAweDNBLAotCTB4MkQsIDB4MzUsIDB4MzMsIDB4ODksIDB4RjEsIDB4RDUsIDB4MDYsIDB4OUQsIDB4RkMsIDB4OEIsIDB4MDEsCi0JMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQywgMHhGRiwgMHhEQiwKLQkweEZGLCAweEIyLCAweDAwLCAweDAyLCAweEZFLCAweENGLCAweDA0LCAweDA1LCAweEY0LCAweDE2LCAweDNGLAotCTB4MzYsIDB4MUUsIDB4RTQsIDB4RjMsIDB4QTMsIDB4MDYsIDB4NEQsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMiwgMHgwMCwKLQkweERCLCAweEZFLCAweDUyLCAweDAxLCAweDFCLCAweEZGLCAweDhELCAweEZFLCAweDU3LCAweDQ4LCAweDgxLAotCTB4MDksIDB4NjEsIDB4RkEsIDB4QzYsIDB4MDMsIDB4OTYsIDB4RkQsIDB4NUIsIDB4MDEsIDB4NjgsIDB4RkYsCi0JMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5RCwKLQkweDAxLCAweDAzLCAweEZELCAweEY3LCAweDA0LCAweEUzLCAweEY3LCAweDUxLCAweDEwLCAweDU1LCAweDQ2LAotCTB4RjksIDB4RjksIDB4NjMsIDB4MDEsIDB4MEQsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NkQsIDB4MDAsIDB4QzUsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwKLQkweDMxLCAweEZDLCAweDE1LCAweDA3LCAweDZELCAweEYyLCAweEJGLCAweDI1LCAweEE1LCAweDM5LCAweDRELAotCTB4RjIsIDB4MEIsIDB4MDYsIDB4MzMsIDB4RkQsIDB4MkQsIDB4MDEsIDB4OUQsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHg5QywgMHhGRiwgMHgyRiwgMHgwMSwgMHgzMCwKLQkweEZELCAweDEwLCAweDA2LCAweDQ3LCAweEYyLCAweDg3LCAweDM5LCAweEU1LCAweDI1LCAweDY3LCAweEYyLAotCTB4MTYsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHhDNiwgMHhGRiwgMHg2QiwgMHgwMCwgMHg4RSwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweDZFLCAweDAxLCAweEU0LCAweEY5LCAweDQ4LCAweDQ2LCAweDc1LCAweDEwLCAweEQ3LCAweEY3LCAweEZDLAotCTB4MDQsIDB4MDAsIDB4RkQsIDB4OUUsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwgMHhGRiwgMHg1OSwgMHgwMSwgMHg5OSwgMHhGRCwgMHhDMCwKLQkweDAzLCAweDZFLCAweEZBLCAweDYxLCAweDA5LCAweDVELCAweDQ4LCAweEE2LCAweEZFLCAweDBGLCAweEZGLAotCTB4NTgsIDB4MDEsIDB4RDcsIDB4RkUsIDB4QzMsIDB4MDAsIDB4QTMsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0RSwgMHhGQywgMHhBMCwgMHgwNiwKLQkweEVELCAweEYzLCAweDBGLCAweDFFLCAweDJELCAweDNGLCAweDEwLCAweEY0LCAweEM4LCAweDA0LCAweDA3LAotCTB4RkUsIDB4QUYsIDB4MDAsIDB4REMsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyNSwgMHgwMCwgMHg2QiwgMHhGRiwgMHg4RCwgMHgwMSwgMHg5QiwgMHhGQywgMHhEOCwgMHgwNiwgMHg4NywKLQkweEYxLCAweDEzLCAweDMzLCAweDVFLCAweDJELCAweDk4LCAweEYxLCAweDIyLCAweDA3LCAweDUyLCAweEZDLAotCTB4QzEsIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsCi0JMHhGRiwgMHgxOCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRSwgMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwKLQkweERCLCAweDQyLCAweEUwLCAweDE3LCAweDg2LCAweEY1LCAweDAwLCAweDA2LCAweDhDLCAweEZDLCAweENFLAotCTB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODgsIDB4RkYsCi0JMHgwOSwgMHgwMSwgMHg0NSwgMHhGRSwgMHg2RSwgMHgwMiwgMHgwNiwgMHhGRCwgMHgxQywgMHgwMywgMHhGNCwKLQkweDQ4LCAweDQxLCAweDA0LCAweDg3LCAweEZDLCAweEIwLCAweDAyLCAweDIzLCAweEZFLCAweDE5LCAweDAxLAotCTB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsCi0JMHhGRiwgMHhDNiwgMHgwMSwgMHg5RiwgMHhGQywgMHhEMywgMHgwNSwgMHhGMSwgMHhGNSwgMHg2QywgMHgxNiwKLQkweDlFLCAweDQzLCAweERELCAweEY2LCAweDE1LCAweDAzLCAweDEwLCAweEZGLCAweDE3LCAweDAwLCAweDI4LAotCTB4MDAsIDB4REYsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCi0JMHhDQSwgMHgwMSwgMHg0NywgMHhGQywgMHgyOCwgMHgwNywgMHhCMCwgMHhGMSwgMHhGNSwgMHgyQiwgMHg2MCwKLQkweDM0LCAweDlBLCAweEYxLCAweEJCLCAweDA2LCAweEIzLCAweEZDLCAweDdELCAweDAxLCAweDczLCAweEZGLAotCTB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksCi0JMHgwMCwgMHhEQSwgMHhGRCwgMHgwRiwgMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwKLQkweDk3LCAweEYzLCAweEJELCAweDA2LCAweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4QjMsIDB4MDAsIDB4RkEsIDB4RkUsCi0JMHgxNywgMHgwMSwgMHg4NiwgMHhGRiwgMHhBQywgMHhGRCwgMHgxNiwgMHg0OCwgMHhBQSwgMHgwQSwgMHhFRSwKLQkweEY5LCAweEZFLCAweDAzLCAweDdBLCAweEZELCAweDY3LCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTIsIDB4MDEsIDB4MUIsCi0JMHhGRCwgMHhDNCwgMHgwNCwgMHg1MSwgMHhGOCwgMHgxMywgMHgwRiwgMHhDOCwgMHg0NiwgMHhCNiwgMHhGQSwKLQkweDAxLCAweDAxLCAweDQ0LCAweDAwLCAweDZDLCAweEZGLCAweDdCLCAweDAwLCAweEJGLCAweEZGLCAweDEwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzIsIDB4RkMsCi0JMHgwOCwgMHgwNywgMHhBNCwgMHhGMiwgMHg2RCwgMHgyNCwgMHhBRCwgMHgzQSwgMHg4OCwgMHhGMiwgMHhEQiwKLQkweDA1LCAweDUzLCAweEZELCAweDE5LCAweDAxLCAweEE3LCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsCi0JMHgwNiwgMHgxNCwgMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywKLQkweDMzLCAweEZDLCAweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBELAotCTB4MDAsIDB4Q0IsIDB4RkYsIDB4NUMsIDB4MDAsIDB4QUMsIDB4RkYsIDB4RDAsIDB4RkYsIDB4Q0QsIDB4MDEsCi0JMHgzMCwgMHhGOSwgMHhDOCwgMHg0NSwgMHhCNiwgMHgxMSwgMHg2QiwgMHhGNywgMHgyRCwgMHgwNSwgMHhFOSwKLQkweEZDLCAweEE4LCAweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MjUsIDB4MDAsIDB4NkQsIDB4RkYsIDB4NEMsIDB4MDEsIDB4QjYsIDB4RkQsIDB4ODYsIDB4MDMsIDB4RTEsCi0JMHhGQSwgMHgzRCwgMHgwOCwgMHg5MiwgMHg0OCwgMHg4RSwgMHhGRiwgMHhBMSwgMHhGRSwgMHg5MywgMHgwMSwKLQkweEI4LCAweEZFLCAweEQzLCAweDAwLCAweDlELCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzcsIDB4RkYsIDB4RTAsIDB4MDEsIDB4NTgsIDB4RkMsIDB4ODIsIDB4MDYsIDB4M0UsIDB4RjQsCi0JMHhCQSwgMHgxQywgMHgwNywgMHg0MCwgMHg3OSwgMHhGNCwgMHg4NCwgMHgwNCwgMHgzMSwgMHhGRSwgMHg5NiwKLQkweDAwLCAweEU4LCAweEZGLCAweEY3LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAotCTB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsIDB4RjEsIDB4RTMsCi0JMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywgMHhCNywgMHgwMSwKLQkweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVBLCAweEZGLCAweDBCLAotCTB4MDAsIDB4NTEsIDB4MDAsIDB4QUEsIDB4RkUsIDB4QzAsIDB4MDMsIDB4QjgsIDB4RjUsIDB4MjEsIDB4NDIsCi0JMHgzMSwgMHgxOSwgMHgyOCwgMHhGNSwgMHgyNywgMHgwNiwgMHg3QywgMHhGQywgMHhENCwgMHgwMSwgMHgzQSwKLQkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhELCAweEZGLCAweEZBLCAweDAwLAotCTB4NjQsIDB4RkUsIDB4MzIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MUIsIDB4MDIsIDB4RUEsIDB4NDgsIDB4NTAsCi0JMHgwNSwgMHgxNCwgMHhGQywgMHhFQiwgMHgwMiwgMHgwNSwgMHhGRSwgMHgyNywgMHgwMSwgMHg3QywgMHhGRiwKLQkweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEJGLAotCTB4MDEsIDB4QjIsIDB4RkMsIDB4QTksIDB4MDUsIDB4NTUsIDB4RjYsIDB4MjAsIDB4MTUsIDB4NDIsIDB4NDQsCi0JMHg3NSwgMHhGNywgMHhCRiwgMHgwMiwgMHg0MywgMHhGRiwgMHhGQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhEQSwKLQkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLCAweEQxLCAweDAxLAotCTB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsIDB4QUUsIDB4MkEsIDB4ODYsIDB4MzUsIDB4QjEsCi0JMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwgMHgwMSwgMHg3QiwgMHhGRiwgMHgyMCwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweEMzLCAweEZGLCAweEUwLCAweDAwLCAweEIzLAotCTB4RkQsIDB4NEIsIDB4MDUsIDB4NEQsIDB4RjMsIDB4NDUsIDB4M0QsIDB4RTAsIDB4MjAsIDB4NEYsIDB4RjMsCi0JMHhENSwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE0LCAweDAwLCAweDE5LCAweEZGLCAweERELCAweDAwLAotCTB4RjAsIDB4RkYsIDB4RDQsIDB4RkMsIDB4QzksIDB4NDcsIDB4RDgsIDB4MEIsIDB4N0MsIDB4RjksIDB4MzUsCi0JMHgwNCwgMHg1RiwgMHhGRCwgMHg3NCwgMHgwMSwgMHg1RSwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDJDLCAweDAwLCAweDU2LCAweEZGLCAweDg3LCAweDAxLCAweDM0LCAweEZELCAweDhGLAotCTB4MDQsIDB4QzAsIDB4RjgsIDB4RDksIDB4MEQsIDB4MzEsIDB4NDcsIDB4N0IsIDB4RkIsIDB4OUMsIDB4MDAsCi0JMHg3RCwgMHgwMCwgMHg0RCwgMHhGRiwgMHg4QSwgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEY3LCAweDA2LAotCTB4RTAsIDB4RjIsIDB4MTgsIDB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsIDB4RjIsIDB4QTgsIDB4MDUsIDB4NzYsCi0JMHhGRCwgMHgwNCwgMHgwMSwgMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFBLCAweDAwLCAweDg5LCAweEZGLCAweDUzLCAweDAxLCAweEY1LCAweEZDLCAweDYzLCAweDA2LCAweEU5LAotCTB4RjEsIDB4NjMsIDB4MzcsIDB4ODUsIDB4MjgsIDB4MDksIDB4RjIsIDB4MjcsIDB4MDcsIDB4MzUsIDB4RkMsCi0JMHhEQSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMSwKLQkweEZGLCAweDRFLCAweDAwLCAweENBLCAweEZGLCAweDlBLCAweEZGLCAweDJBLCAweDAyLCAweDgzLCAweEY4LAotCTB4M0YsIDB4NDUsIDB4RkIsIDB4MTIsIDB4MDEsIDB4RjcsIDB4NUQsIDB4MDUsIDB4RDMsIDB4RkMsIDB4QjEsCi0JMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKLQkweDczLCAweEZGLCAweDNGLCAweDAxLCAweEQzLCAweEZELCAweDRDLCAweDAzLCAweDU0LCAweEZCLCAweDFGLAotCTB4MDcsIDB4QkIsIDB4NDgsIDB4N0QsIDB4MDAsIDB4MzMsIDB4RkUsIDB4Q0YsIDB4MDEsIDB4OTgsIDB4RkUsCi0JMHhFMiwgMHgwMCwgMHg5NywgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKLQkweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLCAweDYyLCAweDA2LCAweDkzLCAweEY0LCAweDY2LCAweDFCLAotCTB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsIDB4MDQsIDB4NUQsIDB4RkUsIDB4N0QsIDB4MDAsIDB4RjUsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1RSwgMHhGRiwKLQkweEE2LCAweDAxLCAweDc2LCAweEZDLCAweDAxLCAweDA3LCAweDdELCAweEYxLCAweEFELCAweDMwLCAweERDLAotCTB4MkYsIDB4N0YsIDB4RjEsIDB4MEMsIDB4MDcsIDB4NkMsIDB4RkMsIDB4QUQsIDB4MDEsIDB4NUEsIDB4RkYsCi0JMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHg2QywKLQkweDAwLCAweDdCLCAweEZFLCAweDBDLCAweDA0LCAweDNBLCAweEY1LCAweDVGLCAweDQxLCAweDgzLCAweDFBLAotCTB4Q0QsIDB4RjQsIDB4NEIsIDB4MDYsIDB4NkQsIDB4RkMsIDB4RDksIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5MywgMHhGRiwgMHhFQywgMHgwMCwgMHg4MywgMHhGRSwKLQkweEY3LCAweDAxLCAweEU4LCAweEZELCAweDIxLCAweDAxLCAweEQyLCAweDQ4LCAweDY0LCAweDA2LCAweEExLAotCTB4RkIsIDB4MjYsIDB4MDMsIDB4RTcsIDB4RkQsIDB4MzUsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCNywgMHgwMSwgMHhDNSwKLQkweEZDLCAweDdDLCAweDA1LCAweEJDLCAweEY2LCAweEQ1LCAweDEzLCAweERDLCAweDQ0LCAweDE0LCAweEY4LAotCTB4NjcsIDB4MDIsIDB4NzcsIDB4RkYsIDB4REQsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RDUsIDB4RkYsIDB4MEIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MiwgMHhGRiwgMHhENywgMHgwMSwgMHgzOSwgMHhGQywKLQkweDI5LCAweDA3LCAweEVGLCAweEYxLCAweDYyLCAweDI5LCAweEE1LCAweDM2LCAweEQwLCAweEYxLCAweDdCLAotCTB4MDYsIDB4RTMsIDB4RkMsIDB4NUUsIDB4MDEsIDB4ODMsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCOCwgMHhGRiwgMHhGNiwgMHgwMCwgMHg4RCwgMHhGRCwgMHg4NCwKLQkweDA1LCAweEZELCAweEYyLCAweDUyLCAweDNDLCAweDM1LCAweDIyLCAweDBCLCAweEYzLCAweEVCLCAweDA2LAotCTB4MzcsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsCi0JMHgwMCwgMHhCNSwgMHhGRiwgMHg5NCwgMHgwMCwgMHgzOSwgMHhGRiwgMHhBMywgMHgwMCwgMHg1OCwgMHgwMCwKLQkweDAyLCAweEZDLCAweDczLCAweDQ3LCAweDBCLCAweDBELCAweDBCLCAweEY5LCAweDZDLCAweDA0LCAweDQ1LAotCTB4RkQsIDB4ODAsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHg1QiwgMHhGRiwgMHg3QywgMHgwMSwgMHg0RSwgMHhGRCwgMHg1QSwgMHgwNCwgMHgzMSwKLQkweEY5LCAweEE0LCAweDBDLCAweDkwLCAweDQ3LCAweDQ3LCAweEZDLCAweDM2LCAweDAwLCAweEI2LCAweDAwLAotCTB4MkUsIDB4RkYsIDB4OTksIDB4MDAsIDB4QjMsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzOSwgMHhGQywgMHhFNCwgMHgwNiwgMHgyMSwgMHhGMywKLQkweEM0LCAweDIxLCAweEE1LCAweDNDLCAweDE2LCAweEYzLCAweDcyLCAweDA1LCAweDlBLCAweEZELCAweEVGLAotCTB4MDAsIDB4QkMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHg4MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHhEQSwgMHhGQywgMHg4NywgMHgwNiwgMHhDNSwgMHhGMSwgMHg0NiwKLQkweDM2LCAweEQxLCAweDI5LCAweEUzLCAweEYxLCAweDJBLCAweDA3LCAweDNBLCAweEZDLCAweEQ1LCAweDAxLAotCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDYsIDB4RkYsIDB4M0YsCi0JMHgwMCwgMHhFNywgMHhGRiwgMHg2NSwgMHhGRiwgMHg4NSwgMHgwMiwgMHhERSwgMHhGNywgMHhBOSwgMHg0NCwKLQkweDQzLCAweDE0LCAweDk5LCAweEY2LCAweDhCLCAweDA1LCAweEJGLCAweEZDLCAweEJBLCAweDAxLCAweDQzLAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzgsIDB4RkYsCi0JMHgzMSwgMHgwMSwgMHhGMSwgMHhGRCwgMHgxMiwgMHgwMywgMHhDNywgMHhGQiwgMHgwNywgMHgwNiwgMHhEQiwKLQkweDQ4LCAweDczLCAweDAxLCAweEMzLCAweEZELCAweDBBLCAweDAyLCAweDc5LCAweEZFLCAweEYxLCAweDAwLAotCTB4OTEsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDcsCi0JMHgwMSwgMHg3MiwgMHhGQywgMHgzRiwgMHgwNiwgMHhFQiwgMHhGNCwgMHgxMiwgMHgxQSwgMHhBMSwgMHg0MSwKLQkweDYzLCAweEY1LCAweEYzLCAweDAzLCAweDhBLCAweEZFLCAweDYzLCAweDAwLCAweDAyLCAweDAwLCAweEVFLAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTgsIDB4RkYsIDB4QjEsIDB4MDEsCi0JMHg2NywgMHhGQywgMHgxMCwgMHgwNywgMHg4MSwgMHhGMSwgMHg3MywgMHgyRiwgMHgxNSwgMHgzMSwgMHg3QywKLQkweEYxLCAweEZCLCAweDA2LCAweDdDLCAweEZDLCAweEEyLCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4ODUsIDB4MDAsIDB4NEUsCi0JMHhGRSwgMHg1NiwgMHgwNCwgMHhDMywgMHhGNCwgMHg5NSwgMHg0MCwgMHhEOCwgMHgxQiwgMHg3NiwgMHhGNCwKLQkweDZELCAweDA2LCAweDYwLCAweEZDLCAweERELCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MTksIDB4MDAsIDB4OTksIDB4RkYsIDB4REQsIDB4MDAsIDB4QTMsIDB4RkUsIDB4QkIsIDB4MDEsCi0JMHg1OCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhBRiwgMHg0OCwgMHg3RSwgMHgwNywgMHgyRSwgMHhGQiwgMHg2MCwKLQkweDAzLCAweEM5LCAweEZELCAweDQzLCAweDAxLCAweDcxLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDgsIDB4RkYsIDB4QUUsIDB4MDEsIDB4REIsIDB4RkMsIDB4NEQsCi0JMHgwNSwgMHgyNCwgMHhGNywgMHg4RSwgMHgxMiwgMHg2RCwgMHg0NSwgMHhCQywgMHhGOCwgMHgwQywgMHgwMiwKLQkweEFDLCAweEZGLCAweEMwLCAweEZGLCAweDUyLCAweDAwLCAweENGLCAweEZGLCAweDBDLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REMsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjUsIDB4MDcsCi0JMHgxOCwgMHhGMiwgMHgxNSwgMHgyOCwgMHhCRiwgMHgzNywgMHhGNywgMHhGMSwgMHg1NiwgMHgwNiwgMHhGRSwKLQkweEZDLCAweDRELCAweDAxLCAweDhDLCAweEZGLCAweDE5LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MEQsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NkEsIDB4RkQsIDB4QkEsIDB4MDUsIDB4QjQsCi0JMHhGMiwgMHg1OCwgMHgzQiwgMHg4QSwgMHgyMywgMHhDQiwgMHhGMiwgMHhGRCwgMHgwNiwgMHgzNCwgMHhGQywKLQkweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJCLAotCTB4RkYsIDB4ODUsIDB4MDAsIDB4NTgsIDB4RkYsIDB4NkEsIDB4MDAsIDB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsCi0JMHgwRiwgMHg0NywgMHg0MiwgMHgwRSwgMHg5QiwgMHhGOCwgMHhBMSwgMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwKLQkweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLAotCTB4NUYsIDB4RkYsIDB4NzAsIDB4MDEsIDB4NjgsIDB4RkQsIDB4MjMsIDB4MDQsIDB4QTIsIDB4RjksIDB4NzMsCi0JMHgwQiwgMHhFNCwgMHg0NywgMHgxQiwgMHhGRCwgMHhDRCwgMHhGRiwgMHhGMCwgMHgwMCwgMHgwRiwgMHhGRiwKLQkweEE5LCAweDAwLCAweEFFLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAotCTB4RkYsIDB4RTYsIDB4MDEsIDB4M0YsIDB4RkMsIDB4Q0UsIDB4MDYsIDB4NjYsIDB4RjMsIDB4NkYsIDB4MjAsCi0JMHg5NiwgMHgzRCwgMHg2OSwgMHhGMywgMHgzOCwgMHgwNSwgMHhCRiwgMHhGRCwgMHhEOSwgMHgwMCwgMHhDNywKLQkweEZGLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDc4LCAweEZGLAotCTB4NzQsIDB4MDEsIDB4QzIsIDB4RkMsIDB4QTcsIDB4MDYsIDB4QTgsIDB4RjEsIDB4MjUsIDB4MzUsIDB4MUIsCi0JMHgyQiwgMHhDMiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MSwgMHhGQywgMHhDRSwgMHgwMSwgMHg0NywgMHhGRiwKLQkweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LAotCTB4MDAsIDB4MzIsIDB4RkYsIDB4REMsIDB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsCi0JMHgzNCwgMHhGNiwgMHhCNywgMHgwNSwgMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIzLCAweDAxLAotCTB4MEYsIDB4RkUsIDB4RDcsIDB4MDIsIDB4M0IsIDB4RkMsIDB4RjUsIDB4MDQsIDB4RUQsIDB4NDgsIDB4NzAsCi0JMHgwMiwgMHg1MiwgMHhGRCwgMHg0NiwgMHgwMiwgMHg1QSwgMHhGRSwgMHhGRiwgMHgwMCwgMHg4QiwgMHhGRiwKLQkweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEQyLCAweDAxLCAweDgxLAotCTB4RkMsIDB4MUEsIDB4MDYsIDB4NDcsIDB4RjUsIDB4QzEsIDB4MTgsIDB4NjAsIDB4NDIsIDB4RTQsIDB4RjUsCi0JMHhBNiwgMHgwMywgMHhCOSwgMHhGRSwgMHg0OCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNywKLQkweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUzLCAweEZGLCAweEJCLCAweDAxLCAweDVBLCAweEZDLAotCTB4MUMsIDB4MDcsIDB4OEQsIDB4RjEsIDB4MzQsIDB4MkUsIDB4NDgsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTcsCi0JMHgwNiwgMHg4RSwgMHhGQywgMHg5NiwgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDA0LCAweDAwLCAweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLAotCTB4MDQsIDB4NTUsIDB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsCi0JMHg1NSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywKLQkweDAwLCAweDlGLCAweEZGLCAweENFLCAweDAwLCAweEMyLCAweEZFLCAweDgwLCAweDAxLCAweEM2LCAweEZFLAotCTB4NDAsIDB4RkYsIDB4ODEsIDB4NDgsIDB4OUUsIDB4MDgsIDB4QkEsIDB4RkEsIDB4OUEsIDB4MDMsIDB4QUMsCi0JMHhGRCwgMHg1MSwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDJGLCAweDAwLCAweDRCLCAweEZGLCAweEE0LCAweDAxLCAweEYxLCAweEZDLCAweDFELCAweDA1LCAweDhGLAotCTB4RjcsIDB4NEEsIDB4MTEsIDB4RjIsIDB4NDUsIDB4NkIsIDB4RjksIDB4QUUsIDB4MDEsIDB4RTIsIDB4RkYsCi0JMHhBMiwgMHhGRiwgMHg2MSwgMHgwMCwgMHhDOSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDNELCAweEZGLCAweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFELCAweDA3LCAweDQ1LCAweEYyLAotCTB4QzYsIDB4MjYsIDB4RDMsIDB4MzgsIDB4MjQsIDB4RjIsIDB4MkQsIDB4MDYsIDB4MUIsIDB4RkQsIDB4M0IsCi0JMHgwMSwgMHg5NSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LCAweEYyLCAweDU0LAotCTB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsCi0JMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMSwgMHhGRiwgMHg3NiwKLQkweDAwLCAweDc2LCAweEZGLCAweDMyLCAweDAwLCAweDIyLCAweDAxLCAweDc2LCAweEZBLCAweEEzLCAweDQ2LAotCTB4N0QsIDB4MEYsIDB4MkMsIDB4RjgsIDB4RDUsIDB4MDQsIDB4MTMsIDB4RkQsIDB4OTYsIDB4MDEsIDB4NTEsCi0JMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NCwgMHhGRiwKLQkweDYzLCAweDAxLCAweDg0LCAweEZELCAweEVCLCAweDAzLCAweDE0LCAweEZBLCAweDQ3LCAweDBBLCAweDJDLAotCTB4NDgsIDB4RjYsIDB4RkQsIDB4NjMsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RjAsIDB4RkUsIDB4QjgsIDB4MDAsCi0JMHhBOCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKLQkweDAxLCAweDQ3LCAweEZDLCAweEI1LCAweDA2LCAweEIwLCAweEYzLCAweDE5LCAweDFGLCAweDdFLCAweDNFLAotCTB4QzQsIDB4RjMsIDB4RkEsIDB4MDQsIDB4RTcsIDB4RkQsIDB4QzEsIDB4MDAsIDB4RDMsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MSwgMHhGRiwgMHg4MiwgMHgwMSwKLQkweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLCAweEZELCAweDMzLCAweDYyLCAweDJDLCAweEE4LAotCTB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MzAsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwgMHgyMywgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweDMxLCAweDAzLCAweEFELCAweEY2LCAweDY1LCAweDQzLCAweERDLCAweDE2LCAweEQxLCAweEY1LAotCTB4RTEsIDB4MDUsIDB4OTksIDB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MywgMHhGRiwgMHgxNCwgMHgwMSwgMHgyRCwgMHhGRSwKLQkweDlDLCAweDAyLCAweEFELCAweEZDLCAweEU5LCAweDAzLCAweEY2LCAweDQ4LCAweDczLCAweDAzLCAweEUwLAotCTB4RkMsIDB4ODIsIDB4MDIsIDB4M0IsIDB4RkUsIDB4MEUsIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQywgMHgwMSwgMHg5MSwgMHhGQywgMHhGMywKLQkweDA1LCAweEE2LCAweEY1LCAweDcwLCAweDE3LCAweDE3LCAweDQzLCAweDZELCAweEY2LCAweDU2LCAweDAzLAotCTB4RUEsIDB4RkUsIDB4MkQsIDB4MDAsIDB4MUQsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyRiwgMHgwMCwgMHg0RSwgMHhGRiwgMHhDMywgMHgwMSwgMHg0RSwgMHhGQywgMHgyNCwgMHgwNywKLQkweDlFLCAweEYxLCAweEYyLCAweDJDLCAweDc4LCAweDMzLCAweDhDLCAweEYxLCAweEQwLCAweDA2LCAweEEyLAotCTB4RkMsIDB4ODgsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHhEOCwgMHhGRiwgMHhCNywgMHgwMCwgMHhGOSwgMHhGRCwgMHhERSwgMHgwNCwgMHhFRiwKLQkweEYzLCAweEU0LCAweDNFLCAweDgxLCAweDFFLCAweEQyLCAweEYzLCAweEE5LCAweDA2LCAweDRCLCAweEZDLAotCTB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTUsCi0JMHhGRiwgMHhCRSwgMHgwMCwgMHhFMiwgMHhGRSwgMHg0NSwgMHgwMSwgMHgzMywgMHhGRiwgMHg1QSwgMHhGRSwKLQkweDQ4LCAweDQ4LCAweEMzLCAweDA5LCAweDQ3LCAweEZBLCAweEQyLCAweDAzLCAweDkwLCAweEZELCAweDVFLAotCTB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHg0RiwgMHhGRiwgMHg5QSwgMHgwMSwgMHgwOCwgMHhGRCwgMHhFQiwgMHgwNCwgMHhGQywgMHhGNywgMHgwQSwKLQkweDEwLCAweDcwLCAweDQ2LCAweDIyLCAweEZBLCAweDRELCAweDAxLCAweDE5LCAweDAwLCAweDg0LCAweEZGLAotCTB4NzAsIDB4MDAsIDB4QzQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsCi0JMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwKLQkweERGLCAweDM5LCAweDVBLCAweEYyLCAweDAwLCAweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLAotCTB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4OTksIDB4RkYsCi0JMHgzMywgMHgwMSwgMHgyOSwgMHhGRCwgMHgxQSwgMHgwNiwgMHgzQiwgMHhGMiwgMHg0QiwgMHgzOSwgMHgzMCwKLQkweDI2LCAweDVCLCAweEYyLCAweDE5LCAweDA3LCAweDMxLCAweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjgsIDB4MDAsIDB4OTUsCi0JMHhGRiwgMHhGQSwgMHhGRiwgMHg4MywgMHgwMSwgMHhCQiwgMHhGOSwgMHgyQiwgMHg0NiwgMHhCQiwgMHgxMCwKLQkweEJGLCAweEY3LCAweDA3LCAweDA1LCAweEZCLCAweEZDLCAweEEwLCAweDAxLCAweDRELCAweEZGLCAweDJGLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4NTYsIDB4MDEsCi0JMHhBMCwgMHhGRCwgMHhCMywgMHgwMywgMHg4NywgMHhGQSwgMHgxRiwgMHgwOSwgMHg2QSwgMHg0OCwgMHhEOSwKLQkweEZFLCAweEY2LCAweEZFLCAweDY1LCAweDAxLCAweEQwLCAweEZFLCAweEM3LCAweDAwLCAweEEyLCAweEZGLAotCTB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTAsCi0JMHhGQywgMHg5OSwgMHgwNiwgMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwgMHgzRiwgMHgyNywgMHhGNCwKLQkweEI5LCAweDA0LCAweDEwLCAweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLCAweEZCLCAweEZGLCAweDAzLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4OTAsIDB4MDEsIDB4OTYsIDB4RkMsCi0JMHhERCwgMHgwNiwgMHg4NSwgMHhGMSwgMHhEMCwgMHgzMiwgMHhBNiwgMHgyRCwgMHg5NCwgMHhGMSwgMHgyMCwKLQkweDA3LCAweDU0LCAweEZDLCAweEJGLCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAotCTB4MDcsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4M0MsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4ODMsCi0JMHgwMywgMHgyMCwgMHhGNiwgMHhCMiwgMHg0MiwgMHgyQiwgMHgxOCwgMHg3MSwgMHhGNSwgMHgwOSwgMHgwNiwKLQkweDg4LCAweEZDLCAweENGLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELAotCTB4MDAsIDB4ODksIDB4RkYsIDB4MDYsIDB4MDEsIDB4NEMsIDB4RkUsIDB4NjAsIDB4MDIsIDB4MUYsIDB4RkQsCi0JMHhFMiwgMHgwMiwgMHhGMywgMHg0OCwgMHg3RCwgMHgwNCwgMHg2RSwgMHhGQywgMHhCRCwgMHgwMiwgMHgxQywKLQkweEZFLCAweDFDLCAweDAxLCAweDgwLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsIDB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsCi0JMHhGNiwgMHgyMiwgMHgxNiwgMHhDMywgMHg0MywgMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwKLQkweDExLCAweDAwLCAweDJCLCAweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLAotCTB4MDAsIDB4NDksIDB4RkYsIDB4Q0IsIDB4MDEsIDB4NDUsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjYsIDB4RjEsCi0JMHhBRCwgMHgyQiwgMHhBMiwgMHgzNCwgMHg5RSwgMHhGMSwgMHhCNCwgMHgwNiwgMHhCOCwgMHhGQywgMHg3QSwKLQkweDAxLCAweDc1LCAweEZGLCAweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAotCTB4Q0MsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4RDEsIDB4RkQsIDB4MUQsIDB4MDUsIDB4OTEsIDB4RjMsIDB4RkUsCi0JMHgzRCwgMHhENywgMHgxRiwgMHg4NywgMHhGMywgMHhDMywgMHgwNiwgMHg0MiwgMHhGQywgMHhFNSwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFCLCAweEZGLCAweEFGLAotCTB4MDAsIDB4MDEsIDB4RkYsIDB4MEEsIDB4MDEsIDB4OUUsIDB4RkYsIDB4N0MsIDB4RkQsIDB4MDMsIDB4NDgsCi0JMHhFRCwgMHgwQSwgMHhENSwgMHhGOSwgMHgwQSwgMHgwNCwgMHg3NCwgMHhGRCwgMHg2QSwgMHgwMSwgMHg2MiwKLQkweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLAotCTB4OTAsIDB4MDEsIDB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsIDB4RTEsCi0JMHg0NiwgMHhFMSwgMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwgMHgwMCwKLQkweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LAotCTB4MDEsIDB4MzMsIDB4RkMsIDB4MDQsIDB4MDcsIDB4QjEsIDB4RjIsIDB4MjEsIDB4MjQsIDB4RTYsIDB4M0EsCi0JMHg5NywgMHhGMiwgMHhEMCwgMHgwNSwgMHg1QiwgMHhGRCwgMHgxNSwgMHgwMSwgMHhBOSwgMHhGRiwgMHgwRiwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDkwLCAweEZGLCAweDQ1LCAweDAxLAotCTB4MEIsIDB4RkQsIDB4NDQsIDB4MDYsIDB4MEEsIDB4RjIsIDB4M0IsIDB4MzgsIDB4ODAsIDB4MjcsIDB4MkIsCi0JMHhGMiwgMHgyMiwgMHgwNywgMHgzMywgMHhGQywgMHhERSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZELCAweEZGLCAweDBELCAweDAwLCAweENELCAweEZGLCAweDU5LCAweDAwLCAweEIzLCAweEZGLCAweEM0LAotCTB4RkYsIDB4RTIsIDB4MDEsIDB4MDksIDB4RjksIDB4QUEsIDB4NDUsIDB4RkUsIDB4MTEsIDB4NTQsIDB4RjcsCi0JMHgzOCwgMHgwNSwgMHhFNCwgMHhGQywgMHhBQSwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LCAweDAxLCAweEJDLCAweEZELAotCTB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsIDB4QzMsIDB4RkYsIDB4ODksCi0JMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywgMHhGRiwgMHgxOCwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLCAweDVCLCAweEZDLCAweDdCLAotCTB4MDYsIDB4NTAsIDB4RjQsIDB4NkUsIDB4MUMsIDB4MzYsIDB4NDAsIDB4OTIsIDB4RjQsIDB4NzUsIDB4MDQsCi0JMHgzQiwgMHhGRSwgMHg5MSwgMHgwMCwgMHhFQiwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlELCAweDAxLCAweDg0LCAweEZDLCAweEYzLCAweDA2LAotCTB4N0QsIDB4RjEsIDB4OUUsIDB4MzEsIDB4RTYsIDB4MkUsIDB4ODUsIDB4RjEsIDB4MTYsIDB4MDcsIDB4NjEsCi0JMHhGQywgMHhCNSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweEVDLCAweEZGLCAweDA4LCAweDAwLCAweDU3LCAweDAwLCAweDlGLCAweEZFLCAweEQxLCAweDAzLCAweDlCLAotCTB4RjUsIDB4RjcsIDB4NDEsIDB4N0MsIDB4MTksIDB4MTMsIDB4RjUsIDB4MkYsIDB4MDYsIDB4NzgsIDB4RkMsCi0JMHhENSwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RiwKLQkweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LCAweDAyLCAweDkxLCAweEZELCAweEUzLCAweDAxLAotCTB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsIDB4RjgsIDB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsCi0JMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweDQyLCAweEZGLCAweEJELCAweDAxLCAweEI2LCAweEZDLCAweDlGLCAweDA1LCAweDZDLCAweEY2LCAweEQ2LAotCTB4MTQsIDB4NjUsIDB4NDQsIDB4OTgsIDB4RjcsIDB4QUMsIDB4MDIsIDB4NEUsIDB4RkYsIDB4RjQsIDB4RkYsCi0JMHgzOSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NSwKLQkweEZGLCAweEQyLCAweDAxLCAweDNELCAweEZDLCAweDJCLCAweDA3LCAweEQ0LCAweEYxLCAweDY0LCAweDJBLAotCTB4QzYsIDB4MzUsIDB4QjcsIDB4RjEsIDB4OTYsIDB4MDYsIDB4Q0YsIDB4RkMsIDB4NkIsIDB4MDEsIDB4N0QsCi0JMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDMSwgMHhGRiwKLQkweEU1LCAweDAwLCAweEFBLCAweEZELCAweDU4LCAweDA1LCAweDNBLCAweEYzLCAweDExLCAweDNELCAweDJDLAotCTB4MjEsIDB4M0YsIDB4RjMsIDB4REEsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwKLQkweEZGLCAweEQwLCAweDAwLCAweDA3LCAweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLAotCTB4NjMsIDB4RjksIDB4NDIsIDB4MDQsIDB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1NywgMHhGRiwgMHg4NSwgMHgwMSwKLQkweDM5LCAweEZELCAweDg0LCAweDA0LCAweEQ5LCAweEY4LCAweDk1LCAweDBELCAweDQ4LCAweDQ3LCAweEE3LAotCTB4RkIsIDB4ODYsIDB4MDAsIDB4OEEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4OEUsIDB4MDAsIDB4QjgsIDB4RkYsCi0JMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwKLQkweEZDLCAweEYzLCAweDA2LCAweEVFLCAweEYyLCAweENELCAweDIyLCAweEU0LCAweDNCLCAweERDLCAweEYyLAotCTB4OUMsIDB4MDUsIDB4N0UsIDB4RkQsIDB4MDAsIDB4MDEsIDB4QjQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4NywgMHhGRiwgMHg1NywgMHgwMSwgMHhFRiwgMHhGQywKLQkweDZCLCAweDA2LCAweEUwLCAweEYxLCAweDIzLCAweDM3LCAweENFLCAweDI4LCAweDAxLCAweEYyLCAweDI4LAotCTB4MDcsIDB4MzYsIDB4RkMsIDB4RDksIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwKLQkweDAyLCAweDVFLCAweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LAotCTB4Q0YsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyMywgMHgwMCwgMHg3NCwgMHhGRiwgMHgzQywgMHgwMSwgMHhEQSwgMHhGRCwgMHg0MCwgMHgwMywKLQkweDZFLCAweEZCLCAweEUxLCAweDA2LCAweEMzLCAweDQ4LCAweEIzLCAweDAwLCAweDFBLCAweEZFLCAweERDLAotCTB4MDEsIDB4OTEsIDB4RkUsIDB4RTUsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQiwgMHgwMSwgMHg2NywgMHhGQywgMHg1QSwgMHgwNiwgMHhBNiwKLQkweEY0LCAweDFCLCAweDFCLCAweDA3LCAweDQxLCAweDA0LCAweEY1LCAweDJELCAweDA0LCAweDY3LCAweEZFLAotCTB4NzcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsCi0JMHgwMCwgMHg1QywgMHhGRiwgMHhBOCwgMHgwMSwgMHg3MywgMHhGQywgMHgwNSwgMHgwNywgMHg3RCwgMHhGMSwKLQkweDY3LCAweDMwLCAweDIxLCAweDMwLCAweDdFLCAweEYxLCAweDA4LCAweDA3LCAweDZGLCAweEZDLCAweEFCLAotCTB4MDEsIDB4NUIsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjAsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwgMHhGNSwgMHgzMiwKLQkweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLCAweERBLCAweDAxLAotCTB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RTgsCi0JMHgwMCwgMHg4QSwgMHhGRSwgMHhFOSwgMHgwMSwgMHgwMSwgMHhGRSwgMHhFQSwgMHgwMCwgMHhDQiwgMHg0OCwKLQkweEEyLCAweDA2LCAweDg3LCAweEZCLCAweDMzLCAweDAzLCAweEUwLCAweEZELCAweDM5LCAweDAxLCAweDc1LAotCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsIDB4RkYsCi0JMHhCNSwgMHgwMSwgMHhDQSwgMHhGQywgMHg3MiwgMHgwNSwgMHhEMywgMHhGNiwgMHg4RCwgMHgxMywgMHhGRCwKLQkweDQ0LCAweDM5LCAweEY4LCAweDUzLCAweDAyLCAweDgyLCAweEZGLCAweEQ3LCAweEZGLCAweDQ3LCAweDAwLAotCTB4RDMsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDgsCi0JMHgwMSwgMHgzNywgMHhGQywgMHgyOSwgMHgwNywgMHhGOCwgMHhGMSwgMHgxOSwgMHgyOSwgMHhFNSwgMHgzNiwKLQkweEQ4LCAweEYxLCAweDczLCAweDA2LCAweEU5LCAweEZDLCAweDVCLCAweDAxLCAweDg1LCAweEZGLCAweDFDLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4QjYsIDB4RkYsIDB4RkIsIDB4MDAsCi0JMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwgMHgxQywgMHgzQywgMHg4MSwgMHgyMiwgMHhGQywKLQkweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjcsIDB4RkYsIDB4OTEsIDB4MDAsIDB4NDAsIDB4RkYsIDB4OTYsCi0JMHgwMCwgMHg2RiwgMHgwMCwgMHhENSwgMHhGQiwgMHg1RSwgMHg0NywgMHg1MCwgMHgwRCwgMHhGMiwgMHhGOCwKLQkweDc4LCAweDA0LCAweDNGLCAweEZELCAweDgyLCAweDAxLCAweDU4LCAweEZGLCAweDJCLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4NzksIDB4MDEsIDB4NTMsIDB4RkQsCi0JMHg0RSwgMHgwNCwgMHg0QSwgMHhGOSwgMHg2MCwgMHgwQywgMHhBMywgMHg0NywgMHg3NiwgMHhGQywgMHgxRiwKLQkweDAwLCAweEMzLCAweDAwLCAweDI3LCAweEZGLCAweDlELCAweDAwLCAweEIyLCAweEZGLCAweDEzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4REYsCi0JMHgwNiwgMHgzMCwgMHhGMywgMHg3OCwgMHgyMSwgMHhEQiwgMHgzQywgMHgyOCwgMHhGMywgMHg2NSwgMHgwNSwKLQkweEEyLCAweEZELCAweEVBLCAweDAwLCAweEJFLCAweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4N0YsIDB4RkYsIDB4NjcsIDB4MDEsIDB4RDUsIDB4RkMsIDB4OEUsIDB4MDYsCi0JMHhCRSwgMHhGMSwgMHgwNiwgMHgzNiwgMHgxQSwgMHgyQSwgMHhEQywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQywKLQkweEZDLCAweEQzLCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLAotCTB4RDgsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RUUsIDB4RkYsIDB4NUEsIDB4RkYsIDB4OTgsIDB4MDIsIDB4QkIsCi0JMHhGNywgMHg4NywgMHg0NCwgMHg4QywgMHgxNCwgMHg4MywgMHhGNiwgMHg5NSwgMHgwNSwgMHhCQSwgMHhGQywKLQkweEJCLCAweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLAotCTB4MDAsIDB4NzksIDB4RkYsIDB4MkUsIDB4MDEsIDB4RjcsIDB4RkQsIDB4MDUsIDB4MDMsIDB4RTEsIDB4RkIsCi0JMHhDQSwgMHgwNSwgMHhERiwgMHg0OCwgMHhBQiwgMHgwMSwgMHhBQSwgMHhGRCwgMHgxOCwgMHgwMiwgMHg3MiwKLQkweEZFLCAweEY0LCAweDAwLCAweDkwLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAotCTB4MzksIDB4RkYsIDB4RDYsIDB4MDEsIDB4NzUsIDB4RkMsIDB4MzcsIDB4MDYsIDB4RkYsIDB4RjQsIDB4QzcsCi0JMHgxOSwgMHhDQywgMHg0MSwgMHg3RiwgMHhGNSwgMHhFMiwgMHgwMywgMHg5NSwgMHhGRSwgMHg1RCwgMHgwMCwKLQkweDA1LCAweDAwLCAweEVELCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LAotCTB4RkYsIDB4QjMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4MTMsIDB4MDcsIDB4ODMsIDB4RjEsIDB4MkMsIDB4MkYsCi0JMHg1QSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGNywgMHgwNiwgMHg4MCwgMHhGQywgMHg5RiwgMHgwMSwgMHg2MSwKLQkweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY1LCAweEZGLCAweEVFLCAweEZGLAotCTB4OEIsIDB4MDAsIDB4NDQsIDB4RkUsIDB4NjUsIDB4MDQsIDB4QUEsIDB4RjQsIDB4NjYsIDB4NDAsIDB4MjMsCi0JMHgxQywgMHg2MywgMHhGNCwgMHg3NCwgMHgwNiwgMHg1RCwgMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDlBLCAweEZGLCAweEQ5LCAweDAwLCAweEFBLAotCTB4RkUsIDB4QUUsIDB4MDEsIDB4NzAsIDB4RkUsIDB4RjgsIDB4RkYsIDB4QTYsIDB4NDgsIDB4QkUsIDB4MDcsCi0JMHgxNCwgMHhGQiwgMHg2RCwgMHgwMywgMHhDMywgMHhGRCwgMHg0NiwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyNCwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFDLCAweDAxLAotCTB4REYsIDB4RkMsIDB4NDMsIDB4MDUsIDB4M0MsIDB4RjcsIDB4NDYsIDB4MTIsIDB4OEQsIDB4NDUsIDB4RTIsCi0JMHhGOCwgMHhGNywgMHgwMSwgMHhCOCwgMHhGRiwgMHhCOSwgMHhGRiwgMHg1NiwgMHgwMCwgMHhDRSwgMHhGRiwKLQkweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERELCAweDAxLCAweDM0LAotCTB4RkMsIDB4MjMsIDB4MDcsIDB4MjEsIDB4RjIsIDB4Q0IsIDB4MjcsIDB4RkUsIDB4MzcsIDB4MDAsIDB4RjIsCi0JMHg0RCwgMHgwNiwgMHgwNCwgMHhGRCwgMHg0OSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFCLCAweEZGLCAweDEwLCAweDAxLCAweDYyLCAweEZELAotCTB4QzUsIDB4MDUsIDB4QTUsIDB4RjIsIDB4MUYsIDB4M0IsIDB4RDYsIDB4MjMsIDB4QkUsIDB4RjIsIDB4MDEsCi0JMHgwNywgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDEwLCAweDAwLCAweEJELCAweEZGLCAweDgyLCAweDAwLCAweDVFLCAweEZGLCAweDVELCAweDAwLCAweEQ0LAotCTB4MDAsIDB4MEMsIDB4RkIsIDB4RjksIDB4NDYsIDB4ODcsIDB4MEUsIDB4ODIsIDB4RjgsIDB4QUQsIDB4MDQsCi0JMHgyNiwgMHhGRCwgMHg4RCwgMHgwMSwgMHg1NCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZELCAweDAxLCAweDZFLCAweEZELCAweDE3LCAweDA0LAotCTB4QkMsIDB4RjksIDB4MzAsIDB4MEIsIDB4RjQsIDB4NDcsIDB4NEIsIDB4RkQsIDB4QjUsIDB4RkYsIDB4RkQsCi0JMHgwMCwgMHgwOCwgMHhGRiwgMHhBQywgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDQxLCAweEZDLCAweEM4LCAweDA2LCAweDc2LAotCTB4RjMsIDB4MjIsIDB4MjAsIDB4Q0EsIDB4M0QsIDB4N0QsIDB4RjMsIDB4MkEsIDB4MDUsIDB4QzgsIDB4RkQsCi0JMHhENCwgMHgwMCwgMHhDQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwKLQkweDAwLCAweDc3LCAweEZGLCAweDc3LCAweDAxLCAweEJELCAweEZDLCAweEFFLCAweDA2LCAweEEzLCAweEYxLAotCTB4RTMsIDB4MzQsIDB4NjQsIDB4MkIsIDB4QkMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDMsIDB4RkMsIDB4Q0QsCi0JMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERCwgMHhGRiwKLQkweDJFLCAweDAwLCAweDBBLCAweDAwLCAweDI3LCAweEZGLCAweEVGLCAweDAyLCAweDIwLCAweEY3LCAweEU3LAotCTB4NDMsIDB4RDgsIDB4MTUsIDB4MUUsIDB4RjYsIDB4QzAsIDB4MDUsIDB4QTcsIDB4RkMsIDB4QzMsIDB4MDEsCi0JMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwKLQkweEZGLCAweDIwLCAweDAxLCAweDE2LCAweEZFLCAweENBLCAweDAyLCAweDU0LCAweEZDLCAweEI5LCAweDA0LAotCTB4RjIsIDB4NDgsIDB4QTksIDB4MDIsIDB4MzksIDB4RkQsIDB4NTMsIDB4MDIsIDB4NTMsIDB4RkUsIDB4MDMsCi0JMHgwMSwgMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwKLQkweEQxLCAweDAxLCAweDg0LCAweEZDLCAweDEyLCAweDA2LCAweDVDLCAweEY1LCAweDc2LCAweDE4LCAweDg5LAotCTB4NDIsIDB4MDIsIDB4RjYsIDB4OTQsIDB4MDMsIDB4QzQsIDB4RkUsIDB4NDIsIDB4MDAsIDB4MTIsIDB4MDAsCi0JMHhFOCwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRCwKLQkweDAxLCAweDU3LCAweEZDLCAweDFFLCAweDA3LCAweDkwLCAweEYxLCAweEVELCAweDJELCAweDhDLCAweDMyLAotCTB4ODMsIDB4RjEsIDB4RTIsIDB4MDYsIDB4OTIsIDB4RkMsIDB4OTMsIDB4MDEsIDB4NjgsIDB4RkYsIDB4MjYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhFMiwgMHhGRiwgMHhBNCwgMHgwMCwKLQkweDE5LCAweEZFLCAweEFBLCAweDA0LCAweDNFLCAweEY0LCAweDkwLCAweDNGLCAweDc4LCAweDFELCAweDEwLAotCTB4RjQsIDB4OTMsIDB4MDYsIDB4NTIsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwgMHhDQSwgMHgwMCwgMHhDOSwgMHhGRSwgMHg3MywKLQkweDAxLCAweERFLCAweEZFLCAweDBDLCAweEZGLCAweDc2LCAweDQ4LCAweERFLCAweDA4LCAweEExLCAweEZBLAotCTB4QTYsIDB4MDMsIDB4QTYsIDB4RkQsIDB4NTMsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMiwgMHgwMSwgMHhGNiwgMHhGQywKLQkweDEyLCAweDA1LCAweEE3LCAweEY3LCAweDAzLCAweDExLCAweDEwLCAweDQ2LCAweDkzLCAweEY5LCAweDk4LAotCTB4MDEsIDB4RUUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzgsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMiwgMHhGQywgMHgxQiwKLQkweDA3LCAweDUwLCAweEYyLCAweDdCLCAweDI2LCAweDExLCAweDM5LCAweDJGLCAweEYyLCAweDIzLCAweDA2LAotCTB4MjIsIDB4RkQsIDB4MzcsIDB4MDEsIDB4OTcsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgxMiwgMHgwMCwgMHhBMSwgMHhGRiwgMHgyNCwgMHgwMSwgMHg0MSwgMHhGRCwgMHhGNiwgMHgwNSwKLQkweDY3LCAweEYyLCAweDFBLCAweDNBLCAweDI5LCAweDI1LCAweDg0LCAweEYyLCAweDBGLCAweDA3LCAweDMxLAotCTB4RkMsIDB4RTMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsCi0JMHhDMiwgMHhGRiwgMHg3MywgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgzOCwgMHgwMSwgMHg0QywKLQkweEZBLCAweDg5LCAweDQ2LCAweEMzLCAweDBGLCAweDE0LCAweEY4LCAweEUwLCAweDA0LCAweDBELCAweEZELAotCTB4OTgsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsCi0JMHgwMCwgMHg2NSwgMHhGRiwgMHg2MCwgMHgwMSwgMHg4QSwgMHhGRCwgMHhERiwgMHgwMywgMHgyRSwgMHhGQSwKLQkweDA0LCAweDBBLCAweDNBLCAweDQ4LCAweDI4LCAweEZFLCAweDRCLCAweEZGLCAweDM4LCAweDAxLCAweEU5LAotCTB4RkUsIDB4QkIsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0OSwgMHhGQywgMHhBRiwgMHgwNiwgMHhDMSwgMHhGMywgMHhDRCwKLQkweDFFLCAweEIxLCAweDNFLCAweEQ5LCAweEYzLCAweEVDLCAweDA0LCAweEYwLCAweEZELCAweEJDLCAweDAwLAotCTB4RDUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkYsCi0JMHhGRiwgMHg4NSwgMHgwMSwgMHhBNiwgMHhGQywgMHhDQSwgMHgwNiwgMHg4RiwgMHhGMSwgMHhCQiwgMHgzMywKLQkweEFCLCAweDJDLCAweEEzLCAweEYxLCAweDI2LCAweDA3LCAweDRDLCAweEZDLCAweEM1LCAweDAxLCAweDRELAotCTB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MjAsIDB4MDAsCi0JMHgyNiwgMHgwMCwgMHhGNSwgMHhGRSwgMHg0MywgMHgwMywgMHg4RCwgMHhGNiwgMHgzQywgMHg0MywgMHgyNSwKLQkweDE3LCAweEJCLCAweEY1LCAweEVBLCAweDA1LCAweDk1LCAweEZDLCAweENBLCAweDAxLCAweDNELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsCi0JMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwKLQkweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHgzRCwgMHhGQywgMHhENiwgMHgwNiwgMHg0QywgMHhGMywgMHhFRCwgMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwKLQkweEYzLCAweDRFLCAweDA1LCAweEIxLCAweEZELCAweEUxLCAweDAwLCAweEMzLCAweEZGLCAweDA1LCAweDAwLAotCTB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsCi0JMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywgMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywKLQkweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsCi0JMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywKLQkweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QzUsIDB4MDEsIDB4NEMsIDB4RkMsIDB4MjYsCi0JMHgwNywgMHhBMywgMHhGMSwgMHhBQiwgMHgyQywgMHhCQiwgMHgzMywgMHg4RiwgMHhGMSwgMHhDQSwgMHgwNiwKLQkweEE2LCAweEZDLCAweDg1LCAweDAxLCAweDZGLCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDE2LAotCTB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsIDB4RTksIDB4RkUsIDB4MzgsIDB4MDEsIDB4NEIsIDB4RkYsCi0JMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwgMHgwQSwgMHgyRSwgMHhGQSwgMHhERiwgMHgwMywgMHg4QSwKLQkweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MEYsIDB4MDcsIDB4ODQsCi0JMHhGMiwgMHgyOSwgMHgyNSwgMHgxQSwgMHgzQSwgMHg2NywgMHhGMiwgMHhGNiwgMHgwNSwgMHg0MSwgMHhGRCwKLQkweDI0LCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM4LAotCTB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsIDB4RjksCi0JMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwgMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywgMHhBMiwKLQkweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTIsIDB4RkMsIDB4OTMsIDB4MDYsIDB4MTAsIDB4RjQsIDB4NzgsCi0JMHgxRCwgMHg5MCwgMHgzRiwgMHgzRSwgMHhGNCwgMHhBQSwgMHgwNCwgMHgxOSwgMHhGRSwgMHhBNCwgMHgwMCwKLQkweEUyLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLAotCTB4MDAsIDB4NDIsIDB4MDAsIDB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsCi0JMHg3NiwgMHgxOCwgMHg1QywgMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwKLQkweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLAotCTB4QzMsIDB4MDEsIDB4QTcsIDB4RkMsIDB4QzAsIDB4MDUsIDB4MUUsIDB4RjYsIDB4RDgsIDB4MTUsIDB4RTcsCi0JMHg0MywgMHgyMCwgMHhGNywgMHhFRiwgMHgwMiwgMHgyNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgyRSwgMHgwMCwKLQkweERELCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LAotCTB4MDAsIDB4QzgsIDB4RkQsIDB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsCi0JMHg3NiwgMHhGMywgMHhDOCwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLCAweDhELCAweDAxLAotCTB4MjYsIDB4RkQsIDB4QUQsIDB4MDQsIDB4ODIsIDB4RjgsIDB4ODcsIDB4MEUsIDB4RjksIDB4NDYsIDB4MEMsCi0JMHhGQiwgMHhENCwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1RSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhCRCwgMHhGRiwKLQkweDEwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LAotCTB4RkQsIDB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsIDB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsCi0JMHgyMywgMHgwNywgMHgzNCwgMHhGQywgMHhERCwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLCAweEZGLCAweDQ2LCAweDAxLCAweEMzLCAweEZELAotCTB4NkQsIDB4MDMsIDB4MTQsIDB4RkIsIDB4QkUsIDB4MDcsIDB4QTYsIDB4NDgsIDB4RjgsIDB4RkYsIDB4NzAsCi0JMHhGRSwgMHhBRSwgMHgwMSwgMHhBQSwgMHhGRSwgMHhEOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwKLQkweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLCAweDAxLCAweDgwLCAweEZDLCAweEY3LAotCTB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsIDB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsCi0JMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQiwKLQkweDAwLCAweDkwLCAweEZGLCAweEY0LCAweDAwLCAweDcyLCAweEZFLCAweDE4LCAweDAyLCAweEFBLCAweEZELAotCTB4QUIsIDB4MDEsIDB4REYsIDB4NDgsIDB4Q0EsIDB4MDUsIDB4RTEsIDB4RkIsIDB4MDUsIDB4MDMsIDB4RjcsCi0JMHhGRCwgMHgyRSwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLCAweDA3LCAweERDLAotCTB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsIDB4RDUsIDB4RkMsCi0JMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMywgMHgwMCwgMHhCMiwKLQkweEZGLCAweDlELCAweDAwLCAweDI3LCAweEZGLCAweEMzLCAweDAwLCAweDFGLCAweDAwLCAweDc2LCAweEZDLAotCTB4QTMsIDB4NDcsIDB4NjAsIDB4MEMsIDB4NEEsIDB4RjksIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkQsIDB4NzksCi0JMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLCAweEYyLCAweDgxLAotCTB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsIDB4RkIsIDB4MDAsCi0JMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhEMywgMHhGRiwgMHg0NywKLQkweDAwLCAweEQ3LCAweEZGLCAweDgyLCAweEZGLCAweDUzLCAweDAyLCAweDM5LCAweEY4LCAweEZELCAweDQ0LAotCTB4OEQsIDB4MTMsIDB4RDMsIDB4RjYsIDB4NzIsIDB4MDUsIDB4Q0EsIDB4RkMsIDB4QjUsIDB4MDEsIDB4NDUsCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwKLQkweERBLCAweDAxLCAweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LCAweENFLCAweDFBLCAweDMyLAotCTB4NDEsIDB4MUYsIDB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsIDB4MDAsIDB4RkIsIDB4RkYsCi0JMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3NywKLQkweDAwLCAweDY3LCAweEZFLCAweDJELCAweDA0LCAweDA0LCAweEY1LCAweDA3LCAweDQxLCAweDFCLCAweDFCLAotCTB4QTYsIDB4RjQsIDB4NUEsIDB4MDYsIDB4NjcsIDB4RkMsIDB4REIsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMywgMHgwMSwKLQkweENGLCAweEZDLCAweDY3LCAweDA1LCAweEVBLCAweEY2LCAweDQ0LCAweDEzLCAweDFFLCAweDQ1LCAweDVFLAotCTB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsIDB4RkYsIDB4RDAsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDIsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCNCwgMHhGRiwgMHgwMCwgMHgwMSwgMHg3RSwKLQkweEZELCAweDlDLCAweDA1LCAweERDLCAweEYyLCAweEU0LCAweDNCLCAweENELCAweDIyLCAweEVFLCAweEYyLAotCTB4RjMsIDB4MDYsIDB4MzUsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHg3NiwgMHgwMSwgMHg1OSwgMHhGRCwKLQkweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLCAweEI2LCAweDQ3LCAweEE0LCAweEZDLCAweDA3LAotCTB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg3RCwgMHhGRiwgMHg2QiwgMHgwMSwgMHhDRiwgMHhGQywgMHg5NiwKLQkweDA2LCAweEI3LCAweEYxLCAweEM2LCAweDM1LCAweDY0LCAweDJBLCAweEQ0LCAweEYxLCAweDJCLCAweDA3LAotCTB4M0QsIDB4RkMsIDB4RDIsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwgMHgyQiwgMHgwMSwgMHhGRSwgMHhGRCwgMHhGOCwgMHgwMiwKLQkweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LCAweDQ4LCAweEUzLCAweDAxLCAweDkxLCAweEZELCAweDI1LAotCTB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsIDB4OEYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyRCwgMHgwMCwgMHg1NSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg2MSwgMHhGQywgMHgxNiwgMHgwNywgMHg4NSwKLQkweEYxLCAweEU2LCAweDJFLCAweDlFLCAweDMxLCAweDdELCAweEYxLCAweEYzLCAweDA2LCAweDg0LCAweEZDLAotCTB4OUQsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUMsCi0JMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwgMHhGRSwgMHhBMSwgMHgwMSwgMHg4OSwgMHhGRSwgMHhDMywgMHhGRiwKLQkweDlDLCAweDQ4LCAweEZELCAweDA3LCAweEZBLCAweEZBLCAweDdBLCAweDAzLCAweEJDLCAweEZELCAweDQ5LAotCTB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHgzRSwgMHhGRiwgMHhERSwgMHgwMSwgMHgzMywgMHhGQywgMHgyMiwgMHgwNywgMHgyQiwgMHhGMiwgMHg4MCwKLQkweDI3LCAweDNCLCAweDM4LCAweDBBLCAweEYyLCAweDQ0LCAweDA2LCAweDBCLCAweEZELCAweDQ1LCAweDAxLAotCTB4OTAsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0YsCi0JMHgwMCwgMHg2NSwgMHhGRiwgMHg1MSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHg0NiwKLQkweENELCAweDBFLCAweDZBLCAweEY4LCAweEI4LCAweDA0LCAweDIwLCAweEZELCAweDkwLCAweDAxLCAweDUzLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCi0JMHhFNSwgMHgwMSwgMHg0MiwgMHhGQywgMHhDMywgMHgwNiwgMHg4NywgMHhGMywgMHhENywgMHgxRiwgMHhGRSwKLQkweDNELCAweDkxLCAweEYzLCAweDFELCAweDA1LCAweEQxLCAweEZELCAweENFLCAweDAwLCAweENDLCAweEZGLAotCTB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MTEsCi0JMHgwMCwgMHgxQiwgMHhGRiwgMHgwMiwgMHgwMywgMHhGRSwgMHhGNiwgMHhDMywgMHg0MywgMHgyMiwgMHgxNiwKLQkweDA3LCAweEY2LCAweENBLCAweDA1LCAweEEzLCAweEZDLCAweEM1LCAweDAxLCAweDNGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0YsIDB4MDEsCi0JMHg4OCwgMHhGQywgMHgwOSwgMHgwNiwgMHg3MSwgMHhGNSwgMHgyQiwgMHgxOCwgMHhCMiwgMHg0MiwgMHgyMCwKLQkweEY2LCAweDgzLCAweDAzLCAweENGLCAweEZFLCAweDNDLCAweDAwLCAweDE1LCAweDAwLCAweEU2LCAweEZGLAotCTB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4REYsIDB4RkYsIDB4QTksIDB4MDAsIDB4MTAsCi0JMHhGRSwgMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwgMHg1RSwgMHgzRiwgMHhDMywgMHgxRCwgMHhGRSwgMHhGMywKLQkweDk5LCAweDA2LCAweDUwLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QTAsIDB4MDEsIDB4RkIsIDB4RkMsCi0JMHgwNywgMHgwNSwgMHhCRiwgMHhGNywgMHhCQiwgMHgxMCwgMHgyQiwgMHg0NiwgMHhCQiwgMHhGOSwgMHg4MywKLQkweDAxLCAweEZBLCAweEZGLCAweDk1LCAweEZGLCAweDY4LCAweDAwLCAweEM3LCAweEZGLCAweDBFLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsIDB4MDEsIDB4M0EsIDB4RkQsIDB4MDAsCi0JMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwgMHg3OSwgMHhGMiwgMHgxMiwgMHgwNywKLQkweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4NUUsIDB4MDEsIDB4OTAsIDB4RkQsIDB4RDIsIDB4MDMsCi0JMHg0NywgMHhGQSwgMHhDMywgMHgwOSwgMHg0OCwgMHg0OCwgMHg1QSwgMHhGRSwgMHgzMywgMHhGRiwgMHg0NSwKLQkweDAxLCAweEUyLCAweEZFLCAweEJFLCAweDAwLCAweEE1LCAweEZGLCAweDE2LCAweDAwLCAweEZELCAweEZGLAotCTB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsIDB4MDYsIDB4OEMsCi0JMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywgMHg0RSwgMHhGQywKLQkweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDFFLCAweDAwLCAweDg2LAotCTB4RkYsIDB4MEUsIDB4MDEsIDB4M0IsIDB4RkUsIDB4ODIsIDB4MDIsIDB4RTAsIDB4RkMsIDB4NzMsIDB4MDMsCi0JMHhGNiwgMHg0OCwgMHhFOSwgMHgwMywgMHhBRCwgMHhGQywgMHg5QywgMHgwMiwgMHgyRCwgMHhGRSwgMHgxNCwKLQkweDAxLCAweDgzLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLAotCTB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsIDB4RjEsIDB4NjIsCi0JMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywgMHg4MiwgMHgwMSwKLQkweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI4LAotCTB4MDAsIDB4RjAsIDB4RkUsIDB4MkIsIDB4MDEsIDB4NjMsIDB4RkYsIDB4RjYsIDB4RkQsIDB4MkMsIDB4NDgsCi0JMHg0NywgMHgwQSwgMHgxNCwgMHhGQSwgMHhFQiwgMHgwMywgMHg4NCwgMHhGRCwgMHg2MywgMHgwMSwgMHg2NCwKLQkweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLCAweEZGLAotCTB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsIDB4REQsIDB4MjQsIDB4NTQsCi0JMHgzQSwgMHg3NCwgMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwgMHgwMSwgMHhBMywgMHhGRiwKLQkweDExLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYxLCAweDAwLCAweEEyLAotCTB4RkYsIDB4RTIsIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkIsIDB4RjksIDB4RjIsIDB4NDUsIDB4NEEsIDB4MTEsCi0JMHg4RiwgMHhGNywgMHgxRCwgMHgwNSwgMHhGMSwgMHhGQywgMHhBNCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUxLCAweDAxLAotCTB4NTUsIDB4RkMsIDB4OEMsIDB4MDYsIDB4MjIsIDB4RjQsIDB4MkMsIDB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsCi0JMHhGNCwgMHg5QiwgMHgwNCwgMHgyMywgMHhGRSwgMHg5RiwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwKLQkweDA0LCAweDAwLCAweDA3LCAweDAwLCAweEU5LCAweEZGLCAweDBGLCAweDAwLCAweDQ4LCAweDAwLCAweEI5LAotCTB4RkUsIDB4QTYsIDB4MDMsIDB4RTQsIDB4RjUsIDB4NjAsIDB4NDIsIDB4QzEsIDB4MTgsIDB4NDcsIDB4RjUsCi0JMHgxQSwgMHgwNiwgMHg4MSwgMHhGQywgMHhEMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLAotCTB4QjcsIDB4MDUsIDB4MzQsIDB4RjYsIDB4OEUsIDB4MTUsIDB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsCi0JMHgwMiwgMHgzMiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgzMSwgMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwKLQkweDAyLCAweDAwLCAweDA0LCAweDAwLCAweEM3LCAweEZGLCAweEQ5LCAweDAwLCAweEJGLCAweEZELCAweDM4LAotCTB4MDUsIDB4NjksIDB4RjMsIDB4OTYsIDB4M0QsIDB4NkYsIDB4MjAsIDB4NjYsIDB4RjMsIDB4Q0UsIDB4MDYsCi0JMHgzRiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDJDLCAweDAwLCAweDU1LCAweEZGLCAweDhCLCAweDAxLCAweDJCLCAweEZELCAweEExLCAweDA0LAotCTB4OUIsIDB4RjgsIDB4NDIsIDB4MEUsIDB4MEYsIDB4NDcsIDB4MzgsIDB4RkIsIDB4QkUsIDB4MDAsIDB4NkEsCi0JMHgwMCwgMHg1OCwgMHhGRiwgMHg4NSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDE5LCAweDAwLCAweDhDLCAweEZGLCAweDRELCAweDAxLCAweEZFLCAweEZDLCAweDU2LCAweDA2LCAweEY3LAotCTB4RjEsIDB4QkYsIDB4MzcsIDB4MTUsIDB4MjgsIDB4MTgsIDB4RjIsIDB4MjUsIDB4MDcsIDB4MzQsIDB4RkMsCi0JMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwKLQkweDAwLCAweDcxLCAweEZGLCAweDQzLCAweDAxLCAweEM5LCAweEZELCAweDYwLCAweDAzLCAweDJFLCAweEZCLAotCTB4N0UsIDB4MDcsIDB4QUYsIDB4NDgsIDB4MkQsIDB4MDAsIDB4NTgsIDB4RkUsIDB4QkIsIDB4MDEsIDB4QTMsCi0JMHhGRSwgMHhERCwgMHgwMCwgMHg5OSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweDYwLCAweEZGLCAweEEyLCAweDAxLCAweDdDLCAweEZDLCAweEZCLCAweDA2LCAweDdDLCAweEYxLCAweDE1LAotCTB4MzEsIDB4NzMsIDB4MkYsIDB4ODEsIDB4RjEsIDB4MTAsIDB4MDcsIDB4NjcsIDB4RkMsIDB4QjEsIDB4MDEsCi0JMHg1OCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwgMHhGRiwgMHhGMSwKLQkweDAwLCAweDc5LCAweEZFLCAweDBBLCAweDAyLCAweEMzLCAweEZELCAweDczLCAweDAxLCAweERCLCAweDQ4LAotCTB4MDcsIDB4MDYsIDB4QzcsIDB4RkIsIDB4MTIsIDB4MDMsIDB4RjEsIDB4RkQsIDB4MzEsIDB4MDEsIDB4NzgsCi0JMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwKLQkweEQ1LCAweDAxLCAweDNBLCAweEZDLCAweDJBLCAweDA3LCAweEUzLCAweEYxLCAweEQxLCAweDI5LCAweDQ2LAotCTB4MzYsIDB4QzUsIDB4RjEsIDB4ODcsIDB4MDYsIDB4REEsIDB4RkMsIDB4NjQsIDB4MDEsIDB4ODAsIDB4RkYsCi0JMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyRSwKLQkweEZGLCAweEI2LCAweDAwLCAweDM2LCAweDAwLCAweDQ3LCAweEZDLCAweDkwLCAweDQ3LCAweEE0LCAweDBDLAotCTB4MzEsIDB4RjksIDB4NUEsIDB4MDQsIDB4NEUsIDB4RkQsIDB4N0MsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwKLQkweDM3LCAweEZDLCAweEVCLCAweDA2LCAweDBCLCAweEYzLCAweDM1LCAweDIyLCAweDUyLCAweDNDLCAweEZELAotCTB4RjIsIDB4ODQsIDB4MDUsIDB4OEQsIDB4RkQsIDB4RjYsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhENSwgMHhGRiwgMHg0NCwgMHgwMCwgMHhERCwgMHhGRiwgMHg3NywKLQkweEZGLCAweDY3LCAweDAyLCAweDE0LCAweEY4LCAweERDLCAweDQ0LCAweEQ1LCAweDEzLCAweEJDLCAweEY2LAotCTB4N0MsIDB4MDUsIDB4QzUsIDB4RkMsIDB4QjcsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOSwgMHgwMSwgMHg2RCwgMHhGQywKLQkweDRCLCAweDA2LCAweENELCAweEY0LCAweDgzLCAweDFBLCAweDVGLCAweDQxLCAweDNBLCAweEY1LCAweDBDLAotCTB4MDQsIDB4N0IsIDB4RkUsIDB4NkMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHgwNSwgMHgwMCwgMHhGMywgMHhGRiwgMHhGNSwgMHhGRiwgMHg3RCwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRSwKLQkweDA0LCAweEVBLCAweEY0LCAweEQ5LCAweDQwLCAweDY2LCAweDFCLCAweDkzLCAweEY0LCAweDYyLCAweDA2LAotCTB4NjQsIDB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMSwgMHgwMSwgMHhEMywgMHhGQywgMHg1RCwgMHgwNSwKLQkweDAxLCAweEY3LCAweEZCLCAweDEyLCAweDNGLCAweDQ1LCAweDgzLCAweEY4LCAweDJBLCAweDAyLCAweDlBLAotCTB4RkYsIDB4Q0EsIDB4RkYsIDB4NEUsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwQywgMHgwMCwgMHhCMSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg3NiwgMHhGRCwgMHhBOCwgMHgwNSwgMHhDQywKLQkweEYyLCAweEFCLCAweDNCLCAweDE4LCAweDIzLCAweEUwLCAweEYyLCAweEY3LCAweDA2LCAweDM1LCAweEZDLAotCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksCi0JMHgwMCwgMHg1RSwgMHhGRiwgMHg3NCwgMHgwMSwgMHg1RiwgMHhGRCwgMHgzNSwgMHgwNCwgMHg3QywgMHhGOSwKLQkweEQ4LCAweDBCLCAweEM5LCAweDQ3LCAweEQ0LCAweEZDLCAweEYwLCAweEZGLCAweERELCAweDAwLCAweDE5LAotCTB4RkYsIDB4QTQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsCi0JMHg3QiwgMHhGRiwgMHg2RSwgMHgwMSwgMHhDQSwgMHhGQywgMHg5RCwgMHgwNiwgMHhCMSwgMHhGMSwgMHg4NiwKLQkweDM1LCAweEFFLCAweDJBLCAweENELCAweEYxLCAweDJCLCAweDA3LCAweDNGLCAweEZDLCAweEQxLCAweDAxLAotCTB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0MsCi0JMHhGRiwgMHgyNywgMHgwMSwgMHgwNSwgMHhGRSwgMHhFQiwgMHgwMiwgMHgxNCwgMHhGQywgMHg1MCwgMHgwNSwKLQkweEVBLCAweDQ4LCAweDFCLCAweDAyLCAweDc4LCAweEZELCAweDMyLCAweDAyLCAweDY0LCAweEZFLCAweEZBLAotCTB4MDAsIDB4OEQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTQsIDB4RkYsCi0JMHhCNywgMHgwMSwgMHg1RSwgMHhGQywgMHgxOSwgMHgwNywgMHg4OCwgMHhGMSwgMHg5RiwgMHgyRSwgMHhFMywKLQkweDMxLCAweDdFLCAweEYxLCAweEVFLCAweDA2LCAweDg4LCAweEZDLCAweDlBLCAweDAxLCAweDY0LCAweEZGLAotCTB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUQsIDB4RkYsIDB4RDMsIDB4MDAsIDB4QjgsCi0JMHhGRSwgMHg5MywgMHgwMSwgMHhBMSwgMHhGRSwgMHg4RSwgMHhGRiwgMHg5MiwgMHg0OCwgMHgzRCwgMHgwOCwKLQkweEUxLCAweEZBLCAweDg2LCAweDAzLCAweEI2LCAweEZELCAweDRDLCAweDAxLCAweDZELCAweEZGLCAweDI1LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REYsIDB4MDEsCi0JMHgzMywgMHhGQywgMHgyMCwgMHgwNywgMHgzNSwgMHhGMiwgMHgzNiwgMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwKLQkweEYyLCAweDNCLCAweDA2LCAweDExLCAweEZELCAweDQxLCAweDAxLCAweDkyLCAweEZGLCAweDE3LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkYsIDB4RkYsIDB4N0IsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NDQsCi0JMHgwMCwgMHgwMSwgMHgwMSwgMHhCNiwgMHhGQSwgMHhDOCwgMHg0NiwgMHgxMywgMHgwRiwgMHg1MSwgMHhGOCwKLQkweEM0LCAweDA0LCAweDFCLCAweEZELCAweDkyLCAweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLCAweEZGLAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsCi0JMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwgMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwKLQkweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLCAweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAotCTB4MDksIDB4MDAsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MTAsIDB4RkYsIDB4MTUsCi0JMHgwMywgMHhERCwgMHhGNiwgMHg5RSwgMHg0MywgMHg2QywgMHgxNiwgMHhGMSwgMHhGNSwgMHhEMywgMHgwNSwKLQkweDlGLCAweEZDLCAweEM2LCAweDAxLCAweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4OEMsIDB4RkMsIDB4MDAsIDB4MDYsCi0JMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwgMHg0MiwgMHgzRiwgMHhGNiwgMHg3MSwgMHgwMywgMHhEOSwKLQkweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLCAweEU1LCAweEZGLCAweDA3LCAweDAwLCAweDAzLCAweDAwLAotCTB4RkMsIDB4RkYsIDB4REMsIDB4RkYsIDB4QUYsIDB4MDAsIDB4MDcsIDB4RkUsIDB4QzgsIDB4MDQsIDB4MTAsCi0JMHhGNCwgMHgyRCwgMHgzRiwgMHgwRiwgMHgxRSwgMHhFRCwgMHhGMywgMHhBMCwgMHgwNiwgMHg0RSwgMHhGQywKLQkweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJFLAotCTB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsIDB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsIDB4RjcsCi0JMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwgMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwgMHg4RSwKLQkweEZGLCAweDZCLCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLCAweEZGLCAweEZGLCAweDEzLCAweDAwLAotCTB4OUQsIDB4RkYsIDB4MkQsIDB4MDEsIDB4MzMsIDB4RkQsIDB4MEIsIDB4MDYsIDB4NEQsIDB4RjIsIDB4QTUsCi0JMHgzOSwgMHhCRiwgMHgyNSwgMHg2RCwgMHhGMiwgMHgxNSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKLQkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LAotCTB4RkYsIDB4NUIsIDB4MDEsIDB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksCi0JMHg1NywgMHg0OCwgMHg4RCwgMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwKLQkweDAwLCAweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZDLCAweEZGLAotCTB4OEIsIDB4MDEsIDB4OUQsIDB4RkMsIDB4RDUsIDB4MDYsIDB4ODksIDB4RjEsIDB4MzUsIDB4MzMsIDB4M0EsCi0JMHgyRCwgMHg5QSwgMHhGMSwgMHgyMywgMHgwNywgMHg1MSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0RiwgMHhGRiwKLQkweDJGLCAweDAwLCAweEZELCAweEZGLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLAotCTB4RkUsIDB4NzQsIDB4MDIsIDB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsCi0JMHg5NCwgMHhGQywgMHhBOSwgMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM5LCAweDAxLAotCTB4NDgsIDB4RkMsIDB4MjgsIDB4MDcsIDB4QUQsIDB4RjEsIDB4MTksIDB4MkMsIDB4M0YsIDB4MzQsIDB4OTcsCi0JMHhGMSwgMHhCRSwgMHgwNiwgMHhCMCwgMHhGQywgMHg3RiwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwKLQkweEZFLCAweEZGLCAweDE1LCAweDAwLCAweEE5LCAweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELAotCTB4MDEsIDB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsIDB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksCi0JMHhGOCwgMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLAotCTB4MDksIDB4MDcsIDB4OUQsIDB4RjIsIDB4OTIsIDB4MjQsIDB4OEYsIDB4M0EsIDB4ODIsIDB4RjIsIDB4RTEsCi0JMHgwNSwgMHg1MCwgMHhGRCwgMHgxQiwgMHgwMSwgMHhBNiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LCAweEZGLCAweEQ2LCAweEZGLCAweEMzLAotCTB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsIDB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsCi0JMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU3LCAweEZDLCAweDg1LCAweDA2LAotCTB4MzQsIDB4RjQsIDB4RTAsIDB4MUMsIDB4RjAsIDB4M0YsIDB4NkQsIDB4RjQsIDB4OEMsIDB4MDQsIDB4MkMsCi0JMHhGRSwgMHg5OSwgMHgwMCwgMHhFNywgMHhGRiwgMHhGOCwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwKLQkweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LCAweDAzLCAweEM3LAotCTB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsIDB4N0QsIDB4RkMsCi0JMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwKLQkweDAwLCAweDQxLCAweEZGLCAweEMwLCAweDAxLCAweEFGLCAweEZDLCAweEFELCAweDA1LCAweDRBLCAweEY2LAotCTB4NDQsIDB4MTUsIDB4MkYsIDB4NDQsIDB4NjQsIDB4RjcsIDB4QzksIDB4MDIsIDB4M0QsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwKLQkweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LCAweEYzLCAweDYxLAotCTB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsIDB4RTYsIDB4MDEsCi0JMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NiwKLQkweEZGLCAweDg4LCAweDAxLCAweDMxLCAweEZELCAweDk1LCAweDA0LCAweEI0LCAweEY4LCAweEZDLCAweDBELAotCTB4MjYsIDB4NDcsIDB4NjQsIDB4RkIsIDB4QTcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4NTEsIDB4RkYsIDB4ODksCi0JMHgwMCwgMHhCQSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QSwgMHhGRiwKLQkweDUxLCAweDAxLCAweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLCAweDgyLCAweDM3LCAweDYwLAotCTB4MjgsIDB4MEUsIDB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg0MCwKLQkweDAxLCAweEQwLCAweEZELCAweDUzLCAweDAzLCAweDQ3LCAweEZCLCAweDNGLCAweDA3LCAweEI4LCAweDQ4LAotCTB4NjIsIDB4MDAsIDB4M0YsIDB4RkUsIDB4QzgsIDB4MDEsIDB4OUMsIDB4RkUsIDB4RTAsIDB4MDAsIDB4OTgsCi0JMHhGRiwgMHgxOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBNSwgMHgwMSwKLQkweDc4LCAweEZDLCAweEZGLCAweDA2LCAweDdELCAweEYxLCAweENGLCAweDMwLCAweEI4LCAweDJGLCAweDgwLAotCTB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsIDB4RkMsIDB4QUUsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MywgMHhGRiwgMHhFRCwgMHgwMCwgMHg4MCwgMHhGRSwgMHhGRCwKLQkweDAxLCAweERDLCAweEZELCAweDNDLCAweDAxLCAweEQ1LCAweDQ4LCAweDQ1LCAweDA2LCAweEFFLCAweEZCLAotCTB4MUYsIDB4MDMsIDB4RUEsIDB4RkQsIDB4MzQsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywgMHhGRiwgMHhENiwgMHgwMSwgMHgzOSwgMHhGQywKLQkweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LCAweDg1LCAweDM2LCAweENDLCAweEYxLCAweDdGLAotCTB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxMiwgMHgwMCwgMHhCNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzNSwgMHhGRiwgMHhBOSwgMHgwMCwgMHg0RCwKLQkweDAwLCAweDE5LCAweEZDLCAweDdDLCAweDQ3LCAweEU4LCAweDBDLCAweDE4LCAweEY5LCAweDY2LCAweDA0LAotCTB4NDgsIDB4RkQsIDB4N0UsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFNiwgMHgwNiwKLQkweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLCAweDNDLCAweDBFLCAweEYzLCAweDc4LCAweDA1LCAweDk2LAotCTB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsCi0JMHhENiwgMHhGRiwgMHg0MSwgMHgwMCwgMHhFNCwgMHhGRiwgMHg2QiwgMHhGRiwgMHg3QiwgMHgwMiwgMHhGMCwKLQkweEY3LCAweEJBLCAweDQ0LCAweDFFLCAweDE0LCAweEE1LCAweEY2LCAweDg2LCAweDA1LCAweEMxLCAweEZDLAotCTB4QjksIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwgMHgwMSwgMHg3MCwgMHhGQywgMHg0MywgMHgwNiwgMHhFMSwgMHhGNCwKLQkweDM4LCAweDFBLCAweDhDLCAweDQxLCAweDU1LCAweEY1LCAweEZDLCAweDAzLCAweDg1LCAweEZFLCAweDY2LAotCTB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjQsIDB4RkYsCi0JMHhGMiwgMHhGRiwgMHg4MywgMHgwMCwgMHg1MywgMHhGRSwgMHg0RSwgMHgwNCwgMHhEMCwgMHhGNCwgMHhBQiwKLQkweDQwLCAweEIyLCAweDFCLCAweDdGLCAweEY0LCAweDY5LCAweDA2LCAweDYyLCAweEZDLCAweERELCAweDAxLAotCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDcsCi0JMHhGRiwgMHhBRiwgMHgwMSwgMHhEOCwgMHhGQywgMHg1MiwgMHgwNSwgMHgxOSwgMHhGNywgMHhCMiwgMHgxMiwKLQkweDVDLCAweDQ1LCAweEE5LCAweEY4LCAweDE2LCAweDAyLCAweEE2LCAweEZGLCAweEMzLCAweEZGLCAweDUxLAotCTB4MDAsIDB4RDAsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QUYsIDB4RkYsCi0JMHgwOSwgMHgwMSwgMHg2RSwgMHhGRCwgMHhCNCwgMHgwNSwgMHhCQywgMHhGMiwgMHg3MywgMHgzQiwgMHg2NCwKLQkweDIzLCAweEQyLCAweEYyLCAweEZCLCAweDA2LCAweDM0LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4NzEsCi0JMHgwMSwgMHg2NSwgMHhGRCwgMHgyOSwgMHgwNCwgMHg5NiwgMHhGOSwgMHg5NSwgMHgwQiwgMHhEQywgMHg0NywKLQkweDAzLCAweEZELCAweEQ5LCAweEZGLCAweEVBLCAweDAwLCAweDEyLCAweEZGLCAweEE3LCAweDAwLCAweEFFLAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsIDB4NzksIDB4RkYsIDB4NzIsIDB4MDEsCi0JMHhDNCwgMHhGQywgMHhBNCwgMHgwNiwgMHhBQiwgMHhGMSwgMHg0NiwgMHgzNSwgMHhGNywgMHgyQSwgMHhDNiwKLQkweEYxLCAweDJBLCAweDA3LCAweDQwLCAweEZDLCAweENGLCAweDAxLCAweDQ3LCAweEZGLCAweDMxLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjQsIDB4MDEsIDB4MEMsCi0JMHhGRSwgMHhERSwgMHgwMiwgMHgyRSwgMHhGQywgMHgxMywgMHgwNSwgMHhFQywgMHg0OCwgMHg1NCwgMHgwMiwKLQkweDVFLCAweEZELCAweDNGLCAweDAyLCAweDVELCAweEZFLCAweEZFLCAweDAwLCAweDhDLCAweEZGLCAweDFDLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4NUIsIDB4RkMsCi0JMHgxQiwgMHgwNywgMHg4QiwgMHhGMSwgMHg1OCwgMHgyRSwgMHgyNiwgMHgzMiwgMHg4MCwgMHhGMSwgMHhFQSwKLQkweDA2LCAweDhDLCAweEZDLCAweDk3LCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLAotCTB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkEsCi0JMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwgMHhDNywgMHhGQSwgMHg5MywgMHgwMywKLQkweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0QsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUUsIDB4MDcsCi0JMHg0MCwgMHhGMiwgMHhFQiwgMHgyNiwgMHhCNSwgMHgzOCwgMHgxRiwgMHhGMiwgMHgzMiwgMHgwNiwgMHgxOCwKLQkweEZELCAweDNELCAweDAxLCAweDk0LCAweEZGLCAweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDBGLCAweDAwLAotCTB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsIDB4MDEsIDB4OEIsCi0JMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwgMHgxNSwgMHhGRCwKLQkweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDYsIDB4RkMsIDB4QjgsIDB4MDYsIDB4QTgsIDB4RjMsCi0JMHgzRiwgMHgxRiwgMHg2NCwgMHgzRSwgMHhCQSwgMHhGMywgMHgwMSwgMHgwNSwgMHhFMiwgMHhGRCwgMHhDNCwKLQkweDAwLCAweEQyLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDA4LCAweDAwLCAweEUxLCAweEZGLAotCTB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsIDB4RjYsIDB4NzcsCi0JMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywgMHhDOCwgMHgwMSwKLQkweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELAotCTB4RkYsIDB4Q0MsIDB4MDEsIDB4OEYsIDB4RkMsIDB4RjgsIDB4MDUsIDB4OUIsIDB4RjUsIDB4OTYsIDB4MTcsCi0JMHgwMiwgMHg0MywgMHg1RSwgMHhGNiwgMHg1RiwgMHgwMywgMHhFNCwgMHhGRSwgMHgzMCwgMHgwMCwgMHgxQiwKLQkweDAwLCAweEU0LCAweEZGLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweEQ5LCAweEZGLAotCTB4QjQsIDB4MDAsIDB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsIDB4RkMsIDB4M0UsIDB4NUIsCi0JMHgxRSwgMHhEQiwgMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwKLQkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlDLAotCTB4MDEsIDB4MDUsIDB4RkQsIDB4RjEsIDB4MDQsIDB4RjAsIDB4RjcsIDB4MkQsIDB4MTAsIDB4NjEsIDB4NDYsCi0JMHgwRCwgMHhGQSwgMHg1OCwgMHgwMSwgMHgxMywgMHgwMCwgMHg4NywgMHhGRiwgMHg2RSwgMHgwMCwgMHhDNCwKLQkweEZGLCAweDBFLCAweDAwLCAweEZGLCAweEZGLCAweDE0LCAweDAwLCAweDlCLCAweEZGLCAweDMxLCAweDAxLAotCTB4MkMsIDB4RkQsIDB4MTUsIDB4MDYsIDB4NDEsIDB4RjIsIDB4NkEsIDB4MzksIDB4MEEsIDB4MjYsIDB4NjEsCi0JMHhGMiwgMHgxNywgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDU4LCAweDAxLCAweDlELAotCTB4RkQsIDB4QjksIDB4MDMsIDB4N0IsIDB4RkEsIDB4NDAsIDB4MDksIDB4NjMsIDB4NDgsIDB4QkYsIDB4RkUsCi0JMHgwMywgMHhGRiwgMHg1RiwgMHgwMSwgMHhENCwgMHhGRSwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZBLCAweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLAotCTB4REIsIDB4MDYsIDB4ODYsIDB4RjEsIDB4RjIsIDB4MzIsIDB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsCi0JMHgwNywgMHg1MywgMHhGQywgMHhDMCwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDFELCAweDAwLCAweDg4LCAweEZGLCAweDA3LCAweDAxLCAweDQ5LCAweEZFLCAweDY3LCAweDAyLCAweDEzLAotCTB4RkQsIDB4RkYsIDB4MDIsIDB4RjQsIDB4NDgsIDB4NUYsIDB4MDQsIDB4N0EsIDB4RkMsIDB4QjYsIDB4MDIsCi0JMHgyMCwgMHhGRSwgMHgxQiwgMHgwMSwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweENBLCAweDAxLCAweDQ2LCAweEZDLCAweDI5LCAweDA3LAotCTB4QjMsIDB4RjEsIDB4RDEsIDB4MkIsIDB4ODEsIDB4MzQsIDB4OUMsIDB4RjEsIDB4QjgsIDB4MDYsIDB4QjUsCi0JMHhGQywgMHg3QywgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwKLQkweEFBLCAweEZGLCAweEIxLCAweDAwLCAweEZFLCAweEZFLCAweDEwLCAweDAxLCAweDkyLCAweEZGLCAweDk0LAotCTB4RkQsIDB4MEQsIDB4NDgsIDB4Q0IsIDB4MEEsIDB4RTIsIDB4RjksIDB4MDQsIDB4MDQsIDB4NzcsIDB4RkQsCi0JMHg2OSwgMHgwMSwgMHg2MiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLCAweDA2LCAweDA3LCAweEFBLCAweEYyLAotCTB4NDYsIDB4MjQsIDB4QzgsIDB4M0EsIDB4OTAsIDB4RjIsIDB4RDYsIDB4MDUsIDB4NTcsIDB4RkQsIDB4MTcsCi0JMHgwMSwgMHhBOCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhDQywgMHhGRiwKLQkweDVBLCAweDAwLCAweEFGLCAweEZGLCAweENBLCAweEZGLCAweEQ4LCAweDAxLCAweDFDLCAweEY5LCAweEI4LAotCTB4NDUsIDB4REEsIDB4MTEsIDB4NjAsIDB4RjcsIDB4MzMsIDB4MDUsIDB4RTcsIDB4RkMsIDB4QTksIDB4MDEsCi0JMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywKLQkweEZGLCAweERGLCAweDAxLCAweDVBLCAweEZDLCAweDdFLCAweDA2LCAweDQ3LCAweEY0LCAweDk0LCAweDFDLAotCTB4MUYsIDB4NDAsIDB4ODUsIDB4RjQsIDB4N0QsIDB4MDQsIDB4MzYsIDB4RkUsIDB4OTMsIDB4MDAsIDB4RUEsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwOSwgMHgwMCwKLQkweDU0LCAweDAwLCAweEE0LCAweEZFLCAweEM5LCAweDAzLCAweEFBLCAweEY1LCAweDBDLCAweDQyLCAweDU2LAotCTB4MTksIDB4MUUsIDB4RjUsIDB4MkIsIDB4MDYsIDB4N0EsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCRSwKLQkweDAxLCAweEI0LCAweEZDLCAweEE0LCAweDA1LCAweDYxLCAweEY2LCAweEZCLCAweDE0LCAweDUzLCAweDQ0LAotCTB4ODYsIDB4RjcsIDB4QjYsIDB4MDIsIDB4NDksIDB4RkYsIDB4RjcsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RDksCi0JMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDMiwgMHhGRiwgMHhFMywgMHgwMCwKLQkweEFFLCAweEZELCAweDUyLCAweDA1LCAweDQ0LCAweEYzLCAweDJBLCAweDNELCAweDA2LCAweDIxLCAweDQ3LAotCTB4RjMsIDB4RDgsIDB4MDYsIDB4M0MsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1NywgMHhGRiwgMHg4NiwgMHgwMSwgMHgzNiwKLQkweEZELCAweDg5LCAweDA0LCAweENELCAweEY4LCAweEI3LCAweDBELCAweDNELCAweDQ3LCAweDkxLCAweEZCLAotCTB4OTEsIDB4MDAsIDB4ODMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4OEMsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4OCwgMHhGRiwgMHg1NSwgMHgwMSwgMHhGMiwgMHhGQywKLQkweDY3LCAweDA2LCAweEU0LCAweEYxLCAweDQ0LCAweDM3LCAweEFBLCAweDI4LCAweDA1LCAweEYyLCAweDI3LAotCTB4MDcsIDB4MzYsIDB4RkMsIDB4REEsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MywgMHhGRiwgMHgzRCwgMHgwMSwgMHhENiwgMHhGRCwgMHg0NiwKLQkweDAzLCAweDYxLCAweEZCLCAweDAwLCAweDA3LCAweEJGLCAweDQ4LCAweDk4LCAweDAwLCAweDI2LCAweEZFLAotCTB4RDUsIDB4MDEsIDB4OTUsIDB4RkUsIDB4RTMsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHhBNywgMHgwMSwgMHg3NSwgMHhGQywgMHgwMywgMHgwNywKLQkweDdELCAweEYxLCAweDhBLCAweDMwLCAweEZGLCAweDJGLCAweDdFLCAweEYxLCAweDBBLCAweDA3LCAweDZFLAotCTB4RkMsIDB4QUMsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUEsIDB4MDAsCi0JMHg5NCwgMHhGRiwgMHhFQSwgMHgwMCwgMHg4NywgMHhGRSwgMHhGMCwgMHgwMSwgMHhGNSwgMHhGRCwgMHgwNSwKLQkweDAxLCAweENFLCAweDQ4LCAweDgzLCAweDA2LCAweDk0LCAweEZCLCAweDJDLCAweDAzLCAweEU0LCAweEZELAotCTB4MzcsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHg0MiwgMHhGRiwgMHhENywgMHgwMSwgMHgzOCwgMHhGQywgMHgyOSwgMHgwNywgMHhGMywgMHhGMSwKLQkweDNFLCAweDI5LCAweEM2LCAweDM2LCAweEQ0LCAweEYxLCAweDc3LCAweDA2LCAweEU2LCAweEZDLCAweDVDLAotCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHg5MywgMHgwMCwgMHgzQywgMHhGRiwgMHg5RCwgMHgwMCwgMHg2MywgMHgwMCwgMHhFQiwgMHhGQiwgMHg2OSwKLQkweDQ3LCAweDJELCAweDBELCAweEZGLCAweEY4LCAweDcyLCAweDA0LCAweDQyLCAweEZELCAweDgxLCAweDAxLAotCTB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsCi0JMHhGRiwgMHhFNiwgMHgwMSwgMHgzQSwgMHhGQywgMHhFMiwgMHgwNiwgMHgyOCwgMHhGMywgMHg5RSwgMHgyMSwKLQkweEMwLCAweDNDLCAweDFGLCAweEYzLCAweDZDLCAweDA1LCAweDlFLCAweEZELCAweEVELCAweDAwLCAweEJELAotCTB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4M0UsIDB4MDAsCi0JMHhFQSwgMHhGRiwgMHg2MCwgMHhGRiwgMHg4RiwgMHgwMiwgMHhDRCwgMHhGNywgMHg5OSwgMHg0NCwgMHg2OCwKLQkweDE0LCAweDhFLCAweEY2LCAweDkwLCAweDA1LCAweEJDLCAweEZDLCAweEJBLCAweDAxLCAweDQzLCAweEZGLAotCTB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDcsCi0JMHgwMSwgMHg3MywgMHhGQywgMHgzQiwgMHgwNiwgMHhGNSwgMHhGNCwgMHhFRCwgMHgxOSwgMHhCNywgMHg0MSwKLQkweDcxLCAweEY1LCAweEVCLCAweDAzLCAweDkwLCAweEZFLCAweDYwLCAweDAwLCAweDA0LCAweDAwLCAweEVELAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsCi0JMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwgMHhCNywgMHhGNCwgMHg3RCwgMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywKLQkweEY0LCAweDcwLCAweDA2LCAweDVGLCAweEZDLCAweERFLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDgsIDB4RkYsIDB4QUQsIDB4MDEsIDB4REQsCi0JMHhGQywgMHg0OCwgMHgwNSwgMHgzMCwgMHhGNywgMHg2QiwgMHgxMiwgMHg3RCwgMHg0NSwgMHhDRiwgMHhGOCwKLQkweDAxLCAweDAyLCAweEIyLCAweEZGLCAweEJELCAweEZGLCAweDU0LCAweDAwLCAweENFLCAweEZGLCAweDBDLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsCi0JMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwgMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwKLQkweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkUsIDB4MDEsIDB4NkIsIDB4RkQsIDB4MUQsCi0JMHgwNCwgMHhBRiwgMHhGOSwgMHg1MSwgMHgwQiwgMHhFQywgMHg0NywgMHgzMywgMHhGRCwgMHhDMSwgMHhGRiwKLQkweEY3LCAweDAwLCAweDBDLCAweEZGLCAweEFBLCAweDAwLCAweEFELCAweEZGLCAweDE0LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsIDB4NzUsIDB4MDEsIDB4QkYsIDB4RkMsIDB4QUIsIDB4MDYsCi0JMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwgMHgyQiwgMHhCRiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MiwKLQkweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjEsIDB4MDEsIDB4MTIsIDB4RkUsIDB4RDEsIDB4MDIsIDB4NDcsCi0JMHhGQywgMHhENywgMHgwNCwgMHhGMCwgMHg0OCwgMHg4RCwgMHgwMiwgMHg0NSwgMHhGRCwgMHg0RCwgMHgwMiwKLQkweDU2LCAweEZFLCAweDAxLCAweDAxLCAweDhCLCAweEZGLCAweDFELCAweDAwLCAweEZELCAweEZGLCAweDJFLAotCTB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsIDB4RjEsCi0JMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywgMHg5NCwKLQkweDAxLCAweDY3LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLAotCTB4Q0MsIDB4MDAsIDB4QzYsIDB4RkUsIDB4NzksIDB4MDEsIDB4RDIsIDB4RkUsIDB4MjYsIDB4RkYsIDB4N0MsCi0JMHg0OCwgMHhCRSwgMHgwOCwgMHhBRSwgMHhGQSwgMHhBMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg1MiwgMHgwMSwKLQkweDZCLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLAotCTB4RkYsIDB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsCi0JMHhGMiwgMHgzOCwgMHgyQSwgMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwKLQkweEZGLCAweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDBGLCAweDAwLCAweEMyLCAweEZGLCAweDc1LCAweDAwLAotCTB4N0EsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MkQsIDB4MDEsIDB4NjEsIDB4RkEsIDB4OTcsIDB4NDYsIDB4QTAsCi0JMHgwRiwgMHgyMCwgMHhGOCwgMHhEQSwgMHgwNCwgMHgxMCwgMHhGRCwgMHg5NywgMHgwMSwgMHg1MCwgMHhGRiwKLQkweDJFLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LAotCTB4MDEsIDB4NDgsIDB4RkMsIDB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsCi0JMHhDRiwgMHhGMywgMHhGMywgMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDAzLCAweDAwLCAweDA4LCAweDAwLCAweEUyLCAweEZGLCAweDIxLCAweDAwLCAweDIzLCAweDAwLAotCTB4RkEsIDB4RkUsIDB4M0EsIDB4MDMsIDB4OUQsIDB4RjYsIDB4NTAsIDB4NDMsIDB4MDAsIDB4MTcsIDB4QzYsCi0JMHhGNSwgMHhFNiwgMHgwNSwgMHg5NywgMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZFLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLAotCTB4RkMsIDB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsIDB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsCi0JMHg0RCwgMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwgMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwKLQkweDAwLCAweDAzLCAweDAwLCAweEZFLCAweEZGLCAweEQ3LCAweEZGLCAweEJBLCAweDAwLCAweEY0LCAweEZELAotCTB4RTUsIDB4MDQsIDB4RTQsIDB4RjMsIDB4Q0EsIDB4M0UsIDB4QTcsIDB4MUUsIDB4Q0EsIDB4RjMsIDB4QUMsCi0JMHgwNiwgMHg0QSwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LCAweDAxLCAweDBCLCAweEZELCAweEU2LAotCTB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsIDB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsCi0JMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDE1LCAweDAwLCAweDk4LCAweEZGLCAweDM1LCAweDAxLCAweDI1LCAweEZELCAweDFFLCAweDA2LAotCTB4MzUsIDB4RjIsIDB4MkUsIDB4MzksIDB4NTUsIDB4MjYsIDB4NTYsIDB4RjIsIDB4MUEsIDB4MDcsIDB4MzEsCi0JMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELCAweDAzLCAweDk0LAotCTB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsIDB4NkMsIDB4MDEsCi0JMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwKLQkweDAwLCAweDY5LCAweEZGLCAweDkxLCAweDAxLCAweDk0LCAweEZDLCAweEUwLCAweDA2LCAweDg0LCAweEYxLAotCTB4QUYsIDB4MzIsIDB4Q0EsIDB4MkQsIDB4OTIsIDB4RjEsIDB4MUYsIDB4MDcsIDB4NTYsIDB4RkMsIDB4QkUsCi0JMHgwMSwgMHg1MSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QSwgMHhGRiwKLQkweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LCAweDAyLCAweEYyLAotCTB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsIDB4MUUsIDB4MDEsCi0JMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OSwKLQkweEZGLCAweENDLCAweDAxLCAweDQ0LCAweEZDLCAweDI5LCAweDA3LCAweEI5LCAweEYxLCAweDg5LCAweDJCLAotCTB4QzMsIDB4MzQsIDB4QTAsIDB4RjEsIDB4QjEsIDB4MDYsIDB4QkEsIDB4RkMsIDB4NzksIDB4MDEsIDB4NzYsCi0JMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQywgMHhGRiwgMHhBRSwgMHgwMCwKLQkweDA1LCAweEZGLCAweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELCAweEZELCAweDQ3LCAweDBFLAotCTB4MEIsIDB4QzgsIDB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsIDB4MDEsIDB4NjEsIDB4RkYsCi0JMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKLQkweDAxLCAweDMzLCAweEZDLCAweDAzLCAweDA3LCAweEI3LCAweEYyLCAweEZDLCAweDIzLCAweDAzLCAweDNCLAotCTB4OUUsIDB4RjIsIDB4Q0IsIDB4MDUsIDB4NUYsIDB4RkQsIDB4MTIsIDB4MDEsIDB4QUEsIDB4RkYsIDB4MEUsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhDRCwgMHhGRiwgMHg1NywgMHgwMCwgMHhCNiwgMHhGRiwKLQkweEJFLCAweEZGLCAweEVELCAweDAxLCAweEY1LCAweEY4LCAweDlCLCAweDQ1LCAweDIyLCAweDEyLCAweDQ4LAotCTB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsIDB4RkMsIDB4QUIsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QywKLQkweEZDLCAweDc4LCAweDA2LCAweDVBLCAweEY0LCAweDQ5LCAweDFDLCAweDRFLCAweDQwLCAweDlFLCAweEY0LAotCTB4NkQsIDB4MDQsIDB4M0YsIDB4RkUsIDB4OEUsIDB4MDAsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHg1QSwgMHgwMCwgMHg5QSwgMHhGRSwKLQkweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLCAweEExLCAweDE5LCAweDA5LCAweEY1LCAweDMzLAotCTB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCQywgMHgwMSwgMHhCOCwgMHhGQywgMHg5QSwKLQkweDA1LCAweDc3LCAweEY2LCAweEIxLCAweDE0LCAweDc3LCAweDQ0LCAweEE5LCAweEY3LCAweEEyLCAweDAyLAotCTB4NTQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RDgsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwgMHhFOCwgMHgwMCwgMHhBNiwgMHhGRCwgMHg1RiwgMHgwNSwKLQkweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLCAweDIxLCAweDM3LCAweEYzLCAweERELCAweDA2LCAweDNCLAotCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyQiwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4MywgMHgwMSwgMHgzQywgMHhGRCwgMHg3RSwgMHgwNCwgMHhFNiwKLQkweEY4LCAweDcyLCAweDBELCAweDUyLCAweDQ3LCAweEJFLCAweEZCLCAweDdBLCAweDAwLCAweDkwLCAweDAwLAotCTB4NDMsIDB4RkYsIDB4OEYsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwgMHgwMSwgMHhFQywgMHhGQywgMHg2RiwgMHgwNiwgMHhEQywgMHhGMSwKLQkweDA0LCAweDM3LCAweEYzLCAweDI4LCAweEZDLCAweEYxLCAweDI4LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LAotCTB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCi0JMHg3NCwgMHhGRiwgMHgzQSwgMHgwMSwgMHhERCwgMHhGRCwgMHgzOSwgMHgwMywgMHg3QiwgMHhGQiwgMHhDMSwKLQkweDA2LCAweEM3LCAweDQ4LCAweENGLCAweDAwLCAweDBELCAweEZFLCAweEUzLCAweDAxLCAweDhFLCAweEZFLAotCTB4RTcsIDB4MDAsIDB4OTUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsCi0JMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwKLQkweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLCAweEFBLCAweDAxLCAweDVDLAotCTB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RTcsIDB4MDAsCi0JMHg4RSwgMHhGRSwgMHhFMywgMHgwMSwgMHgwRCwgMHhGRSwgMHhDRiwgMHgwMCwgMHhDNywgMHg0OCwgMHhDMSwKLQkweDA2LCAweDdCLCAweEZCLCAweDM5LCAweDAzLCAweERELCAweEZELCAweDNBLCAweDAxLCAweDc0LCAweEZGLAotCTB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDgsCi0JMHgwMSwgMHgzNywgMHhGQywgMHgyOCwgMHgwNywgMHhGQywgMHhGMSwgMHhGMywgMHgyOCwgMHgwNCwgMHgzNywKLQkweERDLCAweEYxLCAweDZGLCAweDA2LCAweEVDLCAweEZDLCAweDU5LCAweDAxLCAweDg2LCAweEZGLCAweDFDLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjcsIDB4RkYsIDB4OEYsIDB4MDAsIDB4NDMsIDB4RkYsCi0JMHg5MCwgMHgwMCwgMHg3QSwgMHgwMCwgMHhCRSwgMHhGQiwgMHg1MiwgMHg0NywgMHg3MiwgMHgwRCwgMHhFNiwKLQkweEY4LCAweDdFLCAweDA0LCAweDNDLCAweEZELCAweDgzLCAweDAxLCAweDU4LCAweEZGLCAweDJCLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0IsCi0JMHhGQywgMHhERCwgMHgwNiwgMHgzNywgMHhGMywgMHg1MiwgMHgyMSwgMHhGNiwgMHgzQywgMHgzMSwgMHhGMywKLQkweDVGLCAweDA1LCAweEE2LCAweEZELCAweEU4LCAweDAwLCAweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDAxLAotCTB4MDAsIDB4MEEsIDB4MDAsIDB4RDgsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RjEsIDB4RkYsIDB4NTQsIDB4RkYsCi0JMHhBMiwgMHgwMiwgMHhBOSwgMHhGNywgMHg3NywgMHg0NCwgMHhCMSwgMHgxNCwgMHg3NywgMHhGNiwgMHg5QSwKLQkweDA1LCAweEI4LCAweEZDLCAweEJDLCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsIDB4MDEsIDB4NzcsIDB4RkMsIDB4MzMsCi0JMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwgMHg4RCwgMHhGNSwgMHhEQSwgMHgwMywKLQkweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLCAweDA0LAotCTB4MDAsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OEUsIDB4MDAsIDB4M0YsIDB4RkUsIDB4NkQsIDB4MDQsCi0JMHg5RSwgMHhGNCwgMHg0RSwgMHg0MCwgMHg0OSwgMHgxQywgMHg1QSwgMHhGNCwgMHg3OCwgMHgwNiwgMHg1QywKLQkweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLAotCTB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsIDB4MDUsIDB4NDgsCi0JMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwgMHhCRSwgMHhGRiwKLQkweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDBFLAotCTB4MDAsIDB4QUEsIDB4RkYsIDB4MTIsIDB4MDEsIDB4NUYsIDB4RkQsIDB4Q0IsIDB4MDUsIDB4OUUsIDB4RjIsCi0JMHgwMywgMHgzQiwgMHhGQywgMHgyMywgMHhCNywgMHhGMiwgMHgwMywgMHgwNywgMHgzMywgMHhGQywgMHhFNSwKLQkweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAotCTB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsIDB4RjksIDB4MEUsCi0JMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwgMHgwNSwgMHhGRiwKLQkweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc2LAotCTB4RkYsIDB4NzksIDB4MDEsIDB4QkEsIDB4RkMsIDB4QjEsIDB4MDYsIDB4QTAsIDB4RjEsIDB4QzMsIDB4MzQsCi0JMHg4OSwgMHgyQiwgMHhCOSwgMHhGMSwgMHgyOSwgMHgwNywgMHg0NCwgMHhGQywgMHhDQywgMHgwMSwgMHg0OSwKLQkweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLCAweEZGLAotCTB4MUUsIDB4MDEsIDB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsIDB4OUIsIDB4MDQsIDB4RjIsCi0JMHg0OCwgMHhDNiwgMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwgMHhGRSwgMHgwNCwgMHgwMSwKLQkweDhBLCAweEZGLCAweDFELCAweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJFLAotCTB4MDEsIDB4NTYsIDB4RkMsIDB4MUYsIDB4MDcsIDB4OTIsIDB4RjEsIDB4Q0EsIDB4MkQsIDB4QUYsIDB4MzIsCi0JMHg4NCwgMHhGMSwgMHhFMCwgMHgwNiwgMHg5NCwgMHhGQywgMHg5MSwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwKLQkweDAwLCAweEZELCAweEZGLCAweDE3LCAweDAwLCAweEExLCAweEZGLCAweEM5LCAweDAwLCAweENELCAweEZFLAotCTB4NkMsIDB4MDEsIDB4RUEsIDB4RkUsIDB4RjMsIDB4RkUsIDB4NzAsIDB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsCi0JMHhGQSwgMHhBRCwgMHgwMywgMHhBMywgMHhGRCwgMHg1NSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMxLAotCTB4RkMsIDB4MUEsIDB4MDcsIDB4NTYsIDB4RjIsIDB4NTUsIDB4MjYsIDB4MkUsIDB4MzksIDB4MzUsIDB4RjIsCi0JMHgxRSwgMHgwNiwgMHgyNSwgMHhGRCwgMHgzNSwgMHgwMSwgMHg5OCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDBGLCAweDAwLCAweEMzLCAweEZGLCAweDcxLCAweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLAotCTB4NDIsIDB4MDEsIDB4MzcsIDB4RkEsIDB4N0MsIDB4NDYsIDB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsCi0JMHgwNCwgMHgwQiwgMHhGRCwgMHg5OSwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDRBLCAweEZDLCAweEFDLAotCTB4MDYsIDB4Q0EsIDB4RjMsIDB4QTcsIDB4MUUsIDB4Q0EsIDB4M0UsIDB4RTQsIDB4RjMsIDB4RTUsIDB4MDQsCi0JMHhGNCwgMHhGRCwgMHhCQSwgMHgwMCwgMHhENywgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwKLQkweDAwLCAweEUzLCAweEZGLCAweDFFLCAweDAwLCAweDJBLCAweDAwLCAweEVGLCAweEZFLCAweDRELCAweDAzLAotCTB4N0QsIDB4RjYsIDB4MkEsIDB4NDMsIDB4NEIsIDB4MTcsIDB4QjAsIDB4RjUsIDB4RUYsIDB4MDUsIDB4OTMsCi0JMHhGQywgMHhDQiwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDM0LCAweDAwLCAweDNFLCAweEZGLCAweEM5LCAweDAxLCAweDk3LCAweEZDLCAweEU2LCAweDA1LCAweEM2LAotCTB4RjUsIDB4MDAsIDB4MTcsIDB4NTAsIDB4NDMsIDB4OUQsIDB4RjYsIDB4M0EsIDB4MDMsIDB4RkEsIDB4RkUsCi0JMHgyMywgMHgwMCwgMHgyMSwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwKLQkweEZGLCAweEQ0LCAweEZGLCAweEJGLCAweDAwLCAweEVCLCAweEZELCAweEYzLCAweDA0LCAweENGLCAweEYzLAotCTB4OTgsIDB4M0UsIDB4RjMsIDB4MUUsIDB4QjksIDB4RjMsIDB4QjIsIDB4MDYsIDB4NDgsIDB4RkMsIDB4RTQsCi0JMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwKLQkweDUwLCAweEZGLCAweDk3LCAweDAxLCAweDEwLCAweEZELCAweERBLCAweDA0LCAweDIwLCAweEY4LCAweEEwLAotCTB4MEYsIDB4OTcsIDB4NDYsIDB4NjEsIDB4RkEsIDB4MkQsIDB4MDEsIDB4MkIsIDB4MDAsIDB4N0EsIDB4RkYsCi0JMHg3NSwgMHgwMCwgMHhDMiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NiwKLQkweEZGLCAweDM5LCAweDAxLCAweDFGLCAweEZELCAweDI4LCAweDA2LCAweDJBLCAweEYyLCAweEYyLCAweDM4LAotCTB4QTAsIDB4MjYsIDB4NEIsIDB4RjIsIDB4MUMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0MsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QiwgMHhGRiwKLQkweDUyLCAweDAxLCAweEE5LCAweEZELCAweEEwLCAweDAzLCAweEFFLCAweEZBLCAweEJFLCAweDA4LCAweDdDLAotCTB4NDgsIDB4MjYsIDB4RkYsIDB4RDIsIDB4RkUsIDB4NzksIDB4MDEsIDB4QzYsIDB4RkUsIDB4Q0MsIDB4MDAsCi0JMHhBMCwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2NywgMHhGRiwgMHg5NCwKLQkweDAxLCAweDkwLCAweEZDLCAweEU1LCAweDA2LCAweDgxLCAweEYxLCAweDZCLCAweDMyLCAweDExLCAweDJFLAotCTB4OEUsIDB4RjEsIDB4MUQsIDB4MDcsIDB4NTgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QiwgMHhGRiwgMHgwMSwgMHgwMSwgMHg1NiwgMHhGRSwKLQkweDRELCAweDAyLCAweDQ1LCAweEZELCAweDhELCAweDAyLCAweEYwLCAweDQ4LCAweEQ3LCAweDA0LCAweDQ3LAotCTB4RkMsIDB4RDEsIDB4MDIsIDB4MTIsIDB4RkUsIDB4MjEsIDB4MDEsIDB4N0UsIDB4RkYsIDB4MjAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OCwgMHhGRiwgMHhDRSwgMHgwMSwgMHg0MiwKLQkweEZDLCAweDJBLCAweDA3LCAweEJGLCAweEYxLCAweDQwLCAweDJCLCAweDA1LCAweDM1LCAweEE2LCAweEYxLAotCTB4QUIsIDB4MDYsIDB4QkYsIDB4RkMsIDB4NzUsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHhBRCwgMHhGRiwgMHhBQSwgMHgwMCwgMHgwQywgMHhGRiwgMHhGNywgMHgwMCwKLQkweEMxLCAweEZGLCAweDMzLCAweEZELCAweEVDLCAweDQ3LCAweDUxLCAweDBCLCAweEFGLCAweEY5LCAweDFELAotCTB4MDQsIDB4NkIsIDB4RkQsIDB4NkUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywgMHhGRiwKLQkweDA2LCAweEM0LCAweEYyLCAweEIwLCAweDIzLCAweDNCLCAweDNCLCAweEFELCAweEYyLCAweEJGLCAweDA1LAotCTB4NjYsIDB4RkQsIDB4MEUsIDB4MDEsIDB4QUMsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsCi0JMHgwMCwgMHhDRSwgMHhGRiwgMHg1NCwgMHgwMCwgMHhCRCwgMHhGRiwgMHhCMiwgMHhGRiwgMHgwMSwgMHgwMiwKLQkweENGLCAweEY4LCAweDdELCAweDQ1LCAweDZCLCAweDEyLCAweDMwLCAweEY3LCAweDQ4LCAweDA1LCAweERELAotCTB4RkMsIDB4QUQsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERSwgMHgwMSwgMHg1RiwgMHhGQywgMHg3MCwgMHgwNiwgMHg2QywKLQkweEY0LCAweEZELCAweDFCLCAweDdELCAweDQwLCAweEI3LCAweEY0LCAweDVELCAweDA0LCAweDQ5LCAweEZFLAotCTB4ODgsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUQsCi0JMHhGRiwgMHgwNCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg5MCwgMHhGRSwgMHhFQiwgMHgwMywgMHg3MSwgMHhGNSwKLQkweEI3LCAweDQxLCAweEVELCAweDE5LCAweEY1LCAweEY0LCAweDNCLCAweDA2LCAweDczLCAweEZDLCAweEQ3LAotCTB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHg0MywgMHhGRiwgMHhCQSwgMHgwMSwgMHhCQywgMHhGQywgMHg5MCwgMHgwNSwgMHg4RSwgMHhGNiwgMHg2OCwKLQkweDE0LCAweDk5LCAweDQ0LCAweENELCAweEY3LCAweDhGLCAweDAyLCAweDYwLCAweEZGLCAweEVBLCAweEZGLAotCTB4M0UsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkQsCi0JMHhGRiwgMHhFRCwgMHgwMCwgMHg5RSwgMHhGRCwgMHg2QywgMHgwNSwgMHgxRiwgMHhGMywgMHhDMCwgMHgzQywKLQkweDlFLCAweDIxLCAweDI4LCAweEYzLCAweEUyLCAweDA2LCAweDNBLCAweEZDLCAweEU2LCAweDAxLCAweDM3LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsCi0JMHg4MSwgMHgwMSwgMHg0MiwgMHhGRCwgMHg3MiwgMHgwNCwgMHhGRiwgMHhGOCwgMHgyRCwgMHgwRCwgMHg2OSwKLQkweDQ3LCAweEVCLCAweEZCLCAweDYzLCAweDAwLCAweDlELCAweDAwLCAweDNDLCAweEZGLCAweDkzLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODQsIDB4RkYsIDB4NUMsCi0JMHgwMSwgMHhFNiwgMHhGQywgMHg3NywgMHgwNiwgMHhENCwgMHhGMSwgMHhDNiwgMHgzNiwgMHgzRSwgMHgyOSwKLQkweEYzLCAweEYxLCAweDI5LCAweDA3LCAweDM4LCAweEZDLCAweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsCi0JMHhFNCwgMHhGRCwgMHgyQywgMHgwMywgMHg5NCwgMHhGQiwgMHg4MywgMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwKLQkweDAxLCAweEY1LCAweEZELCAweEYwLCAweDAxLCAweDg3LCAweEZFLCAweEVBLCAweDAwLCAweDk0LCAweEZGLAotCTB4MUEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUEsIDB4RkYsIDB4QUMsIDB4MDEsIDB4NkUsCi0JMHhGQywgMHgwQSwgMHgwNywgMHg3RSwgMHhGMSwgMHhGRiwgMHgyRiwgMHg4QSwgMHgzMCwgMHg3RCwgMHhGMSwKLQkweDAzLCAweDA3LCAweDc1LCAweEZDLCAweEE3LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweEZELAotCTB4RkYsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsIDB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsCi0JMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwgMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwKLQkweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4REEsIDB4MDEsIDB4MzYsIDB4RkMsIDB4MjcsCi0JMHgwNywgMHgwNSwgMHhGMiwgMHhBQSwgMHgyOCwgMHg0NCwgMHgzNywgMHhFNCwgMHhGMSwgMHg2NywgMHgwNiwKLQkweEYyLCAweEZDLCAweDU1LCAweDAxLCAweDg4LCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDExLAotCTB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4ODMsIDB4MDAsIDB4OTEsIDB4MDAsCi0JMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywgMHgwRCwgMHhDRCwgMHhGOCwgMHg4OSwgMHgwNCwgMHgzNiwKLQkweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0MsIDB4RkMsIDB4RDgsIDB4MDYsIDB4NDcsCi0JMHhGMywgMHgwNiwgMHgyMSwgMHgyQSwgMHgzRCwgMHg0NCwgMHhGMywgMHg1MiwgMHgwNSwgMHhBRSwgMHhGRCwKLQkweEUzLCAweDAwLCAweEMyLCAweEZGLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEQ5LAotCTB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsIDB4RjcsCi0JMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwgMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywgMHhCRSwKLQkweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAotCTB4M0EsIDB4RkYsIDB4RDQsIDB4MDEsIDB4N0EsIDB4RkMsIDB4MkIsIDB4MDYsIDB4MUUsIDB4RjUsIDB4NTYsCi0JMHgxOSwgMHgwQywgMHg0MiwgMHhBQSwgMHhGNSwgMHhDOSwgMHgwMywgMHhBNCwgMHhGRSwgMHg1NCwgMHgwMCwKLQkweDA5LCAweDAwLCAweEVCLCAweEZGLCAweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLAotCTB4RkYsIDB4OTMsIDB4MDAsIDB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsCi0JMHg5NCwgMHgxQywgMHg0NywgMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywKLQkweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAotCTB4QTksIDB4MDEsIDB4RTcsIDB4RkMsIDB4MzMsIDB4MDUsIDB4NjAsIDB4RjcsIDB4REEsIDB4MTEsIDB4QjgsCi0JMHg0NSwgMHgxQywgMHhGOSwgMHhEOCwgMHgwMSwgMHhDQSwgMHhGRiwgMHhBRiwgMHhGRiwgMHg1QSwgMHgwMCwKLQkweENDLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LAotCTB4MDEsIDB4NTcsIDB4RkQsIDB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsCi0JMHhBQSwgMHhGMiwgMHgwNiwgMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDY5LCAweDAxLAotCTB4NzcsIDB4RkQsIDB4MDQsIDB4MDQsIDB4RTIsIDB4RjksIDB4Q0IsIDB4MEEsIDB4MEQsIDB4NDgsIDB4OTQsCi0JMHhGRCwgMHg5MiwgMHhGRiwgMHgxMCwgMHgwMSwgMHhGRSwgMHhGRSwgMHhCMSwgMHgwMCwgMHhBQSwgMHhGRiwKLQkweDE1LCAweDAwLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LAotCTB4RkMsIDB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsIDB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsCi0JMHgyOSwgMHgwNywgMHg0NiwgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDFCLCAweDAxLCAweDIwLCAweEZFLAotCTB4QjYsIDB4MDIsIDB4N0EsIDB4RkMsIDB4NUYsIDB4MDQsIDB4RjQsIDB4NDgsIDB4RkYsIDB4MDIsIDB4MTMsCi0JMHhGRCwgMHg2NywgMHgwMiwgMHg0OSwgMHhGRSwgMHgwNywgMHgwMSwgMHg4OCwgMHhGRiwgMHgxRCwgMHgwMCwKLQkweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLCAweDAxLCAweDUzLCAweEZDLCAweDIxLAotCTB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsIDB4ODYsIDB4RjEsIDB4REIsIDB4MDYsCi0JMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEEyLCAweEZGLCAweEM1LCAweDAwLCAweEQ0LCAweEZFLCAweDVGLCAweDAxLCAweDAzLCAweEZGLAotCTB4QkYsIDB4RkUsIDB4NjMsIDB4NDgsIDB4NDAsIDB4MDksIDB4N0IsIDB4RkEsIDB4QjksIDB4MDMsIDB4OUQsCi0JMHhGRCwgMHg1OCwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LCAweDA3LCAweDYxLAotCTB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsIDB4MkMsIDB4RkQsCi0JMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNCwKLQkweEZGLCAweDZFLCAweDAwLCAweDg3LCAweEZGLCAweDEzLCAweDAwLCAweDU4LCAweDAxLCAweDBELCAweEZBLAotCTB4NjEsIDB4NDYsIDB4MkQsIDB4MTAsIDB4RjAsIDB4RjcsIDB4RjEsIDB4MDQsIDB4MDUsIDB4RkQsIDB4OUMsCi0JMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLCAweEYzLCAweDVCLAotCTB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsIDB4QjQsIDB4MDAsCi0JMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFNCwgMHhGRiwgMHgxQiwKLQkweDAwLCAweDMwLCAweDAwLCAweEU0LCAweEZFLCAweDVGLCAweDAzLCAweDVFLCAweEY2LCAweDAyLCAweDQzLAotCTB4OTYsIDB4MTcsIDB4OUIsIDB4RjUsIDB4RjgsIDB4MDUsIDB4OEYsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4M0QsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRSwgMHhGRiwKLQkweEM4LCAweDAxLCAweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LCAweEI2LCAweDE2LCAweDc3LAotCTB4NDMsIDB4QkQsIDB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MjUsIDB4MDAsCi0JMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhGRiwgMHhDNCwKLQkweDAwLCAweEUyLCAweEZELCAweDAxLCAweDA1LCAweEJBLCAweEYzLCAweDY0LCAweDNFLCAweDNGLCAweDFGLAotCTB4QTgsIDB4RjMsIDB4QjgsIDB4MDYsIDB4NDYsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MSwgMHhGRiwgMHg5NSwgMHgwMSwKLQkweDE1LCAweEZELCAweENGLCAweDA0LCAweDM5LCAweEY4LCAweDU5LCAweDBGLCAweEFGLCAweDQ2LCAweDhCLAotCTB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4NzgsIDB4MDAsIDB4QzAsIDB4RkYsCi0JMHgwRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NCwgMHhGRiwgMHgzRCwgMHgwMSwgMHgxOCwKLQkweEZELCAweDMyLCAweDA2LCAweDFGLCAweEYyLCAweEI1LCAweDM4LCAweEVCLCAweDI2LCAweDQwLCAweEYyLAotCTB4MUUsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwgMHg0RiwgMHgwMSwgMHhCMCwgMHhGRCwKLQkweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LCAweDg2LCAweDQ4LCAweDVBLCAweEZGLCAweEJBLAotCTB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4OUUsIDB4RkYsIDB4MTcsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg5NywgMHgwMSwgMHg4QywgMHhGQywgMHhFQSwKLQkweDA2LCAweDgwLCAweEYxLCAweDI2LCAweDMyLCAweDU4LCAweDJFLCAweDhCLCAweEYxLCAweDFCLCAweDA3LAotCTB4NUIsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRiwgMHgwMiwgMHg1RSwgMHhGRCwKLQkweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLCAweDA1LCAweDJFLCAweEZDLCAweERFLCAweDAyLCAweDBDLAotCTB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwgMHhDRiwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwgMHgwNywgMHhDNiwKLQkweEYxLCAweEY3LCAweDJBLCAweDQ2LCAweDM1LCAweEFCLCAweEYxLCAweEE0LCAweDA2LCAweEM0LCAweEZDLAotCTB4NzIsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUUsCi0JMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwgMHhGRiwgMHhFQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwMywgMHhGRCwKLQkweERDLCAweDQ3LCAweDk1LCAweDBCLCAweDk2LCAweEY5LCAweDI5LCAweDA0LCAweDY1LCAweEZELCAweDcxLAotCTB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywgMHhGQiwgMHgwNiwgMHhEMiwgMHhGMiwgMHg2NCwKLQkweDIzLCAweDczLCAweDNCLCAweEJDLCAweEYyLCAweEI0LCAweDA1LCAweDZFLCAweEZELCAweDA5LCAweDAxLAotCTB4QUYsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTEsCi0JMHgwMCwgMHhDMywgMHhGRiwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMiwgMHhBOSwgMHhGOCwgMHg1QywgMHg0NSwKLQkweEIyLCAweDEyLCAweDE5LCAweEY3LCAweDUyLCAweDA1LCAweEQ4LCAweEZDLCAweEFGLCAweDAxLCAweDQ3LAotCTB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsCi0JMHhERCwgMHgwMSwgMHg2MiwgMHhGQywgMHg2OSwgMHgwNiwgMHg3RiwgMHhGNCwgMHhCMiwgMHgxQiwgMHhBQiwKLQkweDQwLCAweEQwLCAweEY0LCAweDRFLCAweDA0LCAweDUzLCAweEZFLCAweDgzLCAweDAwLCAweEYyLCAweEZGLAotCTB4RjQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjYsCi0JMHgwMCwgMHg4NSwgMHhGRSwgMHhGQywgMHgwMywgMHg1NSwgMHhGNSwgMHg4QywgMHg0MSwgMHgzOCwgMHgxQSwKLQkweEUxLCAweEY0LCAweDQzLCAweDA2LCAweDcwLCAweEZDLCAweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjksIDB4MDEsCi0JMHhDMSwgMHhGQywgMHg4NiwgMHgwNSwgMHhBNSwgMHhGNiwgMHgxRSwgMHgxNCwgMHhCQSwgMHg0NCwgMHhGMCwKLQkweEY3LCAweDdCLCAweDAyLCAweDZCLCAweEZGLCAweEU0LCAweEZGLCAweDQxLCAweDAwLCAweEQ2LCAweEZGLAotCTB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RjEsIDB4MDAsIDB4OTYsCi0JMHhGRCwgMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywgMHg4QSwgMHgzQywgMHhFQSwgMHgyMSwgMHgxOSwgMHhGMywKLQkweEU2LCAweDA2LCAweDM4LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NUEsIDB4RkYsIDB4N0UsIDB4MDEsIDB4NDgsIDB4RkQsCi0JMHg2NiwgMHgwNCwgMHgxOCwgMHhGOSwgMHhFOCwgMHgwQywgMHg3QywgMHg0NywgMHgxOSwgMHhGQywgMHg0RCwKLQkweDAwLCAweEE5LCAweDAwLCAweDM1LCAweEZGLCAweDk2LCAweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RkMsIDB4N0YsCi0JMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwgMHhFQiwgMHhGMSwgMHgyQSwgMHgwNywKLQkweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzQsIDB4MDEsIDB4RUEsIDB4RkQsIDB4MUYsIDB4MDMsCi0JMHhBRSwgMHhGQiwgMHg0NSwgMHgwNiwgMHhENSwgMHg0OCwgMHgzQywgMHgwMSwgMHhEQywgMHhGRCwgMHhGRCwKLQkweDAxLCAweDgwLCAweEZFLCAweEVELCAweDAwLCAweDkzLCAweEZGLCAweDFCLCAweDAwLCAweEZELCAweEZGLAotCTB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsIDB4MDcsIDB4ODAsCi0JMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwgMHg3OCwgMHhGQywKLQkweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDE5LCAweDAwLCAweDk4LAotCTB4RkYsIDB4RTAsIDB4MDAsIDB4OUMsIDB4RkUsIDB4QzgsIDB4MDEsIDB4M0YsIDB4RkUsIDB4NjIsIDB4MDAsCi0JMHhCOCwgMHg0OCwgMHgzRiwgMHgwNywgMHg0NywgMHhGQiwgMHg1MywgMHgwMywgMHhEMCwgMHhGRCwgMHg0MCwKLQkweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsIDB4RjIsIDB4NjAsCi0JMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywgMHg1MSwgMHgwMSwKLQkweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweDExLCAweDAwLCAweEJBLCAweEZGLCAweDg5LAotCTB4MDAsIDB4NTEsIDB4RkYsIDB4NzcsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NjQsIDB4RkIsIDB4MjYsIDB4NDcsCi0JMHhGQywgMHgwRCwgMHhCNCwgMHhGOCwgMHg5NSwgMHgwNCwgMHgzMSwgMHhGRCwgMHg4OCwgMHgwMSwgMHg1NiwKLQkweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAotCTB4RTYsIDB4MDEsIDB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsIDB4QkEsIDB4MjAsIDB4NjEsCi0JMHgzRCwgMHg1NiwgMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwgMHgwMCwgMHhDNSwgMHhGRiwKLQkweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAotCTB4RkYsIDB4M0QsIDB4RkYsIDB4QzksIDB4MDIsIDB4NjQsIDB4RjcsIDB4MkYsIDB4NDQsIDB4NDQsIDB4MTUsCi0JMHg0QSwgMHhGNiwgMHhBRCwgMHgwNSwgMHhBRiwgMHhGQywgMHhDMCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwKLQkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQzLCAweDAxLAotCTB4N0QsIDB4RkMsIDB4MjMsIDB4MDYsIDB4MzIsIDB4RjUsIDB4MEMsIDB4MTksIDB4MzgsIDB4NDIsIDB4QzcsCi0JMHhGNSwgMHhCOCwgMHgwMywgMHhBRiwgMHhGRSwgMHg0RSwgMHgwMCwgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwKLQkweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY4LCAweEZGLCAweEU3LCAweEZGLCAweDk5LCAweDAwLCAweDJDLAotCTB4RkUsIDB4OEMsIDB4MDQsIDB4NkQsIDB4RjQsIDB4RjAsIDB4M0YsIDB4RTAsIDB4MUMsIDB4MzQsIDB4RjQsCi0JMHg4NSwgMHgwNiwgMHg1NywgMHhGQywgMHhFMCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRBLCAweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLAotCTB4MjgsIDB4MDUsIDB4NzcsIDB4RjcsIDB4OTIsIDB4MTEsIDB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsCi0JMHgwMSwgMHhENiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg1RSwgMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDEwLCAweDAwLCAweEE2LCAweEZGLCAweDFCLCAweDAxLCAweDUwLCAweEZELCAweEUxLAotCTB4MDUsIDB4ODIsIDB4RjIsIDB4OEYsIDB4M0EsIDB4OTIsIDB4MjQsIDB4OUQsIDB4RjIsIDB4MDksIDB4MDcsCi0JMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDY2LCAweDAxLCAweDdELCAweEZELCAweEY4LCAweDAzLAotCTB4RkIsIDB4RjksIDB4ODksIDB4MEEsIDB4MUQsIDB4NDgsIDB4QzUsIDB4RkQsIDB4N0EsIDB4RkYsIDB4MUQsCi0JMHgwMSwgMHhGNywgMHhGRSwgMHhCNCwgMHgwMCwgMHhBOSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDdGLCAweDAxLCAweEIwLCAweEZDLCAweEJFLCAweDA2LCAweDk3LAotCTB4RjEsIDB4M0YsIDB4MzQsIDB4MTksIDB4MkMsIDB4QUQsIDB4RjEsIDB4MjgsIDB4MDcsIDB4NDgsIDB4RkMsCi0JMHhDOSwgMHgwMSwgMHg0QiwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwKLQkweDAwLCAweDgyLCAweEZGLCAweDE4LCAweDAxLCAweDI3LCAweEZFLCAweEE5LCAweDAyLCAweDk0LCAweEZDLAotCTB4MjQsIDB4MDQsIDB4RjUsIDB4NDgsIDB4MzksIDB4MDMsIDB4RjksIDB4RkMsIDB4NzQsIDB4MDIsIDB4NDIsCi0JMHhGRSwgMHgwQiwgMHgwMSwgMHg4NywgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweDRGLCAweEZGLCAweEMyLCAweDAxLCAweDUxLCAweEZDLCAweDIzLCAweDA3LCAweDlBLCAweEYxLCAweDNBLAotCTB4MkQsIDB4MzUsIDB4MzMsIDB4ODksIDB4RjEsIDB4RDUsIDB4MDYsIDB4OUQsIDB4RkMsIDB4OEIsIDB4MDEsCi0JMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMiwKLQkweDAwLCAweERCLCAweEZFLCAweDUyLCAweDAxLCAweDFCLCAweEZGLCAweDhELCAweEZFLCAweDU3LCAweDQ4LAotCTB4ODEsIDB4MDksIDB4NjEsIDB4RkEsIDB4QzYsIDB4MDMsIDB4OTYsIDB4RkQsIDB4NUIsIDB4MDEsIDB4NjgsCi0JMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwKLQkweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE1LCAweDA3LCAweDZELCAweEYyLCAweEJGLCAweDI1LCAweEE1LAotCTB4MzksIDB4NEQsIDB4RjIsIDB4MEIsIDB4MDYsIDB4MzMsIDB4RkQsIDB4MkQsIDB4MDEsIDB4OUQsIDB4RkYsCi0JMHgxMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNiwgMHhGRiwgMHg2QiwgMHgwMCwgMHg4RSwKLQkweEZGLCAweDA2LCAweDAwLCAweDZFLCAweDAxLCAweEU0LCAweEY5LCAweDQ4LCAweDQ2LCAweDc1LCAweDEwLAotCTB4RDcsIDB4RjcsIDB4RkMsIDB4MDQsIDB4MDAsIDB4RkQsIDB4OUUsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwKLQkweDRFLCAweEZDLCAweEEwLCAweDA2LCAweEVELCAweEYzLCAweDBGLCAweDFFLCAweDJELCAweDNGLCAweDEwLAotCTB4RjQsIDB4QzgsIDB4MDQsIDB4MDcsIDB4RkUsIDB4QUYsIDB4MDAsIDB4REMsIDB4RkYsIDB4RkMsIDB4RkYsCi0JMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHhFNSwgMHhGRiwgMHgxOCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwKLQkweEZFLCAweDcxLCAweDAzLCAweDNGLCAweEY2LCAweERCLCAweDQyLCAweEUwLCAweDE3LCAweDg2LCAweEY1LAotCTB4MDAsIDB4MDYsIDB4OEMsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNiwgMHgwMSwgMHg5RiwgMHhGQywKLQkweEQzLCAweDA1LCAweEYxLCAweEY1LCAweDZDLCAweDE2LCAweDlFLCAweDQzLCAweERELCAweEY2LCAweDE1LAotCTB4MDMsIDB4MTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MjgsIDB4MDAsIDB4REYsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRiwgMHhGRiwgMHhDOSwgMHgwMCwgMHhEQSwgMHhGRCwgMHgwRiwKLQkweDA1LCAweEE1LCAweEYzLCAweDMxLCAweDNFLCAweDhBLCAweDFGLCAweDk3LCAweEYzLCAweEJELCAweDA2LAotCTB4NDQsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MiwgMHgwMSwgMHgxQiwgMHhGRCwgMHhDNCwgMHgwNCwKLQkweDUxLCAweEY4LCAweDEzLCAweDBGLCAweEM4LCAweDQ2LCAweEI2LCAweEZBLCAweDAxLCAweDAxLCAweDQ0LAotCTB4MDAsIDB4NkMsIDB4RkYsIDB4N0IsIDB4MDAsIDB4QkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgxNywgMHgwMCwgMHg5MiwgMHhGRiwgMHg0MSwgMHgwMSwgMHgxMSwgMHhGRCwgMHgzQiwgMHgwNiwgMHgxNCwKLQkweEYyLCAweDc4LCAweDM4LCAweDM2LCAweDI3LCAweDM1LCAweEYyLCAweDIwLCAweDA3LCAweDMzLCAweEZDLAotCTB4REYsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsCi0JMHgwMCwgMHg2RCwgMHhGRiwgMHg0QywgMHgwMSwgMHhCNiwgMHhGRCwgMHg4NiwgMHgwMywgMHhFMSwgMHhGQSwKLQkweDNELCAweDA4LCAweDkyLCAweDQ4LCAweDhFLCAweEZGLCAweEExLCAweEZFLCAweDkzLCAweDAxLCAweEI4LAotCTB4RkUsIDB4RDMsIDB4MDAsIDB4OUQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHg2NCwgMHhGRiwgMHg5QSwgMHgwMSwgMHg4OCwgMHhGQywgMHhFRSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhFMywKLQkweDMxLCAweDlGLCAweDJFLCAweDg4LCAweEYxLCAweDE5LCAweDA3LCAweDVFLCAweEZDLCAweEI3LCAweDAxLAotCTB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEQsIDB4RkYsIDB4RkEsCi0JMHgwMCwgMHg2NCwgMHhGRSwgMHgzMiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgxQiwgMHgwMiwgMHhFQSwgMHg0OCwKLQkweDUwLCAweDA1LCAweDE0LCAweEZDLCAweEVCLCAweDAyLCAweDA1LCAweEZFLCAweDI3LCAweDAxLCAweDdDLAotCTB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsCi0JMHhEMSwgMHgwMSwgMHgzRiwgMHhGQywgMHgyQiwgMHgwNywgMHhDRCwgMHhGMSwgMHhBRSwgMHgyQSwgMHg4NiwKLQkweDM1LCAweEIxLCAweEYxLCAweDlELCAweDA2LCAweENBLCAweEZDLCAweDZFLCAweDAxLCAweDdCLCAweEZGLAotCTB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTQsIDB4MDAsIDB4MTksCi0JMHhGRiwgMHhERCwgMHgwMCwgMHhGMCwgMHhGRiwgMHhENCwgMHhGQywgMHhDOSwgMHg0NywgMHhEOCwgMHgwQiwKLQkweDdDLCAweEY5LCAweDM1LCAweDA0LCAweDVGLCAweEZELCAweDc0LCAweDAxLCAweDVFLCAweEZGLCAweDI5LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHgzNSwgMHhGQywgMHhGNywgMHgwNiwgMHhFMCwgMHhGMiwgMHgxOCwgMHgyMywgMHhBQiwgMHgzQiwgMHhDQywKLQkweEYyLCAweEE4LCAweDA1LCAweDc2LCAweEZELCAweDA0LCAweDAxLCAweEIxLCAweEZGLCAweDBDLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RDEsIDB4RkYsIDB4NEUsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4OUEsCi0JMHhGRiwgMHgyQSwgMHgwMiwgMHg4MywgMHhGOCwgMHgzRiwgMHg0NSwgMHhGQiwgMHgxMiwgMHgwMSwgMHhGNywKLQkweDVELCAweDA1LCAweEQzLCAweEZDLCAweEIxLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLAotCTB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsCi0JMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwgMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwKLQkweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LCAweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLAotCTB4MDUsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4NkMsIDB4MDAsIDB4N0IsIDB4RkUsIDB4MEMsCi0JMHgwNCwgMHgzQSwgMHhGNSwgMHg1RiwgMHg0MSwgMHg4MywgMHgxQSwgMHhDRCwgMHhGNCwgMHg0QiwgMHgwNiwKLQkweDZELCAweEZDLCAweEQ5LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4QzUsIDB4RkMsIDB4N0MsIDB4MDUsCi0JMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywgMHg0NCwgMHgxNCwgMHhGOCwgMHg2NywgMHgwMiwgMHg3NywKLQkweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLCAweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLAotCTB4MDksIDB4MDAsIDB4QjgsIDB4RkYsIDB4RjYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4ODQsIDB4MDUsIDB4RkQsCi0JMHhGMiwgMHg1MiwgMHgzQywgMHgzNSwgMHgyMiwgMHgwQiwgMHhGMywgMHhFQiwgMHgwNiwgMHgzNywgMHhGQywKLQkweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJBLAotCTB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsIDB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsIDB4RjksCi0JMHhBNCwgMHgwQywgMHg5MCwgMHg0NywgMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwgMHgyRSwKLQkweEZGLCAweDk5LCAweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAotCTB4ODAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4REEsIDB4RkMsIDB4ODcsIDB4MDYsIDB4QzUsIDB4RjEsIDB4NDYsCi0JMHgzNiwgMHhEMSwgMHgyOSwgMHhFMywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwKLQkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LAotCTB4RkYsIDB4MzEsIDB4MDEsIDB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsCi0JMHhEQiwgMHg0OCwgMHg3MywgMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwKLQkweDAwLCAweDkxLCAweEZGLCAweDFCLCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU4LCAweEZGLAotCTB4QjEsIDB4MDEsIDB4NjcsIDB4RkMsIDB4MTAsIDB4MDcsIDB4ODEsIDB4RjEsIDB4NzMsIDB4MkYsIDB4MTUsCi0JMHgzMSwgMHg3QywgMHhGMSwgMHhGQiwgMHgwNiwgMHg3QywgMHhGQywgMHhBMiwgMHgwMSwgMHg2MCwgMHhGRiwKLQkweDI5LCAweDAwLCAweEZELCAweEZGLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLAotCTB4RkUsIDB4QkIsIDB4MDEsIDB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsCi0JMHgyRSwgMHhGQiwgMHg2MCwgMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERDLCAweDAxLAotCTB4MzQsIDB4RkMsIDB4MjUsIDB4MDcsIDB4MTgsIDB4RjIsIDB4MTUsIDB4MjgsIDB4QkYsIDB4MzcsIDB4RjcsCi0JMHhGMSwgMHg1NiwgMHgwNiwgMHhGRSwgMHhGQywgMHg0RCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxOSwgMHgwMCwKLQkweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJCLCAweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLAotCTB4MDAsIDB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsIDB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsCi0JMHhBMSwgMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwKLQkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNGLCAweEZDLAotCTB4Q0UsIDB4MDYsIDB4NjYsIDB4RjMsIDB4NkYsIDB4MjAsIDB4OTYsIDB4M0QsIDB4NjksIDB4RjMsIDB4MzgsCi0JMHgwNSwgMHhCRiwgMHhGRCwgMHhEOSwgMHgwMCwgMHhDNywgMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LCAweDAwLCAweDMyLCAweEZGLCAweERDLAotCTB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsIDB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsCi0JMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEQyLCAweDAxLCAweDgxLCAweEZDLCAweDFBLCAweDA2LAotCTB4NDcsIDB4RjUsIDB4QzEsIDB4MTgsIDB4NjAsIDB4NDIsIDB4RTQsIDB4RjUsIDB4QTYsIDB4MDMsIDB4QjksCi0JMHhGRSwgMHg0OCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwNCwgMHgwMCwKLQkweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLCAweDA0LCAweDU1LAotCTB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsIDB4NTUsIDB4RkMsCi0JMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwKLQkweDAwLCAweDRCLCAweEZGLCAweEE0LCAweDAxLCAweEYxLCAweEZDLCAweDFELCAweDA1LCAweDhGLCAweEY3LAotCTB4NEEsIDB4MTEsIDB4RjIsIDB4NDUsIDB4NkIsIDB4RjksIDB4QUUsIDB4MDEsIDB4RTIsIDB4RkYsIDB4QTIsCi0JMHhGRiwgMHg2MSwgMHgwMCwgMHhDOSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LCAweEYyLCAweDU0LAotCTB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsCi0JMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NCwKLQkweEZGLCAweDYzLCAweDAxLCAweDg0LCAweEZELCAweEVCLCAweDAzLCAweDE0LCAweEZBLCAweDQ3LCAweDBBLAotCTB4MkMsIDB4NDgsIDB4RjYsIDB4RkQsIDB4NjMsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RjAsIDB4RkUsIDB4QjgsCi0JMHgwMCwgMHhBOCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MSwgMHhGRiwKLQkweDgyLCAweDAxLCAweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLCAweEZELCAweDMzLCAweDYyLAotCTB4MkMsIDB4QTgsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsIDB4MDEsIDB4NEMsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MywgMHhGRiwgMHgxNCwKLQkweDAxLCAweDJELCAweEZFLCAweDlDLCAweDAyLCAweEFELCAweEZDLCAweEU5LCAweDAzLCAweEY2LCAweDQ4LAotCTB4NzMsIDB4MDMsIDB4RTAsIDB4RkMsIDB4ODIsIDB4MDIsIDB4M0IsIDB4RkUsIDB4MEUsIDB4MDEsIDB4ODYsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RSwgMHhGRiwgMHhDMywgMHgwMSwKLQkweDRFLCAweEZDLCAweDI0LCAweDA3LCAweDlFLCAweEYxLCAweEYyLCAweDJDLCAweDc4LCAweDMzLCAweDhDLAotCTB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsIDB4RkMsIDB4ODgsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNSwgMHhGRiwgMHhCRSwgMHgwMCwgMHhFMiwgMHhGRSwgMHg0NSwKLQkweDAxLCAweDMzLCAweEZGLCAweDVBLCAweEZFLCAweDQ4LCAweDQ4LCAweEMzLCAweDA5LCAweDQ3LCAweEZBLAotCTB4RDIsIDB4MDMsIDB4OTAsIDB4RkQsIDB4NUUsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywKLQkweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LCAweERGLCAweDM5LCAweDVBLCAweEYyLCAweDAwLAotCTB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2OCwgMHgwMCwgMHg5NSwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4MywKLQkweDAxLCAweEJCLCAweEY5LCAweDJCLCAweDQ2LCAweEJCLCAweDEwLCAweEJGLCAweEY3LCAweDA3LCAweDA1LAotCTB4RkIsIDB4RkMsIDB4QTAsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MCwgMHhGQywgMHg5OSwgMHgwNiwKLQkweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLCAweDNGLCAweDI3LCAweEY0LCAweEI5LCAweDA0LCAweDEwLAotCTB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsCi0JMHhFNiwgMHhGRiwgMHgxNSwgMHgwMCwgMHgzQywgMHgwMCwgMHhDRiwgMHhGRSwgMHg4MywgMHgwMywgMHgyMCwKLQkweEY2LCAweEIyLCAweDQyLCAweDJCLCAweDE4LCAweDcxLCAweEY1LCAweDA5LCAweDA2LCAweDg4LCAweEZDLAotCTB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwgMHgwMSwgMHhBMywgMHhGQywgMHhDQSwgMHgwNSwgMHgwNywgMHhGNiwKLQkweDIyLCAweDE2LCAweEMzLCAweDQzLCAweEZFLCAweEY2LCAweDAyLCAweDAzLCAweDFCLCAweEZGLCAweDExLAotCTB4MDAsIDB4MkIsIDB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHhDQywgMHhGRiwgMHhDRSwgMHgwMCwgMHhEMSwgMHhGRCwgMHgxRCwgMHgwNSwgMHg5MSwgMHhGMywgMHhGRSwKLQkweDNELCAweEQ3LCAweDFGLCAweDg3LCAweEYzLCAweEMzLCAweDA2LCAweDQyLCAweEZDLCAweEU1LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsCi0JMHhGRiwgMHg5MCwgMHgwMSwgMHgyMCwgMHhGRCwgMHhCOCwgMHgwNCwgMHg2QSwgMHhGOCwgMHhDRCwgMHgwRSwKLQkweEUxLCAweDQ2LCAweEUxLCAweEZBLCAweEVCLCAweDAwLCAweDUxLCAweDAwLCAweDY1LCAweEZGLCAweDdGLAotCTB4MDAsIDB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OTAsIDB4RkYsCi0JMHg0NSwgMHgwMSwgMHgwQiwgMHhGRCwgMHg0NCwgMHgwNiwgMHgwQSwgMHhGMiwgMHgzQiwgMHgzOCwgMHg4MCwKLQkweDI3LCAweDJCLCAweEYyLCAweDIyLCAweDA3LCAweDMzLCAweEZDLCAweERFLCAweDAxLCAweDNFLCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4NDksCi0JMHgwMSwgMHhCQywgMHhGRCwgMHg3QSwgMHgwMywgMHhGQSwgMHhGQSwgMHhGRCwgMHgwNywgMHg5QywgMHg0OCwKLQkweEMzLCAweEZGLCAweDg5LCAweEZFLCAweEExLCAweDAxLCAweEIxLCAweEZFLCAweEQ2LCAweDAwLCAweDlDLAotCTB4RkYsIDB4MTgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUQsIDB4MDEsCi0JMHg4NCwgMHhGQywgMHhGMywgMHgwNiwgMHg3RCwgMHhGMSwgMHg5RSwgMHgzMSwgMHhFNiwgMHgyRSwgMHg4NSwKLQkweEYxLCAweDE2LCAweDA3LCAweDYxLCAweEZDLCAweEI1LCAweDAxLCAweDU1LCAweEZGLCAweDJELCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEYsIDB4RkYsIDB4RjcsIDB4MDAsIDB4NkIsIDB4RkUsIDB4MjUsCi0JMHgwMiwgMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwgMHhFNSwgMHg0OCwgMHg4RCwgMHgwNSwgMHhGQiwgMHhGQiwKLQkweEY4LCAweDAyLCAweEZFLCAweEZELCAweDJCLCAweDAxLCAweDdBLCAweEZGLCAweDIxLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4RkYsIDB4RDIsIDB4MDEsIDB4M0QsIDB4RkMsCi0JMHgyQiwgMHgwNywgMHhENCwgMHhGMSwgMHg2NCwgMHgyQSwgMHhDNiwgMHgzNSwgMHhCNywgMHhGMSwgMHg5NiwKLQkweDA2LCAweENGLCAweEZDLCAweDZCLCAweDAxLCAweDdELCAweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLAotCTB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDcsCi0JMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywgMHg2MywgMHhGOSwgMHg0MiwgMHgwNCwKLQkweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjMsIDB4MDYsCi0JMHhFRSwgMHhGMiwgMHhDRCwgMHgyMiwgMHhFNCwgMHgzQiwgMHhEQywgMHhGMiwgMHg5QywgMHgwNSwgMHg3RSwKLQkweEZELCAweDAwLCAweDAxLCAweEI0LCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLAotCTB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsIDB4MDIsIDB4NUUsCi0JMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwgMHhDRiwgMHhGQywKLQkweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsIDB4NjcsIDB4RkMsIDB4NUEsIDB4MDYsIDB4QTYsIDB4RjQsCi0JMHgxQiwgMHgxQiwgMHgwNywgMHg0MSwgMHgwNCwgMHhGNSwgMHgyRCwgMHgwNCwgMHg2NywgMHhGRSwgMHg3NywKLQkweDAwLCAweEY4LCAweEZGLCAweEYyLCAweEZGLCAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweEYwLCAweEZGLAotCTB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsIDB4RjUsIDB4MzIsCi0JMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywgMHhEQSwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LAotCTB4RkYsIDB4QjUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4NzIsIDB4MDUsIDB4RDMsIDB4RjYsIDB4OEQsIDB4MTMsCi0JMHhGRCwgMHg0NCwgMHgzOSwgMHhGOCwgMHg1MywgMHgwMiwgMHg4MiwgMHhGRiwgMHhENywgMHhGRiwgMHg0NywKLQkweDAwLCAweEQzLCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEI2LCAweEZGLAotCTB4RkIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsIDB4MUMsIDB4M0MsIDB4ODEsCi0JMHgyMiwgMHhGQywgMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc5LAotCTB4MDEsIDB4NTMsIDB4RkQsIDB4NEUsIDB4MDQsIDB4NEEsIDB4RjksIDB4NjAsIDB4MEMsIDB4QTMsIDB4NDcsCi0JMHg3NiwgMHhGQywgMHgxRiwgMHgwMCwgMHhDMywgMHgwMCwgMHgyNywgMHhGRiwgMHg5RCwgMHgwMCwgMHhCMiwKLQkweEZGLCAweDEzLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLCAweDdGLCAweEZGLCAweDY3LCAweDAxLAotCTB4RDUsIDB4RkMsIDB4OEUsIDB4MDYsIDB4QkUsIDB4RjEsIDB4MDYsIDB4MzYsIDB4MUEsIDB4MkEsIDB4REMsCi0JMHhGMSwgMHgyQSwgMHgwNywgMHgzQywgMHhGQywgMHhEMywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDc5LCAweEZGLCAweDJFLCAweDAxLCAweEY3LAotCTB4RkQsIDB4MDUsIDB4MDMsIDB4RTEsIDB4RkIsIDB4Q0EsIDB4MDUsIDB4REYsIDB4NDgsIDB4QUIsIDB4MDEsCi0JMHhBQSwgMHhGRCwgMHgxOCwgMHgwMiwgMHg3MiwgMHhGRSwgMHhGNCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgxQiwKLQkweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LCAweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLAotCTB4MTMsIDB4MDcsIDB4ODMsIDB4RjEsIDB4MkMsIDB4MkYsIDB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsCi0JMHgwNiwgMHg4MCwgMHhGQywgMHg5RiwgMHgwMSwgMHg2MSwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE5LCAweDAwLCAweDlBLCAweEZGLCAweEQ5LCAweDAwLCAweEFBLCAweEZFLCAweEFFLCAweDAxLCAweDcwLAotCTB4RkUsIDB4RjgsIDB4RkYsIDB4QTYsIDB4NDgsIDB4QkUsIDB4MDcsIDB4MTQsIDB4RkIsIDB4NkQsIDB4MDMsCi0JMHhDMywgMHhGRCwgMHg0NiwgMHgwMSwgMHg3MCwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERELCAweDAxLCAweDM0LCAweEZDLCAweDIzLCAweDA3LAotCTB4MjEsIDB4RjIsIDB4Q0IsIDB4MjcsIDB4RkUsIDB4MzcsIDB4MDAsIDB4RjIsIDB4NEQsIDB4MDYsIDB4MDQsCi0JMHhGRCwgMHg0OSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwKLQkweEJELCAweEZGLCAweDgyLCAweDAwLCAweDVFLCAweEZGLCAweDVELCAweDAwLCAweEQ0LCAweDAwLCAweDBDLAotCTB4RkIsIDB4RjksIDB4NDYsIDB4ODcsIDB4MEUsIDB4ODIsIDB4RjgsIDB4QUQsIDB4MDQsIDB4MjYsIDB4RkQsCi0JMHg4RCwgMHgwMSwgMHg1NCwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDQxLCAweEZDLCAweEM4LCAweDA2LCAweDc2LCAweEYzLAotCTB4MjIsIDB4MjAsIDB4Q0EsIDB4M0QsIDB4N0QsIDB4RjMsIDB4MkEsIDB4MDUsIDB4QzgsIDB4RkQsIDB4RDQsCi0JMHgwMCwgMHhDQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhERCwgMHhGRiwKLQkweDJFLCAweDAwLCAweDBBLCAweDAwLCAweDI3LCAweEZGLCAweEVGLCAweDAyLCAweDIwLCAweEY3LCAweEU3LAotCTB4NDMsIDB4RDgsIDB4MTUsIDB4MUUsIDB4RjYsIDB4QzAsIDB4MDUsIDB4QTcsIDB4RkMsIDB4QzMsIDB4MDEsCi0JMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwKLQkweEZGLCAweEQxLCAweDAxLCAweDg0LCAweEZDLCAweDEyLCAweDA2LCAweDVDLCAweEY1LCAweDc2LCAweDE4LAotCTB4ODksIDB4NDIsIDB4MDIsIDB4RjYsIDB4OTQsIDB4MDMsIDB4QzQsIDB4RkUsIDB4NDIsIDB4MDAsIDB4MTIsCi0JMHgwMCwgMHhFOCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhFMiwgMHhGRiwKLQkweEE0LCAweDAwLCAweDE5LCAweEZFLCAweEFBLCAweDA0LCAweDNFLCAweEY0LCAweDkwLCAweDNGLCAweDc4LAotCTB4MUQsIDB4MTAsIDB4RjQsIDB4OTMsIDB4MDYsIDB4NTIsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzYsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMiwKLQkweDAxLCAweEY2LCAweEZDLCAweDEyLCAweDA1LCAweEE3LCAweEY3LCAweDAzLCAweDExLCAweDEwLCAweDQ2LAotCTB4OTMsIDB4RjksIDB4OTgsIDB4MDEsIDB4RUUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzgsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhBMSwgMHhGRiwgMHgyNCwgMHgwMSwKLQkweDQxLCAweEZELCAweEY2LCAweDA1LCAweDY3LCAweEYyLCAweDFBLCAweDNBLCAweDI5LCAweDI1LCAweDg0LAotCTB4RjIsIDB4MEYsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg2MCwgMHgwMSwgMHg4QSwKLQkweEZELCAweERGLCAweDAzLCAweDJFLCAweEZBLCAweDA0LCAweDBBLCAweDNBLCAweDQ4LCAweDI4LCAweEZFLAotCTB4NEIsIDB4RkYsIDB4MzgsIDB4MDEsIDB4RTksIDB4RkUsIDB4QkIsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RiwgMHhGRiwgMHg4NSwgMHgwMSwgMHhBNiwgMHhGQywKLQkweENBLCAweDA2LCAweDhGLCAweEYxLCAweEJCLCAweDMzLCAweEFCLCAweDJDLCAweEEzLCAweEYxLCAweDI2LAotCTB4MDcsIDB4NEMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwKLQkweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLAotCTB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywKLQkweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLAotCTB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywKLQkweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLAotCTB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsCi0JMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywKLQkweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLCAweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENiwgMHgwNiwgMHg0QywgMHhGMywgMHhFRCwKLQkweDIwLCAweDNELCAweDNELCAweDRBLCAweEYzLCAweDRFLCAweDA1LCAweEIxLCAweEZELCAweEUxLCAweDAwLAotCTB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsCi0JMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywKLQkweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLAotCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsCi0JMHhFOSwgMHhGRSwgMHgzOCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwKLQkweDBBLCAweDJFLCAweEZBLCAweERGLCAweDAzLCAweDhBLCAweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLAotCTB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzgsIDB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsCi0JMHhGRiwgMHhFRSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg5MywgMHhGOSwgMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwKLQkweEE3LCAweEY3LCAweDEyLCAweDA1LCAweEY2LCAweEZDLCAweEEyLCAweDAxLCAweDRDLCAweEZGLCAweDJGLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTIsIDB4MDAsIDB4NDIsIDB4MDAsCi0JMHhDNCwgMHhGRSwgMHg5NCwgMHgwMywgMHgwMiwgMHhGNiwgMHg4OSwgMHg0MiwgMHg3NiwgMHgxOCwgMHg1QywKLQkweEY1LCAweDEyLCAweDA2LCAweDg0LCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4RDQsIDB4MDAsIDB4QzgsCi0JMHhGRCwgMHgyQSwgMHgwNSwgMHg3RCwgMHhGMywgMHhDQSwgMHgzRCwgMHgyMiwgMHgyMCwgMHg3NiwgMHhGMywKLQkweEM4LCAweDA2LCAweDQxLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEUsIDB4RkYsIDB4NDksIDB4MDEsIDB4MDQsIDB4RkQsCi0JMHg0RCwgMHgwNiwgMHgwMCwgMHhGMiwgMHhGRSwgMHgzNywgMHhDQiwgMHgyNywgMHgyMSwgMHhGMiwgMHgyMywKLQkweDA3LCAweDM0LCAweEZDLCAweERELCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLAotCTB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4OUYsIDB4MDEsIDB4ODAsIDB4RkMsIDB4RjcsCi0JMHgwNiwgMHg3RCwgMHhGMSwgMHg1QSwgMHgzMSwgMHgyQywgMHgyRiwgMHg4MywgMHhGMSwgMHgxMywgMHgwNywKLQkweDY0LCAweEZDLCAweEIzLCAweDAxLCAweDU3LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweEZELAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDMsIDB4MDEsIDB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsCi0JMHhEQywgMHhGMSwgMHgxQSwgMHgyQSwgMHgwNiwgMHgzNiwgMHhCRSwgMHhGMSwgMHg4RSwgMHgwNiwgMHhENSwKLQkweEZDLCAweDY3LCAweDAxLCAweDdGLCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RUYsIDB4MDYsIDB4RkMsCi0JMHhGMiwgMHg4MSwgMHgyMiwgMHgxQywgMHgzQywgMHhFQywgMHhGMiwgMHg5MCwgMHgwNSwgMHg4NSwgMHhGRCwKLQkweEZCLCAweDAwLCAweEI2LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDM1LAotCTB4MDAsIDB4MzgsIDB4RkYsIDB4REEsIDB4MDEsIDB4NkEsIDB4RkMsIDB4NTMsIDB4MDYsIDB4QkEsIDB4RjQsCi0JMHhDRSwgMHgxQSwgMHgzMiwgMHg0MSwgMHgxRiwgMHhGNSwgMHgxRCwgMHgwNCwgMHg3MSwgMHhGRSwgMHg3MSwKLQkweDAwLCAweEZCLCAweEZGLCAweEYwLCAweEZGLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLAotCTB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsIDB4RUEsIDB4RjYsIDB4NDQsCi0JMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwgMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwgMHhGRiwgMHhEMCwgMHhGRiwKLQkweDRBLCAweDAwLCAweEQyLCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELAotCTB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsIDB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsCi0JMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywgMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwKLQkweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLAotCTB4MkIsIDB4MDEsIDB4RkUsIDB4RkQsIDB4RjgsIDB4MDIsIDB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsCi0JMHg0OCwgMHhFMywgMHgwMSwgMHg5MSwgMHhGRCwgMHgyNSwgMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwKLQkweDhGLCAweEZGLCAweDFDLCAweDAwLCAweDE4LCAweDAwLCAweDlDLCAweEZGLCAweEQ2LCAweDAwLCAweEIxLAotCTB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsIDB4RkYsIDB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsCi0JMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwgMHg0OSwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwKLQkweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLCAweDAwLCAweDY1LCAweEZGLAotCTB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsIDB4Q0QsIDB4MEUsIDB4NkEsCi0JMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLCAweDAwLCAweDFCLAotCTB4RkYsIDB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsIDB4MDcsIDB4RjYsCi0JMHhDQSwgMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLCAweEZFLAotCTB4QjksIDB4MDQsIDB4MjcsIDB4RjQsIDB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsIDB4OTksCi0JMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LCAweDAxLCAweDNBLCAweEZELCAweDAwLAotCTB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsIDB4NzksIDB4RjIsIDB4MTIsIDB4MDcsCi0JMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKLQkweEZGLCAweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLCAweDA2LAotCTB4OEMsIDB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEUsCi0JMHhGQywgMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDMwLCAweDAwLCAweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LAotCTB4RjEsIDB4NjIsIDB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsCi0JMHg4MiwgMHgwMSwgMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDNBLCAweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLAotCTB4REQsIDB4MjQsIDB4NTQsIDB4M0EsIDB4NzQsIDB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsCi0JMHgwMSwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM3LCAweEZGLCAweEUxLCAweDAxLCAweDU1LCAweEZDLCAweDhDLCAweDA2LCAweDIyLCAweEY0LCAweDJDLAotCTB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsIDB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsIDB4RkUsIDB4OUYsIDB4MDAsCi0JMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKLQkweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLCAweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LAotCTB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsIDB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsCi0JMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwKLQkweDhCLCAweDAxLCAweDJCLCAweEZELCAweEExLCAweDA0LCAweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLAotCTB4NDcsIDB4MzgsIDB4RkIsIDB4QkUsIDB4MDAsIDB4NkEsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsCi0JMHhCQiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywKLQkweDAxLCAweEM5LCAweEZELCAweDYwLCAweDAzLCAweDJFLCAweEZCLCAweDdFLCAweDA3LCAweEFGLCAweDQ4LAotCTB4MkQsIDB4MDAsIDB4NTgsIDB4RkUsIDB4QkIsIDB4MDEsIDB4QTMsIDB4RkUsIDB4REQsIDB4MDAsIDB4OTksCi0JMHhGRiwgMHgxOSwgMHgwMCwgMHgxQiwgMHgwMCwgMHg5MSwgMHhGRiwgMHhGMSwgMHgwMCwgMHg3OSwgMHhGRSwKLQkweDBBLCAweDAyLCAweEMzLCAweEZELCAweDczLCAweDAxLCAweERCLCAweDQ4LCAweDA3LCAweDA2LCAweEM3LAotCTB4RkIsIDB4MTIsIDB4MDMsIDB4RjEsIDB4RkQsIDB4MzEsIDB4MDEsIDB4NzgsIDB4RkYsIDB4MjIsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyRSwgMHhGRiwgMHhCNiwKLQkweDAwLCAweDM2LCAweDAwLCAweDQ3LCAweEZDLCAweDkwLCAweDQ3LCAweEE0LCAweDBDLCAweDMxLCAweEY5LAotCTB4NUEsIDB4MDQsIDB4NEUsIDB4RkQsIDB4N0MsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwQiwgMHgwMCwgMHhENSwgMHhGRiwgMHg0NCwgMHgwMCwgMHhERCwgMHhGRiwgMHg3NywgMHhGRiwKLQkweDY3LCAweDAyLCAweDE0LCAweEY4LCAweERDLCAweDQ0LCAweEQ1LCAweDEzLCAweEJDLCAweEY2LCAweDdDLAotCTB4MDUsIDB4QzUsIDB4RkMsIDB4QjcsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHhGMywgMHhGRiwgMHhGNSwgMHhGRiwgMHg3RCwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRSwKLQkweDA0LCAweEVBLCAweEY0LCAweEQ5LCAweDQwLCAweDY2LCAweDFCLCAweDkzLCAweEY0LCAweDYyLCAweDA2LAotCTB4NjQsIDB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgwQywgMHgwMCwgMHhCMSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg3NiwgMHhGRCwgMHhBOCwgMHgwNSwKLQkweENDLCAweEYyLCAweEFCLCAweDNCLCAweDE4LCAweDIzLCAweEUwLCAweEYyLCAweEY3LCAweDA2LCAweDM1LAotCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgyMCwgMHgwMCwgMHg3QiwgMHhGRiwgMHg2RSwgMHgwMSwgMHhDQSwgMHhGQywgMHg5RCwgMHgwNiwgMHhCMSwKLQkweEYxLCAweDg2LCAweDM1LCAweEFFLCAweDJBLCAweENELCAweEYxLCAweDJCLCAweDA3LCAweDNGLCAweEZDLAotCTB4RDEsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkQsCi0JMHgwMCwgMHg1NCwgMHhGRiwgMHhCNywgMHgwMSwgMHg1RSwgMHhGQywgMHgxOSwgMHgwNywgMHg4OCwgMHhGMSwKLQkweDlGLCAweDJFLCAweEUzLCAweDMxLCAweDdFLCAweEYxLCAweEVFLCAweDA2LCAweDg4LCAweEZDLCAweDlBLAotCTB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMywgMHhGQywgMHgyMCwgMHgwNywgMHgzNSwgMHhGMiwgMHgzNiwKLQkweDI3LCAweDc4LCAweDM4LCAweDE0LCAweEYyLCAweDNCLCAweDA2LCAweDExLCAweEZELCAweDQxLCAweDAxLAotCTB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCi0JMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywgMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwKLQkweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLCAweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLAotCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsCi0JMHhDRSwgMHgwMSwgMHg4QywgMHhGQywgMHgwMCwgMHgwNiwgMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwKLQkweDQyLCAweDNGLCAweEY2LCAweDcxLCAweDAzLCAweEQ5LCAweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLAotCTB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsCi0JMHgwMSwgMHgwMCwgMHhGRCwgMHhGQywgMHgwNCwgMHhENywgMHhGNywgMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwKLQkweEU0LCAweEY5LCAweDZFLCAweDAxLCAweDA2LCAweDAwLCAweDhFLCAweEZGLCAweDZCLCAweDAwLCAweEM2LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsIDB4NUIsIDB4MDEsCi0JMHg5NiwgMHhGRCwgMHhDNiwgMHgwMywgMHg2MSwgMHhGQSwgMHg4MSwgMHgwOSwgMHg1NywgMHg0OCwgMHg4RCwKLQkweEZFLCAweDFCLCAweEZGLCAweDUyLCAweDAxLCAweERCLCAweEZFLCAweEMyLCAweDAwLCAweEE0LCAweEZGLAotCTB4MTYsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NDIsIDB4RkUsIDB4NzQsCi0JMHgwMiwgMHhGOSwgMHhGQywgMHgzOSwgMHgwMywgMHhGNSwgMHg0OCwgMHgyNCwgMHgwNCwgMHg5NCwgMHhGQywKLQkweEE5LCAweDAyLCAweDI3LCAweEZFLCAweDE4LCAweDAxLCAweDgyLCAweEZGLCAweDFGLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MTUsIDB4MDAsIDB4QTksIDB4RkYsIDB4QjQsIDB4MDAsIDB4RjcsIDB4RkUsIDB4MUQsIDB4MDEsCi0JMHg3QSwgMHhGRiwgMHhDNSwgMHhGRCwgMHgxRCwgMHg0OCwgMHg4OSwgMHgwQSwgMHhGQiwgMHhGOSwgMHhGOCwKLQkweDAzLCAweDdELCAweEZELCAweDY2LCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLAotCTB4MEQsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4NUUsIDB4MDAsIDB4QTksIDB4RkYsIDB4RDYsIDB4RkYsIDB4QzMsCi0JMHgwMSwgMHg0MywgMHhGOSwgMHhENywgMHg0NSwgMHg5MiwgMHgxMSwgMHg3NywgMHhGNywgMHgyOCwgMHgwNSwKLQkweEVDLCAweEZDLCAweEE3LCAweDAxLCAweDRBLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDA2LAotCTB4MDAsIDB4RUEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4NEUsIDB4MDAsIDB4QUYsIDB4RkUsIDB4QjgsIDB4MDMsCi0JMHhDNywgMHhGNSwgMHgzOCwgMHg0MiwgMHgwQywgMHgxOSwgMHgzMiwgMHhGNSwgMHgyMywgMHgwNiwgMHg3RCwKLQkweEZDLCAweEQzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLAotCTB4MDUsIDB4MDAsIDB4QzUsIDB4RkYsIDB4REUsIDB4MDAsIDB4QjcsIDB4RkQsIDB4NDUsIDB4MDUsIDB4NTYsCi0JMHhGMywgMHg2MSwgMHgzRCwgMHhCQSwgMHgyMCwgMHg1NiwgMHhGMywgMHhEMywgMHgwNiwgMHgzRSwgMHhGQywKLQkweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDFBLAotCTB4MDAsIDB4OEEsIDB4RkYsIDB4NTEsIDB4MDEsIDB4RjgsIDB4RkMsIDB4NUUsIDB4MDYsIDB4RUQsIDB4RjEsCi0JMHg4MiwgMHgzNywgMHg2MCwgMHgyOCwgMHgwRSwgMHhGMiwgMHgyNiwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwKLQkweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDI5LCAweDAwLAotCTB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsIDB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsIDB4N0QsIDB4RjEsIDB4Q0YsCi0JMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwgMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwgMHhGQywgMHhBRSwgMHgwMSwKLQkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLAotCTB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsIDB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksCi0JMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwgMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwKLQkweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDYsIDB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsCi0JMHgzQywgMHgwRSwgMHhGMywgMHg3OCwgMHgwNSwgMHg5NiwgMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwKLQkweDA4LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LAotCTB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsIDB4RjQsIDB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsCi0JMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwgMHg2NiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwKLQkweEZGLCAweDA2LCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LCAweEZGLCAweEFGLCAweDAxLAotCTB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsIDB4NUMsIDB4NDUsIDB4QTksCi0JMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwgMHgwMCwgMHhEMCwgMHhGRiwKLQkweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLCAweDAxLCAweDY1LAotCTB4RkQsIDB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsIDB4MDMsIDB4RkQsCi0JMHhEOSwgMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwKLQkweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLCAweEZFLAotCTB4REUsIDB4MDIsIDB4MkUsIDB4RkMsIDB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsIDB4NUUsCi0JMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwgMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywgMHgwMCwKLQkweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLCAweEZFLCAweDg2LCAweDAxLCAweEJBLAotCTB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsIDB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsCi0JMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwKLQkweDAwLCAweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LCAweDAxLAotCTB4OEIsIDB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsIDB4MTUsCi0JMHhGRCwgMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMCwKLQkweEUxLCAweEZGLCAweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELAotCTB4RjYsIDB4NzcsIDB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsCi0JMHhDOCwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwKLQkweEZGLCAweEQ5LCAweEZGLCAweEI0LCAweDAwLCAweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLAotCTB4RkMsIDB4M0UsIDB4NUIsIDB4MUUsIDB4REIsIDB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsCi0JMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwKLQkweDlCLCAweEZGLCAweDMxLCAweDAxLCAweDJDLCAweEZELCAweDE1LCAweDA2LCAweDQxLCAweEYyLCAweDZBLAotCTB4MzksIDB4MEEsIDB4MjYsIDB4NjEsIDB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCi0JMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwKLQkweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLCAweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLAotCTB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsIDB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKLQkweENBLCAweDAxLCAweDQ2LCAweEZDLCAweDI5LCAweDA3LCAweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLAotCTB4MzQsIDB4OUMsIDB4RjEsIDB4QjgsIDB4MDYsIDB4QjUsIDB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsCi0JMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKLQkweDAxLCAweDMyLCAweEZDLCAweDA2LCAweDA3LCAweEFBLCAweEYyLCAweDQ2LCAweDI0LCAweEM4LCAweDNBLAotCTB4OTAsIDB4RjIsIDB4RDYsIDB4MDUsIDB4NTcsIDB4RkQsIDB4MTcsIDB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwKLQkweDVBLCAweEZDLCAweDdFLCAweDA2LCAweDQ3LCAweEY0LCAweDk0LCAweDFDLCAweDFGLCAweDQwLCAweDg1LAotCTB4RjQsIDB4N0QsIDB4MDQsIDB4MzYsIDB4RkUsIDB4OTMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4RjcsIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCRSwgMHgwMSwgMHhCNCwKLQkweEZDLCAweEE0LCAweDA1LCAweDYxLCAweEY2LCAweEZCLCAweDE0LCAweDUzLCAweDQ0LCAweDg2LCAweEY3LAotCTB4QjYsIDB4MDIsIDB4NDksIDB4RkYsIDB4RjcsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1NywgMHhGRiwgMHg4NiwgMHgwMSwgMHgzNiwgMHhGRCwKLQkweDg5LCAweDA0LCAweENELCAweEY4LCAweEI3LCAweDBELCAweDNELCAweDQ3LCAweDkxLCAweEZCLCAweDkxLAotCTB4MDAsIDB4ODMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4OEMsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MywgMHhGRiwgMHgzRCwgMHgwMSwgMHhENiwgMHhGRCwgMHg0NiwKLQkweDAzLCAweDYxLCAweEZCLCAweDAwLCAweDA3LCAweEJGLCAweDQ4LCAweDk4LCAweDAwLCAweDI2LCAweEZFLAotCTB4RDUsIDB4MDEsIDB4OTUsIDB4RkUsIDB4RTMsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MUEsCi0JMHgwMCwgMHg5NCwgMHhGRiwgMHhFQSwgMHgwMCwgMHg4NywgMHhGRSwgMHhGMCwgMHgwMSwgMHhGNSwgMHhGRCwKLQkweDA1LCAweDAxLCAweENFLCAweDQ4LCAweDgzLCAweDA2LCAweDk0LCAweEZCLCAweDJDLCAweDAzLCAweEU0LAotCTB4RkQsIDB4MzcsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsCi0JMHhCNiwgMHhGRiwgMHg5MywgMHgwMCwgMHgzQywgMHhGRiwgMHg5RCwgMHgwMCwgMHg2MywgMHgwMCwgMHhFQiwKLQkweEZCLCAweDY5LCAweDQ3LCAweDJELCAweDBELCAweEZGLCAweEY4LCAweDcyLCAweDA0LCAweDQyLCAweEZELAotCTB4ODEsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDcsCi0JMHhGRiwgMHgzRSwgMHgwMCwgMHhFQSwgMHhGRiwgMHg2MCwgMHhGRiwgMHg4RiwgMHgwMiwgMHhDRCwgMHhGNywKLQkweDk5LCAweDQ0LCAweDY4LCAweDE0LCAweDhFLCAweEY2LCAweDkwLCAweDA1LCAweEJDLCAweEZDLCAweEJBLAotCTB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjUsIDB4RkYsCi0JMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwgMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwgMHhCNywgMHhGNCwgMHg3RCwKLQkweDQwLCAweEZELCAweDFCLCAweDZDLCAweEY0LCAweDcwLCAweDA2LCAweDVGLCAweEZDLCAweERFLCAweDAxLAotCTB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsCi0JMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwKLQkweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLCAweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsCi0JMHg3NSwgMHgwMSwgMHhCRiwgMHhGQywgMHhBQiwgMHgwNiwgMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwKLQkweDJCLCAweEJGLCAweEYxLCAweDJBLCAweDA3LCAweDQyLCAweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLAotCTB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsCi0JMHgwMSwgMHg1OCwgMHhGQywgMHgxRCwgMHgwNywgMHg4RSwgMHhGMSwgMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwKLQkweDgxLCAweEYxLCAweEU1LCAweDA2LCAweDkwLCAweEZDLCAweDk0LCAweDAxLCAweDY3LCAweEZGLCAweDI2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTAsIDB4MDEsCi0JMHgzMiwgMHhGQywgMHgxQywgMHgwNywgMHg0QiwgMHhGMiwgMHhBMCwgMHgyNiwgMHhGMiwgMHgzOCwgMHgyQSwKLQkweEYyLCAweDI4LCAweDA2LCAweDFGLCAweEZELCAweDM5LCAweDAxLCAweDk2LCAweEZGLCAweDE2LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDgsCi0JMHhGQywgMHhCMiwgMHgwNiwgMHhCOSwgMHhGMywgMHhGMywgMHgxRSwgMHg5OCwgMHgzRSwgMHhDRiwgMHhGMywKLQkweEYzLCAweDA0LCAweEVCLCAweEZELCAweEJGLCAweDAwLCAweEQ0LCAweEZGLCAweEZGLCAweEZGLCAweDAzLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0IsIDB4MDEsIDB4OTMsIDB4RkMsCi0JMHhFRiwgMHgwNSwgMHhCMCwgMHhGNSwgMHg0QiwgMHgxNywgMHgyQSwgMHg0MywgMHg3RCwgMHhGNiwgMHg0RCwKLQkweDAzLCAweEVGLCAweEZFLCAweDJBLCAweDAwLCAweDFFLCAweDAwLCAweEUzLCAweEZGLCAweDA4LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEYsIDB4RkYsIDB4OTksIDB4MDEsIDB4MEIsIDB4RkQsIDB4RTYsCi0JMHgwNCwgMHgwOCwgMHhGOCwgMHhFNywgMHgwRiwgMHg3QywgMHg0NiwgMHgzNywgMHhGQSwgMHg0MiwgMHgwMSwKLQkweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDcxLCAweDAwLCAweEMzLCAweEZGLCAweDBGLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MjYsIDB4MDAsIDB4NkEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4QTMsIDB4RkQsIDB4QUQsIDB4MDMsCi0JMHg5NCwgMHhGQSwgMHhGRiwgMHgwOCwgMHg3MCwgMHg0OCwgMHhGMywgMHhGRSwgMHhFQSwgMHhGRSwgMHg2QywKLQkweDAxLCAweENELCAweEZFLCAweEM5LCAweDAwLCAweEExLCAweEZGLCAweDE3LCAweDAwLCAweDFELCAweDAwLAotCTB4OEEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NTAsIDB4RkUsIDB4NUEsIDB4MDIsIDB4MkMsIDB4RkQsIDB4QzYsCi0JMHgwMiwgMHhGMiwgMHg0OCwgMHg5QiwgMHgwNCwgMHg2MSwgMHhGQywgMHhDMywgMHgwMiwgMHgxOSwgMHhGRSwKLQkweDFFLCAweDAxLCAweDdGLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweEFDLAotCTB4RkYsIDB4QUUsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MDMsIDB4MDEsIDB4QUEsIDB4RkYsIDB4NjMsIDB4RkQsCi0JMHhGRCwgMHg0NywgMHgwRSwgMHgwQiwgMHhDOCwgMHhGOSwgMHgxMSwgMHgwNCwgMHg3MSwgMHhGRCwgMHg2QywKLQkweDAxLCAweDYxLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweENELCAweEZGLAotCTB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsIDB4RjUsIDB4RjgsIDB4OUIsCi0JMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwgMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwgMHhGQywgMHhBQiwgMHgwMSwKLQkweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LAotCTB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsIDB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsCi0JMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywgMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwKLQkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLAotCTB4RTgsIDB4MDAsIDB4QTYsIDB4RkQsIDB4NUYsIDB4MDUsIDB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsCi0JMHgyMSwgMHgzNywgMHhGMywgMHhERCwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg2LCAweEZGLCAweDU5LAotCTB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsIDB4RjEsIDB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsCi0JMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweEFBLCAweDAxLAotCTB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4MzAsIDB4N0UsCi0JMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwKLQkweEZELCAweEZGLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LCAweDAxLCAweDM3LAotCTB4RkMsIDB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsIDB4REMsIDB4RjEsCi0JMHg2RiwgMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwKLQkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLCAweEZDLAotCTB4REQsIDB4MDYsIDB4MzcsIDB4RjMsIDB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsIDB4NUYsCi0JMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LCAweDAxLCAweDc3LCAweEZDLCAweDMzLAotCTB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsIDB4OEQsIDB4RjUsIDB4REEsIDB4MDMsCi0JMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELCAweDA1LAotCTB4NDgsIDB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsIDB4QkUsCi0JMHhGRiwgMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDI4LCAweDAwLCAweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LAotCTB4RjksIDB4MEUsIDB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsCi0JMHgwNSwgMHhGRiwgMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwKLQkweDAwLCAweDdGLCAweEZGLCAweDFFLCAweDAxLCAweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLAotCTB4OUIsIDB4MDQsIDB4RjIsIDB4NDgsIDB4QzYsIDB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsCi0JMHhGRSwgMHgwNCwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHgxNywgMHgwMCwgMHhBMSwgMHhGRiwKLQkweEM5LCAweDAwLCAweENELCAweEZFLCAweDZDLCAweDAxLCAweEVBLCAweEZFLCAweEYzLCAweEZFLCAweDcwLAotCTB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsIDB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4NTUsIDB4MDEsCi0JMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwKLQkweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LAotCTB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsIDB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwKLQkweDJBLCAweDAwLCAweEVGLCAweEZFLCAweDRELCAweDAzLCAweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLAotCTB4MTcsIDB4QjAsIDB4RjUsIDB4RUYsIDB4MDUsIDB4OTMsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwKLQkweDAwLCAweEVCLCAweEZELCAweEYzLCAweDA0LCAweENGLCAweEYzLCAweDk4LCAweDNFLCAweEYzLCAweDFFLAotCTB4QjksIDB4RjMsIDB4QjIsIDB4MDYsIDB4NDgsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NiwgMHhGRiwgMHgzOSwgMHgwMSwKLQkweDFGLCAweEZELCAweDI4LCAweDA2LCAweDJBLCAweEYyLCAweEYyLCAweDM4LCAweEEwLCAweDI2LCAweDRCLAotCTB4RjIsIDB4MUMsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2NywgMHhGRiwgMHg5NCwgMHgwMSwgMHg5MCwKLQkweEZDLCAweEU1LCAweDA2LCAweDgxLCAweEYxLCAweDZCLCAweDMyLCAweDExLCAweDJFLCAweDhFLCAweEYxLAotCTB4MUQsIDB4MDcsIDB4NTgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OCwgMHhGRiwgMHhDRSwgMHgwMSwgMHg0MiwgMHhGQywKLQkweDJBLCAweDA3LCAweEJGLCAweEYxLCAweDQwLCAweDJCLCAweDA1LCAweDM1LCAweEE2LCAweEYxLCAweEFCLAotCTB4MDYsIDB4QkYsIDB4RkMsIDB4NzUsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywgMHhGRiwKLQkweDA2LCAweEM0LCAweEYyLCAweEIwLCAweDIzLCAweDNCLCAweDNCLCAweEFELCAweEYyLCAweEJGLCAweDA1LAotCTB4NjYsIDB4RkQsIDB4MEUsIDB4MDEsIDB4QUMsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERSwgMHgwMSwgMHg1RiwgMHhGQywgMHg3MCwgMHgwNiwKLQkweDZDLCAweEY0LCAweEZELCAweDFCLCAweDdELCAweDQwLCAweEI3LCAweEY0LCAweDVELCAweDA0LCAweDQ5LAotCTB4RkUsIDB4ODgsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQSwgMHgwMSwgMHhCQywgMHhGQywgMHg5MCwgMHgwNSwgMHg4RSwKLQkweEY2LCAweDY4LCAweDE0LCAweDk5LCAweDQ0LCAweENELCAweEY3LCAweDhGLCAweDAyLCAweDYwLCAweEZGLAotCTB4RUEsIDB4RkYsIDB4M0UsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCi0JMHgwMCwgMHg1OSwgMHhGRiwgMHg4MSwgMHgwMSwgMHg0MiwgMHhGRCwgMHg3MiwgMHgwNCwgMHhGRiwgMHhGOCwKLQkweDJELCAweDBELCAweDY5LCAweDQ3LCAweEVCLCAweEZCLCAweDYzLCAweDAwLCAweDlELCAweDAwLCAweDNDLAotCTB4RkYsIDB4OTMsIDB4MDAsIDB4QjYsIDB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsCi0JMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNCwgMHhGRCwgMHgyQywgMHgwMywgMHg5NCwgMHhGQiwgMHg4MywKLQkweDA2LCAweENFLCAweDQ4LCAweDA1LCAweDAxLCAweEY1LCAweEZELCAweEYwLCAweDAxLCAweDg3LCAweEZFLAotCTB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsCi0JMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwgMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwKLQkweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LCAweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLAotCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsCi0JMHg0QSwgMHhGRiwgMHg4MywgMHgwMCwgMHg5MSwgMHgwMCwgMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywKLQkweDBELCAweENELCAweEY4LCAweDg5LCAweDA0LCAweDM2LCAweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLAotCTB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsCi0JMHhGRiwgMHg0OSwgMHhGRiwgMHhCNiwgMHgwMiwgMHg4NiwgMHhGNywgMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwKLQkweDYxLCAweEY2LCAweEE0LCAweDA1LCAweEI0LCAweEZDLCAweEJFLCAweDAxLCAweDQyLCAweEZGLCAweDMyLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTMsIDB4MDAsCi0JMHgzNiwgMHhGRSwgMHg3RCwgMHgwNCwgMHg4NSwgMHhGNCwgMHgxRiwgMHg0MCwgMHg5NCwgMHgxQywgMHg0NywKLQkweEY0LCAweDdFLCAweDA2LCAweDVBLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTcsIDB4MDEsIDB4NTcsCi0JMHhGRCwgMHhENiwgMHgwNSwgMHg5MCwgMHhGMiwgMHhDOCwgMHgzQSwgMHg0NiwgMHgyNCwgMHhBQSwgMHhGMiwKLQkweDA2LCAweDA3LCAweDMyLCAweEZDLCAweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzQsIDB4RkYsIDB4N0MsIDB4MDEsIDB4QjUsIDB4RkMsCi0JMHhCOCwgMHgwNiwgMHg5QywgMHhGMSwgMHg4MSwgMHgzNCwgMHhEMSwgMHgyQiwgMHhCMywgMHhGMSwgMHgyOSwKLQkweDA3LCAweDQ2LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLAotCTB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QzAsIDB4MDEsIDB4NTMsIDB4RkMsIDB4MjEsCi0JMHgwNywgMHg5NiwgMHhGMSwgMHg4MiwgMHgyRCwgMHhGMiwgMHgzMiwgMHg4NiwgMHhGMSwgMHhEQiwgMHgwNiwKLQkweDk5LCAweEZDLCAweDhFLCAweDAxLCAweDZBLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweEZELAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTcsIDB4MDcsCi0JMHg2MSwgMHhGMiwgMHgwQSwgMHgyNiwgMHg2QSwgMHgzOSwgMHg0MSwgMHhGMiwgMHgxNSwgMHgwNiwgMHgyQywKLQkweEZELCAweDMxLCAweDAxLCAweDlCLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEMsIDB4RkMsIDB4QTYsIDB4MDYsIDB4REIsCi0JMHhGMywgMHg1QiwgMHgxRSwgMHhGQywgMHgzRSwgMHhGQSwgMHhGMywgMHhENywgMHgwNCwgMHhGRCwgMHhGRCwKLQkweEI0LCAweDAwLCAweEQ5LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4M0UsIDB4RkYsIDB4QzgsIDB4MDEsIDB4OUIsIDB4RkMsIDB4REQsIDB4MDUsIDB4REMsIDB4RjUsCi0JMHhCNiwgMHgxNiwgMHg3NywgMHg0MywgMHhCRCwgMHhGNiwgMHgyOCwgMHgwMywgMHgwNSwgMHhGRiwgMHgxRCwKLQkweDAwLCAweDI1LCAweDAwLCAweEUxLCAweEZGLCAweDA4LCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLAotCTB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsIDB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsIDB4MzksIDB4RjgsIDB4NTksCi0JMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwgMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwgMHgwMCwgMHg3MywgMHhGRiwKLQkweDc4LCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLAotCTB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsIDB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsCi0JMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwKLQkweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLCAweDFDLCAweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLAotCTB4NUQsIDB4RkUsIDB4M0YsIDB4MDIsIDB4NUUsIDB4RkQsIDB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsCi0JMHgwNSwgMHgyRSwgMHhGQywgMHhERSwgMHgwMiwgMHgwQywgMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwKLQkweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweEFFLCAweEZGLCAweEE3LCAweDAwLCAweDEyLAotCTB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsIDB4RkQsIDB4REMsIDB4NDcsIDB4OTUsIDB4MEIsCi0JMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwgMHg3MSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwKLQkweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLCAweDAwLCAweEMzLCAweEZGLAotCTB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsIDB4QjIsIDB4MTIsIDB4MTksCi0JMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LCAweDAwLCAweDg1LAotCTB4RkUsIDB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsIDB4RTEsIDB4RjQsCi0JMHg0MywgMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LCAweEZELAotCTB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsIDB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsIDB4RTYsCi0JMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLCAweDAxLCAweEUwLCAweEZDLCAweDdGLAotCTB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksIDB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsCi0JMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKLQkweEZGLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELCAweDA3LAotCTB4ODAsIDB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsIDB4NzgsCi0JMHhGQywgMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLAotCTB4RjIsIDB4NjAsIDB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsCi0JMHg1MSwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLAotCTB4QkEsIDB4MjAsIDB4NjEsIDB4M0QsIDB4NTYsIDB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsCi0JMHgwMCwgMHhDNSwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDNBLCAweEZGLCAweEQzLCAweDAxLCAweDdELCAweEZDLCAweDIzLCAweDA2LCAweDMyLCAweEY1LCAweDBDLAotCTB4MTksIDB4MzgsIDB4NDIsIDB4QzcsIDB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsIDB4RkUsIDB4NEUsIDB4MDAsCi0JMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwKLQkweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLCAweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLAotCTB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsIDB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsCi0JMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwKLQkweDY2LCAweDAxLCAweDdELCAweEZELCAweEY4LCAweDAzLCAweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELAotCTB4NDgsIDB4QzUsIDB4RkQsIDB4N0EsIDB4RkYsIDB4MUQsIDB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsCi0JMHhBOSwgMHhGRiwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwKLQkweDAxLCAweDI3LCAweEZFLCAweEE5LCAweDAyLCAweDk0LCAweEZDLCAweDI0LCAweDA0LCAweEY1LCAweDQ4LAotCTB4MzksIDB4MDMsIDB4RjksIDB4RkMsIDB4NzQsIDB4MDIsIDB4NDIsIDB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMiwgMHgwMCwgMHhEQiwgMHhGRSwKLQkweDUyLCAweDAxLCAweDFCLCAweEZGLCAweDhELCAweEZFLCAweDU3LCAweDQ4LCAweDgxLCAweDA5LCAweDYxLAotCTB4RkEsIDB4QzYsIDB4MDMsIDB4OTYsIDB4RkQsIDB4NUIsIDB4MDEsIDB4NjgsIDB4RkYsIDB4MjYsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDNiwgMHhGRiwgMHg2QiwgMHgwMCwgMHg4RSwgMHhGRiwgMHgwNiwKLQkweDAwLCAweDZFLCAweDAxLCAweEU0LCAweEY5LCAweDQ4LCAweDQ2LCAweDc1LCAweDEwLCAweEQ3LCAweEY3LAotCTB4RkMsIDB4MDQsIDB4MDAsIDB4RkQsIDB4OUUsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwNywgMHgwMCwgMHhFNSwgMHhGRiwgMHgxOCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRSwKLQkweDcxLCAweDAzLCAweDNGLCAweEY2LCAweERCLCAweDQyLCAweEUwLCAweDE3LCAweDg2LCAweEY1LCAweDAwLAotCTB4MDYsIDB4OEMsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRiwgMHhGRiwgMHhDOSwgMHgwMCwgMHhEQSwgMHhGRCwgMHgwRiwKLQkweDA1LCAweEE1LCAweEYzLCAweDMxLCAweDNFLCAweDhBLCAweDFGLCAweDk3LCAweEYzLCAweEJELCAweDA2LAotCTB4NDQsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgxNywgMHgwMCwgMHg5MiwgMHhGRiwgMHg0MSwgMHgwMSwgMHgxMSwgMHhGRCwgMHgzQiwgMHgwNiwKLQkweDE0LCAweEYyLCAweDc4LCAweDM4LCAweDM2LCAweDI3LCAweDM1LCAweEYyLCAweDIwLCAweDA3LCAweDMzLAotCTB4RkMsIDB4REYsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgyOCwgMHgwMCwgMHg2NCwgMHhGRiwgMHg5QSwgMHgwMSwgMHg4OCwgMHhGQywgMHhFRSwgMHgwNiwgMHg3RSwKLQkweEYxLCAweEUzLCAweDMxLCAweDlGLCAweDJFLCAweDg4LCAweEYxLCAweDE5LCAweDA3LCAweDVFLCAweEZDLAotCTB4QjcsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwgMHgzRiwgMHhGQywgMHgyQiwgMHgwNywgMHhDRCwgMHhGMSwKLQkweEFFLCAweDJBLCAweDg2LCAweDM1LCAweEIxLCAweEYxLCAweDlELCAweDA2LCAweENBLCAweEZDLCAweDZFLAotCTB4MDEsIDB4N0IsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNywgMHgwNiwgMHhFMCwgMHhGMiwgMHgxOCwKLQkweDIzLCAweEFCLCAweDNCLCAweENDLCAweEYyLCAweEE4LCAweDA1LCAweDc2LCAweEZELCAweDA0LCAweDAxLAotCTB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCi0JMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywgMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwKLQkweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLCAweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsCi0JMHhCNywgMHgwMSwgMHhDNSwgMHhGQywgMHg3QywgMHgwNSwgMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywKLQkweDQ0LCAweDE0LCAweEY4LCAweDY3LCAweDAyLCAweDc3LCAweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLAotCTB4RDUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsCi0JMHgwMSwgMHg0RSwgMHhGRCwgMHg1QSwgMHgwNCwgMHgzMSwgMHhGOSwgMHhBNCwgMHgwQywgMHg5MCwgMHg0NywKLQkweDQ3LCAweEZDLCAweDM2LCAweDAwLCAweEI2LCAweDAwLCAweDJFLCAweEZGLCAweDk5LCAweDAwLCAweEIzLAotCTB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzgsIDB4RkYsIDB4MzEsIDB4MDEsCi0JMHhGMSwgMHhGRCwgMHgxMiwgMHgwMywgMHhDNywgMHhGQiwgMHgwNywgMHgwNiwgMHhEQiwgMHg0OCwgMHg3MywKLQkweDAxLCAweEMzLCAweEZELCAweDBBLCAweDAyLCAweDc5LCAweEZFLCAweEYxLCAweDAwLCAweDkxLCAweEZGLAotCTB4MUIsIDB4MDAsIDB4MTksIDB4MDAsIDB4OTksIDB4RkYsIDB4REQsIDB4MDAsIDB4QTMsIDB4RkUsIDB4QkIsCi0JMHgwMSwgMHg1OCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhBRiwgMHg0OCwgMHg3RSwgMHgwNywgMHgyRSwgMHhGQiwKLQkweDYwLCAweDAzLCAweEM5LCAweEZELCAweDQzLCAweDAxLCAweDcxLCAweEZGLCAweDI0LCAweDAwLCAweDAwLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4QkIsIDB4RkYsIDB4ODUsIDB4MDAsIDB4NTgsIDB4RkYsIDB4NkEsIDB4MDAsCi0JMHhCRSwgMHgwMCwgMHgzOCwgMHhGQiwgMHgwRiwgMHg0NywgMHg0MiwgMHgwRSwgMHg5QiwgMHhGOCwgMHhBMSwKLQkweDA0LCAweDJCLCAweEZELCAweDhCLCAweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MzEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MzIsIDB4RkYsIDB4REMsCi0JMHgwMiwgMHg0MiwgMHhGNywgMHgwQiwgMHg0NCwgMHg4RSwgMHgxNSwgMHgzNCwgMHhGNiwgMHhCNywgMHgwNSwKLQkweEFCLCAweEZDLCAweEMxLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDA0LAotCTB4MDAsIDB4RjksIDB4RkYsIDB4RTQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjMsIDB4RkUsIDB4OUIsIDB4MDQsCi0JMHg1NSwgMHhGNCwgMHhDMCwgMHgzRiwgMHgyQywgMHgxRCwgMHgyMiwgMHhGNCwgMHg4QywgMHgwNiwgMHg1NSwKLQkweEZDLCAweEUxLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLAotCTB4MTEsIDB4MDAsIDB4QTMsIDB4RkYsIDB4MjAsIDB4MDEsIDB4NDksIDB4RkQsIDB4RUIsIDB4MDUsIDB4NzQsCi0JMHhGMiwgMHg1NCwgMHgzQSwgMHhERCwgMHgyNCwgMHg5MSwgMHhGMiwgMHgwQywgMHgwNywgMHgzMiwgMHhGQywKLQkweEU0LCAweDAxLCAweDNBLCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDIzLAotCTB4MDAsIDB4NzEsIDB4RkYsIDB4ODIsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QzQsIDB4MDYsIDB4OTMsIDB4RjEsCi0JMHhGRCwgMHgzMywgMHg2MiwgMHgyQywgMHhBOCwgMHhGMSwgMHgyNywgMHgwNywgMHg0QSwgMHhGQywgMHhDNywKLQkweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJGLCAweDAwLAotCTB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUUsIDB4RjEsIDB4RjIsCi0JMHgyQywgMHg3OCwgMHgzMywgMHg4QywgMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwgMHhGQywgMHg4OCwgMHgwMSwKLQkweDZELCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLAotCTB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsCi0JMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwgMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwKLQkweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAotCTB4RTIsIDB4MDEsIDB4NTAsIDB4RkMsIDB4OTksIDB4MDYsIDB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsCi0JMHgzRiwgMHgyNywgMHhGNCwgMHhCOSwgMHgwNCwgMHgxMCwgMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwKLQkweEZCLCAweEZGLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM1LAotCTB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsIDB4RjYsIDB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsCi0JMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwKLQkweEZGLCAweDA5LCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweDkwLCAweDAxLAotCTB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsIDB4RTEsIDB4NDYsIDB4RTEsCi0JMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwgMHgwMCwgMHhCRSwgMHhGRiwKLQkweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LCAweDAxLCAweEJDLAotCTB4RkQsIDB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsIDB4QzMsIDB4RkYsCi0JMHg4OSwgMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywgMHhGRiwgMHgxOCwKLQkweDAwLCAweDFDLCAweDAwLCAweDhGLCAweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LCAweDAyLAotCTB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsIDB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsIDB4RjgsCi0JMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwgMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLCAweEZGLCAweEQwLCAweDAwLCAweDA3LAotCTB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsIDB4NjMsIDB4RjksIDB4NDIsIDB4MDQsCi0JMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwKLQkweDAwLCAweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLCAweDAyLAotCTB4NUUsIDB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsIDB4Q0YsCi0JMHhGQywgMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwKLQkweEYwLCAweEZGLCAweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLAotCTB4RjUsIDB4MzIsIDB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsCi0JMHhEQSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwKLQkweDAwLCAweEI2LCAweEZGLCAweEZCLCAweDAwLCAweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLAotCTB4MUMsIDB4M0MsIDB4ODEsIDB4MjIsIDB4RkMsIDB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweDdGLCAweEZGLCAweDY3LCAweDAxLCAweEQ1LCAweEZDLCAweDhFLCAweDA2LCAweEJFLCAweEYxLCAweDA2LAotCTB4MzYsIDB4MUEsIDB4MkEsIDB4REMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsCi0JMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywKLQkweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLCAweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLAotCTB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsIDB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwKLQkweERELCAweDAxLCAweDM0LCAweEZDLCAweDIzLCAweDA3LCAweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLAotCTB4MzcsIDB4MDAsIDB4RjIsIDB4NEQsIDB4MDYsIDB4MDQsIDB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwKLQkweDAxLCAweDQxLCAweEZDLCAweEM4LCAweDA2LCAweDc2LCAweEYzLCAweDIyLCAweDIwLCAweENBLCAweDNELAotCTB4N0QsIDB4RjMsIDB4MkEsIDB4MDUsIDB4QzgsIDB4RkQsIDB4RDQsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsCi0JMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMSwgMHgwMSwKLQkweDg0LCAweEZDLCAweDEyLCAweDA2LCAweDVDLCAweEY1LCAweDc2LCAweDE4LCAweDg5LCAweDQyLCAweDAyLAotCTB4RjYsIDB4OTQsIDB4MDMsIDB4QzQsIDB4RkUsIDB4NDIsIDB4MDAsIDB4MTIsIDB4MDAsIDB4RTgsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMiwgMHgwMSwgMHhGNiwKLQkweEZDLCAweDEyLCAweDA1LCAweEE3LCAweEY3LCAweDAzLCAweDExLCAweDEwLCAweDQ2LCAweDkzLCAweEY5LAotCTB4OTgsIDB4MDEsIDB4RUUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzgsIDB4RkYsIDB4MEUsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg2MCwgMHgwMSwgMHg4QSwgMHhGRCwKLQkweERGLCAweDAzLCAweDJFLCAweEZBLCAweDA0LCAweDBBLCAweDNBLCAweDQ4LCAweDI4LCAweEZFLCAweDRCLAotCTB4RkYsIDB4MzgsIDB4MDEsIDB4RTksIDB4RkUsIDB4QkIsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwKLQkweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLAotCTB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGNCwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHgwMCwgMHgwNywgMHgwMywgMHgxNiwgMHgwNiwKLQkweDdDLCAweDA5LCAweDJBLCAweDBDLCAweDJFLCAweDBELCAweDJBLCAweDBDLCAweDdDLCAweDA5LCAweDE2LAotCTB4MDYsIDB4MDcsIDB4MDMsIDB4RkYsIDB4MDAsIDB4MUEsIDB4MDAsIDB4RjQsIDB4RkYsIDB4RjIsIDB4RkYsCi0JMHhBMCwgMHhGRiwgMHg3MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHg4NiwgMHgwMywgMHg3MywgMHgwOCwgMHg4OCwKLQkweDBELCAweDc4LCAweDEwLCAweEM5LCAweDBGLCAweEQ1LCAweDBCLCAweDhCLCAweDA2LCAweDI4LCAweDAyLAotCTB4REYsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REMsCi0JMHhGRiwgMHg4MCwgMHhGRiwgMHg5QSwgMHhGRiwgMHg0NiwgMHgwMSwgMHgxRSwgMHgwNSwgMHg1QSwgMHgwQSwKLQkweEVELCAweDBFLCAweEFBLCAweDEwLCAweEFGLCAweDBFLCAweEZELCAweDA5LCAweENCLCAweDA0LCAweDE4LAotCTB4MDEsIDB4OEUsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RTEsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkQsIDB4RkYsCi0JMHg2RCwgMHhGRiwgMHhGNiwgMHhGRiwgMHg2NSwgMHgwMiwgMHhFNSwgMHgwNiwgMHgyQiwgMHgwQywgMHhGMywKLQkweDBGLCAweDYwLCAweDEwLCAweDNCLCAweDBELCAweDE2LCAweDA4LCAweDNGLCAweDAzLCAweDUwLCAweDAwLAotCTB4NkUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4RjUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NzUsCi0JMHhGRiwgMHg5MSwgMHgwMCwgMHhDOSwgMHgwMywgMHhDOCwgMHgwOCwgMHhDQywgMHgwRCwgMHg4OSwgMHgxMCwKLQkweDlGLCAweDBGLCAweDg1LCAweDBCLCAweDNCLCAweDA2LCAweEY0LCAweDAxLCAweENELCAweEZGLCAweDcyLAotCTB4RkYsIDB4QzksIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RkYsIDB4N0IsIDB4RkYsCi0JMHhBNSwgMHhGRiwgMHg3MywgMHgwMSwgMHg2QSwgMHgwNSwgMHhBRCwgMHgwQSwgMHgyMSwgMHgwRiwgMHhBNiwKLQkweDEwLCAweDc0LCAweDBFLCAweEE5LCAweDA5LCAweDgzLCAweDA0LCAweEYwLCAweDAwLCAweDg1LCAweEZGLAotCTB4OEIsIDB4RkYsIDB4RTUsIDB4RkYsIDB4RkEsIDB4RkYsIDB4QjcsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHg5RCwgMHgwMiwgMHgzNywgMHgwNywgMHg3OCwgMHgwQywgMHgxNSwgMHgxMCwgMHg0NywgMHgxMCwKLQkweEYzLCAweDBDLCAweEMyLCAweDA3LCAweDAxLCAweDAzLCAweDM1LCAweDAwLCAweDZELCAweEZGLCAweEFELAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4RUIsIDB4RkYsIDB4OTQsIDB4RkYsIDB4N0EsIDB4RkYsIDB4QjMsIDB4MDAsCi0JMHgwRCwgMHgwNCwgMHgxQywgMHgwOSwgMHgwRCwgMHgwRSwgMHg5NywgMHgxMCwgMHg3MywgMHgwRiwgMHgzNSwKLQkweDBCLCAweEVCLCAweDA1LCAweEMxLCAweDAxLCAweEJELCAweEZGLCAweDc1LCAweEZGLCAweENFLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDIsIDB4RkYsIDB4NzcsIDB4RkYsIDB4QjMsIDB4RkYsIDB4QTEsCi0JMHgwMSwgMHhCNywgMHgwNSwgMHhGRiwgMHgwQSwgMHg1MywgMHgwRiwgMHg5RSwgMHgxMCwgMHgzNywgMHgwRSwKLQkweDU1LCAweDA5LCAweDNCLCAweDA0LCAweENCLCAweDAwLCAweDdFLCAweEZGLCAweDkwLCAweEZGLCAweEU5LAotCTB4RkYsIDB4RjgsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RDgsIDB4MDIsCi0JMHg4QSwgMHgwNywgMHhDMiwgMHgwQywgMHgzNCwgMHgxMCwgMHgyQSwgMHgxMCwgMHhBQSwgMHgwQywgMHg2RiwKLQkweDA3LCAweEM0LCAweDAyLCAweDFDLCAweDAwLCAweDZDLCAweEZGLCAweEIzLCAweEZGLCAweEY5LCAweEZGLAotCTB4RTgsIDB4RkYsIDB4OEUsIDB4RkYsIDB4ODAsIDB4RkYsIDB4RDcsIDB4MDAsIDB4NTMsIDB4MDQsIDB4NzEsCi0JMHgwOSwgMHg0QywgMHgwRSwgMHhBMSwgMHgxMCwgMHg0MywgMHgwRiwgMHhFMywgMHgwQSwgMHg5RCwgMHgwNSwKLQkweDkxLCAweDAxLCAweEFFLCAweEZGLCAweDc5LCAweEZGLCAweEQ0LCAweEZGLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4Q0QsIDB4RkYsIDB4NzQsIDB4RkYsIDB4QzIsIDB4RkYsIDB4RDIsIDB4MDEsIDB4MDYsIDB4MDYsCi0JMHg1MCwgMHgwQiwgMHg4MiwgMHgwRiwgMHg5MywgMHgxMCwgMHhGOCwgMHgwRCwgMHgwMCwgMHgwOSwgMHhGNiwKLQkweDAzLCAweEE3LCAweDAwLCAweDc4LCAweEZGLCAweDk2LCAweEZGLCAweEVDLCAweEZGLCAweEY2LCAweEZGLAotCTB4QUIsIDB4RkYsIDB4NkQsIDB4RkYsIDB4M0UsIDB4MDAsIDB4MTUsIDB4MDMsIDB4REUsIDB4MDcsIDB4MEIsCi0JMHgwRCwgMHg1MCwgMHgxMCwgMHgwQSwgMHgxMCwgMHg1RSwgMHgwQywgMHgxQywgMHgwNywgMHg4QSwgMHgwMiwKLQkweDA0LCAweDAwLCAweDZDLCAweEZGLCAweEI5LCAweEZGLCAweEZCLCAweEZGLCAweEU0LCAweEZGLCAweDg5LAotCTB4RkYsIDB4ODgsIDB4RkYsIDB4RkQsIDB4MDAsIDB4OUIsIDB4MDQsIDB4QzUsIDB4MDksIDB4ODgsIDB4MEUsCi0JMHhBOCwgMHgxMCwgMHgxMCwgMHgwRiwgMHg5MSwgMHgwQSwgMHg1MCwgMHgwNSwgMHg2NCwgMHgwMSwgMHhBMSwKLQkweEZGLCAweDdELCAweEZGLCAweEQ5LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM3LCAweEZGLAotCTB4NzEsIDB4RkYsIDB4RDMsIDB4RkYsIDB4MDUsIDB4MDIsIDB4NTUsIDB4MDYsIDB4QTAsIDB4MEIsIDB4QUQsCi0JMHgwRiwgMHg4NCwgMHgxMCwgMHhCNiwgMHgwRCwgMHhBQywgMHgwOCwgMHhCMywgMHgwMywgMHg4NiwgMHgwMCwKLQkweDc0LCAweEZGLCAweDlDLCAweEZGLCAweEYwLCAweEZGLCAweEY0LCAweEZGLCAweEE1LCAweEZGLCAweDZGLAotCTB4RkYsIDB4NUEsIDB4MDAsIDB4NTQsIDB4MDMsIDB4MzIsIDB4MDgsIDB4NTIsIDB4MEQsIDB4NjgsIDB4MTAsCi0JMHhFNiwgMHgwRiwgMHgxMSwgMHgwQywgMHhDQSwgMHgwNiwgMHg1MiwgMHgwMiwgMHhFRiwgMHhGRiwgMHg2RSwKLQkweEZGLCAweEJGLCAweEZGLCAweEZDLCAweEZGLCAweERGLCAweEZGLCAweDg0LCAweEZGLCAweDkxLCAweEZGLAotCTB4MjUsIDB4MDEsIDB4RTQsIDB4MDQsIDB4MTksIDB4MEEsIDB4QzIsIDB4MEUsIDB4QUEsIDB4MTAsIDB4REEsCi0JMHgwRSwgMHgzRSwgMHgwQSwgMHgwNSwgMHgwNSwgMHgzOCwgMHgwMSwgMHg5NiwgMHhGRiwgMHg4MSwgMHhGRiwKLQkweERELCAweEZGLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEMxLCAweEZGLCAweDZFLCAweEZGLCAweEU2LAotCTB4RkYsIDB4M0EsIDB4MDIsIDB4QTYsIDB4MDYsIDB4RUYsIDB4MEIsIDB4RDYsIDB4MEYsIDB4NzEsIDB4MTAsCi0JMHg3MSwgMHgwRCwgMHg1NywgMHgwOCwgMHg3MSwgMHgwMywgMHg2NywgMHgwMCwgMHg3MCwgMHhGRiwgMHhBMiwKLQkweEZGLCAweEYzLCAweEZGLCAweEYxLCAweEZGLCAweDlGLCAweEZGLCAweDcyLCAweEZGLCAweDc4LCAweDAwLAotCTB4OTUsIDB4MDMsIDB4ODYsIDB4MDgsIDB4OTgsIDB4MEQsIDB4N0MsIDB4MTAsIDB4QzAsIDB4MEYsIDB4QzMsCi0JMHgwQiwgMHg3OSwgMHgwNiwgMHgxQywgMHgwMiwgMHhEQiwgMHhGRiwgMHg3MCwgMHhGRiwgMHhDNSwgMHhGRiwKLQkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERCLCAweEZGLCAweDdGLCAweEZGLCAweDlDLCAweEZGLCAweDUwLAotCTB4MDEsIDB4MkYsIDB4MDUsIDB4NkMsIDB4MEEsIDB4RjksIDB4MEUsIDB4QTksIDB4MTAsIDB4QTIsIDB4MEUsCi0JMHhFQSwgMHgwOSwgMHhCQiwgMHgwNCwgMHgwRiwgMHgwMSwgMHg4QywgMHhGRiwgMHg4NywgMHhGRiwgMHhFMiwKLQkweEZGLCAweEZDLCAweEZGLCAweEJDLCAweEZGLCAweDZELCAweEZGLCAweEZBLCAweEZGLCAweDcxLCAweDAyLAotCTB4RjcsIDB4MDYsIDB4M0MsIDB4MEMsIDB4RkIsIDB4MEYsIDB4NUIsIDB4MTAsIDB4MkIsIDB4MEQsIDB4MDMsCi0JMHgwOCwgMHgzMSwgMHgwMywgMHg0QSwgMHgwMCwgMHg2RSwgMHhGRiwgMHhBOCwgMHhGRiwgMHhGNSwgMHhGRiwKLQkweEVFLCAweEZGLCAweDk5LCAweEZGLCAweDc2LCAweEZGLCAweDk4LCAweDAwLCAweEQ4LCAweDAzLCAweERCLAotCTB4MDgsIDB4REIsIDB4MEQsIDB4OEQsIDB4MTAsIDB4OTYsIDB4MEYsIDB4NzMsIDB4MEIsIDB4MjksIDB4MDYsCi0JMHhFOCwgMHgwMSwgMHhDOSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEQ2LCAweEZGLCAweDdBLCAweEZGLCAweEE4LCAweEZGLCAweDdELCAweDAxLCAweDdCLCAweDA1LAotCTB4QkYsIDB4MEEsIDB4MkQsIDB4MEYsIDB4QTUsIDB4MTAsIDB4NjcsIDB4MEUsIDB4OTYsIDB4MDksIDB4NzMsCi0JMHgwNCwgMHhFNywgMHgwMCwgMHg4NCwgMHhGRiwgMHg4QywgMHhGRiwgMHhFNiwgMHhGRiwgMHhGQSwgMHhGRiwKLQkweEI2LCAweEZGLCAweDZDLCAweEZGLCAweDExLCAweDAwLCAweEFBLCAweDAyLCAweDRBLCAweDA3LCAweDg4LAotCTB4MEMsIDB4MUMsIDB4MTAsIDB4NDEsIDB4MTAsIDB4RTMsIDB4MEMsIDB4QUYsIDB4MDcsIDB4RjMsIDB4MDIsCi0JMHgyRiwgMHgwMCwgMHg2QywgMHhGRiwgMHhBRSwgMHhGRiwgMHhGNywgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MywKLQkweEZGLCAweDdCLCAweEZGLCAweEJCLCAweDAwLCAweDFDLCAweDA0LCAweDJGLCAweDA5LCAweDFCLCAweDBFLAotCTB4OUEsIDB4MTAsIDB4NjgsIDB4MEYsIDB4MjMsIDB4MEIsIDB4REEsIDB4MDUsIDB4QjcsIDB4MDEsIDB4QjksCi0JMHhGRiwgMHg3NiwgMHhGRiwgMHhEMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMSwgMHhGRiwKLQkweDc2LCAweEZGLCAweEI2LCAweEZGLCAweEFDLCAweDAxLCAweEM4LCAweDA1LCAweDExLCAweDBCLCAweDVFLAotCTB4MEYsIDB4OUMsIDB4MTAsIDB4MjksIDB4MEUsIDB4NDIsIDB4MDksIDB4MkMsIDB4MDQsIDB4QzIsIDB4MDAsCi0JMHg3RCwgMHhGRiwgMHg5MiwgMHhGRiwgMHhFQSwgMHhGRiwgMHhGOCwgMHhGRiwgMHhCMCwgMHhGRiwgMHg2QywKLQkweEZGLCAweDI5LCAweDAwLCAweEU2LCAweDAyLCAweDlELCAweDA3LCAweEQzLCAweDBDLCAweDNCLCAweDEwLAotCTB4MjMsIDB4MTAsIDB4OTksIDB4MEMsIDB4NUMsIDB4MDcsIDB4QjcsIDB4MDIsIDB4MTYsIDB4MDAsIDB4NkMsCi0JMHhGRiwgMHhCNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhFNywgMHhGRiwgMHg4RCwgMHhGRiwgMHg4MiwgMHhGRiwKLQkweERGLCAweDAwLCAweDYzLCAweDA0LCAweDg0LCAweDA5LCAweDU5LCAweDBFLCAweEEzLCAweDEwLCAweDM4LAotCTB4MEYsIDB4RDEsIDB4MEEsIDB4OEMsIDB4MDUsIDB4ODcsIDB4MDEsIDB4QUIsIDB4RkYsIDB4NzksIDB4RkYsCi0JMHhENSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhDQiwgMHhGRiwgMHg3MywgMHhGRiwgMHhDNiwKLQkweEZGLCAweERELCAweDAxLCAweDE3LCAweDA2LCAweDYyLCAweDBCLCAweDhDLCAweDBGLCAweDkwLCAweDEwLAotCTB4RTksIDB4MEQsIDB4RUQsIDB4MDgsIDB4RTcsIDB4MDMsIDB4QTAsIDB4MDAsIDB4NzcsIDB4RkYsIDB4OTcsCi0JMHhGRiwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg2RCwgMHhGRiwgMHg0NCwgMHgwMCwKLQkweDIzLCAweDAzLCAweEYxLCAweDA3LCAweDFCLCAweDBELCAweDU1LCAweDEwLCAweDAyLCAweDEwLCAweDRELAotCTB4MEMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkEsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHhFMywgMHhGRiwgMHg4OCwgMHhGRiwgMHg4QSwgMHhGRiwgMHgwNiwgMHgwMSwgMHhBQiwKLQkweDA0LCAweEQ4LCAweDA5LCAweDk1LCAweDBFLCAweEE5LCAweDEwLCAweDA1LCAweDBGLCAweDdGLCAweDBBLAotCTB4NDAsIDB4MDUsIDB4NUEsIDB4MDEsIDB4OUYsIDB4RkYsIDB4N0UsIDB4RkYsIDB4REEsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHhDNiwgMHhGRiwgMHg3MCwgMHhGRiwgMHhENywgMHhGRiwgMHgxMCwgMHgwMiwKLQkweDY3LCAweDA2LCAweEIxLCAweDBCLCAweEI3LCAweDBGLCAweDgwLCAweDEwLCAweEE3LCAweDBELCAweDk5LAotCTB4MDgsIDB4QTQsIDB4MDMsIDB4N0YsIDB4MDAsIDB4NzMsIDB4RkYsIDB4OUQsIDB4RkYsIDB4RjAsIDB4RkYsCi0JMHhGMywgMHhGRiwgMHhBMywgMHhGRiwgMHg3MCwgMHhGRiwgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMywgMHg0NSwKLQkweDA4LCAweDYyLCAweDBELCAweDZDLCAweDEwLCAweERFLCAweDBGLCAweDAwLCAweDBDLCAweEI4LCAweDA2LAotCTB4NDYsIDB4MDIsIDB4RUEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4QzAsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhERSwgMHhGRiwgMHg4MywgMHhGRiwgMHg5NCwgMHhGRiwgMHgyRiwgMHgwMSwgMHhGNCwgMHgwNCwKLQkweDJCLCAweDBBLCAweENFLCAweDBFLCAweEFBLCAweDEwLCAweENFLCAweDBFLCAweDJCLCAweDBBLCAweEY0LAotCTB4MDQsIDB4MkYsIDB4MDEsIDB4OTQsIDB4RkYsIDB4ODMsIDB4RkYsIDB4REUsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHhDMCwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFQSwgMHhGRiwgMHg0NiwgMHgwMiwgMHhCOCwgMHgwNiwgMHgwMCwKLQkweDBDLCAweERFLCAweDBGLCAweDZDLCAweDEwLCAweDYyLCAweDBELCAweDQ1LCAweDA4LCAweDYyLCAweDAzLAotCTB4NjAsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RjMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4OUQsCi0JMHhGRiwgMHg3MywgMHhGRiwgMHg3RiwgMHgwMCwgMHhBNCwgMHgwMywgMHg5OSwgMHgwOCwgMHhBNywgMHgwRCwKLQkweDgwLCAweDEwLCAweEI3LCAweDBGLCAweEIxLCAweDBCLCAweDY3LCAweDA2LCAweDEwLCAweDAyLCAweEQ3LAotCTB4RkYsIDB4NzAsIDB4RkYsIDB4QzYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REEsIDB4RkYsCi0JMHg3RSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg1QSwgMHgwMSwgMHg0MCwgMHgwNSwgMHg3RiwgMHgwQSwgMHgwNSwKLQkweDBGLCAweEE5LCAweDEwLCAweDk1LCAweDBFLCAweEQ4LCAweDA5LCAweEFCLCAweDA0LCAweDA2LCAweDAxLAotCTB4OEEsIDB4RkYsIDB4ODgsIDB4RkYsIDB4RTMsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QkEsIDB4RkYsIDB4NkQsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHg3RSwgMHgwMiwgMHgwQSwgMHgwNywgMHg0RCwgMHgwQywgMHgwMiwgMHgxMCwKLQkweDU1LCAweDEwLCAweDFCLCAweDBELCAweEYxLCAweDA3LCAweDIzLCAweDAzLCAweDQ0LCAweDAwLCAweDZELAotCTB4RkYsIDB4QTksIDB4RkYsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NzcsIDB4RkYsCi0JMHhBMCwgMHgwMCwgMHhFNywgMHgwMywgMHhFRCwgMHgwOCwgMHhFOSwgMHgwRCwgMHg5MCwgMHgxMCwgMHg4QywKLQkweDBGLCAweDYyLCAweDBCLCAweDE3LCAweDA2LCAweERELCAweDAxLCAweEM2LCAweEZGLCAweDczLCAweEZGLAotCTB4Q0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUIsCi0JMHhGRiwgMHg4NywgMHgwMSwgMHg4QywgMHgwNSwgMHhEMSwgMHgwQSwgMHgzOCwgMHgwRiwgMHhBMywgMHgxMCwKLQkweDU5LCAweDBFLCAweDg0LCAweDA5LCAweDYzLCAweDA0LCAweERGLCAweDAwLCAweDgyLCAweEZGLCAweDhELAotCTB4RkYsIDB4RTcsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjQsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTYsIDB4MDAsCi0JMHhCNywgMHgwMiwgMHg1QywgMHgwNywgMHg5OSwgMHgwQywgMHgyMywgMHgxMCwgMHgzQiwgMHgxMCwgMHhEMywKLQkweDBDLCAweDlELCAweDA3LCAweEU2LCAweDAyLCAweDI5LCAweDAwLCAweDZDLCAweEZGLCAweEIwLCAweEZGLAotCTB4RjgsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTIsIDB4RkYsIDB4N0QsIDB4RkYsIDB4QzIsIDB4MDAsIDB4MkMsCi0JMHgwNCwgMHg0MiwgMHgwOSwgMHgyOSwgMHgwRSwgMHg5QywgMHgxMCwgMHg1RSwgMHgwRiwgMHgxMSwgMHgwQiwKLQkweEM4LCAweDA1LCAweEFDLCAweDAxLCAweEI2LCAweEZGLCAweDc2LCAweEZGLCAweEQxLCAweEZGLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4NzYsIDB4RkYsIDB4QjksIDB4RkYsIDB4QjcsIDB4MDEsCi0JMHhEQSwgMHgwNSwgMHgyMywgMHgwQiwgMHg2OCwgMHgwRiwgMHg5QSwgMHgxMCwgMHgxQiwgMHgwRSwgMHgyRiwKLQkweDA5LCAweDFDLCAweDA0LCAweEJCLCAweDAwLCAweDdCLCAweEZGLCAweDkzLCAweEZGLCAweEVBLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4QUUsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RjMsIDB4MDIsIDB4QUYsCi0JMHgwNywgMHhFMywgMHgwQywgMHg0MSwgMHgxMCwgMHgxQywgMHgxMCwgMHg4OCwgMHgwQywgMHg0QSwgMHgwNywKLQkweEFBLCAweDAyLCAweDExLCAweDAwLCAweDZDLCAweEZGLCAweEI2LCAweEZGLCAweEZBLCAweEZGLCAweEU2LAotCTB4RkYsIDB4OEMsIDB4RkYsIDB4ODQsIDB4RkYsIDB4RTcsIDB4MDAsIDB4NzMsIDB4MDQsIDB4OTYsIDB4MDksCi0JMHg2NywgMHgwRSwgMHhBNSwgMHgxMCwgMHgyRCwgMHgwRiwgMHhCRiwgMHgwQSwgMHg3QiwgMHgwNSwgMHg3RCwKLQkweDAxLCAweEE4LCAweEZGLCAweDdBLCAweEZGLCAweEQ2LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLAotCTB4Q0EsIDB4RkYsIDB4NzIsIDB4RkYsIDB4QzksIDB4RkYsIDB4RTgsIDB4MDEsIDB4MjksIDB4MDYsIDB4NzMsCi0JMHgwQiwgMHg5NiwgMHgwRiwgMHg4RCwgMHgxMCwgMHhEQiwgMHgwRCwgMHhEQiwgMHgwOCwgMHhEOCwgMHgwMywKLQkweDk4LCAweDAwLCAweDc2LCAweEZGLCAweDk5LCAweEZGLCAweEVFLCAweEZGLCAweEY1LCAweEZGLCAweEE4LAotCTB4RkYsIDB4NkUsIDB4RkYsIDB4NEEsIDB4MDAsIDB4MzEsIDB4MDMsIDB4MDMsIDB4MDgsIDB4MkIsIDB4MEQsCi0JMHg1QiwgMHgxMCwgMHhGQiwgMHgwRiwgMHgzQywgMHgwQywgMHhGNywgMHgwNiwgMHg3MSwgMHgwMiwgMHhGQSwKLQkweEZGLCAweDZELCAweEZGLCAweEJDLCAweEZGLCAweEZDLCAweEZGLCAweEUyLCAweEZGLCAweDg3LCAweEZGLAotCTB4OEMsIDB4RkYsIDB4MEYsIDB4MDEsIDB4QkIsIDB4MDQsIDB4RUEsIDB4MDksIDB4QTIsIDB4MEUsIDB4QTksCi0JMHgxMCwgMHhGOSwgMHgwRSwgMHg2QywgMHgwQSwgMHgyRiwgMHgwNSwgMHg1MCwgMHgwMSwgMHg5QywgMHhGRiwKLQkweDdGLCAweEZGLCAweERCLCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM1LCAweEZGLCAweDcwLAotCTB4RkYsIDB4REIsIDB4RkYsIDB4MUMsIDB4MDIsIDB4NzksIDB4MDYsIDB4QzMsIDB4MEIsIDB4QzAsIDB4MEYsCi0JMHg3QywgMHgxMCwgMHg5OCwgMHgwRCwgMHg4NiwgMHgwOCwgMHg5NSwgMHgwMywgMHg3OCwgMHgwMCwgMHg3MiwKLQkweEZGLCAweDlGLCAweEZGLCAweEYxLCAweEZGLCAweEYzLCAweEZGLCAweEEyLCAweEZGLCAweDcwLCAweEZGLAotCTB4NjcsIDB4MDAsIDB4NzEsIDB4MDMsIDB4NTcsIDB4MDgsIDB4NzEsIDB4MEQsIDB4NzEsIDB4MTAsIDB4RDYsCi0JMHgwRiwgMHhFRiwgMHgwQiwgMHhBNiwgMHgwNiwgMHgzQSwgMHgwMiwgMHhFNiwgMHhGRiwgMHg2RSwgMHhGRiwKLQkweEMxLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERELCAweEZGLCAweDgxLCAweEZGLCAweDk2LAotCTB4RkYsIDB4MzgsIDB4MDEsIDB4MDUsIDB4MDUsIDB4M0UsIDB4MEEsIDB4REEsIDB4MEUsIDB4QUEsIDB4MTAsCi0JMHhDMiwgMHgwRSwgMHgxOSwgMHgwQSwgMHhFNCwgMHgwNCwgMHgyNSwgMHgwMSwgMHg5MSwgMHhGRiwgMHg4NCwKLQkweEZGLCAweERGLCAweEZGLCAweEZDLCAweEZGLCAweEJGLCAweEZGLCAweDZFLCAweEZGLCAweEVGLCAweEZGLAotCTB4NTIsIDB4MDIsIDB4Q0EsIDB4MDYsIDB4MTEsIDB4MEMsIDB4RTYsIDB4MEYsIDB4NjgsIDB4MTAsIDB4NTIsCi0JMHgwRCwgMHgzMiwgMHgwOCwgMHg1NCwgMHgwMywgMHg1QSwgMHgwMCwgMHg2RiwgMHhGRiwgMHhBNSwgMHhGRiwKLQkweEY0LCAweEZGLCAweEYwLCAweEZGLCAweDlDLCAweEZGLCAweDc0LCAweEZGLCAweDg2LCAweDAwLCAweEIzLAotCTB4MDMsIDB4QUMsIDB4MDgsIDB4QjYsIDB4MEQsIDB4ODQsIDB4MTAsIDB4QUQsIDB4MEYsIDB4QTAsIDB4MEIsCi0JMHg1NSwgMHgwNiwgMHgwNSwgMHgwMiwgMHhEMywgMHhGRiwgMHg3MSwgMHhGRiwgMHhDNywgMHhGRiwgMHhGRSwKLQkweEZGLCAweDAwLCAweDAwLCAweEQ5LCAweEZGLCAweDdELCAweEZGLCAweEExLCAweEZGLCAweDY0LCAweDAxLAotCTB4NTAsIDB4MDUsIDB4OTEsIDB4MEEsIDB4MTAsIDB4MEYsIDB4QTgsIDB4MTAsIDB4ODgsIDB4MEUsIDB4QzUsCi0JMHgwOSwgMHg5QiwgMHgwNCwgMHhGRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHg4OSwgMHhGRiwgMHhFNCwgMHhGRiwKLQkweEZCLCAweEZGLCAweEI5LCAweEZGLCAweDZDLCAweEZGLCAweDA0LCAweDAwLCAweDhBLCAweDAyLCAweDFDLAotCTB4MDcsIDB4NUUsIDB4MEMsIDB4MEEsIDB4MTAsIDB4NTAsIDB4MTAsIDB4MEIsIDB4MEQsIDB4REUsIDB4MDcsCi0JMHgxNSwgMHgwMywgMHgzRSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBQiwgMHhGRiwgMHhGNiwgMHhGRiwgMHhFQywKLQkweEZGLCAweDk2LCAweEZGLCAweDc4LCAweEZGLCAweEE3LCAweDAwLCAweEY2LCAweDAzLCAweDAwLCAweDA5LAotCTB4RjgsIDB4MEQsIDB4OTMsIDB4MTAsIDB4ODIsIDB4MEYsIDB4NTAsIDB4MEIsIDB4MDYsIDB4MDYsIDB4RDIsCi0JMHgwMSwgMHhDMiwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweEQ0LCAweEZGLCAweDc5LCAweEZGLCAweEFFLCAweEZGLCAweDkxLCAweDAxLCAweDlELCAweDA1LCAweEUzLAotCTB4MEEsIDB4NDMsIDB4MEYsIDB4QTEsIDB4MTAsIDB4NEMsIDB4MEUsIDB4NzEsIDB4MDksIDB4NTMsIDB4MDQsCi0JMHhENywgMHgwMCwgMHg4MCwgMHhGRiwgMHg4RSwgMHhGRiwgMHhFOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhCMywKLQkweEZGLCAweDZDLCAweEZGLCAweDFDLCAweDAwLCAweEM0LCAweDAyLCAweDZGLCAweDA3LCAweEFBLCAweDBDLAotCTB4MkEsIDB4MTAsIDB4MzQsIDB4MTAsIDB4QzIsIDB4MEMsIDB4OEEsIDB4MDcsIDB4RDgsIDB4MDIsIDB4MjQsCi0JMHgwMCwgMHg2QywgMHhGRiwgMHhCMSwgMHhGRiwgMHhGOCwgMHhGRiwgMHhFOSwgMHhGRiwgMHg5MCwgMHhGRiwKLQkweDdFLCAweEZGLCAweENCLCAweDAwLCAweDNCLCAweDA0LCAweDU1LCAweDA5LCAweDM3LCAweDBFLCAweDlFLAotCTB4MTAsIDB4NTMsIDB4MEYsIDB4RkYsIDB4MEEsIDB4QjcsIDB4MDUsIDB4QTEsIDB4MDEsIDB4QjMsIDB4RkYsCi0JMHg3NywgMHhGRiwgMHhEMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRSwgMHhGRiwgMHg3NSwKLQkweEZGLCAweEJELCAweEZGLCAweEMxLCAweDAxLCAweEVCLCAweDA1LCAweDM1LCAweDBCLCAweDczLCAweDBGLAotCTB4OTcsIDB4MTAsIDB4MEQsIDB4MEUsIDB4MUMsIDB4MDksIDB4MEQsIDB4MDQsIDB4QjMsIDB4MDAsIDB4N0EsCi0JMHhGRiwgMHg5NCwgMHhGRiwgMHhFQiwgMHhGRiwgMHhGNywgMHhGRiwgMHhBRCwgMHhGRiwgMHg2RCwgMHhGRiwKLQkweDM1LCAweDAwLCAweDAxLCAweDAzLCAweEMyLCAweDA3LCAweEYzLCAweDBDLCAweDQ3LCAweDEwLCAweDE1LAotCTB4MTAsIDB4NzgsIDB4MEMsIDB4MzcsIDB4MDcsIDB4OUQsIDB4MDIsIDB4MEMsIDB4MDAsIDB4NkMsIDB4RkYsCi0JMHhCNywgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNSwgMHhGRiwgMHg4QiwgMHhGRiwgMHg4NSwgMHhGRiwgMHhGMCwKLQkweDAwLCAweDgzLCAweDA0LCAweEE5LCAweDA5LCAweDc0LCAweDBFLCAweEE2LCAweDEwLCAweDIxLCAweDBGLAotCTB4QUQsIDB4MEEsIDB4NkEsIDB4MDUsIDB4NzMsIDB4MDEsIDB4QTUsIDB4RkYsIDB4N0IsIDB4RkYsIDB4RDcsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDOSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDRCwgMHhGRiwKLQkweEY0LCAweDAxLCAweDNCLCAweDA2LCAweDg1LCAweDBCLCAweDlGLCAweDBGLCAweDg5LCAweDEwLCAweENDLAotCTB4MEQsIDB4QzgsIDB4MDgsIDB4QzksIDB4MDMsIDB4OTEsIDB4MDAsIDB4NzUsIDB4RkYsIDB4OUEsIDB4RkYsCi0JMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBNywgMHhGRiwgMHg2RSwgMHhGRiwgMHg1MCwgMHgwMCwgMHgzRiwKLQkweDAzLCAweDE2LCAweDA4LCAweDNCLCAweDBELCAweDYwLCAweDEwLCAweEYzLCAweDBGLCAweDJCLCAweDBDLAotCTB4RTUsIDB4MDYsIDB4NjUsIDB4MDIsIDB4RjYsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkQsIDB4RkYsIDB4RkMsCi0JMHhGRiwgMHhFMSwgMHhGRiwgMHg4NSwgMHhGRiwgMHg4RSwgMHhGRiwgMHgxOCwgMHgwMSwgMHhDQiwgMHgwNCwKLQkweEZELCAweDA5LCAweEFGLCAweDBFLCAweEFBLCAweDEwLCAweEVELCAweDBFLCAweDVBLCAweDBBLCAweDFFLAotCTB4MDUsIDB4NDYsIDB4MDEsIDB4OUEsIDB4RkYsIDB4ODAsIDB4RkYsIDB4REMsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHhDMywgMHhGRiwgMHg2RiwgMHhGRiwgMHhERiwgMHhGRiwgMHgyOCwgMHgwMiwgMHg4QiwKLQkweDA2LCAweEQ1LCAweDBCLCAweEM5LCAweDBGLCAweDc4LCAweDEwLCAweDg4LCAweDBELCAweDczLCAweDA4LAotCTB4ODYsIDB4MDMsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RjIsIDB4RkYsIDB4RjIsCi0JMHhGRiwgMHhBMSwgMHhGRiwgMHg3MSwgMHhGRiwgMHg2RSwgMHgwMCwgMHg3RiwgMHgwMywgMHg2QSwgMHgwOCwKLQkweDgxLCAweDBELCAweDc2LCAweDEwLCAweENELCAweDBGLCAweERELCAweDBCLCAweDk0LCAweDA2LCAweDJFLAotCTB4MDIsIDB4RTEsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHhEQywgMHhGRiwgMHg4MCwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MiwgMHgwMSwgMHgxNiwgMHgwNSwgMHg1MCwKLQkweDBBLCAweEU3LCAweDBFLCAweEFBLCAweDEwLCAweEI1LCAweDBFLCAweDA2LCAweDBBLCAweEQzLCAweDA0LAotCTB4MUMsIDB4MDEsIDB4OEYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RTAsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkUsCi0JMHhGRiwgMHg2RCwgMHhGRiwgMHhGMywgMHhGRiwgMHg1RSwgMHgwMiwgMHhEQywgMHgwNiwgMHgyMywgMHgwQywKLQkweEVGLCAweDBGLCAweDYzLCAweDEwLCAweDQzLCAweDBELCAweDFGLCAweDA4LCAweDQ2LCAweDAzLCAweDUzLAotCTB4MDAsIDB4NkUsIDB4RkYsIDB4QTYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4RUYsIDB4RkYsIDB4OUIsIDB4RkYsCi0JMHg3NSwgMHhGRiwgMHg4RCwgMHgwMCwgMHhDMSwgMHgwMywgMHhCRSwgMHgwOCwgMHhDNCwgMHgwRCwgMHg4OCwKLQkweDEwLCAweEE0LCAweDBGLCAweDhFLCAweDBCLCAweDQzLCAweDA2LCAweEY5LCAweDAxLCAweENGLCAweEZGLAotCTB4NzEsIDB4RkYsIDB4QzgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RkYsIDB4N0MsCi0JMHhGRiwgMHhBNCwgMHhGRiwgMHg2RSwgMHgwMSwgMHg2MSwgMHgwNSwgMHhBMywgMHgwQSwgMHgxQywgMHgwRiwKLQkweEE3LCAweDEwLCAweDdCLCAweDBFLCAweEIyLCAweDA5LCAweDhCLCAweDA0LCAweEY0LCAweDAwLCAweDg2LAotCTB4RkYsIDB4OEEsIDB4RkYsIDB4RTQsIDB4RkYsIDB4RkEsIDB4RkYsIDB4QjgsIDB4RkYsIDB4NkMsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHg5NywgMHgwMiwgMHgyRSwgMHgwNywgMHg2RiwgMHgwQywgMHgxMSwgMHgxMCwgMHg0QSwKLQkweDEwLCAweEZCLCAweDBDLCAweENCLCAweDA3LCAweDA3LCAweDAzLCAweDM4LCAweDAwLCAweDZELCAweEZGLAotCTB4QUMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUMsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUYsCi0JMHgwMCwgMHgwNSwgMHgwNCwgMHgxMywgMHgwOSwgMHgwNiwgMHgwRSwgMHg5NiwgMHgxMCwgMHg3OCwgMHgwRiwKLQkweDNFLCAweDBCLCAweEY0LCAweDA1LCAweEM3LCAweDAxLCAweEJGLCAweEZGLCAweDc0LCAweEZGLCAweENFLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDIsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QjEsIDB4RkYsCi0JMHg5QywgMHgwMSwgMHhBRSwgMHgwNSwgMHhGNiwgMHgwQSwgMHg0RSwgMHgwRiwgMHg5RiwgMHgxMCwgMHgzRSwKLQkweDBFLCAweDVFLCAweDA5LCAweDQzLCAweDA0LCAweENGLCAweDAwLCAweDdGLCAweEZGLCAweDkwLCAweEZGLAotCTB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjIsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RDIsCi0JMHgwMiwgMHg4MSwgMHgwNywgMHhCQSwgMHgwQywgMHgzMSwgMHgxMCwgMHgyRSwgMHgxMCwgMHhCMiwgMHgwQywKLQkweDc4LCAweDA3LCAweENCLCAweDAyLCAweDFFLCAweDAwLCAweDZDLCAweEZGLCAweEIyLCAweEZGLCAweEY5LAotCTB4RkYsIDB4RTgsIDB4RkYsIDB4OEYsIDB4RkYsIDB4ODAsIDB4RkYsIDB4RDMsIDB4MDAsIDB4NEIsIDB4MDQsCi0JMHg2NywgMHgwOSwgMHg0NSwgMHgwRSwgMHhBMCwgMHgxMCwgMHg0OCwgMHgwRiwgMHhFQywgMHgwQSwgMHhBNiwKLQkweDA1LCAweDk3LCAweDAxLCAweEIwLCAweEZGLCAweDc4LCAweEZGLCAweEQzLCAweEZGLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4NzQsIDB4RkYsIDB4QzAsIDB4RkYsIDB4Q0MsIDB4MDEsIDB4RkQsCi0JMHgwNSwgMHg0NywgMHgwQiwgMHg3RCwgMHgwRiwgMHg5NCwgMHgxMCwgMHhGRiwgMHgwRCwgMHgwQSwgMHgwOSwKLQkweEZFLCAweDAzLCAweEFCLCAweDAwLCAweDc5LCAweEZGLCAweDk1LCAweEZGLCAweEVDLCAweEZGLCAweEY3LAotCTB4RkYsIDB4QUMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4M0IsIDB4MDAsIDB4MEUsIDB4MDMsIDB4RDUsIDB4MDcsCi0JMHgwMywgMHgwRCwgMHg0RCwgMHgxMCwgMHgwRSwgMHgxMCwgMHg2NywgMHgwQywgMHgyNSwgMHgwNywgMHg5MSwKLQkweDAyLCAweDA3LCAweDAwLCAweDZDLCAweEZGLCAweEI4LCAweEZGLCAweEZCLCAweEZGLCAweEU0LCAweEZGLAotCTB4ODksIDB4RkYsIDB4ODcsIDB4RkYsIDB4RjksIDB4MDAsIDB4OTMsIDB4MDQsIDB4QkMsIDB4MDksIDB4ODIsCi0JMHgwRSwgMHhBNywgMHgxMCwgMHgxNiwgMHgwRiwgMHg5QSwgMHgwQSwgMHg1OSwgMHgwNSwgMHg2OSwgMHgwMSwKLQkweEEzLCAweEZGLCAweDdDLCAweEZGLCAweEQ4LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM4LAotCTB4RkYsIDB4NzEsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NEMsIDB4MDYsIDB4OTcsIDB4MEIsCi0JMHhBOSwgMHgwRiwgMHg4NiwgMHgxMCwgMHhCRCwgMHgwRCwgMHhCNSwgMHgwOCwgMHhCQSwgMHgwMywgMHg4QSwKLQkweDAwLCAweDc0LCAweEZGLCAweDlCLCAweEZGLCAweEVGLCAweEZGLCAweEY0LCAweEZGLCAweEE1LCAweEZGLAotCTB4NkYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4NEQsIDB4MDMsIDB4MjksIDB4MDgsIDB4NEIsIDB4MEQsIDB4NjUsCi0JMHgxMCwgMHhFQiwgMHgwRiwgMHgxQSwgMHgwQywgMHhEMywgMHgwNiwgMHg1OCwgMHgwMiwgMHhGMSwgMHhGRiwKLQkweDZELCAweEZGLCAweEJFLCAweEZGLCAweEZDLCAweEZGLCAweEUwLCAweEZGLCAweDg0LCAweEZGLCAweDkwLAotCTB4RkYsIDB4MjEsIDB4MDEsIDB4REMsIDB4MDQsIDB4MTAsIDB4MEEsIDB4QkIsIDB4MEUsIDB4QUEsIDB4MTAsCi0JMHhFMSwgMHgwRSwgMHg0NywgMHgwQSwgMHgwRCwgMHgwNSwgMHgzRCwgMHgwMSwgMHg5NywgMHhGRiwgMHg4MSwKLQkweEZGLCAweERELCAweEZGLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEMyLCAweEZGLCAweDZGLCAweEZGLAotCTB4RTQsIDB4RkYsIDB4MzQsIDB4MDIsIDB4OUQsIDB4MDYsIDB4RTYsIDB4MEIsIDB4RDEsIDB4MEYsIDB4NzMsCi0JMHgxMCwgMHg3OSwgMHgwRCwgMHg2MSwgMHgwOCwgMHg3OCwgMHgwMywgMHg2QSwgMHgwMCwgMHg3MCwgMHhGRiwKLQkweEExLCAweEZGLCAweEYyLCAweEZGLCAweEYxLCAweEZGLCAweDlGLCAweEZGLCAweDcyLCAweEZGLCAweDc0LAotCTB4MDAsIDB4OEUsIDB4MDMsIDB4N0QsIDB4MDgsIDB4OTAsIDB4MEQsIDB4N0EsIDB4MTAsIDB4QzQsIDB4MEYsCi0JMHhDQywgMHgwQiwgMHg4MiwgMHgwNiwgMHgyMiwgMHgwMiwgMHhERCwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDNCwKLQkweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERCLCAweEZGLCAweDdGLCAweEZGLCAweDlCLCAweEZGLAotCTB4NEIsIDB4MDEsIDB4MjYsIDB4MDUsIDB4NjMsIDB4MEEsIDB4RjMsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QTgsCi0JMHgwRSwgMHhGNCwgMHgwOSwgMHhDMywgMHgwNCwgMHgxMywgMHgwMSwgMHg4RCwgMHhGRiwgMHg4NiwgMHhGRiwKLQkweEUxLCAweEZGLCAweEZDLCAweEZGLCAweEJDLCAweEZGLCAweDZELCAweEZGLCAweEY4LCAweEZGLCAweDZCLAotCTB4MDIsIDB4RUUsIDB4MDYsIDB4MzQsIDB4MEMsIDB4RjcsIDB4MEYsIDB4NUQsIDB4MTAsIDB4MzMsIDB4MEQsCi0JMHgwRCwgMHgwOCwgMHgzOCwgMHgwMywgMHg0RCwgMHgwMCwgMHg2RSwgMHhGRiwgMHhBNywgMHhGRiwgMHhGNSwKLQkweEZGLCAweEVFLCAweEZGLCAweDk5LCAweEZGLCAweDc2LCAweEZGLCAweDk0LCAweDAwLCAweEQwLCAweDAzLAotCTB4RDEsIDB4MDgsIDB4RDMsIDB4MEQsIDB4OEIsIDB4MTAsIDB4OUEsIDB4MEYsIDB4N0MsIDB4MEIsIDB4MzIsCi0JMHgwNiwgMHhFRSwgMHgwMSwgMHhDQiwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDAwLCAweDAwLCAweEQ2LCAweEZGLCAweDdCLCAweEZGLCAweEE3LCAweEZGLCAweDc4LCAweDAxLCAweDcyLAotCTB4MDUsIDB4QjYsIDB4MEEsIDB4MjcsIDB4MEYsIDB4QTUsIDB4MTAsIDB4NkUsIDB4MEUsIDB4QTAsIDB4MDksCi0JMHg3QiwgMHgwNCwgMHhFQywgMHgwMCwgMHg4NSwgMHhGRiwgMHg4QiwgMHhGRiwgMHhFNSwgMHhGRiwgMHhGQSwKLQkweEZGLCAweEI2LCAweEZGLCAweDZDLCAweEZGLCAweDBFLCAweDAwLCAweEE0LCAweDAyLCAweDQxLCAweDA3LAotCTB4ODAsIDB4MEMsIDB4MTksIDB4MTAsIDB4NDQsIDB4MTAsIDB4RUIsIDB4MEMsIDB4QjksIDB4MDcsIDB4RkEsCi0JMHgwMiwgMHgzMiwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBRSwgMHhGRiwgMHhGNywgMHhGRiwgMHhFQiwgMHhGRiwKLQkweDkzLCAweEZGLCAweDdCLCAweEZGLCAweEI3LCAweDAwLCAweDE1LCAweDA0LCAweDI2LCAweDA5LCAweDE0LAotCTB4MEUsIDB4OTgsIDB4MTAsIDB4NkQsIDB4MEYsIDB4MkMsIDB4MEIsIDB4RTMsIDB4MDUsIDB4QkMsIDB4MDEsCi0JMHhCQiwgMHhGRiwgMHg3NSwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMSwKLQkweEZGLCAweDc3LCAweEZGLCAweEI1LCAweEZGLCAweEE2LCAweDAxLCAweEMwLCAweDA1LCAweDA4LCAweDBCLAotCTB4NTgsIDB4MEYsIDB4OUQsIDB4MTAsIDB4MzAsIDB4MEUsIDB4NEIsIDB4MDksIDB4MzQsIDB4MDQsIDB4QzYsCi0JMHgwMCwgMHg3RCwgMHhGRiwgMHg5MSwgMHhGRiwgMHhFOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHhCMCwgMHhGRiwKLQkweDZDLCAweEZGLCAweDI3LCAweDAwLCAweERGLCAweDAyLCAweDk0LCAweDA3LCAweENBLCAweDBDLCAweDM3LAotCTB4MTAsIDB4MjcsIDB4MTAsIDB4QTEsIDB4MEMsIDB4NjUsIDB4MDcsIDB4QkUsIDB4MDIsIDB4MTksIDB4MDAsCi0JMHg2QywgMHhGRiwgMHhCNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhFNywgMHhGRiwgMHg4RSwgMHhGRiwgMHg4MSwKLQkweEZGLCAweERCLCAweDAwLCAweDVCLCAweDA0LCAweDdBLCAweDA5LCAweDUzLCAweDBFLCAweEEyLCAweDEwLAotCTB4M0QsIDB4MEYsIDB4REEsIDB4MEEsIDB4OTUsIDB4MDUsIDB4OEMsIDB4MDEsIDB4QUQsIDB4RkYsIDB4NzksCi0JMHhGRiwgMHhENCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhDQywgMHhGRiwgMHg3MywgMHhGRiwKLQkweEM0LCAweEZGLCAweEQ3LCAweDAxLCAweDBFLCAweDA2LCAweDU5LCAweDBCLCAweDg3LCAweDBGLCAweDkxLAotCTB4MTAsIDB4RjAsIDB4MEQsIDB4RjcsIDB4MDgsIDB4RUYsIDB4MDMsIDB4QTMsIDB4MDAsIDB4NzgsIDB4RkYsCi0JMHg5NywgMHhGRiwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHhBQSwgMHhGRiwgMHg2RCwgMHhGRiwgMHg0MSwKLQkweDAwLCAweDFDLCAweDAzLCAweEU3LCAweDA3LCAweDEzLCAweDBELCAweDUyLCAweDEwLCAweDA2LCAweDEwLAotCTB4NTYsIDB4MEMsIDB4MTMsIDB4MDcsIDB4ODQsIDB4MDIsIDB4MDIsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QkEsCi0JMHhGRiwgMHhGQiwgMHhGRiwgMHhFMywgMHhGRiwgMHg4OCwgMHhGRiwgMHg4OSwgMHhGRiwgMHgwMSwgMHgwMSwKLQkweEEzLCAweDA0LCAweENFLCAweDA5LCAweDhGLCAweDBFLCAweEE4LCAweDEwLCAweDBBLCAweDBGLCAweDg4LAotCTB4MEEsIDB4NDgsIDB4MDUsIDB4NUYsIDB4MDEsIDB4QTAsIDB4RkYsIDB4N0QsIDB4RkYsIDB4RDksIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNywgMHhGRiwgMHg3MCwgMHhGRiwgMHhENSwgMHhGRiwgMHgwQiwKLQkweDAyLCAweDVFLCAweDA2LCAweEE5LCAweDBCLCAweEIyLCAweDBGLCAweDgyLCAweDEwLCAweEFFLCAweDBELAotCTB4QTIsIDB4MDgsIDB4QUIsIDB4MDMsIDB4ODIsIDB4MDAsIDB4NzMsIDB4RkYsIDB4OUQsIDB4RkYsIDB4RjAsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHhBNCwgMHhGRiwgMHg2RiwgMHhGRiwgMHg1RCwgMHgwMCwgMHg1QiwgMHgwMywKLQkweDNCLCAweDA4LCAweDVBLCAweDBELCAweDZBLCAweDEwLCAweEUyLCAweDBGLCAweDA5LCAweDBDLCAweEMxLAotCTB4MDYsIDB4NEMsIDB4MDIsIDB4RUMsIDB4RkYsIDB4NkUsIDB4RkYsIDB4QzAsIDB4RkYsIDB4RkMsIDB4RkYsCi0JMHhERiwgMHhGRiwgMHg4MywgMHhGRiwgMHg5MywgMHhGRiwgMHgyQSwgMHgwMSwgMHhFQywgMHgwNCwgMHgyMiwKLQkweDBBLCAweEM4LCAweDBFLCAweEFCLCAweDEwLCAweEQ0LCAweDBFLCAweDM1LCAweDBBLCAweEZELCAweDA0LAotCTB4MzMsIDB4MDEsIDB4OTUsIDB4RkYsIDB4ODIsIDB4RkYsIDB4REUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhDMSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFOCwgMHhGRiwgMHg0MCwgMHgwMiwgMHhBRiwgMHgwNiwKLQkweEY3LCAweDBCLCAweERBLCAweDBGLCAweDZGLCAweDEwLCAweDZBLCAweDBELCAweDRFLCAweDA4LCAweDZBLAotCTB4MDMsIDB4NjQsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RjMsIDB4RkYsIDB4RjEsIDB4RkYsCi0JMHg5RSwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3QiwgMHgwMCwgMHg5QywgMHgwMywgMHg5MCwgMHgwOCwgMHg5RiwKLQkweDBELCAweDdFLCAweDEwLCAweEJCLCAweDBGLCAweEJBLCAweDBCLCAweDcwLCAweDA2LCAweDE2LCAweDAyLAotCTB4RDksIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REEsCi0JMHhGRiwgMHg3RSwgMHhGRiwgMHg5RCwgMHhGRiwgMHg1NSwgMHgwMSwgMHgzNywgMHgwNSwgMHg3NSwgMHgwQSwKLQkweEZGLCAweDBFLCAweEE5LCAweDEwLCAweDlDLCAweDBFLCAweEUxLCAweDA5LCAweEIzLCAweDA0LCAweDBBLAotCTB4MDEsIDB4OEIsIDB4RkYsIDB4ODcsIDB4RkYsIDB4RTIsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QkIsIDB4RkYsCi0JMHg2RCwgMHhGRiwgMHhGRCwgMHhGRiwgMHg3NywgMHgwMiwgMHgwMSwgMHgwNywgMHg0NSwgMHgwQywgMHhGRiwKLQkweDBGLCAweDU4LCAweDEwLCAweDIzLCAweDBELCAweEZBLCAweDA3LCAweDJBLCAweDAzLCAweDQ3LCAweDAwLAotCTB4NkUsIDB4RkYsIDB4QTksIDB4RkYsIDB4RjUsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NzcsCi0JMHhGRiwgMHg5QywgMHgwMCwgMHhERiwgMHgwMywgMHhFNCwgMHgwOCwgMHhFMiwgMHgwRCwgMHg4RSwgMHgxMCwKLQkweDkxLCAweDBGLCAweDZCLCAweDBCLCAweDIwLCAweDA2LCAweEUzLCAweDAxLCAweEM4LCAweEZGLCAweDczLAotCTB4RkYsIDB4Q0IsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RkYsIDB4N0EsIDB4RkYsCi0JMHhBQSwgMHhGRiwgMHg4MiwgMHgwMSwgMHg4MywgMHgwNSwgMHhDOCwgMHgwQSwgMHgzMiwgMHgwRiwgMHhBNCwKLQkweDEwLCAweDYwLCAweDBFLCAweDhELCAweDA5LCAweDZCLCAweDA0LCAweEUzLCAweDAwLCAweDgzLCAweEZGLAotCTB4OEQsIDB4RkYsIDB4RTYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTQsCi0JMHgwMCwgMHhCMSwgMHgwMiwgMHg1MywgMHgwNywgMHg5MSwgMHgwQywgMHgyMCwgMHgxMCwgMHgzRSwgMHgxMCwKLQkweERCLCAweDBDLCAweEE2LCAweDA3LCAweEVDLCAweDAyLCAweDJDLCAweDAwLCAweDZDLCAweEZGLCAweEFGLAotCTB4RkYsIDB4RjgsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTIsIDB4RkYsIDB4N0MsIDB4RkYsIDB4QkUsIDB4MDAsCi0JMHgyNCwgMHgwNCwgMHgzOCwgMHgwOSwgMHgyMiwgMHgwRSwgMHg5QiwgMHgxMCwgMHg2MywgMHgwRiwgMHgxQSwKLQkweDBCLCAweEQxLCAweDA1LCAweEIxLCAweDAxLCAweEI4LCAweEZGLCAweDc2LCAweEZGLCAweEQwLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4NzYsIDB4RkYsIDB4QjgsIDB4RkYsIDB4QjEsCi0JMHgwMSwgMHhEMSwgMHgwNSwgMHgxQSwgMHgwQiwgMHg2MywgMHgwRiwgMHg5QiwgMHgxMCwgMHgyMiwgMHgwRSwKLQkweDM4LCAweDA5LCAweDI0LCAweDA0LCAweEJFLCAweDAwLCAweDdDLCAweEZGLCAweDkyLCAweEZGLCAweEVBLAotCTB4RkYsIDB4RjgsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RUMsIDB4MDIsCi0JMHhBNiwgMHgwNywgMHhEQiwgMHgwQywgMHgzRSwgMHgxMCwgMHgyMCwgMHgxMCwgMHg5MSwgMHgwQywgMHg1MywKLQkweDA3LCAweEIxLCAweDAyLCAweDE0LCAweDAwLCAweDZDLCAweEZGLCAweEI1LCAweEZGLCAweEZBLCAweEZGLAotCTB4RTYsIDB4RkYsIDB4OEQsIDB4RkYsIDB4ODMsIDB4RkYsIDB4RTMsIDB4MDAsIDB4NkIsIDB4MDQsIDB4OEQsCi0JMHgwOSwgMHg2MCwgMHgwRSwgMHhBNCwgMHgxMCwgMHgzMiwgMHgwRiwgMHhDOCwgMHgwQSwgMHg4MywgMHgwNSwKLQkweDgyLCAweDAxLCAweEFBLCAweEZGLCAweDdBLCAweEZGLCAweEQ1LCAweEZGLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4Q0IsIDB4RkYsIDB4NzMsIDB4RkYsIDB4QzgsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MjAsIDB4MDYsCi0JMHg2QiwgMHgwQiwgMHg5MSwgMHgwRiwgMHg4RSwgMHgxMCwgMHhFMiwgMHgwRCwgMHhFNCwgMHgwOCwgMHhERiwKLQkweDAzLCAweDlDLCAweDAwLCAweDc3LCAweEZGLCAweDk4LCAweEZGLCAweEVELCAweEZGLCAweEY1LCAweEZGLAotCTB4QTksIDB4RkYsIDB4NkUsIDB4RkYsIDB4NDcsIDB4MDAsIDB4MkEsIDB4MDMsIDB4RkEsIDB4MDcsIDB4MjMsCi0JMHgwRCwgMHg1OCwgMHgxMCwgMHhGRiwgMHgwRiwgMHg0NSwgMHgwQywgMHgwMSwgMHgwNywgMHg3NywgMHgwMiwKLQkweEZELCAweEZGLCAweDZELCAweEZGLCAweEJCLCAweEZGLCAweEZCLCAweEZGLCAweEUyLCAweEZGLCAweDg3LAotCTB4RkYsIDB4OEIsIDB4RkYsIDB4MEEsIDB4MDEsIDB4QjMsIDB4MDQsIDB4RTEsIDB4MDksIDB4OUMsIDB4MEUsCi0JMHhBOSwgMHgxMCwgMHhGRiwgMHgwRSwgMHg3NSwgMHgwQSwgMHgzNywgMHgwNSwgMHg1NSwgMHgwMSwgMHg5RCwKLQkweEZGLCAweDdFLCAweEZGLCAweERBLCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM1LCAweEZGLAotCTB4NzAsIDB4RkYsIDB4RDksIDB4RkYsIDB4MTYsIDB4MDIsIDB4NzAsIDB4MDYsIDB4QkEsIDB4MEIsIDB4QkIsCi0JMHgwRiwgMHg3RSwgMHgxMCwgMHg5RiwgMHgwRCwgMHg5MCwgMHgwOCwgMHg5QywgMHgwMywgMHg3QiwgMHgwMCwKLQkweDcyLCAweEZGLCAweDlFLCAweEZGLCAweEYxLCAweEZGLCAweEYzLCAweEZGLCAweEEzLCAweEZGLCAweDcwLAotCTB4RkYsIDB4NjQsIDB4MDAsIDB4NkEsIDB4MDMsIDB4NEUsIDB4MDgsIDB4NkEsIDB4MEQsIDB4NkYsIDB4MTAsCi0JMHhEQSwgMHgwRiwgMHhGNywgMHgwQiwgMHhBRiwgMHgwNiwgMHg0MCwgMHgwMiwgMHhFOCwgMHhGRiwgMHg2RSwKLQkweEZGLCAweEMxLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERFLCAweEZGLCAweDgyLCAweEZGLAotCTB4OTUsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RkQsIDB4MDQsIDB4MzUsIDB4MEEsIDB4RDQsIDB4MEUsIDB4QUIsCi0JMHgxMCwgMHhDOCwgMHgwRSwgMHgyMiwgMHgwQSwgMHhFQywgMHgwNCwgMHgyQSwgMHgwMSwgMHg5MywgMHhGRiwKLQkweDgzLCAweEZGLCAweERGLCAweEZGLCAweEZDLCAweEZGLCAweEMwLCAweEZGLCAweDZFLCAweEZGLCAweEVDLAotCTB4RkYsIDB4NEMsIDB4MDIsIDB4QzEsIDB4MDYsIDB4MDksIDB4MEMsIDB4RTIsIDB4MEYsIDB4NkEsIDB4MTAsCi0JMHg1QSwgMHgwRCwgMHgzQiwgMHgwOCwgMHg1QiwgMHgwMywgMHg1RCwgMHgwMCwgMHg2RiwgMHhGRiwgMHhBNCwKLQkweEZGLCAweEYzLCAweEZGLCAweEYwLCAweEZGLCAweDlELCAweEZGLCAweDczLCAweEZGLCAweDgyLCAweDAwLAotCTB4QUIsIDB4MDMsIDB4QTIsIDB4MDgsIDB4QUUsIDB4MEQsIDB4ODIsIDB4MTAsIDB4QjIsIDB4MEYsIDB4QTksCi0JMHgwQiwgMHg1RSwgMHgwNiwgMHgwQiwgMHgwMiwgMHhENSwgMHhGRiwgMHg3MCwgMHhGRiwgMHhDNywgMHhGRiwKLQkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ5LCAweEZGLCAweDdELCAweEZGLCAweEEwLCAweEZGLCAweDVGLAotCTB4MDEsIDB4NDgsIDB4MDUsIDB4ODgsIDB4MEEsIDB4MEEsIDB4MEYsIDB4QTgsIDB4MTAsIDB4OEYsIDB4MEUsCi0JMHhDRSwgMHgwOSwgMHhBMywgMHgwNCwgMHgwMSwgMHgwMSwgMHg4OSwgMHhGRiwgMHg4OCwgMHhGRiwgMHhFMywKLQkweEZGLCAweEZCLCAweEZGLCAweEJBLCAweEZGLCAweDZELCAweEZGLCAweDAyLCAweDAwLCAweDg0LCAweDAyLAotCTB4MTMsIDB4MDcsIDB4NTYsIDB4MEMsIDB4MDYsIDB4MTAsIDB4NTIsIDB4MTAsIDB4MTMsIDB4MEQsIDB4RTcsCi0JMHgwNywgMHgxQywgMHgwMywgMHg0MSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBQSwgMHhGRiwgMHhGNiwgMHhGRiwKLQkweEVELCAweEZGLCAweDk3LCAweEZGLCAweDc4LCAweEZGLCAweEEzLCAweDAwLCAweEVGLCAweDAzLCAweEY3LAotCTB4MDgsIDB4RjAsIDB4MEQsIDB4OTEsIDB4MTAsIDB4ODcsIDB4MEYsIDB4NTksIDB4MEIsIDB4MEUsIDB4MDYsCi0JMHhENywgMHgwMSwgMHhDNCwgMHhGRiwgMHg3MywgMHhGRiwgMHhDQywgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweEQ0LCAweEZGLCAweDc5LCAweEZGLCAweEFELCAweEZGLCAweDhDLCAweDAxLCAweDk1LCAweDA1LAotCTB4REEsIDB4MEEsIDB4M0QsIDB4MEYsIDB4QTIsIDB4MTAsIDB4NTMsIDB4MEUsIDB4N0EsIDB4MDksIDB4NUIsCi0JMHgwNCwgMHhEQiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg4RSwgMHhGRiwgMHhFNywgMHhGRiwgMHhGOSwgMHhGRiwKLQkweEI0LCAweEZGLCAweDZDLCAweEZGLCAweDE5LCAweDAwLCAweEJFLCAweDAyLCAweDY1LCAweDA3LCAweEExLAotCTB4MEMsIDB4MjcsIDB4MTAsIDB4MzcsIDB4MTAsIDB4Q0EsIDB4MEMsIDB4OTQsIDB4MDcsIDB4REYsIDB4MDIsCi0JMHgyNywgMHgwMCwgMHg2QywgMHhGRiwgMHhCMCwgMHhGRiwgMHhGOCwgMHhGRiwgMHhFOSwgMHhGRiwgMHg5MSwKLQkweEZGLCAweDdELCAweEZGLCAweEM2LCAweDAwLCAweDM0LCAweDA0LCAweDRCLCAweDA5LCAweDMwLCAweDBFLAotCTB4OUQsIDB4MTAsIDB4NTgsIDB4MEYsIDB4MDgsIDB4MEIsIDB4QzAsIDB4MDUsIDB4QTYsIDB4MDEsIDB4QjUsCi0JMHhGRiwgMHg3NywgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwKLQkweDc1LCAweEZGLCAweEJCLCAweEZGLCAweEJDLCAweDAxLCAweEUzLCAweDA1LCAweDJDLCAweDBCLCAweDZELAotCTB4MEYsIDB4OTgsIDB4MTAsIDB4MTQsIDB4MEUsIDB4MjYsIDB4MDksIDB4MTUsIDB4MDQsIDB4QjcsIDB4MDAsCi0JMHg3QiwgMHhGRiwgMHg5MywgMHhGRiwgMHhFQiwgMHhGRiwgMHhGNywgMHhGRiwgMHhBRSwgMHhGRiwgMHg2RCwKLQkweEZGLCAweDMyLCAweDAwLCAweEZBLCAweDAyLCAweEI5LCAweDA3LCAweEVCLCAweDBDLCAweDQ0LCAweDEwLAotCTB4MTksIDB4MTAsIDB4ODAsIDB4MEMsIDB4NDEsIDB4MDcsIDB4QTQsIDB4MDIsIDB4MEUsIDB4MDAsIDB4NkMsCi0JMHhGRiwgMHhCNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNSwgMHhGRiwgMHg4QiwgMHhGRiwgMHg4NSwgMHhGRiwKLQkweEVDLCAweDAwLCAweDdCLCAweDA0LCAweEEwLCAweDA5LCAweDZFLCAweDBFLCAweEE1LCAweDEwLCAweDI3LAotCTB4MEYsIDB4QjYsIDB4MEEsIDB4NzIsIDB4MDUsIDB4NzgsIDB4MDEsIDB4QTcsIDB4RkYsIDB4N0IsIDB4RkYsCi0JMHhENiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDQSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDQiwKLQkweEZGLCAweEVFLCAweDAxLCAweDMyLCAweDA2LCAweDdDLCAweDBCLCAweDlBLCAweDBGLCAweDhCLCAweDEwLAotCTB4RDMsIDB4MEQsIDB4RDEsIDB4MDgsIDB4RDAsIDB4MDMsIDB4OTQsIDB4MDAsIDB4NzYsIDB4RkYsIDB4OTksCi0JMHhGRiwgMHhFRSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBNywgMHhGRiwgMHg2RSwgMHhGRiwgMHg0RCwgMHgwMCwKLQkweDM4LCAweDAzLCAweDBELCAweDA4LCAweDMzLCAweDBELCAweDVELCAweDEwLCAweEY3LCAweDBGLCAweDM0LAotCTB4MEMsIDB4RUUsIDB4MDYsIDB4NkIsIDB4MDIsIDB4RjgsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkMsIDB4RkYsCi0JMHhGQywgMHhGRiwgMHhFMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4RCwgMHhGRiwgMHgxMywgMHgwMSwgMHhDMywKLQkweDA0LCAweEY0LCAweDA5LCAweEE4LCAweDBFLCAweEFBLCAweDEwLCAweEYzLCAweDBFLCAweDYzLCAweDBBLAotCTB4MjYsIDB4MDUsIDB4NEIsIDB4MDEsIDB4OUIsIDB4RkYsIDB4N0YsIDB4RkYsIDB4REIsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhDNCwgMHhGRiwgMHg2RiwgMHhGRiwgMHhERCwgMHhGRiwgMHgyMiwgMHgwMiwKLQkweDgyLCAweDA2LCAweENDLCAweDBCLCAweEM0LCAweDBGLCAweDdBLCAweDEwLCAweDkwLCAweDBELCAweDdELAotCTB4MDgsIDB4OEUsIDB4MDMsIDB4NzQsIDB4MDAsIDB4NzIsIDB4RkYsIDB4OUYsIDB4RkYsIDB4RjEsIDB4RkYsCi0JMHhGMiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg3MCwgMHhGRiwgMHg2QSwgMHgwMCwgMHg3OCwgMHgwMywgMHg2MSwKLQkweDA4LCAweDc5LCAweDBELCAweDczLCAweDEwLCAweEQxLCAweDBGLCAweEU2LCAweDBCLCAweDlELCAweDA2LAotCTB4MzQsIDB4MDIsIDB4RTQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzIsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhERCwgMHhGRiwgMHg4MSwgMHhGRiwgMHg5NywgMHhGRiwgMHgzRCwgMHgwMSwgMHgwRCwgMHgwNSwKLQkweDQ3LCAweDBBLCAweEUxLCAweDBFLCAweEFBLCAweDEwLCAweEJCLCAweDBFLCAweDEwLCAweDBBLCAweERDLAotCTB4MDQsIDB4MjEsIDB4MDEsIDB4OTAsIDB4RkYsIDB4ODQsIDB4RkYsIDB4RTAsIDB4RkYsIDB4RkMsIDB4RkYsCi0JMHhCRSwgMHhGRiwgMHg2RCwgMHhGRiwgMHhGMSwgMHhGRiwgMHg1OCwgMHgwMiwgMHhEMywgMHgwNiwgMHgxQSwKLQkweDBDLCAweEVCLCAweDBGLCAweDY1LCAweDEwLCAweDRCLCAweDBELCAweDI5LCAweDA4LCAweDRELCAweDAzLAotCTB4NTcsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTUsIDB4RkYsIDB4RjQsIDB4RkYsIDB4RUYsIDB4RkYsIDB4OUIsCi0JMHhGRiwgMHg3NCwgMHhGRiwgMHg4QSwgMHgwMCwgMHhCQSwgMHgwMywgMHhCNSwgMHgwOCwgMHhCRCwgMHgwRCwKLQkweDg2LCAweDEwLCAweEE5LCAweDBGLCAweDk3LCAweDBCLCAweDRDLCAweDA2LCAweEZGLCAweDAxLCAweEQxLAotCTB4RkYsIDB4NzEsIDB4RkYsIDB4QzgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RkYsCi0JMHg3QywgMHhGRiwgMHhBMywgMHhGRiwgMHg2OSwgMHgwMSwgMHg1OSwgMHgwNSwgMHg5QSwgMHgwQSwgMHgxNiwKLQkweDBGLCAweEE3LCAweDEwLCAweDgyLCAweDBFLCAweEJDLCAweDA5LCAweDkzLCAweDA0LCAweEY5LCAweDAwLAotCTB4ODcsIDB4RkYsIDB4ODksIDB4RkYsIDB4RTQsIDB4RkYsIDB4RkIsIDB4RkYsIDB4QjgsIDB4RkYsIDB4NkMsCi0JMHhGRiwgMHgwNywgMHgwMCwgMHg5MSwgMHgwMiwgMHgyNSwgMHgwNywgMHg2NywgMHgwQywgMHgwRSwgMHgxMCwKLQkweDRELCAweDEwLCAweDAzLCAweDBELCAweEQ1LCAweDA3LCAweDBFLCAweDAzLCAweDNCLCAweDAwLCAweDZELAotCTB4RkYsIDB4QUMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUMsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NzksIDB4RkYsCi0JMHhBQiwgMHgwMCwgMHhGRSwgMHgwMywgMHgwQSwgMHgwOSwgMHhGRiwgMHgwRCwgMHg5NCwgMHgxMCwgMHg3RCwKLQkweDBGLCAweDQ3LCAweDBCLCAweEZELCAweDA1LCAweENDLCAweDAxLCAweEMwLCAweEZGLCAweDc0LCAweEZGLAotCTB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QjAsCi0JMHhGRiwgMHg5NywgMHgwMSwgMHhBNiwgMHgwNSwgMHhFQywgMHgwQSwgMHg0OCwgMHgwRiwgMHhBMCwgMHgxMCwKLQkweDQ1LCAweDBFLCAweDY3LCAweDA5LCAweDRCLCAweDA0LCAweEQzLCAweDAwLCAweDgwLCAweEZGLCAweDhGLAotCTB4RkYsIDB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjIsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHhDQiwgMHgwMiwgMHg3OCwgMHgwNywgMHhCMiwgMHgwQywgMHgyRSwgMHgxMCwgMHgzMSwgMHgxMCwgMHhCQSwKLQkweDBDLCAweDgxLCAweDA3LCAweEQyLCAweDAyLCAweDIxLCAweDAwLCAweDZDLCAweEZGLCAweEIyLCAweEZGLAotCTB4RjksIDB4RkYsIDB4RTgsIDB4RkYsIDB4OTAsIDB4RkYsIDB4N0YsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4NDMsCi0JMHgwNCwgMHg1RSwgMHgwOSwgMHgzRSwgMHgwRSwgMHg5RiwgMHgxMCwgMHg0RSwgMHgwRiwgMHhGNiwgMHgwQSwKLQkweEFFLCAweDA1LCAweDlDLCAweDAxLCAweEIxLCAweEZGLCAweDc4LCAweEZGLCAweEQyLCAweEZGLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4NzQsIDB4RkYsIDB4QkYsIDB4RkYsIDB4QzcsIDB4MDEsCi0JMHhGNCwgMHgwNSwgMHgzRSwgMHgwQiwgMHg3OCwgMHgwRiwgMHg5NiwgMHgxMCwgMHgwNiwgMHgwRSwgMHgxMywKLQkweDA5LCAweDA1LCAweDA0LCAweEFGLCAweDAwLCAweDc5LCAweEZGLCAweDk1LCAweEZGLCAweEVDLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4QUMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MDcsIDB4MDMsIDB4Q0IsCi0JMHgwNywgMHhGQiwgMHgwQywgMHg0QSwgMHgxMCwgMHgxMSwgMHgxMCwgMHg2RiwgMHgwQywgMHgyRSwgMHgwNywKLQkweDk3LCAweDAyLCAweDA5LCAweDAwLCAweDZDLCAweEZGLCAweEI4LCAweEZGLCAweEZBLCAweEZGLCAweEU0LAotCTB4RkYsIDB4OEEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4RjQsIDB4MDAsIDB4OEIsIDB4MDQsIDB4QjIsIDB4MDksCi0JMHg3QiwgMHgwRSwgMHhBNywgMHgxMCwgMHgxQywgMHgwRiwgMHhBMywgMHgwQSwgMHg2MSwgMHgwNSwgMHg2RSwKLQkweDAxLCAweEE0LCAweEZGLCAweDdDLCAweEZGLCAweEQ4LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLAotCTB4QzgsIDB4RkYsIDB4NzEsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RjksIDB4MDEsIDB4NDMsIDB4MDYsIDB4OEUsCi0JMHgwQiwgMHhBNCwgMHgwRiwgMHg4OCwgMHgxMCwgMHhDNCwgMHgwRCwgMHhCRSwgMHgwOCwgMHhDMSwgMHgwMywKLQkweDhELCAweDAwLCAweDc1LCAweEZGLCAweDlCLCAweEZGLCAweEVGLCAweEZGLCAweEY0LCAweEZGLCAweEE2LAotCTB4RkYsIDB4NkUsIDB4RkYsIDB4NTMsIDB4MDAsIDB4NDYsIDB4MDMsIDB4MUYsIDB4MDgsIDB4NDMsIDB4MEQsCi0JMHg2MywgMHgxMCwgMHhFRiwgMHgwRiwgMHgyMywgMHgwQywgMHhEQywgMHgwNiwgMHg1RSwgMHgwMiwgMHhGMywKLQkweEZGLCAweDZELCAweEZGLCAweEJFLCAweEZGLCAweEZDLCAweEZGLCAweEUwLCAweEZGLCAweDg1LCAweEZGLAotCTB4OEYsIDB4RkYsIDB4MUMsIDB4MDEsIDB4RDMsIDB4MDQsIDB4MDYsIDB4MEEsIDB4QjUsIDB4MEUsIDB4QUEsCi0JMHgxMCwgMHhFNywgMHgwRSwgMHg1MCwgMHgwQSwgMHgxNiwgMHgwNSwgMHg0MiwgMHgwMSwgMHg5OCwgMHhGRiwKLQkweDgwLCAweEZGLCAweERDLCAweEZGLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEMzLCAweEZGLCAweDZGLAotCTB4RkYsIDB4RTEsIDB4RkYsIDB4MkUsIDB4MDIsIDB4OTQsIDB4MDYsIDB4REQsIDB4MEIsIDB4Q0QsIDB4MEYsCi0JMHg3NiwgMHgxMCwgMHg4MSwgMHgwRCwgMHg2QSwgMHgwOCwgMHg3RiwgMHgwMywgMHg2RSwgMHgwMCwgMHg3MSwKLQkweEZGLCAweEExLCAweEZGLCAweEYyLCAweEZGLCAweDAwLCAweDAwLCAweDE1LCAweDAwLCAweEQxLCAweEZGLAotCTB4OEIsIDB4RkUsIDB4QkMsIDB4RkQsIDB4RTEsIDB4MDAsIDB4ODQsIDB4MDksIDB4QjAsIDB4MTMsIDB4NDcsCi0JMHgxOCwgMHhCMCwgMHgxMywgMHg4NCwgMHgwOSwgMHhFMSwgMHgwMCwgMHhCQywgMHhGRCwgMHg4QiwgMHhGRSwKLQkweEQxLCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLCAweERBLCAweDAwLCAweDMwLAotCTB4MDAsIDB4NUQsIDB4RkMsIDB4QjMsIDB4RkMsIDB4MzUsIDB4MEEsIDB4QzIsIDB4MUMsIDB4MjQsIDB4MjAsCi0JMHg0OCwgMHgxMCwgMHg1RCwgMHhGRiwgMHg3NCwgMHhGQiwgMHgzQSwgMHhGRiwgMHhGQiwgMHgwMCwgMHg0MiwKLQkweDAwLCAweEY4LCAweEZGLCAweEZBLCAweEZGLCAweDJDLCAweDAwLCAweEYzLCAweDAwLCAweEFELCAweEZGLAotCTB4QzUsIDB4RkIsIDB4MTEsIDB4RkUsIDB4QUYsIDB4MEQsIDB4RUYsIDB4MUUsIDB4NjgsIDB4MUUsIDB4QkMsCi0JMHgwQywgMHhBNywgMHhGRCwgMHhFQSwgMHhGQiwgMHhEMywgMHhGRiwgMHhFRSwgMHgwMCwgMHgyNCwgMHgwMCwKLQkweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRDLCAweDAwLCAweEZCLCAweDAwLCAweDBDLCAweEZGLCAweDVGLAotCTB4RkIsIDB4RTgsIDB4RkYsIDB4M0QsIDB4MTEsIDB4N0UsIDB4MjAsIDB4MTMsIDB4MUMsIDB4NEMsIDB4MDksCi0JMHg2QSwgMHhGQywgMHg4QywgMHhGQywgMHg0RSwgMHgwMCwgMHhEMSwgMHgwMCwgMHgwRSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEY3LCAweEZGLCAweDcyLCAweDAwLCAweEVDLCAweDAwLCAweDU1LCAweEZFLCAweDNELCAweEZCLAotCTB4MzcsIDB4MDIsIDB4QkUsIDB4MTQsIDB4NUQsIDB4MjEsIDB4NDAsIDB4MTksIDB4MTgsIDB4MDYsIDB4QTIsCi0JMHhGQiwgMHg0NywgMHhGRCwgMHhBNywgMHgwMCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZDLCAweEZGLCAweDlCLCAweDAwLCAweEMwLCAweDAwLCAweDkyLCAweEZELCAweDczLAotCTB4RkIsIDB4RjIsIDB4MDQsIDB4MEUsIDB4MTgsIDB4ODEsIDB4MjEsIDB4MEMsIDB4MTYsIDB4MzcsIDB4MDMsCi0JMHg0NywgMHhGQiwgMHgwQiwgMHhGRSwgMHhERiwgMHgwMCwgMHg4MiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDA4LCAweDAwLCAweEMzLCAweDAwLCAweDc0LCAweDAwLCAweEQyLCAweEZDLCAweDEwLCAweEZDLAotCTB4MDgsIDB4MDgsIDB4MEEsIDB4MUIsIDB4RTksIDB4MjAsIDB4OUEsIDB4MTIsIDB4QkUsIDB4MDAsIDB4NDksCi0JMHhGQiwgMHhDOCwgMHhGRSwgMHhGOSwgMHgwMCwgMHg1QSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwKLQkweDFCLCAweDAwLCAweEU0LCAweDAwLCAweDA2LCAweDAwLCAweDI0LCAweEZDLCAweDFFLCAweEZELCAweDY1LAotCTB4MEIsIDB4OTQsIDB4MUQsIDB4OUQsIDB4MUYsIDB4MEQsIDB4MEYsIDB4QjgsIDB4RkUsIDB4OTYsIDB4RkIsCi0JMHg3MiwgMHhGRiwgMHhGOSwgMHgwMCwgMHgzNywgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEY4LCAweDAwLCAweDc4LCAweEZGLCAweDlCLCAweEZCLCAweEE2LCAweEZFLCAweEU5LCAweDBFLAotCTB4OEQsIDB4MUYsIDB4QUEsIDB4MUQsIDB4ODcsIDB4MEIsIDB4MkIsIDB4RkQsIDB4MUUsIDB4RkMsIDB4MDIsCi0JMHgwMCwgMHhFNSwgMHgwMCwgMHgxQywgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1OCwgMHgwMCwKLQkweEY5LCAweDAwLCAweENGLCAweEZFLCAweDRBLCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDEyLCAweEUwLAotCTB4MjAsIDB4MjYsIDB4MUIsIDB4MjgsIDB4MDgsIDB4MTgsIDB4RkMsIDB4Q0IsIDB4RkMsIDB4NzEsIDB4MDAsCi0JMHhDNSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg4MCwgMHgwMCwgMHhFMSwKLQkweDAwLCAweDEzLCAweEZFLCAweDQ1LCAweEZCLCAweDFELCAweDAzLCAweEVCLCAweDE1LCAweDdGLCAweDIxLAotCTB4MkQsIDB4MTgsIDB4MEUsIDB4MDUsIDB4NzcsIDB4RkIsIDB4OEIsIDB4RkQsIDB4QkUsIDB4MDAsIDB4OUQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhBOSwgMHgwMCwKLQkweEFBLCAweDAwLCAweDRGLCAweEZELCAweDlELCAweEZCLCAweEZBLCAweDA1LCAweDIyLCAweDE5LCAweDYyLAotCTB4MjEsIDB4RTAsIDB4MTQsIDB4NTAsIDB4MDIsIDB4M0UsIDB4RkIsIDB4NEUsIDB4RkUsIDB4RUIsIDB4MDAsCi0JMHg3MywgMHgwMCwgMHhGNywgMHhGRiwgMHhGRSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhEMCwgMHgwMCwgMHg1MiwKLQkweDAwLCAweDkzLCAweEZDLCAweDYwLCAweEZDLCAweDJDLCAweDA5LCAweEZBLCAweDFCLCAweDhBLCAweDIwLAotCTB4NjAsIDB4MTEsIDB4RkQsIDB4RkYsIDB4NUMsIDB4RkIsIDB4MDYsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NEQsCi0JMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyMywgMHgwMCwgMHhFRCwgMHgwMCwgMHhEOSwgMHhGRiwKLQkweEVGLCAweEZCLCAweDk4LCAweEZELCAweDk5LCAweDBDLCAweDU0LCAweDFFLCAweDAyLCAweDFGLCAweEQyLAotCTB4MEQsIDB4MjAsIDB4RkUsIDB4QzAsIDB4RkIsIDB4QTcsIDB4RkYsIDB4RjQsIDB4MDAsIDB4MkQsIDB4MDAsCi0JMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhGQiwgMHgwMCwgMHg0MSwgMHhGRiwgMHg3OCwKLQkweEZCLCAweDRBLCAweEZGLCAweDI1LCAweDEwLCAweDE2LCAweDIwLCAweERBLCAweDFDLCAweDU2LCAweDBBLAotCTB4QkUsIDB4RkMsIDB4NTYsIDB4RkMsIDB4MkMsIDB4MDAsIDB4REIsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHg2NiwgMHgwMCwgMHhGNCwgMHgwMCwgMHg4RiwgMHhGRSwgMHgzRiwgMHhGQiwKLQkweDc1LCAweDAxLCAweEFFLCAweDEzLCAweDJDLCAweDIxLCAweDJBLCAweDFBLCAweDBELCAweDA3LCAweEQ0LAotCTB4RkIsIDB4MEMsIDB4RkQsIDB4OEYsIDB4MDAsIDB4QjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHhGQSwgMHhGRiwgMHg4RSwgMHgwMCwgMHhEMSwgMHgwMCwgMHhDRiwgMHhGRCwgMHg1OCwKLQkweEZCLCAweDEwLCAweDA0LCAweDEwLCAweDE3LCAweDhBLCAweDIxLCAweDEwLCAweDE3LCAweDEwLCAweDA0LAotCTB4NTgsIDB4RkIsIDB4Q0YsIDB4RkQsIDB4RDEsIDB4MDAsIDB4OEUsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHhCNywgMHgwMCwgMHg4RiwgMHgwMCwgMHgwQywgMHhGRCwgMHhENCwgMHhGQiwKLQkweDBELCAweDA3LCAweDJBLCAweDFBLCAweDJDLCAweDIxLCAweEFFLCAweDEzLCAweDc1LCAweDAxLCAweDNGLAotCTB4RkIsIDB4OEYsIDB4RkUsIDB4RjQsIDB4MDAsIDB4NjYsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgxNCwgMHgwMCwgMHhEQiwgMHgwMCwgMHgyQywgMHgwMCwgMHg1NiwgMHhGQywgMHhCRSwgMHhGQywgMHg1NiwKLQkweDBBLCAweERBLCAweDFDLCAweDE2LCAweDIwLCAweDI1LCAweDEwLCAweDRBLCAweEZGLCAweDc4LCAweEZCLAotCTB4NDEsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDEsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MkQsCi0JMHgwMCwgMHhGNCwgMHgwMCwgMHhBNywgMHhGRiwgMHhDMCwgMHhGQiwgMHgyMCwgMHhGRSwgMHhEMiwgMHgwRCwKLQkweDAyLCAweDFGLCAweDU0LCAweDFFLCAweDk5LCAweDBDLCAweDk4LCAweEZELCAweEVGLCAweEZCLCAweEQ5LAotCTB4RkYsIDB4RUQsIDB4MDAsIDB4MjMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NEQsIDB4MDAsCi0JMHhGQiwgMHgwMCwgMHgwNiwgMHhGRiwgMHg1QywgMHhGQiwgMHhGRCwgMHhGRiwgMHg2MCwgMHgxMSwgMHg4QSwKLQkweDIwLCAweEZBLCAweDFCLCAweDJDLCAweDA5LCAweDYwLCAweEZDLCAweDkzLCAweEZDLCAweDUyLCAweDAwLAotCTB4RDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NzMsIDB4MDAsIDB4RUIsCi0JMHgwMCwgMHg0RSwgMHhGRSwgMHgzRSwgMHhGQiwgMHg1MCwgMHgwMiwgMHhFMCwgMHgxNCwgMHg2MiwgMHgyMSwKLQkweDIyLCAweDE5LCAweEZBLCAweDA1LCAweDlELCAweEZCLCAweDRGLCAweEZELCAweEFBLCAweDAwLCAweEE5LAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4OUQsIDB4MDAsCi0JMHhCRSwgMHgwMCwgMHg4QiwgMHhGRCwgMHg3NywgMHhGQiwgMHgwRSwgMHgwNSwgMHgyRCwgMHgxOCwgMHg3RiwKLQkweDIxLCAweEVCLCAweDE1LCAweDFELCAweDAzLCAweDQ1LCAweEZCLCAweDEzLCAweEZFLCAweEUxLCAweDAwLAotCTB4ODAsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDgsIDB4MDAsIDB4QzUsIDB4MDAsIDB4NzEsCi0JMHgwMCwgMHhDQiwgMHhGQywgMHgxOCwgMHhGQywgMHgyOCwgMHgwOCwgMHgyNiwgMHgxQiwgMHhFMCwgMHgyMCwKLQkweDc3LCAweDEyLCAweEE3LCAweDAwLCAweDRBLCAweEZCLCAweENGLCAweEZFLCAweEY5LCAweDAwLCAweDU4LAotCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RTUsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHgxRSwgMHhGQywgMHgyQiwgMHhGRCwgMHg4NywgMHgwQiwgMHhBQSwgMHgxRCwgMHg4RCwgMHgxRiwgMHhFOSwKLQkweDBFLCAweEE2LCAweEZFLCAweDlCLCAweEZCLCAweDc4LCAweEZGLCAweEY4LCAweDAwLCAweDM2LCAweDAwLAotCTB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjksIDB4MDAsIDB4NzIsIDB4RkYsIDB4OTYsCi0JMHhGQiwgMHhCOCwgMHhGRSwgMHgwRCwgMHgwRiwgMHg5RCwgMHgxRiwgMHg5NCwgMHgxRCwgMHg2NSwgMHgwQiwKLQkweDFFLCAweEZELCAweDI0LCAweEZDLCAweDA2LCAweDAwLCAweEU0LCAweDAwLCAweDFCLCAweDAwLCAweEZDLAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4NUEsIDB4MDAsIDB4RjksIDB4MDAsIDB4QzgsIDB4RkUsIDB4NDksIDB4RkIsCi0JMHhCRSwgMHgwMCwgMHg5QSwgMHgxMiwgMHhFOSwgMHgyMCwgMHgwQSwgMHgxQiwgMHgwOCwgMHgwOCwgMHgxMCwKLQkweEZDLCAweEQyLCAweEZDLCAweDc0LCAweDAwLCAweEMzLCAweDAwLCAweDA4LCAweDAwLCAweEZFLCAweEZGLAotCTB4RjksIDB4RkYsIDB4ODIsIDB4MDAsIDB4REYsIDB4MDAsIDB4MEIsIDB4RkUsIDB4NDcsIDB4RkIsIDB4MzcsCi0JMHgwMywgMHgwQywgMHgxNiwgMHg4MSwgMHgyMSwgMHgwRSwgMHgxOCwgMHhGMiwgMHgwNCwgMHg3MywgMHhGQiwKLQkweDkyLCAweEZELCAweEMwLCAweDAwLCAweDlCLCAweDAwLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NDcsIDB4RkQsIDB4QTIsIDB4RkIsCi0JMHgxOCwgMHgwNiwgMHg0MCwgMHgxOSwgMHg1RCwgMHgyMSwgMHhCRSwgMHgxNCwgMHgzNywgMHgwMiwgMHgzRCwKLQkweEZCLCAweDU1LCAweEZFLCAweEVDLCAweDAwLCAweDcyLCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLAotCTB4MEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4OEMsIDB4RkMsIDB4NkEsIDB4RkMsIDB4NEMsCi0JMHgwOSwgMHgxMywgMHgxQywgMHg3RSwgMHgyMCwgMHgzRCwgMHgxMSwgMHhFOCwgMHhGRiwgMHg1RiwgMHhGQiwKLQkweDBDLCAweEZGLCAweEZCLCAweDAwLCAweDRDLCAweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI0LAotCTB4MDAsIDB4RUUsIDB4MDAsIDB4RDMsIDB4RkYsIDB4RUEsIDB4RkIsIDB4QTcsIDB4RkQsIDB4QkMsIDB4MEMsCi0JMHg2OCwgMHgxRSwgMHhFRiwgMHgxRSwgMHhBRiwgMHgwRCwgMHgxMSwgMHhGRSwgMHhDNSwgMHhGQiwgMHhBRCwKLQkweEZGLCAweEYzLCAweDAwLCAweDJDLCAweDAwLCAweEZBLCAweEZGLCAweEY4LCAweEZGLCAweDQyLCAweDAwLAotCTB4RkIsIDB4MDAsIDB4M0EsIDB4RkYsIDB4NzQsIDB4RkIsIDB4NUQsIDB4RkYsIDB4NDgsIDB4MTAsIDB4MjQsCi0JMHgyMCwgMHhDMiwgMHgxQywgMHgzNSwgMHgwQSwgMHhCMywgMHhGQywgMHg1RCwgMHhGQywgMHgzMCwgMHgwMCwKLQkweERBLCAweDAwLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDY3LCAweDAwLCAweEYzLAotCTB4MDAsIDB4ODgsIDB4RkUsIDB4M0UsIDB4RkIsIDB4OEMsIDB4MDEsIDB4RDAsIDB4MTMsIDB4MzMsIDB4MjEsCi0JMHgwRCwgMHgxQSwgMHhFRSwgMHgwNiwgMHhDRCwgMHhGQiwgMHgxMywgMHhGRCwgMHg5MiwgMHgwMCwgMHhCNiwKLQkweDAwLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZBLCAweEZGLCAweDkwLCAweDAwLAotCTB4Q0YsIDB4MDAsIDB4QzcsIDB4RkQsIDB4NUIsIDB4RkIsIDB4MkIsIDB4MDQsIDB4MzEsIDB4MTcsIDB4OEEsCi0JMHgyMSwgMHhGMCwgMHgxNiwgMHhGNCwgMHgwMywgMHg1NiwgMHhGQiwgMHhENiwgMHhGRCwgMHhEMywgMHgwMCwKLQkweDhELCAweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEI5LCAweDAwLCAweDhDLAotCTB4MDAsIDB4MDUsIDB4RkQsIDB4REIsIDB4RkIsIDB4MkMsIDB4MDcsIDB4NDcsIDB4MUEsIDB4MjUsIDB4MjEsCi0JMHg4QiwgMHgxMywgMHg1RCwgMHgwMSwgMHg0MCwgMHhGQiwgMHg5NywgMHhGRSwgMHhGNSwgMHgwMCwgMHg2NCwKLQkweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE1LCAweDAwLCAweERDLCAweDAwLCAweDI3LCAweDAwLAotCTB4NTAsIDB4RkMsIDB4Q0EsIDB4RkMsIDB4NzgsIDB4MEEsIDB4RjIsIDB4MUMsIDB4MDcsIDB4MjAsIDB4MDIsCi0JMHgxMCwgMHgzNywgMHhGRiwgMHg3QiwgMHhGQiwgMHg0NywgMHhGRiwgMHhGQiwgMHgwMCwgMHg0MCwgMHgwMCwKLQkweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJFLCAweDAwLCAweEY1LCAweDAwLCAweEEyLCAweEZGLCAweEJCLAotCTB4RkIsIDB4MzEsIDB4RkUsIDB4RjUsIDB4MEQsIDB4MTQsIDB4MUYsIDB4M0YsIDB4MUUsIDB4NzcsIDB4MEMsCi0JMHg4QSwgMHhGRCwgMHhGNSwgMHhGQiwgMHhERSwgMHhGRiwgMHhFQywgMHgwMCwgMHgyMiwgMHgwMCwgMHhGQiwKLQkweEZGLCAweEY3LCAweEZGLCAweDRFLCAweDAwLCAweEZCLCAweDAwLCAweEZGLCAweEZFLCAweDU5LCAweEZCLAotCTB4MTEsIDB4MDAsIDB4ODMsIDB4MTEsIDB4OTYsIDB4MjAsIDB4RTAsIDB4MUIsIDB4MEIsIDB4MDksIDB4NTYsCi0JMHhGQywgMHg5OSwgMHhGQywgMHg1NiwgMHgwMCwgMHhDRSwgMHgwMCwgMHgwRCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEY4LCAweEZGLCAweDc1LCAweDAwLCAweEVBLCAweDAwLCAweDQ3LCAweEZFLCAweDNFLCAweEZCLCAweDY5LAotCTB4MDIsIDB4MDIsIDB4MTUsIDB4NjYsIDB4MjEsIDB4MDQsIDB4MTksIDB4REMsIDB4MDUsIDB4OTgsIDB4RkIsCi0JMHg1NiwgMHhGRCwgMHhBRCwgMHgwMCwgMHhBOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweDlFLCAweDAwLCAweEJDLCAweDAwLCAweDgzLCAweEZELCAweDdCLCAweEZCLAotCTB4MkIsIDB4MDUsIDB4NEMsIDB4MTgsIDB4N0MsIDB4MjEsIDB4Q0EsIDB4MTUsIDB4MDMsIDB4MDMsIDB4NDQsCi0JMHhGQiwgMHgxQSwgMHhGRSwgMHhFMiwgMHgwMCwgMHg3RSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDA5LCAweDAwLCAweEM2LCAweDAwLCAweDZELCAweDAwLCAweEMzLCAweEZDLCAweDIwLCAweEZDLCAweDQ5LAotCTB4MDgsIDB4NDEsIDB4MUIsIDB4RDYsIDB4MjAsIDB4NTQsIDB4MTIsIDB4OTIsIDB4MDAsIDB4NEMsIDB4RkIsCi0JMHhENiwgMHhGRSwgMHhGQSwgMHgwMCwgMHg1NywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxRCwKLQkweDAwLCAweEU2LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweEZDLCAweDM4LCAweEZELCAweEE5LCAweDBCLAotCTB4QzAsIDB4MUQsIDB4N0MsIDB4MUYsIDB4QzYsIDB4MEUsIDB4OTUsIDB4RkUsIDB4OUYsIDB4RkIsIDB4N0UsCi0JMHhGRiwgMHhGOCwgMHgwMCwgMHgzNSwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzOCwgMHgwMCwKLQkweEY5LCAweDAwLCAweDZDLCAweEZGLCAweDkyLCAweEZCLCAweEM5LCAweEZFLCAweDJGLCAweDBGLCAweEFELAotCTB4MUYsIDB4N0QsIDB4MUQsIDB4NDIsIDB4MEIsIDB4MTIsIDB4RkQsIDB4MkEsIDB4RkMsIDB4MEIsIDB4MDAsCi0JMHhFMywgMHgwMCwgMHgxQSwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg1QiwgMHgwMCwgMHhGOCwKLQkweDAwLCAweEMxLCAweEZFLCAweDQ3LCAweEZCLCAweEQ0LCAweDAwLCAweEJDLCAweDEyLCAweEYzLCAweDIwLAotCTB4RUYsIDB4MUEsIDB4RTksIDB4MDcsIDB4MDgsIDB4RkMsIDB4RDksIDB4RkMsIDB4NzgsIDB4MDAsIDB4QzIsCi0JMHgwMCwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwgMHg4MywgMHgwMCwgMHhERCwgMHgwMCwKLQkweDA0LCAweEZFLCAweDQ5LCAweEZCLCAweDUyLCAweDAzLCAweDJELCAweDE2LCAweDgzLCAweDIxLCAweEVGLAotCTB4MTcsIDB4RDUsIDB4MDQsIDB4NkYsIDB4RkIsIDB4OUEsIDB4RkQsIDB4QzMsIDB4MDAsIDB4OUEsIDB4MDAsCi0JMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhBRCwgMHgwMCwgMHhBNCwKLQkweDAwLCAweDQwLCAweEZELCAweEE4LCAweEZCLCAweDM2LCAweDA2LCAweDVFLCAweDE5LCAweDU4LCAweDIxLAotCTB4OUMsIDB4MTQsIDB4MUUsIDB4MDIsIDB4M0QsIDB4RkIsIDB4NUQsIDB4RkUsIDB4RUQsIDB4MDAsIDB4NzAsCi0JMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhEMiwgMHgwMCwgMHg0QSwgMHgwMCwKLQkweDg1LCAweEZDLCAweDc0LCAweEZDLCAweDZELCAweDA5LCAweDJELCAweDFDLCAweDcyLCAweDIwLCAweDFBLAotCTB4MTEsIDB4RDQsIDB4RkYsIDB4NjEsIDB4RkIsIDB4MTMsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NEEsIDB4MDAsCi0JMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhFRiwgMHgwMCwgMHhDRSwgMHhGRiwgMHhFNCwKLQkweEZCLCAweEI1LCAweEZELCAweERFLCAweDBDLCAweDdDLCAweDFFLCAweERELCAweDFFLCAweDhDLCAweDBELAotCTB4MDEsIDB4RkUsIDB4Q0EsIDB4RkIsIDB4QjMsIDB4RkYsIDB4RjMsIDB4MDAsIDB4MkIsIDB4MDAsIDB4RkEsCi0JMHhGRiwgMHhGOCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhGQiwgMHgwMCwgMHgzNCwgMHhGRiwgMHg3MSwgMHhGQiwKLQkweDcxLCAweEZGLCAweDZCLCAweDEwLCAweDMyLCAweDIwLCAweEE5LCAweDFDLCAweDEzLCAweDBBLCAweEE4LAotCTB4RkMsIDB4NjMsIDB4RkMsIDB4MzUsIDB4MDAsIDB4RDksIDB4MDAsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg2OSwgMHgwMCwgMHhGMiwgMHgwMCwgMHg4MSwgMHhGRSwgMHgzRSwgMHhGQiwgMHhBNCwKLQkweDAxLCAweEYyLCAweDEzLCAweDNBLCAweDIxLCAweEYwLCAweDE5LCAweENGLCAweDA2LCAweEM3LCAweEZCLAotCTB4MUIsIDB4RkQsIDB4OTYsIDB4MDAsIDB4QjQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhGQiwgMHhGRiwgMHg5MiwgMHgwMCwgMHhDRCwgMHgwMCwgMHhDMCwgMHhGRCwgMHg1RSwgMHhGQiwKLQkweDQ3LCAweDA0LCAweDUxLCAweDE3LCAweDhBLCAweDIxLCAweEQwLCAweDE2LCAweEQ5LCAweDAzLCAweDUzLAotCTB4RkIsIDB4REUsIDB4RkQsIDB4RDUsIDB4MDAsIDB4OEIsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHhCQSwgMHgwMCwgMHg4OSwgMHgwMCwgMHhGRCwgMHhGQywgMHhFMiwgMHhGQiwgMHg0QiwKLQkweDA3LCAweDYzLCAweDFBLCAweDFELCAweDIxLCAweDY5LCAweDEzLCAweDQ2LCAweDAxLCAweDQxLCAweEZCLAotCTB4OUUsIDB4RkUsIDB4RjUsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhERCwgMHgwMCwgMHgyMywgMHgwMCwgMHg0OSwgMHhGQywgMHhENSwgMHhGQywgMHg5OSwgMHgwQSwKLQkweDA5LCAweDFELCAweEY5LCAweDFGLCAweERGLCAweDBGLCAweDI0LCAweEZGLCAweDdGLCAweEZCLCAweDRELAotCTB4RkYsIDB4RkIsIDB4MDAsIDB4M0YsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHhGNSwgMHgwMCwgMHg5QywgMHhGRiwgMHhCNiwgMHhGQiwgMHg0MSwgMHhGRSwgMHgxNywgMHgwRSwgMHgyNiwKLQkweDFGLCAweDJCLCAweDFFLCAweDU0LCAweDBDLCAweDdDLCAweEZELCAweEZBLCAweEZCLCAweEUzLCAweEZGLAotCTB4RUIsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTAsIDB4MDAsIDB4RkIsCi0JMHgwMCwgMHhGOCwgMHhGRSwgMHg1NywgMHhGQiwgMHgyNiwgMHgwMCwgMHhBNiwgMHgxMSwgMHhBMSwgMHgyMCwKLQkweEM2LCAweDFCLCAweEVBLCAweDA4LCAweDRELCAweEZDLCAweEEwLCAweEZDLCAweDVBLCAweDAwLCAweENELAotCTB4MDAsIDB4MEMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsIDB4MDAsIDB4RTksIDB4MDAsCi0JMHgzRiwgMHhGRSwgMHgzRiwgMHhGQiwgMHg4MiwgMHgwMiwgMHgyMywgMHgxNSwgMHg2QiwgMHgyMSwgMHhFNSwKLQkweDE4LCAweEJFLCAweDA1LCAweDkzLCAweEZCLCAweDVFLCAweEZELCAweEFGLCAweDAwLCAweEE2LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QjksCi0JMHgwMCwgMHg3QywgMHhGRCwgMHg4MCwgMHhGQiwgMHg0OCwgMHgwNSwgMHg2QiwgMHgxOCwgMHg3OSwgMHgyMSwKLQkweEE5LCAweDE1LCAweEU5LCAweDAyLCAweDQzLCAweEZCLCAweDIxLCAweEZFLCAweEUzLCAweDAwLCAweDdELAotCTB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDksIDB4MDAsIDB4QzcsIDB4MDAsIDB4NjksIDB4MDAsCi0JMHhCQywgMHhGQywgMHgyOSwgMHhGQywgMHg2OSwgMHgwOCwgMHg1QywgMHgxQiwgMHhDQywgMHgyMCwgMHgzMiwKLQkweDEyLCAweDdDLCAweDAwLCAweDRFLCAweEZCLCAweERELCAweEZFLCAweEZBLCAweDAwLCAweDU2LCAweDAwLAotCTB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RTcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4MTIsCi0JMHhGQywgMHg0NSwgMHhGRCwgMHhDQiwgMHgwQiwgMHhENiwgMHgxRCwgMHg2QywgMHgxRiwgMHhBMywgMHgwRSwKLQkweDg0LCAweEZFLCAweEE0LCAweEZCLCAweDg0LCAweEZGLCAweEY3LCAweDAwLCAweDM0LCAweDAwLCAweEY5LAotCTB4RkYsIDB4RjgsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RkEsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OEUsIDB4RkIsCi0JMHhEQiwgMHhGRSwgMHg1MywgMHgwRiwgMHhCRCwgMHgxRiwgMHg2NiwgMHgxRCwgMHgyMSwgMHgwQiwgMHgwNSwKLQkweEZELCAweDMwLCAweEZDLCAweDEwLCAweDAwLCAweEUyLCAweDAwLCAweDE5LCAweDAwLCAweEZDLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4NUQsIDB4MDAsIDB4RjgsIDB4MDAsIDB4QkEsIDB4RkUsIDB4NDYsIDB4RkIsIDB4RUEsCi0JMHgwMCwgMHhERiwgMHgxMiwgMHhGQywgMHgyMCwgMHhEMywgMHgxQSwgMHhDOSwgMHgwNywgMHgwMCwgMHhGQywKLQkweEUwLCAweEZDLCAweDdCLCAweDAwLCAweEMwLCAweDAwLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEY5LAotCTB4RkYsIDB4ODUsIDB4MDAsIDB4REMsIDB4MDAsIDB4RkMsIDB4RkQsIDB4NEEsIDB4RkIsIDB4NkMsIDB4MDMsCi0JMHg0RSwgMHgxNiwgMHg4NSwgMHgyMSwgMHhDRiwgMHgxNywgMHhCOCwgMHgwNCwgMHg2QywgMHhGQiwgMHhBMiwKLQkweEZELCAweEM1LCAweDAwLCAweDk4LCAweDAwLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDEsIDB4MDAsIDB4QUUsIDB4MDAsIDB4QTEsIDB4MDAsIDB4MzgsIDB4RkQsIDB4QUUsIDB4RkIsIDB4NTQsCi0JMHgwNiwgMHg3QywgMHgxOSwgMHg1MywgMHgyMSwgMHg3QiwgMHgxNCwgMHgwNSwgMHgwMiwgMHgzRCwgMHhGQiwKLQkweDY0LCAweEZFLCAweEVFLCAweDAwLCAweDZGLCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDBGLAotCTB4MDAsIDB4RDQsIDB4MDAsIDB4NDYsIDB4MDAsIDB4N0UsIDB4RkMsIDB4N0UsIDB4RkMsIDB4OEUsIDB4MDksCi0JMHg0NiwgMHgxQywgMHg2NiwgMHgyMCwgMHhGNywgMHgxMCwgMHhDMCwgMHhGRiwgMHg2NCwgMHhGQiwgMHgxQSwKLQkweEZGLCAweEZDLCAweDAwLCAweDQ5LCAweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI2LCAweDAwLAotCTB4RjAsIDB4MDAsIDB4QzksIDB4RkYsIDB4REYsIDB4RkIsIDB4QzQsIDB4RkQsIDB4MDEsIDB4MEQsIDB4OTAsCi0JMHgxRSwgMHhDQSwgMHgxRSwgMHg2OSwgMHgwRCwgMHhGMSwgMHhGRCwgMHhDRiwgMHhGQiwgMHhCOCwgMHhGRiwKLQkweEYyLCAweDAwLCAweDI5LCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDQ1LCAweDAwLCAweEZDLAotCTB4MDAsIDB4MkQsIDB4RkYsIDB4NkQsIDB4RkIsIDB4ODQsIDB4RkYsIDB4OEUsIDB4MTAsIDB4M0YsIDB4MjAsCi0JMHg5MSwgMHgxQywgMHhGMiwgMHgwOSwgMHg5RCwgMHhGQywgMHg2QSwgMHhGQywgMHgzOSwgMHgwMCwgMHhENywKLQkweDAwLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDZBLCAweDAwLCAweEYxLCAweDAwLAotCTB4N0EsIDB4RkUsIDB4M0QsIDB4RkIsIDB4QkMsIDB4MDEsIDB4MTQsIDB4MTQsIDB4NDEsIDB4MjEsIDB4RDQsCi0JMHgxOSwgMHhCMCwgMHgwNiwgMHhDMCwgMHhGQiwgMHgyMiwgMHhGRCwgMHg5OSwgMHgwMCwgMHhCMywgMHgwMCwKLQkweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZCLCAweEZGLCAweDkzLCAweDAwLCAweENCLAotCTB4MDAsIDB4QjgsIDB4RkQsIDB4NjEsIDB4RkIsIDB4NjMsIDB4MDQsIDB4NzEsIDB4MTcsIDB4ODksIDB4MjEsCi0JMHhCMCwgMHgxNiwgMHhCRCwgMHgwMywgMHg1MSwgMHhGQiwgMHhFNiwgMHhGRCwgMHhENywgMHgwMCwgMHg4QSwKLQkweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweDA1LCAweDAwLCAweEJDLCAweDAwLCAweDg2LCAweDAwLAotCTB4RjYsIDB4RkMsIDB4RTksIDB4RkIsIDB4NkEsIDB4MDcsIDB4ODAsIDB4MUEsIDB4MTUsIDB4MjEsIDB4NDcsCi0JMHgxMywgMHgyRiwgMHgwMSwgMHg0MiwgMHhGQiwgMHhBNSwgMHhGRSwgMHhGNiwgMHgwMCwgMHg2MSwgMHgwMCwKLQkweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE2LCAweDAwLCAweERGLCAweDAwLCAweDFFLCAweDAwLCAweDQzLAotCTB4RkMsIDB4RTEsIDB4RkMsIDB4QkIsIDB4MEEsIDB4MjEsIDB4MUQsIDB4RUEsIDB4MUYsIDB4QkMsIDB4MEYsCi0JMHgxMiwgMHhGRiwgMHg4MiwgMHhGQiwgMHg1NCwgMHhGRiwgMHhGQSwgMHgwMCwgMHgzRCwgMHgwMCwgMHhGOCwKLQkweEZGLCAweEY5LCAweEZGLCAweDMwLCAweDAwLCAweEY2LCAweDAwLCAweDk2LCAweEZGLCAweEIxLCAweEZCLAotCTB4NTEsIDB4RkUsIDB4M0EsIDB4MEUsIDB4MzgsIDB4MUYsIDB4MTYsIDB4MUUsIDB4MzIsIDB4MEMsIDB4NkUsCi0JMHhGRCwgMHgwMCwgMHhGQywgMHhFOCwgMHhGRiwgMHhFQSwgMHgwMCwgMHgyMCwgMHgwMCwgMHhGQiwgMHhGRiwKLQkweEY3LCAweEZGLCAweDUxLCAweDAwLCAweEZCLCAweDAwLCAweEYxLCAweEZFLCAweDU0LCAweEZCLCAweDNCLAotCTB4MDAsIDB4QzksIDB4MTEsIDB4QUQsIDB4MjAsIDB4QUMsIDB4MUIsIDB4Q0EsIDB4MDgsIDB4NDQsIDB4RkMsCi0JMHhBNywgMHhGQywgMHg1RSwgMHgwMCwgMHhDQywgMHgwMCwgMHgwQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwKLQkweEZGLCAweDc4LCAweDAwLCAweEU3LCAweDAwLCAweDM4LCAweEZFLCAweDQwLCAweEZCLCAweDlCLCAweDAyLAotCTB4NDUsIDB4MTUsIDB4NkYsIDB4MjEsIDB4QzcsIDB4MTgsIDB4QTEsIDB4MDUsIDB4OEUsIDB4RkIsIDB4NjUsCi0JMHhGRCwgMHhCMiwgMHgwMCwgMHhBNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZFLCAweEZGLCAweEEyLCAweDAwLCAweEI3LCAweDAwLCAweDc0LCAweEZELCAweDg0LCAweEZCLCAweDY2LAotCTB4MDUsIDB4OEEsIDB4MTgsIDB4NzYsIDB4MjEsIDB4ODcsIDB4MTUsIDB4Q0YsIDB4MDIsIDB4NDEsIDB4RkIsCi0JMHgyOSwgMHhGRSwgMHhFNSwgMHgwMCwgMHg3QiwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwQSwKLQkweDAwLCAweEM5LCAweDAwLCAweDY2LCAweDAwLCAweEI1LCAweEZDLCAweDMyLCAweEZDLCAweDg5LCAweDA4LAotCTB4NzcsIDB4MUIsIDB4QzIsIDB4MjAsIDB4MEYsIDB4MTIsIDB4NjYsIDB4MDAsIDB4NTAsIDB4RkIsIDB4RTQsCi0JMHhGRSwgMHhGQSwgMHgwMCwgMHg1NCwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweEU4LCAweDAwLCAweEYzLCAweEZGLCAweDBDLCAweEZDLCAweDUzLCAweEZELCAweEVELCAweDBCLCAweEVCLAotCTB4MUQsIDB4NUEsIDB4MUYsIDB4ODAsIDB4MEUsIDB4NzMsIDB4RkUsIDB4QTgsIDB4RkIsIDB4OEEsIDB4RkYsCi0JMHhGNywgMHgwMCwgMHgzMiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzQiwgMHgwMCwgMHhGQSwKLQkweDAwLCAweDYwLCAweEZGLCAweDhBLCAweEZCLCAweEVELCAweEZFLCAweDc2LCAweDBGLCAweENDLCAweDFGLAotCTB4NEYsIDB4MUQsIDB4RkYsIDB4MEEsIDB4RjksIDB4RkMsIDB4MzYsIDB4RkMsIDB4MTUsIDB4MDAsIDB4RTEsCi0JMHgwMCwgMHgxOCwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg1RSwgMHgwMCwgMHhGNywgMHgwMCwKLQkweEIzLCAweEZFLCAweDQ0LCAweEZCLCAweDAxLCAweDAxLCAweDAyLCAweDEzLCAweDA0LCAweDIxLCAweEI4LAotCTB4MUEsIDB4QTksIDB4MDcsIDB4RjgsIDB4RkIsIDB4RTcsIDB4RkMsIDB4N0YsIDB4MDAsIDB4QkYsIDB4MDAsCi0JMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwgMHg4NiwgMHgwMCwgMHhEQSwgMHgwMCwgMHhGNSwKLQkweEZELCAweDRDLCAweEZCLCAweDg3LCAweDAzLCAweDZFLCAweDE2LCAweDg2LCAweDIxLCAweEIwLCAweDE3LAotCTB4OUMsIDB4MDQsIDB4NjgsIDB4RkIsIDB4QTksIDB4RkQsIDB4QzcsIDB4MDAsIDB4OTYsIDB4MDAsIDB4RkIsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHhCMCwgMHgwMCwgMHg5RiwgMHgwMCwKLQkweDMxLCAweEZELCAweEI0LCAweEZCLCAweDczLCAweDA2LCAweDk5LCAweDE5LCAweDRELCAweDIxLCAweDU5LAotCTB4MTQsIDB4RUQsIDB4MDEsIDB4M0QsIDB4RkIsIDB4NkIsIDB4RkUsIDB4RUYsIDB4MDAsIDB4NkQsIDB4MDAsCi0JMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhENSwgMHgwMCwgMHg0MiwgMHgwMCwgMHg3NywKLQkweEZDLCAweDg4LCAweEZDLCAweEFGLCAweDA5LCAweDVGLCAweDFDLCAweDU5LCAweDIwLCAweEQ0LCAweDEwLAotCTB4QUMsIDB4RkYsIDB4NjcsIDB4RkIsIDB4MjAsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NDgsIDB4MDAsIDB4RjcsCi0JMHhGRiwgMHhGQSwgMHhGRiwgMHgyNywgMHgwMCwgMHhGMCwgMHgwMCwgMHhDMywgMHhGRiwgMHhEOSwgMHhGQiwKLQkweEQzLCAweEZELCAweDI0LCAweDBELCAweEEzLCAweDFFLCAweEI3LCAweDFFLCAweDQ2LCAweDBELCAweEUyLAotCTB4RkQsIDB4RDQsIDB4RkIsIDB4QkUsIDB4RkYsIDB4RjEsIDB4MDAsIDB4MjgsIDB4MDAsIDB4RkEsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMCwgMHgyNywgMHhGRiwgMHg2QSwgMHhGQiwgMHg5OCwKLQkweEZGLCAweEIxLCAweDEwLCAweDRDLCAweDIwLCAweDc4LCAweDFDLCAweEQxLCAweDA5LCAweDkzLCAweEZDLAotCTB4NzEsIDB4RkMsIDB4M0QsIDB4MDAsIDB4RDYsIDB4MDAsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsCi0JMHhGRiwgMHg2QywgMHgwMCwgMHhGMCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgzRCwgMHhGQiwgMHhENCwgMHgwMSwKLQkweDM2LCAweDE0LCAweDQ3LCAweDIxLCAweEI2LCAweDE5LCAweDkxLCAweDA2LCAweEJBLCAweEZCLCAweDI5LAotCTB4RkQsIDB4OUMsIDB4MDAsIDB4QjEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHhGQiwgMHhGRiwgMHg5NSwgMHgwMCwgMHhDOSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg2NSwgMHhGQiwgMHg4MCwKLQkweDA0LCAweDkwLCAweDE3LCAweDg4LCAweDIxLCAweDhGLCAweDE2LCAweEEyLCAweDAzLCAweDRFLCAweEZCLAotCTB4RUQsIDB4RkQsIDB4RDksIDB4MDAsIDB4ODgsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDUsCi0JMHgwMCwgMHhCRCwgMHgwMCwgMHg4MiwgMHgwMCwgMHhFRiwgMHhGQywgMHhGMCwgMHhGQiwgMHg4QSwgMHgwNywKLQkweDlDLCAweDFBLCAweDBELCAweDIxLCAweDI0LCAweDEzLCAweDE4LCAweDAxLCAweDQzLCAweEZCLCAweEFDLAotCTB4RkUsIDB4RjcsIDB4MDAsIDB4NjAsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTcsIDB4MDAsCi0JMHhFMCwgMHgwMCwgMHgxQSwgMHgwMCwgMHgzRCwgMHhGQywgMHhFRCwgMHhGQywgMHhERCwgMHgwQSwgMHgzOCwKLQkweDFELCAweERCLCAweDFGLCAweDk5LCAweDBGLCAweEZGLCAweEZFLCAweDg2LCAweEZCLCAweDVBLCAweEZGLAotCTB4RkEsIDB4MDAsIDB4M0MsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzEsIDB4MDAsIDB4RjYsCi0JMHgwMCwgMHg5MCwgMHhGRiwgMHhBRCwgMHhGQiwgMHg2MiwgMHhGRSwgMHg1RCwgMHgwRSwgMHg0OSwgMHgxRiwKLQkweDAxLCAweDFFLCAweDEwLCAweDBDLCAweDYwLCAweEZELCAweDA2LCAweEZDLCAweEVFLCAweEZGLCAweEU5LAotCTB4MDAsIDB4MUYsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTMsIDB4MDAsIDB4RkIsIDB4MDAsCi0JMHhFQiwgMHhGRSwgMHg1MiwgMHhGQiwgMHg1MSwgMHgwMCwgMHhFQywgMHgxMSwgMHhCNywgMHgyMCwgMHg5MSwKLQkweDFCLCAweEE5LCAweDA4LCAweDNCLCAweEZDLCAweEFFLCAweEZDLCAweDYyLCAweDAwLCAweENBLCAweDAwLAotCTB4MEIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0EsIDB4MDAsIDB4RTYsIDB4MDAsIDB4MzAsCi0JMHhGRSwgMHg0MCwgMHhGQiwgMHhCNSwgMHgwMiwgMHg2NiwgMHgxNSwgMHg3MywgMHgyMSwgMHhBOSwgMHgxOCwKLQkweDgzLCAweDA1LCAweDg5LCAweEZCLCAweDZELCAweEZELCAweEI0LCAweDAwLCAweEEzLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QTMsIDB4MDAsIDB4QjQsIDB4MDAsCi0JMHg2RCwgMHhGRCwgMHg4OSwgMHhGQiwgMHg4MywgMHgwNSwgMHhBOSwgMHgxOCwgMHg3MywgMHgyMSwgMHg2NiwKLQkweDE1LCAweEI1LCAweDAyLCAweDQwLCAweEZCLCAweDMwLCAweEZFLCAweEU2LCAweDAwLCAweDdBLCAweDAwLAotCTB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4Q0EsIDB4MDAsIDB4NjIsIDB4MDAsIDB4QUUsCi0JMHhGQywgMHgzQiwgMHhGQywgMHhBOSwgMHgwOCwgMHg5MSwgMHgxQiwgMHhCNywgMHgyMCwgMHhFQywgMHgxMSwKLQkweDUxLCAweDAwLCAweDUyLCAweEZCLCAweEVCLCAweEZFLCAweEZCLCAweDAwLCAweDUzLCAweDAwLCAweEY3LAotCTB4RkYsIDB4RkIsIDB4RkYsIDB4MUYsIDB4MDAsIDB4RTksIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDYsIDB4RkMsCi0JMHg2MCwgMHhGRCwgMHgxMCwgMHgwQywgMHgwMSwgMHgxRSwgMHg0OSwgMHgxRiwgMHg1RCwgMHgwRSwgMHg2MiwKLQkweEZFLCAweEFELCAweEZCLCAweDkwLCAweEZGLCAweEY2LCAweDAwLCAweDMxLCAweDAwLCAweEY5LCAweEZGLAotCTB4RjgsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RkEsIDB4MDAsIDB4NUEsIDB4RkYsIDB4ODYsIDB4RkIsIDB4RkYsCi0JMHhGRSwgMHg5OSwgMHgwRiwgMHhEQiwgMHgxRiwgMHgzOCwgMHgxRCwgMHhERCwgMHgwQSwgMHhFRCwgMHhGQywKLQkweDNELCAweEZDLCAweDFBLCAweDAwLCAweEUwLCAweDAwLCAweDE3LCAweDAwLCAweEZDLCAweEZGLCAweEY3LAotCTB4RkYsIDB4NjAsIDB4MDAsIDB4RjcsIDB4MDAsIDB4QUMsIDB4RkUsIDB4NDMsIDB4RkIsIDB4MTgsIDB4MDEsCi0JMHgyNCwgMHgxMywgMHgwRCwgMHgyMSwgMHg5QywgMHgxQSwgMHg4QSwgMHgwNywgMHhGMCwgMHhGQiwgMHhFRiwKLQkweEZDLCAweDgyLCAweDAwLCAweEJELCAweDAwLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweEY5LCAweEZGLAotCTB4ODgsIDB4MDAsIDB4RDksIDB4MDAsIDB4RUQsIDB4RkQsIDB4NEUsIDB4RkIsIDB4QTIsIDB4MDMsIDB4OEYsCi0JMHgxNiwgMHg4OCwgMHgyMSwgMHg5MCwgMHgxNywgMHg4MCwgMHgwNCwgMHg2NSwgMHhGQiwgMHhCMSwgMHhGRCwKLQkweEM5LCAweDAwLCAweDk1LCAweDAwLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAyLAotCTB4MDAsIDB4QjEsIDB4MDAsIDB4OUMsIDB4MDAsIDB4MjksIDB4RkQsIDB4QkEsIDB4RkIsIDB4OTEsIDB4MDYsCi0JMHhCNiwgMHgxOSwgMHg0NywgMHgyMSwgMHgzNiwgMHgxNCwgMHhENCwgMHgwMSwgMHgzRCwgMHhGQiwgMHg3MiwKLQkweEZFLCAweEYwLCAweDAwLCAweDZDLCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDExLCAweDAwLAotCTB4RDYsIDB4MDAsIDB4M0QsIDB4MDAsIDB4NzEsIDB4RkMsIDB4OTMsIDB4RkMsIDB4RDEsIDB4MDksIDB4NzgsCi0JMHgxQywgMHg0QywgMHgyMCwgMHhCMSwgMHgxMCwgMHg5OCwgMHhGRiwgMHg2QSwgMHhGQiwgMHgyNywgMHhGRiwKLQkweEZDLCAweDAwLCAweDQ2LCAweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI4LCAweDAwLCAweEYxLAotCTB4MDAsIDB4QkUsIDB4RkYsIDB4RDQsIDB4RkIsIDB4RTIsIDB4RkQsIDB4NDYsIDB4MEQsIDB4QjcsIDB4MUUsCi0JMHhBMywgMHgxRSwgMHgyNCwgMHgwRCwgMHhEMywgMHhGRCwgMHhEOSwgMHhGQiwgMHhDMywgMHhGRiwgMHhGMCwKLQkweDAwLCAweDI3LCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDQ4LCAweDAwLCAweEZDLCAweDAwLAotCTB4MjAsIDB4RkYsIDB4NjcsIDB4RkIsIDB4QUMsIDB4RkYsIDB4RDQsIDB4MTAsIDB4NTksIDB4MjAsIDB4NUYsCi0JMHgxQywgMHhBRiwgMHgwOSwgMHg4OCwgMHhGQywgMHg3NywgMHhGQywgMHg0MiwgMHgwMCwgMHhENSwgMHgwMCwKLQkweDEwLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDZELCAweDAwLCAweEVGLCAweDAwLCAweDZCLAotCTB4RkUsIDB4M0QsIDB4RkIsIDB4RUQsIDB4MDEsIDB4NTksIDB4MTQsIDB4NEQsIDB4MjEsIDB4OTksIDB4MTksCi0JMHg3MywgMHgwNiwgMHhCNCwgMHhGQiwgMHgzMSwgMHhGRCwgMHg5RiwgMHgwMCwgMHhCMCwgMHgwMCwgMHgwMSwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZCLCAweEZGLCAweDk2LCAweDAwLCAweEM3LCAweDAwLAotCTB4QTksIDB4RkQsIDB4NjgsIDB4RkIsIDB4OUMsIDB4MDQsIDB4QjAsIDB4MTcsIDB4ODYsIDB4MjEsIDB4NkUsCi0JMHgxNiwgMHg4NywgMHgwMywgMHg0QywgMHhGQiwgMHhGNSwgMHhGRCwgMHhEQSwgMHgwMCwgMHg4NiwgMHgwMCwKLQkweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA2LCAweDAwLCAweEJGLCAweDAwLCAweDdGLCAweDAwLCAweEU3LAotCTB4RkMsIDB4RjgsIDB4RkIsIDB4QTksIDB4MDcsIDB4QjgsIDB4MUEsIDB4MDQsIDB4MjEsIDB4MDIsIDB4MTMsCi0JMHgwMSwgMHgwMSwgMHg0NCwgMHhGQiwgMHhCMywgMHhGRSwgMHhGNywgMHgwMCwgMHg1RSwgMHgwMCwgMHhGNywKLQkweEZGLCAweEZDLCAweEZGLCAweDE4LCAweDAwLCAweEUxLCAweDAwLCAweDE1LCAweDAwLCAweDM2LCAweEZDLAotCTB4RjksIDB4RkMsIDB4RkYsIDB4MEEsIDB4NEYsIDB4MUQsIDB4Q0MsIDB4MUYsIDB4NzYsIDB4MEYsIDB4RUQsCi0JMHhGRSwgMHg4QSwgMHhGQiwgMHg2MCwgMHhGRiwgMHhGQSwgMHgwMCwgMHgzQiwgMHgwMCwgMHhGOCwgMHhGRiwKLQkweEY5LCAweEZGLCAweDMyLCAweDAwLCAweEY3LCAweDAwLCAweDhBLCAweEZGLCAweEE4LCAweEZCLCAweDczLAotCTB4RkUsIDB4ODAsIDB4MEUsIDB4NUEsIDB4MUYsIDB4RUIsIDB4MUQsIDB4RUQsIDB4MEIsIDB4NTMsIDB4RkQsCi0JMHgwQywgMHhGQywgMHhGMywgMHhGRiwgMHhFOCwgMHgwMCwgMHgxRSwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywKLQkweEZGLCAweDU0LCAweDAwLCAweEZBLCAweDAwLCAweEU0LCAweEZFLCAweDUwLCAweEZCLCAweDY2LCAweDAwLAotCTB4MEYsIDB4MTIsIDB4QzIsIDB4MjAsIDB4NzcsIDB4MUIsIDB4ODksIDB4MDgsIDB4MzIsIDB4RkMsIDB4QjUsCi0JMHhGQywgMHg2NiwgMHgwMCwgMHhDOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwKLQkweDdCLCAweDAwLCAweEU1LCAweDAwLCAweDI5LCAweEZFLCAweDQxLCAweEZCLCAweENGLCAweDAyLCAweDg3LAotCTB4MTUsIDB4NzYsIDB4MjEsIDB4OEEsIDB4MTgsIDB4NjYsIDB4MDUsIDB4ODQsIDB4RkIsIDB4NzQsIDB4RkQsCi0JMHhCNywgMHgwMCwgMHhBMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweEE1LCAweDAwLCAweEIyLCAweDAwLCAweDY1LCAweEZELCAweDhFLCAweEZCLCAweEExLCAweDA1LAotCTB4QzcsIDB4MTgsIDB4NkYsIDB4MjEsIDB4NDUsIDB4MTUsIDB4OUIsIDB4MDIsIDB4NDAsIDB4RkIsIDB4MzgsCi0JMHhGRSwgMHhFNywgMHgwMCwgMHg3OCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwQiwgMHgwMCwKLQkweENDLCAweDAwLCAweDVFLCAweDAwLCAweEE3LCAweEZDLCAweDQ0LCAweEZDLCAweENBLCAweDA4LCAweEFDLAotCTB4MUIsIDB4QUQsIDB4MjAsIDB4QzksIDB4MTEsIDB4M0IsIDB4MDAsIDB4NTQsIDB4RkIsIDB4RjEsIDB4RkUsCi0JMHhGQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgyMCwgMHgwMCwgMHhFQSwKLQkweDAwLCAweEU4LCAweEZGLCAweDAwLCAweEZDLCAweDZFLCAweEZELCAweDMyLCAweDBDLCAweDE2LCAweDFFLAotCTB4MzgsIDB4MUYsIDB4M0EsIDB4MEUsIDB4NTEsIDB4RkUsIDB4QjEsIDB4RkIsIDB4OTYsIDB4RkYsIDB4RjYsCi0JMHgwMCwgMHgzMCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzRCwgMHgwMCwgMHhGQSwgMHgwMCwKLQkweDU0LCAweEZGLCAweDgyLCAweEZCLCAweDEyLCAweEZGLCAweEJDLCAweDBGLCAweEVBLCAweDFGLCAweDIxLAotCTB4MUQsIDB4QkIsIDB4MEEsIDB4RTEsIDB4RkMsIDB4NDMsIDB4RkMsIDB4MUUsIDB4MDAsIDB4REYsIDB4MDAsCi0JMHgxNiwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg2MSwgMHgwMCwgMHhGNiwgMHgwMCwgMHhBNSwKLQkweEZFLCAweDQyLCAweEZCLCAweDJGLCAweDAxLCAweDQ3LCAweDEzLCAweDE1LCAweDIxLCAweDgwLCAweDFBLAotCTB4NkEsIDB4MDcsIDB4RTksIDB4RkIsIDB4RjYsIDB4RkMsIDB4ODYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4MDUsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4QSwgMHgwMCwgMHhENywgMHgwMCwgMHhFNiwgMHhGRCwKLQkweDUxLCAweEZCLCAweEJELCAweDAzLCAweEIwLCAweDE2LCAweDg5LCAweDIxLCAweDcxLCAweDE3LCAweDYzLAotCTB4MDQsIDB4NjEsIDB4RkIsIDB4QjgsIDB4RkQsIDB4Q0IsIDB4MDAsIDB4OTMsIDB4MDAsIDB4RkIsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMCwgMHhCMywgMHgwMCwgMHg5OSwgMHgwMCwgMHgyMiwKLQkweEZELCAweEMwLCAweEZCLCAweEIwLCAweDA2LCAweEQ0LCAweDE5LCAweDQxLCAweDIxLCAweDE0LCAweDE0LAotCTB4QkMsIDB4MDEsIDB4M0QsIDB4RkIsIDB4N0EsIDB4RkUsIDB4RjEsIDB4MDAsIDB4NkEsIDB4MDAsIDB4RjcsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhENywgMHgwMCwgMHgzOSwgMHgwMCwgMHg2QSwgMHhGQywKLQkweDlELCAweEZDLCAweEYyLCAweDA5LCAweDkxLCAweDFDLCAweDNGLCAweDIwLCAweDhFLCAweDEwLCAweDg0LAotCTB4RkYsIDB4NkQsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NDUsIDB4MDAsIDB4RjcsIDB4RkYsCi0JMHhGQSwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGMiwgMHgwMCwgMHhCOCwgMHhGRiwgMHhDRiwgMHhGQiwgMHhGMSwKLQkweEZELCAweDY5LCAweDBELCAweENBLCAweDFFLCAweDkwLCAweDFFLCAweDAxLCAweDBELCAweEM0LCAweEZELAotCTB4REYsIDB4RkIsIDB4QzksIDB4RkYsIDB4RjAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsCi0JMHhGRiwgMHg0OSwgMHgwMCwgMHhGQywgMHgwMCwgMHgxQSwgMHhGRiwgMHg2NCwgMHhGQiwgMHhDMCwgMHhGRiwKLQkweEY3LCAweDEwLCAweDY2LCAweDIwLCAweDQ2LCAweDFDLCAweDhFLCAweDA5LCAweDdFLCAweEZDLCAweDdFLAotCTB4RkMsIDB4NDYsIDB4MDAsIDB4RDQsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsCi0JMHg2RiwgMHgwMCwgMHhFRSwgMHgwMCwgMHg2NCwgMHhGRSwgMHgzRCwgMHhGQiwgMHgwNSwgMHgwMiwgMHg3QiwKLQkweDE0LCAweDUzLCAweDIxLCAweDdDLCAweDE5LCAweDU0LCAweDA2LCAweEFFLCAweEZCLCAweDM4LCAweEZELAotCTB4QTEsIDB4MDAsIDB4QUUsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkMsCi0JMHhGRiwgMHg5OCwgMHgwMCwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRCwgMHg2QywgMHhGQiwgMHhCOCwgMHgwNCwKLQkweENGLCAweDE3LCAweDg1LCAweDIxLCAweDRFLCAweDE2LCAweDZDLCAweDAzLCAweDRBLCAweEZCLCAweEZDLAotCTB4RkQsIDB4REMsIDB4MDAsIDB4ODUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDAsCi0JMHhDMCwgMHgwMCwgMHg3QiwgMHgwMCwgMHhFMCwgMHhGQywgMHgwMCwgMHhGQywgMHhDOSwgMHgwNywgMHhEMywKLQkweDFBLCAweEZDLCAweDIwLCAweERGLCAweDEyLCAweEVBLCAweDAwLCAweDQ2LCAweEZCLCAweEJBLCAweEZFLAotCTB4RjgsIDB4MDAsIDB4NUQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTksIDB4MDAsIDB4RTIsCi0JMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHhGQywgMHgwNSwgMHhGRCwgMHgyMSwgMHgwQiwgMHg2NiwgMHgxRCwKLQkweEJELCAweDFGLCAweDUzLCAweDBGLCAweERCLCAweEZFLCAweDhFLCAweEZCLCAweDY2LCAweEZGLCAweEZBLAotCTB4MDAsIDB4M0EsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzQsIDB4MDAsIDB4RjcsIDB4MDAsCi0JMHg4NCwgMHhGRiwgMHhBNCwgMHhGQiwgMHg4NCwgMHhGRSwgMHhBMywgMHgwRSwgMHg2QywgMHgxRiwgMHhENiwKLQkweDFELCAweENCLCAweDBCLCAweDQ1LCAweEZELCAweDEyLCAweEZDLCAweEY4LCAweEZGLCAweEU3LCAweDAwLAotCTB4MUQsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTYsIDB4MDAsIDB4RkEsIDB4MDAsIDB4REQsCi0JMHhGRSwgMHg0RSwgMHhGQiwgMHg3QywgMHgwMCwgMHgzMiwgMHgxMiwgMHhDQywgMHgyMCwgMHg1QywgMHgxQiwKLQkweDY5LCAweDA4LCAweDI5LCAweEZDLCAweEJDLCAweEZDLCAweDY5LCAweDAwLCAweEM3LCAweDAwLCAweDA5LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0QsIDB4MDAsIDB4RTMsIDB4MDAsIDB4MjEsIDB4RkUsCi0JMHg0MywgMHhGQiwgMHhFOSwgMHgwMiwgMHhBOSwgMHgxNSwgMHg3OSwgMHgyMSwgMHg2QiwgMHgxOCwgMHg0OCwKLQkweDA1LCAweDgwLCAweEZCLCAweDdDLCAweEZELCAweEI5LCAweDAwLCAweEEwLCAweDAwLCAweEZELCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QTYsIDB4MDAsIDB4QUYsIDB4MDAsIDB4NUUsCi0JMHhGRCwgMHg5MywgMHhGQiwgMHhCRSwgMHgwNSwgMHhFNSwgMHgxOCwgMHg2QiwgMHgyMSwgMHgyMywgMHgxNSwKLQkweDgyLCAweDAyLCAweDNGLCAweEZCLCAweDNGLCAweEZFLCAweEU5LCAweDAwLCAweDc3LCAweDAwLCAweEY4LAotCTB4RkYsIDB4RkUsIDB4RkYsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4MDAsIDB4NUEsIDB4MDAsIDB4QTAsIDB4RkMsCi0JMHg0RCwgMHhGQywgMHhFQSwgMHgwOCwgMHhDNiwgMHgxQiwgMHhBMSwgMHgyMCwgMHhBNiwgMHgxMSwgMHgyNiwKLQkweDAwLCAweDU3LCAweEZCLCAweEY4LCAweEZFLCAweEZCLCAweDAwLCAweDUwLCAweDAwLCAweEY3LCAweEZGLAotCTB4RkIsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4RkEsIDB4RkIsIDB4N0MsCi0JMHhGRCwgMHg1NCwgMHgwQywgMHgyQiwgMHgxRSwgMHgyNiwgMHgxRiwgMHgxNywgMHgwRSwgMHg0MSwgMHhGRSwKLQkweEI2LCAweEZCLCAweDlDLCAweEZGLCAweEY1LCAweDAwLCAweDJGLCAweDAwLCAweEY5LCAweEZGLCAweEY4LAotCTB4RkYsIDB4M0YsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NEQsIDB4RkYsIDB4N0YsIDB4RkIsIDB4MjQsIDB4RkYsCi0JMHhERiwgMHgwRiwgMHhGOSwgMHgxRiwgMHgwOSwgMHgxRCwgMHg5OSwgMHgwQSwgMHhENSwgMHhGQywgMHg0OSwKLQkweEZDLCAweDIzLCAweDAwLCAweERELCAweDAwLCAweDE2LCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLAotCTB4NjMsIDB4MDAsIDB4RjUsIDB4MDAsIDB4OUUsIDB4RkUsIDB4NDEsIDB4RkIsIDB4NDYsIDB4MDEsIDB4NjksCi0JMHgxMywgMHgxRCwgMHgyMSwgMHg2MywgMHgxQSwgMHg0QiwgMHgwNywgMHhFMiwgMHhGQiwgMHhGRCwgMHhGQywKLQkweDg5LCAweDAwLCAweEJBLCAweDAwLCAweDA0LCAweDAwLCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweDhCLAotCTB4MDAsIDB4RDUsIDB4MDAsIDB4REUsIDB4RkQsIDB4NTMsIDB4RkIsIDB4RDksIDB4MDMsIDB4RDAsIDB4MTYsCi0JMHg4QSwgMHgyMSwgMHg1MSwgMHgxNywgMHg0NywgMHgwNCwgMHg1RSwgMHhGQiwgMHhDMCwgMHhGRCwgMHhDRCwKLQkweDAwLCAweDkyLCAweDAwLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAyLCAweDAwLAotCTB4QjQsIDB4MDAsIDB4OTYsIDB4MDAsIDB4MUIsIDB4RkQsIDB4QzcsIDB4RkIsIDB4Q0YsIDB4MDYsIDB4RjAsCi0JMHgxOSwgMHgzQSwgMHgyMSwgMHhGMiwgMHgxMywgMHhBNCwgMHgwMSwgMHgzRSwgMHhGQiwgMHg4MSwgMHhGRSwKLQkweEYyLCAweDAwLCAweDY5LCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEQ5LAotCTB4MDAsIDB4MzUsIDB4MDAsIDB4NjMsIDB4RkMsIDB4QTgsIDB4RkMsIDB4MTMsIDB4MEEsIDB4QTksIDB4MUMsCi0JMHgzMiwgMHgyMCwgMHg2QiwgMHgxMCwgMHg3MSwgMHhGRiwgMHg3MSwgMHhGQiwgMHgzNCwgMHhGRiwgMHhGQiwKLQkweDAwLCAweDQ0LCAweDAwLCAweEY4LCAweEZGLCAweEZBLCAweEZGLCAweDJCLCAweDAwLCAweEYzLCAweDAwLAotCTB4QjMsIDB4RkYsIDB4Q0EsIDB4RkIsIDB4MDEsIDB4RkUsIDB4OEMsIDB4MEQsIDB4REQsIDB4MUUsIDB4N0MsCi0JMHgxRSwgMHhERSwgMHgwQywgMHhCNSwgMHhGRCwgMHhFNCwgMHhGQiwgMHhDRSwgMHhGRiwgMHhFRiwgMHgwMCwKLQkweDI1LCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRBLCAweDAwLCAweEZDLCAweDAwLCAweDEzLAotCTB4RkYsIDB4NjEsIDB4RkIsIDB4RDQsIDB4RkYsIDB4MUEsIDB4MTEsIDB4NzIsIDB4MjAsIDB4MkQsIDB4MUMsCi0JMHg2RCwgMHgwOSwgMHg3NCwgMHhGQywgMHg4NSwgMHhGQywgMHg0QSwgMHgwMCwgMHhEMiwgMHgwMCwgMHgwRiwKLQkweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLCAweDcwLCAweDAwLCAweEVELCAweDAwLCAweDVELCAweEZFLAotCTB4M0QsIDB4RkIsIDB4MUUsIDB4MDIsIDB4OUMsIDB4MTQsIDB4NTgsIDB4MjEsIDB4NUUsIDB4MTksIDB4MzYsCi0JMHgwNiwgMHhBOCwgMHhGQiwgMHg0MCwgMHhGRCwgMHhBNCwgMHgwMCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZDLCAweEZGLCAweDlBLCAweDAwLCAweEMzLCAweDAwLCAweDlBLAotCTB4RkQsIDB4NkYsIDB4RkIsIDB4RDUsIDB4MDQsIDB4RUYsIDB4MTcsIDB4ODMsIDB4MjEsIDB4MkQsIDB4MTYsCi0JMHg1MiwgMHgwMywgMHg0OSwgMHhGQiwgMHgwNCwgMHhGRSwgMHhERCwgMHgwMCwgMHg4MywgMHgwMCwgMHhGOSwKLQkweEZGLCAweEZGLCAweEZGLCAweDA3LCAweDAwLCAweEMyLCAweDAwLCAweDc4LCAweDAwLCAweEQ5LCAweEZDLAotCTB4MDgsIDB4RkMsIDB4RTksIDB4MDcsIDB4RUYsIDB4MUEsIDB4RjMsIDB4MjAsIDB4QkMsIDB4MTIsIDB4RDQsCi0JMHgwMCwgMHg0NywgMHhGQiwgMHhDMSwgMHhGRSwgMHhGOCwgMHgwMCwgMHg1QiwgMHgwMCwgMHhGNywgMHhGRiwKLQkweEZDLCAweEZGLCAweDFBLCAweDAwLCAweEUzLCAweDAwLCAweDBCLCAweDAwLCAweDJBLCAweEZDLCAweDEyLAotCTB4RkQsIDB4NDIsIDB4MEIsIDB4N0QsIDB4MUQsIDB4QUQsIDB4MUYsIDB4MkYsIDB4MEYsIDB4QzksIDB4RkUsCi0JMHg5MiwgMHhGQiwgMHg2QywgMHhGRiwgMHhGOSwgMHgwMCwgMHgzOCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwKLQkweEZGLCAweDM1LCAweDAwLCAweEY4LCAweDAwLCAweDdFLCAweEZGLCAweDlGLCAweEZCLCAweDk1LCAweEZFLAotCTB4QzYsIDB4MEUsIDB4N0MsIDB4MUYsIDB4QzAsIDB4MUQsIDB4QTksIDB4MEIsIDB4MzgsIDB4RkQsIDB4MTgsCi0JMHhGQywgMHhGRCwgMHhGRiwgMHhFNiwgMHgwMCwgMHgxRCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwKLQkweDU3LCAweDAwLCAweEZBLCAweDAwLCAweEQ2LCAweEZFLCAweDRDLCAweEZCLCAweDkyLCAweDAwLCAweDU0LAotCTB4MTIsIDB4RDYsIDB4MjAsIDB4NDEsIDB4MUIsIDB4NDksIDB4MDgsIDB4MjAsIDB4RkMsIDB4QzMsIDB4RkMsCi0JMHg2RCwgMHgwMCwgMHhDNiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3RSwKLQkweDAwLCAweEUyLCAweDAwLCAweDFBLCAweEZFLCAweDQ0LCAweEZCLCAweDAzLCAweDAzLCAweENBLCAweDE1LAotCTB4N0MsIDB4MjEsIDB4NEMsIDB4MTgsIDB4MkIsIDB4MDUsIDB4N0IsIDB4RkIsIDB4ODMsIDB4RkQsIDB4QkMsCi0JMHgwMCwgMHg5RSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweEE4LCAweDAwLCAweEFELCAweDAwLCAweDU2LCAweEZELCAweDk4LCAweEZCLCAweERDLCAweDA1LCAweDA0LAotCTB4MTksIDB4NjYsIDB4MjEsIDB4MDIsIDB4MTUsIDB4NjksIDB4MDIsIDB4M0UsIDB4RkIsIDB4NDcsIDB4RkUsCi0JMHhFQSwgMHgwMCwgMHg3NSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDRSwKLQkweDAwLCAweDU2LCAweDAwLCAweDk5LCAweEZDLCAweDU2LCAweEZDLCAweDBCLCAweDA5LCAweEUwLCAweDFCLAotCTB4OTYsIDB4MjAsIDB4ODMsIDB4MTEsIDB4MTEsIDB4MDAsIDB4NTksIDB4RkIsIDB4RkYsIDB4RkUsIDB4RkIsCi0JMHgwMCwgMHg0RSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgyMiwgMHgwMCwgMHhFQywgMHgwMCwKLQkweERFLCAweEZGLCAweEY1LCAweEZCLCAweDhBLCAweEZELCAweDc3LCAweDBDLCAweDNGLCAweDFFLCAweDE0LAotCTB4MUYsIDB4RjUsIDB4MEQsIDB4MzEsIDB4RkUsIDB4QkIsIDB4RkIsIDB4QTIsIDB4RkYsIDB4RjUsIDB4MDAsCi0JMHgyRSwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MCwgMHgwMCwgMHhGQiwgMHgwMCwgMHg0NywKLQkweEZGLCAweDdCLCAweEZCLCAweDM3LCAweEZGLCAweDAyLCAweDEwLCAweDA3LCAweDIwLCAweEYyLCAweDFDLAotCTB4NzgsIDB4MEEsIDB4Q0EsIDB4RkMsIDB4NTAsIDB4RkMsIDB4MjcsIDB4MDAsIDB4REMsIDB4MDAsIDB4MTUsCi0JMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwgMHg2NCwgMHgwMCwgMHhGNSwgMHgwMCwgMHg5NywgMHhGRSwKLQkweDQwLCAweEZCLCAweDVELCAweDAxLCAweDhCLCAweDEzLCAweDI1LCAweDIxLCAweDQ3LCAweDFBLCAweDJDLAotCTB4MDcsIDB4REIsIDB4RkIsIDB4MDUsIDB4RkQsIDB4OEMsIDB4MDAsIDB4QjksIDB4MDAsIDB4MDQsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4RCwgMHgwMCwgMHhEMywgMHgwMCwgMHhENiwgMHhGRCwgMHg1NiwKLQkweEZCLCAweEY0LCAweDAzLCAweEYwLCAweDE2LCAweDhBLCAweDIxLCAweDMxLCAweDE3LCAweDJCLCAweDA0LAotCTB4NUIsIDB4RkIsIDB4QzcsIDB4RkQsIDB4Q0YsIDB4MDAsIDB4OTAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwgMHhCNiwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMywgMHhGRCwKLQkweENELCAweEZCLCAweEVFLCAweDA2LCAweDBELCAweDFBLCAweDMzLCAweDIxLCAweEQwLCAweDEzLCAweDhDLAotCTB4MDEsIDB4M0UsIDB4RkIsIDB4ODgsIDB4RkUsIDB4RjMsIDB4MDAsIDB4NjcsIDB4MDAsIDB4RjcsIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwMywgMHhGRiwgMHhGRSwgMHgwMCwgMHhBMSwgMHgwMiwgMHhBNiwKLQkweEY4LCAweDU2LCAweDAyLCAweEE1LCAweDI4LCAweEE1LCAweDI4LCAweDU2LCAweDAyLCAweEE2LCAweEY4LAotCTB4QTEsIDB4MDIsIDB4RkUsIDB4MDAsIDB4MDMsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgyMSwgMHgwMCwgMHhBNiwgMHhGRiwgMHgzRiwgMHhGRiwgMHgwQiwgMHgwMywgMHg0MiwgMHhGRSwKLQkweDNFLCAweEY4LCAweDdGLCAweDE1LCAweEFDLCAweDMwLCAweDdGLCAweDE1LCAweDNFLCAweEY4LCAweDQyLAotCTB4RkUsIDB4MEIsIDB4MDMsIDB4M0YsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGQSwgMHhGRiwgMHhDRSwgMHhGRiwgMHgxNCwgMHgwMSwgMHgwMCwgMHhGRCwgMHgzNSwgMHgwNiwgMHhENSwKLQkweEY0LCAweERBLCAweDE1LCAweDkyLCAweDQwLCAweEFFLCAweEZFLCAweEYzLCAweEZDLCAweDY4LCAweDAzLAotCTB4ODYsIDB4RkQsIDB4NTEsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUMsCi0JMHhGRiwgMHhGOSwgMHhGRiwgMHhDNiwgMHgwMCwgMHg1NSwgMHhGRCwgMHgzNSwgMHgwNiwgMHg5MCwgMHhGMywKLQkweEU1LCAweDFDLCAweDZCLCAweDNELCAweDcxLCAweEZBLCAweDM0LCAweEZGLCAweDQ2LCAweDAyLCAweEZGLAotCTB4RkQsIDB4MkQsIDB4MDEsIDB4OTAsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REIsIDB4RkYsCi0JMHgyRCwgMHgwMCwgMHg2MCwgMHgwMCwgMHhFMSwgMHhGRCwgMHhDRSwgMHgwNSwgMHhFRCwgMHhGMiwgMHhGMywKLQkweDIzLCAweDIwLCAweDM5LCAweDIyLCAweEY3LCAweDQ0LCAweDAxLCAweDFGLCAweDAxLCAweDg5LCAweEZFLAotCTB4RkIsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjgsCi0JMHgwMCwgMHhFNSwgMHhGRiwgMHhBMCwgMHhGRSwgMHhGQiwgMHgwNCwgMHgwQywgMHhGMywgMHhDNSwgMHgyQSwKLQkweEQ4LCAweDMzLCAweEM5LCAweEY0LCAweDBCLCAweDAzLCAweDA1LCAweDAwLCAweDFBLCAweEZGLCAweEMxLAotCTB4MDAsIDB4QUQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjUsIDB4RkYsIDB4QTUsIDB4MDAsCi0JMHg1QywgMHhGRiwgMHg4QywgMHhGRiwgMHhCRiwgMHgwMywgMHgwNiwgMHhGNCwgMHgyMiwgMHgzMSwgMHhDOCwKLQkweDJELCAweDYzLCAweEYzLCAweDc2LCAweDA0LCAweDA4LCAweEZGLCAweEE3LCAweEZGLCAweDg0LCAweDAwLAotCTB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QTQsIDB4RkYsIDB4RTEsIDB4MDAsIDB4Q0IsCi0JMHhGRSwgMHg5QiwgMHgwMCwgMHgyMSwgMHgwMiwgMHhFRSwgMHhGNSwgMHhDRCwgMHgzNiwgMHgyNCwgMHgyNywKLQkweEUxLCAweEYyLCAweDdBLCAweDA1LCAweDMzLCAweEZFLCAweDJBLCAweDAwLCAweDQ3LCAweDAwLCAweEQzLAotCTB4RkYsIDB4MDQsIDB4MDAsIDB4MEYsIDB4MDAsIDB4OTUsIDB4RkYsIDB4MTcsIDB4MDEsIDB4M0QsIDB4RkUsCi0JMHhCRCwgMHgwMSwgMHgzMCwgMHgwMCwgMHhDQywgMHhGOCwgMHg5MiwgMHgzQiwgMHgyQSwgMHgyMCwgMHgyRSwKLQkweEYzLCAweDEyLCAweDA2LCAweDhGLCAweEZELCAweDlBLCAweDAwLCAweDEwLCAweDAwLCAweEU1LCAweEZGLAotCTB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OEMsIDB4RkYsIDB4NDIsIDB4MDEsIDB4QkIsIDB4RkQsIDB4RTQsCi0JMHgwMiwgMHgwMSwgMHhGRSwgMHg5QywgMHhGQywgMHg0NSwgMHgzRiwgMHgxNiwgMHgxOSwgMHgyRCwgMHhGNCwKLQkweDQxLCAweDA2LCAweDIxLCAweEZELCAweEYzLCAweDAwLCAweEUwLCAweEZGLCAweEY0LCAweEZGLCAweDAxLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NUQsIDB4MDEsIDB4NEYsIDB4RkQsIDB4RkIsIDB4MDMsCi0JMHhCMiwgMHhGQiwgMHg1MywgMHgwMSwgMHhDMiwgMHg0MSwgMHgyNCwgMHgxMiwgMHhCQSwgMHhGNSwgMHgwRiwKLQkweDA2LCAweEU5LCAweEZDLCAweDMzLCAweDAxLCAweEJCLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEQsIDB4MDAsIDB4OTMsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MDQsIDB4RkQsIDB4RUYsIDB4MDQsIDB4NjIsCi0JMHhGOSwgMHhENywgMHgwNiwgMHhGMiwgMHg0MiwgMHg4RCwgMHgwQiwgMHhCMCwgMHhGNywgMHg4NywgMHgwNSwKLQkweEU2LCAweEZDLCAweDU4LCAweDAxLCAweEEwLCAweEZGLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDcsIDB4MDAsIDB4QTUsIDB4RkYsIDB4NTIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4QUQsIDB4MDUsCi0JMHgzNSwgMHhGNywgMHgwOCwgMHgwRCwgMHhDQiwgMHg0MiwgMHg4MSwgMHgwNSwgMHhFOCwgMHhGOSwgMHhCQiwKLQkweDA0LCAweDEyLCAweEZELCAweDY0LCAweDAxLCAweDkwLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4QzIsIDB4RkYsIDB4MjcsIDB4MDEsIDB4RjEsIDB4RkMsIDB4MjIsIDB4MDYsIDB4NTQsCi0JMHhGNSwgMHhCOCwgMHgxMywgMHg0QSwgMHg0MSwgMHgyOSwgMHgwMCwgMHgzQywgMHhGQywgMHhCRCwgMHgwMywKLQkweDY2LCAweEZELCAweDU4LCAweDAxLCAweDhBLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEYxLAotCTB4RkYsIDB4RUIsIDB4RkYsIDB4RTEsIDB4MDAsIDB4MzUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4RTQsIDB4RjMsCi0JMHhCNywgMHgxQSwgMHg4NSwgMHgzRSwgMHhBNiwgMHhGQiwgMHg4NiwgMHhGRSwgMHhBMCwgMHgwMiwgMHhENywKLQkweEZELCAweDM5LCAweDAxLCAweDhFLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweEUxLCAweEZGLAotCTB4MUMsIDB4MDAsIDB4ODIsIDB4MDAsIDB4QjAsIDB4RkQsIDB4RjksIDB4MDUsIDB4MEMsIDB4RjMsIDB4Q0IsCi0JMHgyMSwgMHg4RiwgMHgzQSwgMHgwRCwgMHhGOCwgMHhBOSwgMHgwMCwgMHg3OSwgMHgwMSwgMHg1RCwgMHhGRSwKLQkweDBCLCAweDAxLCAweDk4LCAweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweENFLCAweEZGLCAweDU1LAotCTB4MDAsIDB4MEQsIDB4MDAsIDB4NjAsIDB4RkUsIDB4NDgsIDB4MDUsIDB4RUMsIDB4RjIsIDB4QjYsIDB4MjgsCi0JMHg5MSwgMHgzNSwgMHg2OCwgMHhGNSwgMHg4OCwgMHgwMiwgMHg1QSwgMHgwMCwgMHhFRCwgMHhGRSwgMHhENCwKLQkweDAwLCAweEE4LCAweEZGLCAweDBCLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweDkyLCAweDAwLAotCTB4ODcsIDB4RkYsIDB4M0YsIDB4RkYsIDB4MkIsIDB4MDQsIDB4QTEsIDB4RjMsIDB4M0QsIDB4MkYsIDB4QjgsCi0JMHgyRiwgMHhCOCwgMHhGMywgMHgxMSwgMHgwNCwgMHg1MiwgMHhGRiwgMHg3QywgMHhGRiwgMHg5NywgMHgwMCwKLQkweEJBLCAweEZGLCAweDA4LCAweDAwLCAweDBCLCAweDAwLCAweEE5LCAweEZGLCAweENGLCAweDAwLCAweEY4LAotCTB4RkUsIDB4NDQsIDB4MDAsIDB4QUEsIDB4MDIsIDB4M0UsIDB4RjUsIDB4MjQsIDB4MzUsIDB4M0IsIDB4MjksCi0JMHhGMiwgMHhGMiwgMHgzNSwgMHgwNSwgMHg3MCwgMHhGRSwgMHgwMywgMHgwMCwgMHg1QSwgMHgwMCwgMHhDRCwKLQkweEZGLCAweDA1LCAweDAwLCAweDBFLCAweDAwLCAweDk5LCAweEZGLCAweDA3LCAweDAxLCAweDY4LCAweEZFLAotCTB4NjMsIDB4MDEsIDB4RDAsIDB4MDAsIDB4RDAsIDB4RjcsIDB4MzUsIDB4M0EsIDB4NTUsIDB4MjIsIDB4MDIsCi0JMHhGMywgMHhFRiwgMHgwNSwgMHhCQywgMHhGRCwgMHg3QSwgMHgwMCwgMHgyMCwgMHgwMCwgMHhERiwgMHhGRiwKLQkweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDhFLCAweEZGLCAweDM2LCAweDAxLCAweEUxLCAweEZELCAweDhBLAotCTB4MDIsIDB4QjIsIDB4RkUsIDB4NTYsIDB4RkIsIDB4NDAsIDB4M0UsIDB4NDIsIDB4MUIsIDB4Q0UsIDB4RjMsCi0JMHgzRSwgMHgwNiwgMHgzRCwgMHhGRCwgMHhEQiwgMHgwMCwgMHhFRSwgMHhGRiwgMHhGMCwgMHhGRiwgMHgwMSwKLQkweDAwLCAweDExLCAweDAwLCAweDhBLCAweEZGLCAweDU3LCAweDAxLCAweDZELCAweEZELCAweEE4LCAweDAzLAotCTB4NjksIDB4RkMsIDB4QzgsIDB4RkYsIDB4MjAsIDB4NDEsIDB4NDAsIDB4MTQsIDB4MzMsIDB4RjUsIDB4MjgsCi0JMHgwNiwgMHhGNSwgMHhGQywgMHgyMiwgMHgwMSwgMHhDNSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDBGLCAweDAwLCAweDhGLCAweEZGLCAweDY0LCAweDAxLCAweDE3LCAweEZELCAweEE5LCAweDA0LCAweDE2LAotCTB4RkEsIDB4MTAsIDB4MDUsIDB4QjgsIDB4NDIsIDB4ODcsIDB4MEQsIDB4MEQsIDB4RjcsIDB4QjksIDB4MDUsCi0JMHhFMiwgMHhGQywgMHg1MCwgMHgwMSwgMHhBNywgMHhGRiwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDBBLCAweDAwLCAweDlFLCAweEZGLCAweDVBLCAweDAxLCAweEU4LCAweEZDLCAweDdBLCAweDA1LAotCTB4REEsIDB4RjcsIDB4MTAsIDB4MEIsIDB4RkIsIDB4NDIsIDB4NEIsIDB4MDcsIDB4MzUsIDB4RjksIDB4MDAsCi0JMHgwNSwgMHgwMCwgMHhGRCwgMHg2MywgMHgwMSwgMHg5NCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAxLCAweDAwLCAweEI4LCAweEZGLCAweDM3LCAweDAxLCAweEU3LCAweEZDLCAweDA3LCAweDA2LCAweERFLAotCTB4RjUsIDB4OUYsIDB4MTEsIDB4RTQsIDB4NDEsIDB4QjgsIDB4MDEsIDB4ODQsIDB4RkIsIDB4MEYsIDB4MDQsCi0JMHg0OCwgMHhGRCwgMHg1RSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNSwKLQkweEZGLCAweERELCAweEZGLCAweEY5LCAweDAwLCAweDFCLCAweEZELCAweDQxLCAweDA2LCAweDQ3LCAweEY0LAotCTB4OEIsIDB4MTgsIDB4ODEsIDB4M0YsIDB4RjEsIDB4RkMsIDB4RDUsIDB4RkQsIDB4RkEsIDB4MDIsIDB4QjIsCi0JMHhGRCwgMHg0NSwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFNiwgMHhGRiwKLQkweDBDLCAweDAwLCAweEEyLCAweDAwLCAweDg1LCAweEZELCAweDFBLCAweDA2LCAweDNDLCAweEYzLCAweDlGLAotCTB4MUYsIDB4RTYsIDB4M0IsIDB4MEUsIDB4RjksIDB4MDcsIDB4MDAsIDB4RDQsIDB4MDEsIDB4MzMsIDB4RkUsCi0JMHgxQiwgMHgwMSwgMHg5NCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhENCwgMHhGRiwgMHg0MywKLQkweDAwLCAweDMzLCAweDAwLCAweDI1LCAweEZFLCAweDg5LCAweDA1LCAweEUwLCAweEYyLCAweDlDLCAweDI2LAotCTB4MzMsIDB4MzcsIDB4MUUsIDB4RjYsIDB4RkQsIDB4MDEsIDB4QjAsIDB4MDAsIDB4QzAsIDB4RkUsIDB4RTYsCi0JMHgwMCwgMHhBMiwgMHhGRiwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwgMHhDMSwgMHhGRiwgMHg3RiwgMHgwMCwKLQkweEIyLCAweEZGLCAweEY2LCAweEZFLCAweDhFLCAweDA0LCAweDUxLCAweEYzLCAweDQ5LCAweDJELCAweDk4LAotCTB4MzEsIDB4MjMsIDB4RjQsIDB4QTIsIDB4MDMsIDB4QTAsIDB4RkYsIDB4NTEsIDB4RkYsIDB4QUEsIDB4MDAsCi0JMHhCNCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhBRSwgMHhGRiwgMHhCRCwgMHgwMCwgMHgyNSwKLQkweEZGLCAweEYxLCAweEZGLCAweDJCLCAweDAzLCAweEE1LCAweEY0LCAweDY4LCAweDMzLCAweDQ4LCAweDJCLAotCTB4MTcsIDB4RjMsIDB4RTcsIDB4MDQsIDB4QjEsIDB4RkUsIDB4REIsIDB4RkYsIDB4NkMsIDB4MDAsIDB4QzcsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHgwRCwgMHgwMCwgMHg5RSwgMHhGRiwgMHhGNywgMHgwMCwgMHg5NCwgMHhGRSwKLQkweDA5LCAweDAxLCAweDZBLCAweDAxLCAweEVCLCAweEY2LCAweEMxLCAweDM4LCAweDdELCAweDI0LCAweEU4LAotCTB4RjIsIDB4QzEsIDB4MDUsIDB4RUUsIDB4RkQsIDB4NTcsIDB4MDAsIDB4MzEsIDB4MDAsIDB4REEsIDB4RkYsCi0JMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHg5MSwgMHhGRiwgMHgyOSwgMHgwMSwgMHgwOSwgMHhGRSwgMHgyRiwKLQkweDAyLCAweDVGLCAweEZGLCAweDI3LCAweEZBLCAweDIwLCAweDNELCAweDcwLCAweDFELCAweDdELCAweEYzLAotCTB4MzEsIDB4MDYsIDB4NUUsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RUIsIDB4RkYsIDB4MDIsCi0JMHgwMCwgMHgxMSwgMHgwMCwgMHg4QiwgMHhGRiwgMHg0RSwgMHgwMSwgMHg4RSwgMHhGRCwgMHg1MiwgMHgwMywKLQkweDIwLCAweEZELCAweDUyLCAweEZFLCAweDYwLCAweDQwLCAweDYzLCAweDE2LCAweEI3LCAweEY0LCAweDM5LAotCTB4MDYsIDB4MDUsIDB4RkQsIDB4MEYsIDB4MDEsIDB4RDEsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHg4RCwgMHhGRiwgMHg2MiwgMHgwMSwgMHgyRSwgMHhGRCwgMHg1RSwgMHgwNCwgMHhDQywKLQkweEZBLCAweDVCLCAweDAzLCAweDVFLCAweDQyLCAweDhFLCAweDBGLCAweDcxLCAweEY2LCAweEU0LCAweDA1LAotCTB4RTIsIDB4RkMsIDB4NDUsIDB4MDEsIDB4QUYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwQiwgMHgwMCwgMHg5OSwgMHhGRiwgMHg2MCwgMHgwMSwgMHhGMiwgMHhGQywgMHg0MCwgMHgwNSwKLQkweDg1LCAweEY4LCAweDI2LCAweDA5LCAweDBDLCAweDQzLCAweDI2LCAweDA5LCAweDg1LCAweEY4LCAweDQwLAotCTB4MDUsIDB4RjIsIDB4RkMsIDB4NjAsIDB4MDEsIDB4OTksIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHg0NSwgMHgwMSwgMHhFMiwgMHhGQywgMHhFNCwgMHgwNSwgMHg3MSwKLQkweEY2LCAweDhFLCAweDBGLCAweDVFLCAweDQyLCAweDVCLCAweDAzLCAweENDLCAweEZBLCAweDVFLCAweDA0LAotCTB4MkUsIDB4RkQsIDB4NjIsIDB4MDEsIDB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhEMSwgMHhGRiwgMHgwRiwgMHgwMSwgMHgwNSwgMHhGRCwgMHgzOSwgMHgwNiwgMHhCNywgMHhGNCwKLQkweDYzLCAweDE2LCAweDYwLCAweDQwLCAweDUyLCAweEZFLCAweDIwLCAweEZELCAweDUyLCAweDAzLCAweDhFLAotCTB4RkQsIDB4NEUsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RUIsIDB4RkYsCi0JMHhGRCwgMHhGRiwgMHhCRiwgMHgwMCwgMHg1RSwgMHhGRCwgMHgzMSwgMHgwNiwgMHg3RCwgMHhGMywgMHg3MCwKLQkweDFELCAweDIwLCAweDNELCAweDI3LCAweEZBLCAweDVGLCAweEZGLCAweDJGLCAweDAyLCAweDA5LCAweEZFLAotCTB4MjksIDB4MDEsIDB4OTEsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REEsIDB4RkYsIDB4MzEsCi0JMHgwMCwgMHg1NywgMHgwMCwgMHhFRSwgMHhGRCwgMHhDMSwgMHgwNSwgMHhFOCwgMHhGMiwgMHg3RCwgMHgyNCwKLQkweEMxLCAweDM4LCAweEVCLCAweEY2LCAweDZBLCAweDAxLCAweDA5LCAweDAxLCAweDk0LCAweEZFLCAweEY3LAotCTB4MDAsIDB4OUUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NkMsIDB4MDAsCi0JMHhEQiwgMHhGRiwgMHhCMSwgMHhGRSwgMHhFNywgMHgwNCwgMHgxNywgMHhGMywgMHg0OCwgMHgyQiwgMHg2OCwKLQkweDMzLCAweEE1LCAweEY0LCAweDJCLCAweDAzLCAweEYxLCAweEZGLCAweDI1LCAweEZGLCAweEJELCAweDAwLAotCTB4QUUsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjQsIDB4RkYsIDB4QUEsIDB4MDAsIDB4NTEsCi0JMHhGRiwgMHhBMCwgMHhGRiwgMHhBMiwgMHgwMywgMHgyMywgMHhGNCwgMHg5OCwgMHgzMSwgMHg0OSwgMHgyRCwKLQkweDUxLCAweEYzLCAweDhFLCAweDA0LCAweEY2LCAweEZFLCAweEIyLCAweEZGLCAweDdGLCAweDAwLCAweEMxLAotCTB4RkYsIDB4MDcsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QTIsIDB4RkYsIDB4RTYsIDB4MDAsIDB4QzAsIDB4RkUsCi0JMHhCMCwgMHgwMCwgMHhGRCwgMHgwMSwgMHgxRSwgMHhGNiwgMHgzMywgMHgzNywgMHg5QywgMHgyNiwgMHhFMCwKLQkweEYyLCAweDg5LCAweDA1LCAweDI1LCAweEZFLCAweDMzLCAweDAwLCAweDQzLCAweDAwLCAweEQ0LCAweEZGLAotCTB4MDQsIDB4MDAsIDB4MEYsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUIsIDB4MDEsIDB4MzMsIDB4RkUsIDB4RDQsCi0JMHgwMSwgMHgwNywgMHgwMCwgMHgwRSwgMHhGOSwgMHhFNiwgMHgzQiwgMHg5RiwgMHgxRiwgMHgzQywgMHhGMywKLQkweDFBLCAweDA2LCAweDg1LCAweEZELCAweEEyLCAweDAwLCAweDBDLCAweDAwLCAweEU2LCAweEZGLCAweDAyLAotCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEMsIDB4RkYsIDB4NDUsIDB4MDEsIDB4QjIsIDB4RkQsIDB4RkEsIDB4MDIsCi0JMHhENSwgMHhGRCwgMHhGMSwgMHhGQywgMHg4MSwgMHgzRiwgMHg4QiwgMHgxOCwgMHg0NywgMHhGNCwgMHg0MSwKLQkweDA2LCAweDFCLCAweEZELCAweEY5LCAweDAwLCAweERELCAweEZGLCAweEY1LCAweEZGLCAweDAxLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NUUsIDB4MDEsIDB4NDgsIDB4RkQsIDB4MEYsIDB4MDQsIDB4ODQsCi0JMHhGQiwgMHhCOCwgMHgwMSwgMHhFNCwgMHg0MSwgMHg5RiwgMHgxMSwgMHhERSwgMHhGNSwgMHgwNywgMHgwNiwKLQkweEU3LCAweEZDLCAweDM3LCAweDAxLCAweEI4LCAweEZGLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDBELAotCTB4MDAsIDB4OTQsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MDAsIDB4RkQsIDB4MDAsIDB4MDUsIDB4MzUsIDB4RjksCi0JMHg0QiwgMHgwNywgMHhGQiwgMHg0MiwgMHgxMCwgMHgwQiwgMHhEQSwgMHhGNywgMHg3QSwgMHgwNSwgMHhFOCwKLQkweEZDLCAweDVBLCAweDAxLCAweDlFLCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDcsIDB4MDAsIDB4QTcsIDB4RkYsIDB4NTAsIDB4MDEsIDB4RTIsIDB4RkMsIDB4QjksIDB4MDUsIDB4MEQsCi0JMHhGNywgMHg4NywgMHgwRCwgMHhCOCwgMHg0MiwgMHgxMCwgMHgwNSwgMHgxNiwgMHhGQSwgMHhBOSwgMHgwNCwKLQkweDE3LCAweEZELCAweDY0LCAweDAxLCAweDhGLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4QzUsIDB4RkYsIDB4MjIsIDB4MDEsIDB4RjUsIDB4RkMsIDB4MjgsIDB4MDYsIDB4MzMsIDB4RjUsCi0JMHg0MCwgMHgxNCwgMHgyMCwgMHg0MSwgMHhDOCwgMHhGRiwgMHg2OSwgMHhGQywgMHhBOCwgMHgwMywgMHg2RCwKLQkweEZELCAweDU3LCAweDAxLCAweDhBLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEYwLCAweEZGLAotCTB4RUUsIDB4RkYsIDB4REIsIDB4MDAsIDB4M0QsIDB4RkQsIDB4M0UsIDB4MDYsIDB4Q0UsIDB4RjMsIDB4NDIsCi0JMHgxQiwgMHg0MCwgMHgzRSwgMHg1NiwgMHhGQiwgMHhCMiwgMHhGRSwgMHg4QSwgMHgwMiwgMHhFMSwgMHhGRCwKLQkweDM2LCAweDAxLCAweDhFLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERGLCAweEZGLCAweDIwLAotCTB4MDAsIDB4N0EsIDB4MDAsIDB4QkMsIDB4RkQsIDB4RUYsIDB4MDUsIDB4MDIsIDB4RjMsIDB4NTUsIDB4MjIsCi0JMHgzNSwgMHgzQSwgMHhEMCwgMHhGNywgMHhEMCwgMHgwMCwgMHg2MywgMHgwMSwgMHg2OCwgMHhGRSwgMHgwNywKLQkweDAxLCAweDk5LCAweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweENELCAweEZGLCAweDVBLCAweDAwLAotCTB4MDMsIDB4MDAsIDB4NzAsIDB4RkUsIDB4MzUsIDB4MDUsIDB4RjIsIDB4RjIsIDB4M0IsIDB4MjksIDB4MjQsCi0JMHgzNSwgMHgzRSwgMHhGNSwgMHhBQSwgMHgwMiwgMHg0NCwgMHgwMCwgMHhGOCwgMHhGRSwgMHhDRiwgMHgwMCwKLQkweEE5LCAweEZGLCAweDBCLCAweDAwLCAweDA4LCAweDAwLCAweEJBLCAweEZGLCAweDk3LCAweDAwLCAweDdDLAotCTB4RkYsIDB4NTIsIDB4RkYsIDB4MTEsIDB4MDQsIDB4QjgsIDB4RjMsIDB4QjgsIDB4MkYsIDB4M0QsIDB4MkYsCi0JMHhBMSwgMHhGMywgMHgyQiwgMHgwNCwgMHgzRiwgMHhGRiwgMHg4NywgMHhGRiwgMHg5MiwgMHgwMCwgMHhCQiwKLQkweEZGLCAweDA4LCAweDAwLCAweDBCLCAweDAwLCAweEE4LCAweEZGLCAweEQ0LCAweDAwLCAweEVELCAweEZFLAotCTB4NUEsIDB4MDAsIDB4ODgsIDB4MDIsIDB4NjgsIDB4RjUsIDB4OTEsIDB4MzUsIDB4QjYsIDB4MjgsIDB4RUMsCi0JMHhGMiwgMHg0OCwgMHgwNSwgMHg2MCwgMHhGRSwgMHgwRCwgMHgwMCwgMHg1NSwgMHgwMCwgMHhDRSwgMHhGRiwKLQkweDA1LCAweDAwLCAweDBFLCAweDAwLCAweDk4LCAweEZGLCAweDBCLCAweDAxLCAweDVELCAweEZFLCAweDc5LAotCTB4MDEsIDB4QTksIDB4MDAsIDB4MEQsIDB4RjgsIDB4OEYsIDB4M0EsIDB4Q0IsIDB4MjEsIDB4MEMsIDB4RjMsCi0JMHhGOSwgMHgwNSwgMHhCMCwgMHhGRCwgMHg4MiwgMHgwMCwgMHgxQywgMHgwMCwgMHhFMSwgMHhGRiwgMHgwMywKLQkweDAwLCAweDEwLCAweDAwLCAweDhFLCAweEZGLCAweDM5LCAweDAxLCAweEQ3LCAweEZELCAweEEwLCAweDAyLAotCTB4ODYsIDB4RkUsIDB4QTYsIDB4RkIsIDB4ODUsIDB4M0UsIDB4QjcsIDB4MUEsIDB4RTQsIDB4RjMsIDB4NDAsCi0JMHgwNiwgMHgzNSwgMHhGRCwgMHhFMSwgMHgwMCwgMHhFQiwgMHhGRiwgMHhGMSwgMHhGRiwgMHgwMSwgMHgwMCwKLQkweDExLCAweDAwLCAweDhBLCAweEZGLCAweDU4LCAweDAxLCAweDY2LCAweEZELCAweEJELCAweDAzLCAweDNDLAotCTB4RkMsIDB4MjksIDB4MDAsIDB4NEEsIDB4NDEsIDB4QjgsIDB4MTMsIDB4NTQsIDB4RjUsIDB4MjIsIDB4MDYsCi0JMHhGMSwgMHhGQywgMHgyNywgMHgwMSwgMHhDMiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwKLQkweDAwLCAweDkwLCAweEZGLCAweDY0LCAweDAxLCAweDEyLCAweEZELCAweEJCLCAweDA0LCAweEU4LCAweEY5LAotCTB4ODEsIDB4MDUsIDB4Q0IsIDB4NDIsIDB4MDgsIDB4MEQsIDB4MzUsIDB4RjcsIDB4QUQsIDB4MDUsIDB4RTIsCi0JMHhGQywgMHg1MiwgMHgwMSwgMHhBNSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDA5LCAweDAwLCAweEEwLCAweEZGLCAweDU4LCAweDAxLCAweEU2LCAweEZDLCAweDg3LCAweDA1LCAweEIwLAotCTB4RjcsIDB4OEQsIDB4MEIsIDB4RjIsIDB4NDIsIDB4RDcsIDB4MDYsIDB4NjIsIDB4RjksIDB4RUYsIDB4MDQsCi0JMHgwNCwgMHhGRCwgMHg2MywgMHgwMSwgMHg5MywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEJCLCAweEZGLCAweDMzLCAweDAxLCAweEU5LCAweEZDLCAweDBGLCAweDA2LCAweEJBLCAweEY1LAotCTB4MjQsIDB4MTIsIDB4QzIsIDB4NDEsIDB4NTMsIDB4MDEsIDB4QjIsIDB4RkIsIDB4RkIsIDB4MDMsIDB4NEYsCi0JMHhGRCwgMHg1RCwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNCwgMHhGRiwKLQkweEUwLCAweEZGLCAweEYzLCAweDAwLCAweDIxLCAweEZELCAweDQxLCAweDA2LCAweDJELCAweEY0LCAweDE2LAotCTB4MTksIDB4NDUsIDB4M0YsIDB4OUMsIDB4RkMsIDB4MDEsIDB4RkUsIDB4RTQsIDB4MDIsIDB4QkIsIDB4RkQsCi0JMHg0MiwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFNSwgMHhGRiwgMHgxMCwKLQkweDAwLCAweDlBLCAweDAwLCAweDhGLCAweEZELCAweDEyLCAweDA2LCAweDJFLCAweEYzLCAweDJBLCAweDIwLAotCTB4OTIsIDB4M0IsIDB4Q0MsIDB4RjgsIDB4MzAsIDB4MDAsIDB4QkQsIDB4MDEsIDB4M0QsIDB4RkUsIDB4MTcsCi0JMHgwMSwgMHg5NSwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhEMywgMHhGRiwgMHg0NywgMHgwMCwKLQkweDJBLCAweDAwLCAweDMzLCAweEZFLCAweDdBLCAweDA1LCAweEUxLCAweEYyLCAweDI0LCAweDI3LCAweENELAotCTB4MzYsIDB4RUUsIDB4RjUsIDB4MjEsIDB4MDIsIDB4OUIsIDB4MDAsIDB4Q0IsIDB4RkUsIDB4RTEsIDB4MDAsCi0JMHhBNCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwgMHg4NCwgMHgwMCwgMHhBNywKLQkweEZGLCAweDA4LCAweEZGLCAweDc2LCAweDA0LCAweDYzLCAweEYzLCAweEM4LCAweDJELCAweDIyLCAweDMxLAotCTB4MDYsIDB4RjQsIDB4QkYsIDB4MDMsIDB4OEMsIDB4RkYsIDB4NUMsIDB4RkYsIDB4QTUsIDB4MDAsIDB4QjUsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhBRCwgMHhGRiwgMHhDMSwgMHgwMCwgMHgxQSwgMHhGRiwKLQkweDA1LCAweDAwLCAweDBCLCAweDAzLCAweEM5LCAweEY0LCAweEQ4LCAweDMzLCAweEM1LCAweDJBLCAweDBDLAotCTB4RjMsIDB4RkIsIDB4MDQsIDB4QTAsIDB4RkUsIDB4RTUsIDB4RkYsIDB4NjgsIDB4MDAsIDB4QzksIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHgwRCwgMHgwMCwgMHg5QywgMHhGRiwgMHhGQiwgMHgwMCwgMHg4OSwgMHhGRSwgMHgxRiwKLQkweDAxLCAweDQ0LCAweDAxLCAweDIyLCAweEY3LCAweDIwLCAweDM5LCAweEYzLCAweDIzLCAweEVELCAweEYyLAotCTB4Q0UsIDB4MDUsIDB4RTEsIDB4RkQsIDB4NjAsIDB4MDAsIDB4MkQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDMsCi0JMHgwMCwgMHgxMCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgyRCwgMHgwMSwgMHhGRiwgMHhGRCwgMHg0NiwgMHgwMiwKLQkweDM0LCAweEZGLCAweDcxLCAweEZBLCAweDZCLCAweDNELCAweEU1LCAweDFDLCAweDkwLCAweEYzLCAweDM1LAotCTB4MDYsIDB4NTUsIDB4RkQsIDB4QzYsIDB4MDAsIDB4RjksIDB4RkYsIDB4RUMsIDB4RkYsIDB4MDEsIDB4MDAsCi0JMHgxMSwgMHgwMCwgMHg4QiwgMHhGRiwgMHg1MSwgMHgwMSwgMHg4NiwgMHhGRCwgMHg2OCwgMHgwMywgMHhGMywKLQkweEZDLCAweEFFLCAweEZFLCAweDkyLCAweDQwLCAweERBLCAweDE1LCAweEQ1LCAweEY0LCAweDM1LCAweDA2LAotCTB4MDAsIDB4RkQsIDB4MTQsIDB4MDEsIDB4Q0UsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsCi0JMHgwMCwgMHg4RCwgMHhGRiwgMHg2MywgMHgwMSwgMHgyOCwgMHhGRCwgMHg3MSwgMHgwNCwgMHg5RSwgMHhGQSwKLQkweEM3LCAweDAzLCAweDc5LCAweDQyLCAweDBCLCAweDBGLCAweDk3LCAweEY2LCAweERBLCAweDA1LCAweEUyLAotCTB4RkMsIDB4NDgsIDB4MDEsIDB4QUQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwQiwgMHgwMCwgMHg5QSwgMHhGRiwgMHg1RiwgMHgwMSwgMHhFRiwgMHhGQywgMHg0RiwgMHgwNSwgMHg1QSwKLQkweEY4LCAweDlGLCAweDA5LCAweDBBLCAweDQzLCAweEFFLCAweDA4LCAweEIxLCAweEY4LCAweDMwLCAweDA1LAotCTB4RjUsIDB4RkMsIDB4NjEsIDB4MDEsIDB4OTcsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsCi0JMHgwMCwgMHhCMSwgMHhGRiwgMHg0MSwgMHgwMSwgMHhFMywgMHhGQywgMHhFRCwgMHgwNSwgMHg0QywgMHhGNiwKLQkweDExLCAweDEwLCAweDQyLCAweDQyLCAweEYxLCAweDAyLCAweEZBLCAweEZBLCAweDRCLCAweDA0LCAweDM0LAotCTB4RkQsIDB4NjEsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjgsIDB4RkYsCi0JMHhENCwgMHhGRiwgMHgwQSwgMHgwMSwgMHgwQSwgMHhGRCwgMHgzQywgMHgwNiwgMHg5QSwgMHhGNCwgMHhFRCwKLQkweDE2LCAweDJBLCAweDQwLCAweEY4LCAweEZELCAweDRELCAweEZELCAweDNDLCAweDAzLCAweDk3LCAweEZELAotCTB4NEMsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhCOCwgMHgwMCwgMHg2NywgMHhGRCwgMHgyQywgMHgwNiwgMHg2QiwgMHhGMywgMHhGQywgMHgxRCwKLQkweEQzLCAweDNDLCAweERGLCAweEY5LCAweDg5LCAweEZGLCAweDE4LCAweDAyLCAweDEzLCAweEZFLCAweDI2LAotCTB4MDEsIDB4OTIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDksIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHg0RSwgMHgwMCwgMHhGQiwgMHhGRCwgMHhCNCwgMHgwNSwgMHhFNCwgMHhGMiwgMHgwNCwgMHgyNSwgMHg1RiwKLQkweDM4LCAweEI2LCAweEY2LCAweDkwLCAweDAxLCAweEYzLCAweDAwLCAweDlGLCAweEZFLCAweEYzLCAweDAwLAotCTB4OUYsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NzEsIDB4MDAsIDB4RDEsCi0JMHhGRiwgMHhDMiwgMHhGRSwgMHhEMSwgMHgwNCwgMHgyMywgMHhGMywgMHhDOSwgMHgyQiwgMHhGNSwgMHgzMiwKLQkweDgzLCAweEY0LCAweDQ5LCAweDAzLCAweERDLCAweEZGLCAweDMwLCAweEZGLCAweEI4LCAweDAwLCAweEIwLAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjMsIDB4RkYsIDB4QUUsIDB4MDAsIDB4NDYsIDB4RkYsCi0JMHhCNCwgMHhGRiwgMHg4NSwgMHgwMywgMHg0MiwgMHhGNCwgMHgwRSwgMHgzMiwgMHhDQSwgMHgyQywgMHg0MSwKLQkweEYzLCAweEE1LCAweDA0LCAweEU0LCAweEZFLCAweEJDLCAweEZGLCAweDdBLCAweDAwLCAweEMzLCAweEZGLAotCTB4MDcsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QTEsIDB4RkYsIDB4RUEsIDB4MDAsIDB4QjUsIDB4RkUsIDB4QzYsCi0JMHgwMCwgMHhEOSwgMHgwMSwgMHg0RiwgMHhGNiwgMHg5OSwgMHgzNywgMHgxNiwgMHgyNiwgMHhFMCwgMHhGMiwKLQkweDk4LCAweDA1LCAweDE2LCAweEZFLCAweDNDLCAweDAwLCAweDNGLCAweDAwLCAweEQ2LCAweEZGLCAweDA0LAotCTB4MDAsIDB4MEYsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUYsIDB4MDEsIDB4MjgsIDB4RkUsIDB4RUIsIDB4MDEsCi0JMHhERCwgMHhGRiwgMHg1MiwgMHhGOSwgMHgzNiwgMHgzQywgMHgxMywgMHgxRiwgMHg0QiwgMHhGMywgMHgyMCwKLQkweDA2LCAweDdCLCAweEZELCAweEE5LCAweDAwLCAweDA4LCAweDAwLCAweEU3LCAweEZGLCAweDAyLCAweDAwLAotCTB4MTEsIDB4MDAsIDB4OEMsIDB4RkYsIDB4NDcsIDB4MDEsIDB4QTksIDB4RkQsIDB4MTAsIDB4MDMsIDB4QTgsCi0JMHhGRCwgMHg0NywgMHhGRCwgMHhCQiwgMHgzRiwgMHgwMSwgMHgxOCwgMHg2MiwgMHhGNCwgMHg0MCwgMHgwNiwKLQkweDE1LCAweEZELCAweEZGLCAweDAwLCAweERBLCAweEZGLCAweEY2LCAweEZGLCAweDAxLCAweDAwLCAweDEwLAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4NUYsIDB4MDEsIDB4NDEsIDB4RkQsIDB4MjMsIDB4MDQsIDB4NTYsIDB4RkIsCi0JMHgxRiwgMHgwMiwgMHgwNiwgMHg0MiwgMHgxOSwgMHgxMSwgMHgwMiwgMHhGNiwgMHhGRiwgMHgwNSwgMHhFNSwKLQkweEZDLCAweDNCLCAweDAxLCAweEI2LCAweEZGLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLAotCTB4OTUsIDB4RkYsIDB4NjIsIDB4MDEsIDB4RkMsIDB4RkMsIDB4MTAsIDB4MDUsIDB4MDksIDB4RjksIDB4QzEsCi0JMHgwNywgMHgwMywgMHg0MywgMHg5NCwgMHgwQSwgMHgwNSwgMHhGOCwgMHg2QywgMHgwNSwgMHhFQSwgMHhGQywKLQkweDVDLCAweDAxLCAweDlELCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LAotCTB4MDAsIDB4QTksIDB4RkYsIDB4NEQsIDB4MDEsIDB4RTEsIDB4RkMsIDB4QzQsIDB4MDUsIDB4RTYsIDB4RjYsCi0JMHgwOCwgMHgwRSwgMHhBNSwgMHg0MiwgMHhBMSwgMHgwNCwgMHg0MywgMHhGQSwgMHg5NywgMHgwNCwgMHgxRCwKLQkweEZELCAweDY0LCAweDAxLCAweDhGLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEZGLAotCTB4QzgsIDB4RkYsIDB4MUUsIDB4MDEsIDB4RjgsIDB4RkMsIDB4MkQsIDB4MDYsIDB4MTMsIDB4RjUsIDB4QzgsCi0JMHgxNCwgMHhGMiwgMHg0MCwgMHg2OSwgMHhGRiwgMHg5NywgMHhGQywgMHg5MiwgMHgwMywgMHg3NSwgMHhGRCwKLQkweDU1LCAweDAxLCAweDhBLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVGLCAweEZGLCAweEYyLAotCTB4RkYsIDB4RDQsIDB4MDAsIDB4NDUsIDB4RkQsIDB4M0IsIDB4MDYsIDB4QjgsIDB4RjMsIDB4Q0UsIDB4MUIsCi0JMHhGQiwgMHgzRCwgMHgwOCwgMHhGQiwgMHhERSwgMHhGRSwgMHg3MywgMHgwMiwgMHhFQiwgMHhGRCwgMHgzMywKLQkweDAxLCAweDhGLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERFLCAweEZGLCAweDI1LCAweDAwLAotCTB4NzEsIDB4MDAsIDB4QzgsIDB4RkQsIDB4RTUsIDB4MDUsIDB4RkEsIDB4RjIsIDB4REYsIDB4MjIsIDB4REIsCi0JMHgzOSwgMHg5NCwgMHhGNywgMHhGNywgMHgwMCwgMHg0QywgMHgwMSwgMHg3MywgMHhGRSwgMHgwMywgMHgwMSwKLQkweDlBLCAweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweENDLCAweEZGLCAweDVFLCAweDAwLCAweEY5LAotCTB4RkYsIDB4ODAsIDB4RkUsIDB4MjMsIDB4MDUsIDB4RjksIDB4RjIsIDB4QzAsIDB4MjksIDB4QjgsIDB4MzQsCi0JMHgxNiwgMHhGNSwgMHhDQiwgMHgwMiwgMHgyRiwgMHgwMCwgMHgwMywgMHhGRiwgMHhDQSwgMHgwMCwgMHhBQSwKLQkweEZGLCAweDBCLCAweDAwLCAweDA4LCAweDAwLCAweEI4LCAweEZGLCAweDlCLCAweDAwLCAweDcyLCAweEZGLAotCTB4NjUsIDB4RkYsIDB4RjYsIDB4MDMsIDB4RDEsIDB4RjMsIDB4MzEsIDB4MzAsIDB4QzEsIDB4MkUsIDB4OEIsCi0JMHhGMywgMHg0NSwgMHgwNCwgMHgyRCwgMHhGRiwgMHg5MiwgMHhGRiwgMHg4RCwgMHgwMCwgMHhCRCwgMHhGRiwKLQkweDA4LCAweDAwLCAweDBDLCAweDAwLCAweEE2LCAweEZGLCAweEQ4LCAweDAwLCAweEUyLCAweEZFLCAweDZGLAotCTB4MDAsIDB4NjYsIDB4MDIsIDB4OTMsIDB4RjUsIDB4RkIsIDB4MzUsIDB4MzEsIDB4MjgsIDB4RTcsIDB4RjIsCi0JMHg1OSwgMHgwNSwgMHg1MSwgMHhGRSwgMHgxNywgMHgwMCwgMHg1MCwgMHgwMCwgMHhEMCwgMHhGRiwgMHgwNSwKLQkweDAwLCAweDBFLCAweDAwLCAweDk3LCAweEZGLCAweDBGLCAweDAxLCAweDUzLCAweEZFLCAweDkwLCAweDAxLAotCTB4ODEsIDB4MDAsIDB4NEIsIDB4RjgsIDB4RTYsIDB4M0EsIDB4M0YsIDB4MjEsIDB4MTYsIDB4RjMsIDB4MDIsCi0JMHgwNiwgMHhBNSwgMHhGRCwgMHg4QSwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDEwLCAweDAwLCAweDhELCAweEZGLCAweDNDLCAweDAxLCAweENFLCAweEZELCAweEI3LCAweDAyLCAweDVBLAotCTB4RkUsIDB4RjcsIDB4RkIsIDB4QzYsIDB4M0UsIDB4MkMsIDB4MUEsIDB4RkMsIDB4RjMsIDB4NDEsIDB4MDYsCi0JMHgyRSwgMHhGRCwgMHhFNywgMHgwMCwgMHhFNywgMHhGRiwgMHhGMiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwKLQkweDAwLCAweDhCLCAweEZGLCAweDVBLCAweDAxLCAweDVFLCAweEZELCAweEQyLCAweDAzLCAweDBFLCAweEZDLAotCTB4OEIsIDB4MDAsIDB4NzUsIDB4NDEsIDB4MzIsIDB4MTMsIDB4NzUsIDB4RjUsIDB4MUMsIDB4MDYsIDB4RUUsCi0JMHhGQywgMHgyQiwgMHgwMSwgMHhDMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwKLQkweDkxLCAweEZGLCAweDY0LCAweDAxLCAweDBELCAweEZELCAweENELCAweDA0LCAweEJCLCAweEY5LCAweEYyLAotCTB4MDUsIDB4RDksIDB4NDIsIDB4ODgsIDB4MEMsIDB4NUUsIDB4RjcsIDB4QTEsIDB4MDUsIDB4RTMsIDB4RkMsCi0JMHg1NCwgMHgwMSwgMHhBMywgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOSwKLQkweDAwLCAweEEyLCAweEZGLCAweDU2LCAweDAxLCAweEU1LCAweEZDLCAweDk0LCAweDA1LCAweDg3LCAweEY3LAotCTB4MEEsIDB4MEMsIDB4RTYsIDB4NDIsIDB4NjQsIDB4MDYsIDB4OEUsIDB4RjksIDB4REUsIDB4MDQsIDB4MDksCi0JMHhGRCwgMHg2NCwgMHgwMSwgMHg5MiwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEJELCAweEZGLCAweDJGLCAweDAxLCAweEVDLCAweEZDLCAweDE2LCAweDA2LCAweDk4LCAweEY1LCAweEFCLAotCTB4MTIsIDB4OUMsIDB4NDEsIDB4RUUsIDB4MDAsIDB4RTAsIDB4RkIsIDB4RTYsIDB4MDMsIDB4NTcsIDB4RkQsCi0JMHg1QiwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMywgMHhGRiwgMHhFNCwKLQkweEZGLCAweEVELCAweDAwLCAweDI3LCAweEZELCAweDQxLCAweDA2LCAweDE0LCAweEY0LCAweEExLCAweDE5LAotCTB4MDYsIDB4M0YsIDB4NDksIDB4RkMsIDB4MkUsIDB4RkUsIDB4Q0QsIDB4MDIsIDB4QzQsIDB4RkQsIDB4M0YsCi0JMHgwMSwgMHg4RCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFMywgMHhGRiwgMHgxNCwgMHgwMCwKLQkweDkyLCAweDAwLCAweDlBLCAweEZELCAweDBBLCAweDA2LCAweDIyLCAweEYzLCAweEI0LCAweDIwLCAweDNDLAotCTB4M0IsIDB4OEIsIDB4RjgsIDB4NTgsIDB4MDAsIDB4QTcsIDB4MDEsIDB4NDgsIDB4RkUsIDB4MTMsIDB4MDEsCi0JMHg5NiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhEMSwgMHhGRiwgMHg0QywgMHgwMCwgMHgyMCwKLQkweDAwLCAweDQyLCAweEZFLCAweDZBLCAweDA1LCAweEUzLCAweEYyLCAweEFCLCAweDI3LCAweDY2LCAweDM2LAotCTB4QzAsIDB4RjUsIDB4NDQsIDB4MDIsIDB4ODUsIDB4MDAsIDB4RDcsIDB4RkUsIDB4REQsIDB4MDAsIDB4QTUsCi0JMHhGRiwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwgMHhCRSwgMHhGRiwgMHg4OSwgMHgwMCwgMHg5RCwgMHhGRiwKLQkweDFBLCAweEZGLCAweDVFLCAweDA0LCAweDc2LCAweEYzLCAweDQ1LCAweDJFLCAweEFBLCAweDMwLCAweEVCLAotCTB4RjMsIDB4REIsIDB4MDMsIDB4NzksIDB4RkYsIDB4NjcsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QjcsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBQywgMHhGRiwgMHhDNiwgMHgwMCwgMHgwRSwgMHhGRiwgMHgxQSwKLQkweDAwLCAweEVCLCAweDAyLCAweEVGLCAweEY0LCAweDQ5LCAweDM0LCAweDQzLCAweDJBLCAweDAyLCAweEYzLAotCTB4MEYsIDB4MDUsIDB4OTAsIDB4RkUsIDB4RUYsIDB4RkYsIDB4NjMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHgwRSwgMHgwMCwgMHg5QiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHhGRSwgMHgzNiwgMHgwMSwKLQkweDFFLCAweDAxLCAweDVCLCAweEY3LCAweDdFLCAweDM5LCAweDY5LCAweDIzLCAweEYzLCAweEYyLCAweEQ5LAotCTB4MDUsIDB4RDQsIDB4RkQsIDB4NjksIDB4MDAsIDB4MjksIDB4MDAsIDB4REQsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgzMCwgMHgwMSwgMHhGNSwgMHhGRCwgMHg1QywgMHgwMiwgMHgwOSwKLQkweEZGLCAweEJDLCAweEZBLCAweEI1LCAweDNELCAweDVBLCAweDFDLCAweEEzLCAweEYzLCAweDM4LCAweDA2LAotCTB4NEQsIDB4RkQsIDB4Q0QsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RUQsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTEsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHg1MywgMHgwMSwgMHg3RSwgMHhGRCwgMHg3RCwgMHgwMywgMHhDNSwgMHhGQywKLQkweDBCLCAweEZGLCAweEMzLCAweDQwLCAweDUxLCAweDE1LCAweEY0LCAweEY0LCAweDMxLCAweDA2LCAweEZDLAotCTB4RkMsIDB4MTksIDB4MDEsIDB4Q0IsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsCi0JMHg4RSwgMHhGRiwgMHg2MywgMHgwMSwgMHgyMiwgMHhGRCwgMHg4NCwgMHgwNCwgMHg3MSwgMHhGQSwgMHgzNCwKLQkweDA0LCAweDkwLCAweDQyLCAweDg5LCAweDBFLCAweEJFLCAweEY2LCAweENGLCAweDA1LCAweEUxLCAweEZDLAotCTB4NEEsIDB4MDEsIDB4QUIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsCi0JMHgwMCwgMHg5QiwgMHhGRiwgMHg1RCwgMHgwMSwgMHhFQywgMHhGQywgMHg1RCwgMHgwNSwgMHgyRiwgMHhGOCwKLQkweDE5LCAweDBBLCAweDA3LCAweDQzLCAweDM3LCAweDA4LCAweERELCAweEY4LCAweDIxLCAweDA1LCAweEY4LAotCTB4RkMsIDB4NjIsIDB4MDEsIDB4OTYsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsCi0JMHhCNCwgMHhGRiwgMHgzRSwgMHgwMSwgMHhFNCwgMHhGQywgMHhGNiwgMHgwNSwgMHgyNiwgMHhGNiwgMHg5NSwKLQkweDEwLCAweDI2LCAweDQyLCAweDg3LCAweDAyLCAweDI4LCAweEZCLCAweDM3LCAweDA0LCAweDNCLCAweEZELAotCTB4NjAsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RDcsCi0JMHhGRiwgMHgwNCwgMHgwMSwgMHgwRiwgMHhGRCwgMHgzRSwgMHgwNiwgMHg3RCwgMHhGNCwgMHg3NiwgMHgxNywKLQkweEY0LCAweDNGLCAweDlGLCAweEZELCAweDdCLCAweEZELCAweDI2LCAweDAzLCAweEEwLCAweEZELCAweDRBLAotCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDQsIDB4MDAsCi0JMHhCMSwgMHgwMCwgMHg3MSwgMHhGRCwgMHgyNiwgMHgwNiwgMHg1QSwgMHhGMywgMHg4OCwgMHgxRSwgMHg4NywKLQkweDNDLCAweDk4LCAweEY5LCAweEIzLCAweEZGLCAweDAyLCAweDAyLCAweDFFLCAweEZFLCAweDIyLCAweDAxLAotCTB4OTMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDcsIDB4RkYsIDB4M0EsIDB4MDAsIDB4NDUsCi0JMHgwMCwgMHgwOSwgMHhGRSwgMHhBNywgMHgwNSwgMHhFMSwgMHhGMiwgMHg4RCwgMHgyNSwgMHhGRCwgMHgzNywKLQkweDgyLCAweEY2LCAweEI1LCAweDAxLCAweERDLCAweDAwLCAweEFBLCAweEZFLCAweEVFLCAweDAwLCAweEEwLAotCTB4RkYsIDB4MEQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4NzYsIDB4MDAsIDB4QzcsIDB4RkYsCi0JMHhEMywgMHhGRSwgMHhCQywgMHgwNCwgMHgzMSwgMHhGMywgMHg0QSwgMHgyQywgMHg4MywgMHgzMiwgMHg2MSwKLQkweEY0LCAweDY4LCAweDAzLCAweEM4LCAweEZGLCAweDNCLCAweEZGLCAweEIzLCAweDAwLCAweEIxLCAweEZGLAotCTB4MEEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QjMsIDB4MDAsIDB4M0IsIDB4RkYsIDB4QzgsCi0JMHhGRiwgMHg2OCwgMHgwMywgMHg2MSwgMHhGNCwgMHg4MywgMHgzMiwgMHg0QSwgMHgyQywgMHgzMSwgMHhGMywKLQkweEJDLCAweDA0LCAweEQzLCAweEZFLCAweEM3LCAweEZGLCAweDc2LCAweDAwLCAweEM0LCAweEZGLCAweDA2LAotCTB4MDAsIDB4MEQsIDB4MDAsIDB4QTAsIDB4RkYsIDB4RUUsIDB4MDAsIDB4QUEsIDB4RkUsIDB4REMsIDB4MDAsCi0JMHhCNSwgMHgwMSwgMHg4MiwgMHhGNiwgMHhGRCwgMHgzNywgMHg4RCwgMHgyNSwgMHhFMSwgMHhGMiwgMHhBNywKLQkweDA1LCAweDA5LCAweEZFLCAweDQ1LCAweDAwLCAweDNBLCAweDAwLCAweEQ3LCAweEZGLCAweDA0LCAweDAwLAotCTB4MEYsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MjIsIDB4MDEsIDB4MUUsIDB4RkUsIDB4MDIsIDB4MDIsIDB4QjMsCi0JMHhGRiwgMHg5OCwgMHhGOSwgMHg4NywgMHgzQywgMHg4OCwgMHgxRSwgMHg1QSwgMHhGMywgMHgyNiwgMHgwNiwKLQkweDcxLCAweEZELCAweEIxLCAweDAwLCAweDA0LCAweDAwLCAweEU5LCAweEZGLCAweDAyLCAweDAwLCAweDExLAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4NEEsIDB4MDEsIDB4QTAsIDB4RkQsIDB4MjYsIDB4MDMsIDB4N0IsIDB4RkQsCi0JMHg5RiwgMHhGRCwgMHhGNCwgMHgzRiwgMHg3NiwgMHgxNywgMHg3RCwgMHhGNCwgMHgzRSwgMHgwNiwgMHgwRiwKLQkweEZELCAweDA0LCAweDAxLCAweEQ3LCAweEZGLCAweEY3LCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweDAwLAotCTB4OEMsIDB4RkYsIDB4NjAsIDB4MDEsIDB4M0IsIDB4RkQsIDB4MzcsIDB4MDQsIDB4MjgsIDB4RkIsIDB4ODcsCi0JMHgwMiwgMHgyNiwgMHg0MiwgMHg5NSwgMHgxMCwgMHgyNiwgMHhGNiwgMHhGNiwgMHgwNSwgMHhFNCwgMHhGQywKLQkweDNFLCAweDAxLCAweEI0LCAweEZGLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDk2LAotCTB4RkYsIDB4NjIsIDB4MDEsIDB4RjgsIDB4RkMsIDB4MjEsIDB4MDUsIDB4REQsIDB4RjgsIDB4MzcsIDB4MDgsCi0JMHgwNywgMHg0MywgMHgxOSwgMHgwQSwgMHgyRiwgMHhGOCwgMHg1RCwgMHgwNSwgMHhFQywgMHhGQywgMHg1RCwKLQkweDAxLCAweDlCLCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAotCTB4QUIsIDB4RkYsIDB4NEEsIDB4MDEsIDB4RTEsIDB4RkMsIDB4Q0YsIDB4MDUsIDB4QkUsIDB4RjYsIDB4ODksCi0JMHgwRSwgMHg5MCwgMHg0MiwgMHgzNCwgMHgwNCwgMHg3MSwgMHhGQSwgMHg4NCwgMHgwNCwgMHgyMiwgMHhGRCwKLQkweDYzLCAweDAxLCAweDhFLCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEZGLCAweENCLAotCTB4RkYsIDB4MTksIDB4MDEsIDB4RkMsIDB4RkMsIDB4MzEsIDB4MDYsIDB4RjQsIDB4RjQsIDB4NTEsIDB4MTUsCi0JMHhDMywgMHg0MCwgMHgwQiwgMHhGRiwgMHhDNSwgMHhGQywgMHg3RCwgMHgwMywgMHg3RSwgMHhGRCwgMHg1MywKLQkweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVELCAweEZGLCAweEY1LCAweEZGLAotCTB4Q0QsIDB4MDAsIDB4NEQsIDB4RkQsIDB4MzgsIDB4MDYsIDB4QTMsIDB4RjMsIDB4NUEsIDB4MUMsIDB4QjUsCi0JMHgzRCwgMHhCQywgMHhGQSwgMHgwOSwgMHhGRiwgMHg1QywgMHgwMiwgMHhGNSwgMHhGRCwgMHgzMCwgMHgwMSwKLQkweDkwLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERELCAweEZGLCAweDI5LCAweDAwLCAweDY5LAotCTB4MDAsIDB4RDQsIDB4RkQsIDB4RDksIDB4MDUsIDB4RjMsIDB4RjIsIDB4NjksIDB4MjMsIDB4N0UsIDB4MzksCi0JMHg1QiwgMHhGNywgMHgxRSwgMHgwMSwgMHgzNiwgMHgwMSwgMHg3RSwgMHhGRSwgMHhGRiwgMHgwMCwgMHg5QiwKLQkweEZGLCAweDBFLCAweDAwLCAweDA2LCAweDAwLCAweENBLCAweEZGLCAweDYzLCAweDAwLCAweEVGLCAweEZGLAotCTB4OTAsIDB4RkUsIDB4MEYsIDB4MDUsIDB4MDIsIDB4RjMsIDB4NDMsIDB4MkEsIDB4NDksIDB4MzQsIDB4RUYsCi0JMHhGNCwgMHhFQiwgMHgwMiwgMHgxQSwgMHgwMCwgMHgwRSwgMHhGRiwgMHhDNiwgMHgwMCwgMHhBQywgMHhGRiwKLQkweDBCLCAweDAwLCAweDA5LCAweDAwLCAweEI3LCAweEZGLCAweEEwLCAweDAwLCAweDY3LCAweEZGLCAweDc5LAotCTB4RkYsIDB4REIsIDB4MDMsIDB4RUIsIDB4RjMsIDB4QUEsIDB4MzAsIDB4NDUsIDB4MkUsIDB4NzYsIDB4RjMsCi0JMHg1RSwgMHgwNCwgMHgxQSwgMHhGRiwgMHg5RCwgMHhGRiwgMHg4OSwgMHgwMCwgMHhCRSwgMHhGRiwgMHgwNywKLQkweDAwLCAweDBDLCAweDAwLCAweEE1LCAweEZGLCAweERELCAweDAwLCAweEQ3LCAweEZFLCAweDg1LCAweDAwLAotCTB4NDQsIDB4MDIsIDB4QzAsIDB4RjUsIDB4NjYsIDB4MzYsIDB4QUIsIDB4MjcsIDB4RTMsIDB4RjIsIDB4NkEsCi0JMHgwNSwgMHg0MiwgMHhGRSwgMHgyMCwgMHgwMCwgMHg0QywgMHgwMCwgMHhEMSwgMHhGRiwgMHgwNCwgMHgwMCwKLQkweDBGLCAweDAwLCAweDk2LCAweEZGLCAweDEzLCAweDAxLCAweDQ4LCAweEZFLCAweEE3LCAweDAxLCAweDU4LAotCTB4MDAsIDB4OEIsIDB4RjgsIDB4M0MsIDB4M0IsIDB4QjQsIDB4MjAsIDB4MjIsIDB4RjMsIDB4MEEsIDB4MDYsCi0JMHg5QSwgMHhGRCwgMHg5MiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhFMywgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMCwKLQkweDAwLCAweDhELCAweEZGLCAweDNGLCAweDAxLCAweEM0LCAweEZELCAweENELCAweDAyLCAweDJFLCAweEZFLAotCTB4NDksIDB4RkMsIDB4MDYsIDB4M0YsIDB4QTEsIDB4MTksIDB4MTQsIDB4RjQsIDB4NDEsIDB4MDYsIDB4MjcsCi0JMHhGRCwgMHhFRCwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGMywgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwKLQkweDhCLCAweEZGLCAweDVCLCAweDAxLCAweDU3LCAweEZELCAweEU2LCAweDAzLCAweEUwLCAweEZCLCAweEVFLAotCTB4MDAsIDB4OUMsIDB4NDEsIDB4QUIsIDB4MTIsIDB4OTgsIDB4RjUsIDB4MTYsIDB4MDYsIDB4RUMsIDB4RkMsCi0JMHgyRiwgMHgwMSwgMHhCRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5MiwKLQkweEZGLCAweDY0LCAweDAxLCAweDA5LCAweEZELCAweERFLCAweDA0LCAweDhFLCAweEY5LCAweDY0LCAweDA2LAotCTB4RTYsIDB4NDIsIDB4MEEsIDB4MEMsIDB4ODcsIDB4RjcsIDB4OTQsIDB4MDUsIDB4RTUsIDB4RkMsIDB4NTYsCi0JMHgwMSwgMHhBMiwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwKLQkweEEzLCAweEZGLCAweDU0LCAweDAxLCAweEUzLCAweEZDLCAweEExLCAweDA1LCAweDVFLCAweEY3LCAweDg4LAotCTB4MEMsIDB4RDksIDB4NDIsIDB4RjIsIDB4MDUsIDB4QkIsIDB4RjksIDB4Q0QsIDB4MDQsIDB4MEQsIDB4RkQsCi0JMHg2NCwgMHgwMSwgMHg5MSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhDMCwKLQkweEZGLCAweDJCLCAweDAxLCAweEVFLCAweEZDLCAweDFDLCAweDA2LCAweDc1LCAweEY1LCAweDMyLCAweDEzLAotCTB4NzUsIDB4NDEsIDB4OEIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4RDIsIDB4MDMsIDB4NUUsIDB4RkQsIDB4NUEsCi0JMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMiwgMHhGRiwgMHhFNywgMHhGRiwKLQkweEU3LCAweDAwLCAweDJFLCAweEZELCAweDQxLCAweDA2LCAweEZDLCAweEYzLCAweDJDLCAweDFBLCAweEM2LAotCTB4M0UsIDB4RjcsIDB4RkIsIDB4NUEsIDB4RkUsIDB4QjcsIDB4MDIsIDB4Q0UsIDB4RkQsIDB4M0MsIDB4MDEsCi0JMHg4RCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFMiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg4QSwKLQkweDAwLCAweEE1LCAweEZELCAweDAyLCAweDA2LCAweDE2LCAweEYzLCAweDNGLCAweDIxLCAweEU2LCAweDNBLAotCTB4NEIsIDB4RjgsIDB4ODEsIDB4MDAsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkUsIDB4MEYsIDB4MDEsIDB4OTcsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MCwgMHgwMCwgMHgxNywgMHgwMCwKLQkweDUxLCAweEZFLCAweDU5LCAweDA1LCAweEU3LCAweEYyLCAweDMxLCAweDI4LCAweEZCLCAweDM1LCAweDkzLAotCTB4RjUsIDB4NjYsIDB4MDIsIDB4NkYsIDB4MDAsIDB4RTIsIDB4RkUsIDB4RDgsIDB4MDAsIDB4QTYsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHgwOCwgMHgwMCwgMHhCRCwgMHhGRiwgMHg4RCwgMHgwMCwgMHg5MiwgMHhGRiwgMHgyRCwKLQkweEZGLCAweDQ1LCAweDA0LCAweDhCLCAweEYzLCAweEMxLCAweDJFLCAweDMxLCAweDMwLCAweEQxLCAweEYzLAotCTB4RjYsIDB4MDMsIDB4NjUsIDB4RkYsIDB4NzIsIDB4RkYsIDB4OUIsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHgwQiwgMHgwMCwgMHhBQSwgMHhGRiwgMHhDQSwgMHgwMCwgMHgwMywgMHhGRiwgMHgyRiwgMHgwMCwKLQkweENCLCAweDAyLCAweDE2LCAweEY1LCAweEI4LCAweDM0LCAweEMwLCAweDI5LCAweEY5LCAweEYyLCAweDIzLAotCTB4MDUsIDB4ODAsIDB4RkUsIDB4RjksIDB4RkYsIDB4NUUsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHgwRSwgMHgwMCwgMHg5QSwgMHhGRiwgMHgwMywgMHgwMSwgMHg3MywgMHhGRSwgMHg0QywgMHgwMSwgMHhGNywKLQkweDAwLCAweDk0LCAweEY3LCAweERCLCAweDM5LCAweERGLCAweDIyLCAweEZBLCAweEYyLCAweEU1LCAweDA1LAotCTB4QzgsIDB4RkQsIDB4NzEsIDB4MDAsIDB4MjUsIDB4MDAsIDB4REUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MTAsCi0JMHgwMCwgMHg4RiwgMHhGRiwgMHgzMywgMHgwMSwgMHhFQiwgMHhGRCwgMHg3MywgMHgwMiwgMHhERSwgMHhGRSwKLQkweDA4LCAweEZCLCAweEZCLCAweDNELCAweENFLCAweDFCLCAweEI4LCAweEYzLCAweDNCLCAweDA2LCAweDQ1LAotCTB4RkQsIDB4RDQsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHg3NSwgMHhGRCwgMHg5MiwgMHgwMywgMHg5NywgMHhGQywgMHg2OSwKLQkweEZGLCAweEYyLCAweDQwLCAweEM4LCAweDE0LCAweDEzLCAweEY1LCAweDJELCAweDA2LCAweEY4LCAweEZDLAotCTB4MUUsIDB4MDEsIDB4QzgsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4OEYsCi0JMHhGRiwgMHg2NCwgMHgwMSwgMHgxRCwgMHhGRCwgMHg5NywgMHgwNCwgMHg0MywgMHhGQSwgMHhBMSwgMHgwNCwKLQkweEE1LCAweDQyLCAweDA4LCAweDBFLCAweEU2LCAweEY2LCAweEM0LCAweDA1LCAweEUxLCAweEZDLCAweDRELAotCTB4MDEsIDB4QTksIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsCi0JMHg5RCwgMHhGRiwgMHg1QywgMHgwMSwgMHhFQSwgMHhGQywgMHg2QywgMHgwNSwgMHgwNSwgMHhGOCwgMHg5NCwKLQkweDBBLCAweDAzLCAweDQzLCAweEMxLCAweDA3LCAweDA5LCAweEY5LCAweDEwLCAweDA1LCAweEZDLCAweEZDLAotCTB4NjIsIDB4MDEsIDB4OTUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QjYsCi0JMHhGRiwgMHgzQiwgMHgwMSwgMHhFNSwgMHhGQywgMHhGRiwgMHgwNSwgMHgwMiwgMHhGNiwgMHgxOSwgMHgxMSwKLQkweDA2LCAweDQyLCAweDFGLCAweDAyLCAweDU2LCAweEZCLCAweDIzLCAweDA0LCAweDQxLCAweEZELCAweDVGLAotCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjYsIDB4RkYsIDB4REEsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgxNSwgMHhGRCwgMHg0MCwgMHgwNiwgMHg2MiwgMHhGNCwgMHgwMSwgMHgxOCwgMHhCQiwKLQkweDNGLCAweDQ3LCAweEZELCAweEE4LCAweEZELCAweDEwLCAweDAzLCAweEE5LCAweEZELCAweDQ3LCAweDAxLAotCTB4OEMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTcsIDB4RkYsIDB4MDgsIDB4MDAsIDB4QTksCi0JMHgwMCwgMHg3QiwgMHhGRCwgMHgyMCwgMHgwNiwgMHg0QiwgMHhGMywgMHgxMywgMHgxRiwgMHgzNiwgMHgzQywKLQkweDUyLCAweEY5LCAweERELCAweEZGLCAweEVCLCAweDAxLCAweDI4LCAweEZFLCAweDFGLCAweDAxLCAweDkzLAotCTB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDYsIDB4RkYsIDB4M0YsIDB4MDAsIDB4M0MsIDB4MDAsCi0JMHgxNiwgMHhGRSwgMHg5OCwgMHgwNSwgMHhFMCwgMHhGMiwgMHgxNiwgMHgyNiwgMHg5OSwgMHgzNywgMHg0RiwKLQkweEY2LCAweEQ5LCAweDAxLCAweEM2LCAweDAwLCAweEI1LCAweEZFLCAweEVBLCAweDAwLCAweEExLCAweEZGLAotCTB4MEQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzMsIDB4RkYsIDB4N0EsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RTQsCi0JMHhGRSwgMHhBNSwgMHgwNCwgMHg0MSwgMHhGMywgMHhDQSwgMHgyQywgMHgwRSwgMHgzMiwgMHg0MiwgMHhGNCwKLQkweDg1LCAweDAzLCAweEI0LCAweEZGLCAweDQ2LCAweEZGLCAweEFFLCAweDAwLCAweEIzLCAweEZGLCAweDA5LAotCTB4MDAsIDB4MEEsIDB4MDAsIDB4QjAsIDB4RkYsIDB4QjgsIDB4MDAsIDB4MzAsIDB4RkYsIDB4REMsIDB4RkYsCi0JMHg0OSwgMHgwMywgMHg4MywgMHhGNCwgMHhGNSwgMHgzMiwgMHhDOSwgMHgyQiwgMHgyMywgMHhGMywgMHhEMSwKLQkweDA0LCAweEMyLCAweEZFLCAweEQxLCAweEZGLCAweDcxLCAweDAwLCAweEM2LCAweEZGLCAweDA2LCAweDAwLAotCTB4MEQsIDB4MDAsIDB4OUYsIDB4RkYsIDB4RjMsIDB4MDAsIDB4OUYsIDB4RkUsIDB4RjMsIDB4MDAsIDB4OTAsCi0JMHgwMSwgMHhCNiwgMHhGNiwgMHg1RiwgMHgzOCwgMHgwNCwgMHgyNSwgMHhFNCwgMHhGMiwgMHhCNCwgMHgwNSwKLQkweEZCLCAweEZELCAweDRFLCAweDAwLCAweDM2LCAweDAwLCAweEQ5LCAweEZGLCAweDA0LCAweDAwLCAweDBGLAotCTB4MDAsIDB4OTIsIDB4RkYsIDB4MjYsIDB4MDEsIDB4MTMsIDB4RkUsIDB4MTgsIDB4MDIsIDB4ODksIDB4RkYsCi0JMHhERiwgMHhGOSwgMHhEMywgMHgzQywgMHhGQywgMHgxRCwgMHg2QiwgMHhGMywgMHgyQywgMHgwNiwgMHg2NywKLQkweEZELCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEZGLCAweDAyLCAweDAwLCAweDExLCAweDAwLAotCTB4OEIsIDB4RkYsIDB4NEMsIDB4MDEsIDB4OTcsIDB4RkQsIDB4M0MsIDB4MDMsIDB4NEQsIDB4RkQsIDB4RjgsCi0JMHhGRCwgMHgyQSwgMHg0MCwgMHhFRCwgMHgxNiwgMHg5QSwgMHhGNCwgMHgzQywgMHgwNiwgMHgwQSwgMHhGRCwKLQkweDBBLCAweDAxLCAweEQ0LCAweEZGLCAweEY4LCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweDAwLCAweDhDLAotCTB4RkYsIDB4NjEsIDB4MDEsIDB4MzQsIDB4RkQsIDB4NEIsIDB4MDQsIDB4RkEsIDB4RkEsIDB4RjEsIDB4MDIsCi0JMHg0MiwgMHg0MiwgMHgxMSwgMHgxMCwgMHg0QywgMHhGNiwgMHhFRCwgMHgwNSwgMHhFMywgMHhGQywgMHg0MSwKLQkweDAxLCAweEIxLCAweEZGLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDk3LCAweEZGLAotCTB4NjEsIDB4MDEsIDB4RjUsIDB4RkMsIDB4MzAsIDB4MDUsIDB4QjEsIDB4RjgsIDB4QUUsIDB4MDgsIDB4MEEsCi0JMHg0MywgMHg5RiwgMHgwOSwgMHg1QSwgMHhGOCwgMHg0RiwgMHgwNSwgMHhFRiwgMHhGQywgMHg1RiwgMHgwMSwKLQkweDlBLCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweEFELAotCTB4RkYsIDB4NDgsIDB4MDEsIDB4RTIsIDB4RkMsIDB4REEsIDB4MDUsIDB4OTcsIDB4RjYsIDB4MEIsIDB4MEYsCi0JMHg3OSwgMHg0MiwgMHhDNywgMHgwMywgMHg5RSwgMHhGQSwgMHg3MSwgMHgwNCwgMHgyOCwgMHhGRCwgMHg2MywKLQkweDAxLCAweDhELCAweEZGLCAweDBGLCAweDAwIAotfTsKLQotc3RhdGljIHUxNgotQ29lZmZpY2llbnRTaXplc1tdID0gewotICAgIC8qIFBsYXliYWNrICovCi0gICAgMHgwMEMwLCAweDUwMDAsIDB4MDA2MCwgMHgyODAwLCAweDAwNDAsIDB4MDA2MCwgMHgxNDAwLCAweDAwMDAsCi0gICAgLyogUmVjb3JkICovCi0gICAgMHgwMDIwLCAweDEyNjAsIDB4MDAyMCwgMHgxMjYwLCAweDAwMDAsIDB4MDA0MCwgMHgxMjYwLCAweDAwMDAsCi19OwotCi0jaWZuZGVmIEpVU1RfREFUQQotCi1zdGF0aWMgdTE2Ci1ubTI1Nl9nZXRTdGFydE9mZnNldCAodTggd2hpY2gpCi17Ci0gICAgdTE2IG9mZnNldCA9IDA7Ci0KLSAgICB3aGlsZSAod2hpY2gtLSA+IDApCi0Jb2Zmc2V0ICs9IENvZWZmaWNpZW50U2l6ZXNbd2hpY2hdOwotCi0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotc3RhdGljIHZvaWQKLW5tMjU2X2xvYWRPbmVDb2VmZmljaWVudCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGludCBkZXZudW0sIHUzMiBwb3J0LCAKLQkJCSAgdTE2IHdoaWNoKQotewotICAgIHUzMiBjb2VmZkJ1ZiA9ICh3aGljaCA8IDgpID8gY2FyZC0+Y29lZmZCdWYgOiBjYXJkLT5hbGxDb2VmZkJ1ZjsKLSAgICB1MTYgb2Zmc2V0ID0gbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKHdoaWNoKTsKLSAgICB1MTYgc2l6ZSA9IENvZWZmaWNpZW50U2l6ZXNbd2hpY2hdOwotCi0gICAgY2FyZC0+Y29lZmZzQ3VycmVudCA9IDA7Ci0KLSAgICBpZiAobm0yNTZfZGVidWcpCi0JcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBMb2FkaW5nIGNvZWZmaWNpZW50IGJ1ZmZlciAweCV4LTB4JXggd2l0aCBjb2VmZmljaWVudCAlZCwgc2l6ZSAlZCwgcG9ydCAweCV4XG4iLAotCQljb2VmZkJ1ZiwgY29lZmZCdWYgKyBzaXplIC0gMSwgd2hpY2gsIHNpemUsIHBvcnQpOwotICAgIG5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgY29lZmZpY2llbnRzICsgb2Zmc2V0LCAxLCBjb2VmZkJ1Ziwgc2l6ZSk7Ci0gICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIHBvcnQgKyAwLCBjb2VmZkJ1Zik7Ci0gICAgLyogPz8/ICBSZWNvcmQgc2VlbXMgdG8gYmVoYXZlIGRpZmZlcmVudGx5IHRoYW4gcGxheWJhY2suICAqLwotICAgIGlmIChkZXZudW0gPT0gMCkKLQlzaXplLS07Ci0gICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIHBvcnQgKyA0LCBjb2VmZkJ1ZiArIHNpemUpOwotfQotCi1zdGF0aWMgdm9pZAotbm0yNTZfbG9hZEFsbENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBjb2VmZmljaWVudHMsIDEsIGNhcmQtPmFsbENvZWZmQnVmLAotCQkJICBOTV9UT1RBTF9DT0VGRl9DT1VOVCAqIDQpOwotICAgIGNhcmQtPmNvZWZmc0N1cnJlbnQgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotbm0yNTZfbG9hZENvZWZmaWNpZW50IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgaW50IHdoaWNoLCBpbnQgbnVtYmVyKQotewotICAgIHN0YXRpYyB1MTYgYWRkcnNbM10gPSB7IDB4MWMsIDB4MjFjLCAweDQwOCB9OwotICAgIC8qIFRoZSBlbmFibGUgcmVnaXN0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgZW5naW5lLiAgKi8KLSAgICB1MzIgcG9mZnNldCA9ICh3aGljaCA9PSAxID8gMHgyMDAgOiAxKTsKLQotICAgIGlmIChubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIHBvZmZzZXQpICYgMSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBFbmdpbmUgd2FzIGVuYWJsZWQgd2hpbGUgbG9hZGluZyBjb2VmZmljaWVudHMhXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogVGhlIHJlY29yZGluZyBlbmdpbmUgdXNlcyBjb2VmZmljaWVudCB2YWx1ZXMgOC0xNS4gICovCi0gICAgaWYgKHdoaWNoID09IDEpCi0JbnVtYmVyICs9IDg7Ci0KLSAgICBpZiAoISBubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKGNhcmQpKQotCW5tMjU2X2xvYWRPbmVDb2VmZmljaWVudCAoY2FyZCwgd2hpY2gsIGFkZHJzW3doaWNoXSwgbnVtYmVyKTsKLSAgICBlbHNlIHsKLQl1MzIgYmFzZSA9IGNhcmQtPmFsbENvZWZmQnVmOwotCXUzMiBvZmZzZXQgPSBubTI1Nl9nZXRTdGFydE9mZnNldCAobnVtYmVyKTsKLQl1MzIgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgQ29lZmZpY2llbnRTaXplc1tudW1iZXJdOwotCi0JaWYgKG5tMjU2X2RlYnVnKQotCSAgICBwcmludGsgKEtFUk5fREVCVUcgImxvYWRpbmcgY29lZmZpY2llbnQgJWQgYXQgcG9ydCAweCV4LCBvZmZzZXQgJWQgKDB4JXgtMHgleClcbiIsCi0JCSAgICBudW1iZXIsIGFkZHJzW3doaWNoXSwgb2Zmc2V0LCBiYXNlICsgb2Zmc2V0LAotCQkgICAgYmFzZSArIGVuZE9mZnNldCAtIDEpOwotCi0JaWYgKCEgY2FyZC0+Y29lZmZzQ3VycmVudCkKLQkgICAgbm0yNTZfbG9hZEFsbENvZWZmaWNpZW50cyAoY2FyZCk7Ci0KLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgYWRkcnNbd2hpY2hdLCBiYXNlICsgb2Zmc2V0KTsKLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgYWRkcnNbd2hpY2hdICsgNCwgYmFzZSArIGVuZE9mZnNldCAtIDEpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIEpVU1RfREFUQSAqLwotCi0jZW5kaWYKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDMuYyBiL3NvdW5kL29zcy9vcGwzLmMKaW5kZXggZmMyNzNlNS4uNzc4MWMxMyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL29wbDMuYworKysgYi9zb3VuZC9vc3Mvb3BsMy5jCkBAIC0zNCw3ICszNCw2IEBACiAKICNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKIAotI2luY2x1ZGUgIm9wbDMuaCIKICNpbmNsdWRlICJvcGwzX2h3LmgiCiAKICNkZWZpbmUgTUFYX1ZPSUNFCTE4CkBAIC03Myw3ICs3Miw2IEBACiAJdW5zaWduZWQgY2hhciAgIGNtYXNrOwogCiAJaW50ICAgICAgICAgICAgIGlzX29wbDQ7Ci0JaW50ICAgICAgICAgICAgKm9zcDsKIH0gb3BsX2RldmluZm87CiAKIHN0YXRpYyBzdHJ1Y3Qgb3BsX2RldmluZm8gKmRldmMgPSBOVUxMOwpAQCAtMTQ0LDcgKzE0Miw3IEBACiAJfQogfQogCi1pbnQgb3BsM19kZXRlY3QoaW50IGlvYWRkciwgaW50ICpvc3ApCitzdGF0aWMgaW50IG9wbDNfZGV0ZWN0KGludCBpb2FkZHIpCiB7CiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiB0aGUgRk0gY2hpcCBpcyBwcmVzZW50IGF0IHRoZSBnaXZlbiBJL08gcG9ydApAQCAtMTgyLDcgKzE4MCw2IEBACiAJCWdvdG8gY2xlYW51cF9kZXZjOwogCX0KIAotCWRldmMtPm9zcCA9IG9zcDsKIAlkZXZjLT5iYXNlID0gaW9hZGRyOwogCiAJLyogUmVzZXQgdGltZXJzIDEgYW5kIDIgKi8KQEAgLTExMDUsNyArMTEwMiw3IEBACiAJLnNldHVwX3ZvaWNlCT0gb3BsM19zZXR1cF92b2ljZQogfTsKIAotaW50IG9wbDNfaW5pdChpbnQgaW9hZGRyLCBpbnQgKm9zcCwgc3RydWN0IG1vZHVsZSAqb3duZXIpCitzdGF0aWMgaW50IG9wbDNfaW5pdChpbnQgaW9hZGRyLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKIHsKIAlpbnQgaTsKIAlpbnQgbWU7CkBAIC0xMTk0LDkgKzExOTEsNiBAQAogCXJldHVybiBtZTsKIH0KIAotRVhQT1JUX1NZTUJPTChvcGwzX2luaXQpOwotRVhQT1JUX1NZTUJPTChvcGwzX2RldGVjdCk7Ci0KIHN0YXRpYyBpbnQgbWU7CiAKIHN0YXRpYyBpbnQgaW8gPSAtMTsKQEAgLTEyMDksMTIgKzEyMDMsMTIgQEAKIAogCWlmIChpbyAhPSAtMSkJLyogVXNlciBsb2FkaW5nIHB1cmUgT1BMMyBtb2R1bGUgKi8KIAl7Ci0JCWlmICghb3BsM19kZXRlY3QoaW8sIE5VTEwpKQorCQlpZiAoIW9wbDNfZGV0ZWN0KGlvKSkKIAkJewogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCQltZSA9IG9wbDNfaW5pdChpbywgTlVMTCwgVEhJU19NT0RVTEUpOworCQltZSA9IG9wbDNfaW5pdChpbywgVEhJU19NT0RVTEUpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDMuaCBiL3NvdW5kL29zcy9vcGwzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzlhNGIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL29wbDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCi1pbnQgb3BsM19kZXRlY3QgKGludCBpb2FkZHIsIGludCAqb3NwKTsKLWludCBvcGwzX2luaXQoaW50IGlvYWRkciwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLQotdm9pZCBlbmFibGVfb3BsM19tb2RlKGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBib3RoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzc2EyLmMgYi9zb3VuZC9vc3Mvb3BsM3NhMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAwNTFmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9vcGwzc2EyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIwICswLDAgQEAKLS8qCi0gKiBzb3VuZC9vc3Mvb3BsM3NhMi5jCi0gKgotICogQSBsb3cgbGV2ZWwgZHJpdmVyIGZvciBZYW1haGEgT1BMMy1TQTIgYW5kIFNBMyBjYXJkcy4KLSAqIE5PVEU6IEFsbCB0cmFjZXMgb2YgdGhlIG5hbWUgT1BMMy1TQXggaGF2ZSBub3cgKERlY2VtYmVyIDIwMDApIGJlZW4KLSAqICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgZHJpdmVyIGNvZGUsIGFzIGFuIGVtYWlsIGV4Y2hhbmdlIHdpdGggWWFtYWhhCi0gKiAgICAgICBwcm92aWRlZCB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGUgWU1GLTcxOSBpcyBpbmRlZWQganVzdCBhCi0gKiAgICAgICByZS1iYWRnZWQgNzE1LgotICoKLSAqIENvcHlyaWdodCAxOTk4LTIwMDEgU2NvdHQgTXVycmF5IDxzY290dEBzcGl0ZWZ1bC5vcmc+Ci0gKgotICogT3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgQ1M0MjMyIGRyaXZlciAoaW4gY3M0MjMyLmMpIGJ5IEhhbm51IFNhdm9sYWluZW4KLSAqIGFuZCBvdGhlcnMuICBOb3cgaW5jb3Jwb3JhdGVzIGNvZGUvaWRlYXMgZnJvbSBwc3MuYywgYWxzbyBieSBIYW5udQotICogU2F2b2xhaW5lbi4gIEJvdGggb2YgdGhvc2UgZmlsZXMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlIGZvbGxvd2luZwotICogbGljZW5zZToKLSAqCi0gKiAiQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NwotICoKLSAqICBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCi0gKiAgVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQotICogIGZvciBtb3JlIGluZm8uIgotICoKLSAqIEFzIHN1Y2gsIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgYWJvdmUgbGljZW5zZSwgdGhpcyBmaWxlLCBvcGwzc2EyLmMsIGlzCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkgVmVyc2lvbiAyIChKdW5lIDE5OTEpLgotICogU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogQ2hhbmdlIEhpc3RvcnkKLSAqIC0tLS0tLS0tLS0tLS0tCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBPcmlnaW5hbCBkcml2ZXIgKEp1biAxNCwgMTk5OCkKLSAqIFBhdWwgSi5ZLiBMYWhhaWUgICAgICAgIENoYW5nZWQgcHJvYmluZyAvIGF0dGFjaCBjb2RlIG9yZGVyCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBBZGRlZCBtaXhlciBzdXBwb3J0IChEZWMgMDMsIDE5OTgpCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBDaGFuZ2VkIGRldGVjdGlvbiBjb2RlIHRvIGJlIG1vcmUgZm9yZ2l2aW5nLAotICogICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgZm9yY2Ugb3B0aW9uIGFzIGxhc3QgcmVzb3J0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgaW9jdGwgcmV0dXJuIHZhbHVlcy4gKERlYyAzMCwgMTk5OCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIFNpbXBsZXIgZGV0ZWN0aW9uIGNvZGUgc2hvdWxkIHdvcmsgYWxsIHRoZSB0aW1lIG5vdwotICogICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggdGhhbmtzIHRvIEJlbiBIdXRjaGluZ3MgZm9yIHRoZSBoZXVyaXN0aWMpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBub3cgdW5uZWNlc3NhcnkgZm9yY2Ugb3B0aW9uLiAoSmFuIDUsIDE5OTkpCi0gKiBDaHJpc3RvcGggSGVsbHdpZwkgICBBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0IChNYXIgNCwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIFJld29ya2VkIFNBMiB2ZXJzdXMgU0EzIG1peGVyIGNvZGUsIHVwZGF0ZWQgY2hpcHNldAotICogICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBkZXRlY3Rpb24gY29kZSAoYWdhaW4hKS4gKERlYyA1LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQWRqdXN0ZWQgbWFzdGVyIHZvbHVtZSBtaXhlciBzY2FsaW5nLiAoRGVjIDYsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBCYXNlZCBvbiBhIHBhdGNoIGJ5IEpvZWwgWWxpbHVvbWEgKGFrYSBCaXNxd2l0KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZWQgd2lkZSBtaXhlciBhbmQgYWRqdXN0ZWQgbWljLCBiYXNzLCB0cmVibGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcuIChEZWMgNiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgUGV0ZXIgRW5nbG1haWVyLCBpbnRlZ3JhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB5bW9kZSBhbmQgbG9vcGJhY2sgb3B0aW9ucy4gKERlYyA2LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgSW5zcGlyZWQgYnkgYSBwYXRjaCBieSBQZXRlciBFbmdsbWFpZXIsIGFuZCBiYXNlZCBvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCBBTFNBIGRvZXMsIGFkZGVkIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBETUEgYW5kIElSUSBzZXR0aW5ncy4gKERlYyA2LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQWRkZWQgc29tZSBtb3JlIGNoZWNrcyB0byB0aGUgY2FyZCBkZXRlY3Rpb24gY29kZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHdoYXQgQUxTQSBkb2VzLiAoRGVjIDEyLCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgSW5zcGlyZWQgYnkgc2ltaWxhciBwYXRjaGVzIGZyb20gSm9obiBGcmVtbGluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgSmltIFJhZGZvcmQsIE1pa2UgUm9saWcsIGFuZCBJbmdtYXIgU3RlZW4sIGFkZGVkIDIuNAotICogICAgICAgICAgICAgICAgICAgICAgICAgSVNBIFBuUCBBUEkgc3VwcG9ydCwgbWFpbmx5IGJhc2VkIG9uIGJpdHMgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgc2JfY2FyZC5jIGFuZCBhd2Vfd2F2ZS5jLiAoRGVjIDEyLCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgU29tZSBzbWFsbCBjbGVhbnVwcyB0byB0aGUgaW5pdCBjb2RlIG91dHB1dC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIChKYW4gNywgMjAwMSkKLSAqIFp3YW5lIE13YWlrYW1ibwkgICBBZGRlZCBQTSBzdXBwb3J0LiAoRGVjIDQgMjAwMSkKLSAqCi0gKiBBZGFtIEJlbGF5ICAgICAgICAgICAgICBDb252ZXJ0ZWQgZHJpdmVyIHRvIG5ldyBQblAgTGF5ZXIgKE9jdCAxMiwgMjAwMikKLSAqIFp3YW5lIE13YWlrYW1ibwkgICBDb2RlLCBkYXRhIHN0cnVjdHVyZSBjbGVhbnVwcy4gKEZlYiAxNSAyMDAyKQotICogWndhbmUgTXdhaWthbWJvCSAgIEZyZWUgcmVzb3VyY2VzIGR1cmluZyBhdXhpbGlhcnkgZGV2aWNlIHByb2JlCi0gKiAJCQkgICBmYWlsdXJlcyAoQXByIDI5IDIwMDIpCi0gKiAgIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotI2luY2x1ZGUgImFkMTg0OC5oIgotI2luY2x1ZGUgIm1wdTQwMS5oIgotCi0jZGVmaW5lIE9QTDNTQTJfTU9EVUxFX05BTUUJIm9wbDNzYTIiCi0jZGVmaW5lIFBGWAkJCU9QTDNTQTJfTU9EVUxFX05BTUUgIjogIgotCi0vKiBVc2VmdWwgY29udHJvbCBwb3J0IGluZGV4ZXM6ICovCi0jZGVmaW5lIE9QTDNTQTJfUE0JICAgICAweDAxCi0jZGVmaW5lIE9QTDNTQTJfU1lTX0NUUkwgICAgIDB4MDIKLSNkZWZpbmUgT1BMM1NBMl9JUlFfQ09ORklHICAgMHgwMwotI2RlZmluZSBPUEwzU0EyX0RNQV9DT05GSUcgICAweDA2Ci0jZGVmaW5lIE9QTDNTQTJfTUFTVEVSX0xFRlQgIDB4MDcKLSNkZWZpbmUgT1BMM1NBMl9NQVNURVJfUklHSFQgMHgwOAotI2RlZmluZSBPUEwzU0EyX01JQyAgICAgICAgICAweDA5Ci0jZGVmaW5lIE9QTDNTQTJfTUlTQyAgICAgICAgIDB4MEEKLQotI2RlZmluZSBPUEwzU0EzX1dJREUgICAgICAgICAweDE0Ci0jZGVmaW5lIE9QTDNTQTNfQkFTUyAgICAgICAgIDB4MTUKLSNkZWZpbmUgT1BMM1NBM19UUkVCTEUgICAgICAgMHgxNgotCi0vKiBVc2VmdWwgY29uc3RhbnRzOiAqLwotI2RlZmluZSBERUZBVUxUX1ZPTFVNRSA1MAotI2RlZmluZSBERUZBVUxUX01JQyAgICA1MAotI2RlZmluZSBERUZBVUxUX1RJTUJSRSAwCi0KLS8qIFBvd2VyIHNhdmluZyBtb2RlcyAqLwotI2RlZmluZSBPUEwzU0EyX1BNX01PREUwCTB4MDAKLSNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMQkweDA0CS8qIFBTViAqLwotI2RlZmluZSBPUEwzU0EyX1BNX01PREUyCTB4MDUJLyogUFNWIHwgUERYICovCi0jZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTMJMHgyNwkvKiBBRE9XTiB8IFBTViB8IFBETiB8IFBEWCAqLwotCi0KLS8qIEZvciBjaGVja2luZyBhZ2FpbnN0IHdoYXQgdGhlIGNhcmQgcmV0dXJuczogKi8KLSNkZWZpbmUgVkVSU0lPTl9VTktOT1dOIDAKLSNkZWZpbmUgVkVSU0lPTl9ZTUY3MTEgIDEKLSNkZWZpbmUgVkVSU0lPTl9ZTUY3MTUgIDIKLSNkZWZpbmUgVkVSU0lPTl9ZTUY3MTVCIDMKLSNkZWZpbmUgVkVSU0lPTl9ZTUY3MTVFIDQKLS8qIGFsc28gYXNzdW1pbmcgdGhhdCBhbnl0aGluZyA+IDQgYnV0IDw9IDcgaXMgYSA3MTVFICovCi0KLS8qIENoaXBzZXQgdHlwZSBjb25zdGFudHMgZm9yIHVzZSBiZWxvdyAqLwotI2RlZmluZSBDSElQU0VUX1VOS05PV04gLTEKLSNkZWZpbmUgQ0hJUFNFVF9PUEwzU0EyIDAKLSNkZWZpbmUgQ0hJUFNFVF9PUEwzU0EzIDEKLXN0YXRpYyBjb25zdCBjaGFyICpDSElQU0VUX1RBQkxFW10gPSB7Ik9QTDMtU0EyIiwgIk9QTDMtU0EzIn07Ci0KLSNpZmRlZiBDT05GSUdfUE5QCi0jZGVmaW5lIE9QTDNTQTJfQ0FSRFNfTUFYIDQKLSNlbHNlCi0jZGVmaW5lIE9QTDNTQTJfQ0FSRFNfTUFYIDEKLSNlbmRpZgotCi0vKiBUaGlzIHNob3VsZCBiZSBwcmV0dHkgb2J2aW91cyAqLwotc3RhdGljIGludCBvcGwzc2EyX2NhcmRzX251bTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCS8qIGRldmljZSByZXNvdXJjZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCBjZmdfcG9ydDsKLQlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKLQlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tc3M7Ci0Jc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OwotI2lmZGVmIENPTkZJR19QTlAKLQkvKiBQblAgU3R1ZmYgKi8KLQlzdHJ1Y3QgcG5wX2RldiogcGRldjsKLQlpbnQgYWN0aXZhdGVkOwkJCS8qIFdoZXRoZXIgc2FpZCBkZXZpY2VzIGhhdmUgYmVlbiBhY3RpdmF0ZWQgKi8KLSNlbmRpZgotCXVuc2lnbmVkIGludAljYXJkOwotCWludAkJY2hpcHNldDsJLyogV2hhdCdzIG15IHZlcnNpb24ocyk/ICovCi0JY2hhcgkJKmNoaXBzZXRfbmFtZTsKLQotCS8qIG1peGVyIGRhdGEgKi8KLQlpbnQJCW1peGVyOwotCXVuc2lnbmVkIGludAl2b2x1bWVfbDsKLQl1bnNpZ25lZCBpbnQJdm9sdW1lX3I7Ci0JdW5zaWduZWQgaW50CW1pYzsKLQl1bnNpZ25lZCBpbnQJYmFzc19sOwotCXVuc2lnbmVkIGludAliYXNzX3I7Ci0JdW5zaWduZWQgaW50CXRyZWJsZV9sOwotCXVuc2lnbmVkIGludAl0cmVibGVfcjsKLQl1bnNpZ25lZCBpbnQJd2lkZV9sOwotCXVuc2lnbmVkIGludAl3aWRlX3I7Ci19IG9wbDNzYTJfc3RhdGVfdDsKLXN0YXRpYyBvcGwzc2EyX3N0YXRlX3Qgb3BsM3NhMl9zdGF0ZVtPUEwzU0EyX0NBUkRTX01BWF07Ci0KLQkKLQotLyogT3VyIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpbwk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIG1zc19pbwk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pbwk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGlycQk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGRtYQk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGRtYTIJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSB5bW9kZQk9IC0xOwotc3RhdGljIGludCBfX2luaXRkYXRhIGxvb3BiYWNrCT0gLTE7Ci0KLSNpZmRlZiBDT05GSUdfUE5QCi0vKiBQblAgc3BlY2lmaWMgcGFyYW1ldGVycyAqLwotc3RhdGljIGludCBfX2luaXRkYXRhIGlzYXBucCA9IDE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgbXVsdGlwbGUgPSAxOwotCi0vKiBXaGV0aGVyIHNhaWQgZGV2aWNlcyBoYXZlIGJlZW4gYWN0aXZhdGVkICovCi1zdGF0aWMgaW50IG9wbDNzYTJfYWN0aXZhdGVkW09QTDNTQTJfQ0FSRFNfTUFYXTsKLSNlbHNlCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaXNhcG5wOyAvKiA9IDAgKi8KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBtdWx0aXBsZTsgLyogPSAwICovCi0jZW5kaWYKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGUgZm9yIE9QTDMtU0EyIGFuZCBTQTMgc291bmQgY2FyZHMgKHVzZXMgQUQxODQ4IE1TUyBkcml2ZXIpLiIpOwotTU9EVUxFX0FVVEhPUigiU2NvdHQgTXVycmF5IDxzY290dEBzcGl0ZWZ1bC5vcmc+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQotbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpbywgIlNldCBJL08gYmFzZSBvZiBPUEwzLVNBMiBvciBTQTMgY2FyZCAodXN1YWxseSAweDM3MC4gIEFkZHJlc3MgbXVzdCBiZSBldmVuIGFuZCBtdXN0IGJlIGZyb20gMHgxMDAgdG8gMHhGRkUpIik7Ci0KLW1vZHVsZV9wYXJhbShtc3NfaW8sIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1zc19pbywgIlNldCBNU1MgKGF1ZGlvKSBJL08gYmFzZSAoMHg1MzAsIDB4RTgwLCBvciBvdGhlci4gQWRkcmVzcyBtdXN0IGVuZCBpbiAwIG9yIDQgYW5kIG11c3QgYmUgZnJvbSAweDUzMCB0byAweEY0OCkiKTsKLQotbW9kdWxlX3BhcmFtKG1wdV9pbywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobXB1X2lvLCAiU2V0IE1JREkgSS9PIGJhc2UgKDB4MzMwIG9yIG90aGVyLiBBZGRyZXNzIG11c3QgYmUgZXZlbiBhbmQgbXVzdCBiZSBmcm9tIDB4MzAwIHRvIDB4MzM0KSIpOwotCi1tb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpcnEsICJTZXQgTVNTIChhdWRpbykgSVJRICg1LCA3LCA5LCAxMCwgMTEsIDEyKSIpOwotCi1tb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkbWEsICJTZXQgTVNTIChhdWRpbykgZmlyc3QgRE1BIGNoYW5uZWwgKDAsIDEsIDMpIik7Ci0KLW1vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkbWEyLCAiU2V0IE1TUyAoYXVkaW8pIHNlY29uZCBETUEgY2hhbm5lbCAoMCwgMSwgMykiKTsKLQotbW9kdWxlX3BhcmFtKHltb2RlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyh5bW9kZSwgIlNldCBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoMCA9IERlc2t0b3AvTm9ybWFsLCAxID0gTm90ZWJvb2sgUEMgKDEpLCAyID0gTm90ZWJvb2sgUEMgKDIpLCAzID0gSGktRmkpIik7Ci0KLW1vZHVsZV9wYXJhbShsb29wYmFjaywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobG9vcGJhY2ssICJTZXQgQS9EIGlucHV0IHNvdXJjZS4gVXNlZnVsIGZvciBlY2hvIGNhbmNlbGxhdGlvbiAoMCA9IE1pYyBSY2ggKGRlZmF1bHQpLCAxID0gTW9ubyBvdXRwdXQgbG9vcGJhY2spIik7Ci0KLSNpZmRlZiBDT05GSUdfUE5QCi1tb2R1bGVfcGFyYW0oaXNhcG5wLCBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLCAiV2hlbiBzZXQgdG8gMCwgSVNBIFBuUCBzdXBwb3J0IHdpbGwgYmUgZGlzYWJsZWQiKTsKLQotbW9kdWxlX3BhcmFtKG11bHRpcGxlLCBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MobXVsdGlwbGUsICJXaGVuIHNldCB0byAwLCB3aWxsIG5vdCBzZWFyY2ggZm9yIG11bHRpcGxlIGNhcmRzIik7Ci0jZW5kaWYKLQotCi0vKgotICogU3RhbmRhcmQgcmVhZCBhbmQgd3JpdGUgZnVuY3Rpb25zCi0qLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgb3BsM3NhMl93cml0ZSh1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkJCSB1bnNpZ25lZCBjaGFyICBpbmRleCwKLQkJCQkgdW5zaWduZWQgY2hhciAgZGF0YSkKLXsKLQlvdXRiX3AoaW5kZXgsIHBvcnQpOwotCW91dGIoZGF0YSwgcG9ydCArIDEpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvcGwzc2EyX3JlYWQodW5zaWduZWQgc2hvcnQgcG9ydCwKLQkJCQl1bnNpZ25lZCBjaGFyICBpbmRleCwKLQkJCQl1bnNpZ25lZCBjaGFyKiBkYXRhKQotewotCW91dGJfcChpbmRleCwgcG9ydCk7Ci0JKmRhdGEgPSBpbmIocG9ydCArIDEpOwotfQotCi0KLS8qCi0gKiBBbGwgb2YgdGhlIG1peGVyIGZ1bmN0aW9ucy4uLgotICovCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTJfc2V0X3ZvbHVtZShvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZWZ0LCBpbnQgcmlnaHQpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgc2NhbGVbMTAxXSA9IHsKLQkJMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZSwKLQkJMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwYywKLQkJMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKLQkJMHgwYiwgMHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwKLQkJMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKLQkJMHgwOCwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNiwgMHgwNiwgMHgwNiwKLQkJMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwKLQkJMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHgwMywKLQkJMHgwMywgMHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMSwKLQkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkJMHgwMAotCX07Ci0JdW5zaWduZWQgY2hhciB2b2w7Ci0KLQl2b2wgPSBzY2FsZVtsZWZ0XTsKLQotCS8qIElmIGxldmVsIGlzIHplcm8sIHR1cm4gb24gbXV0ZSAqLwotCWlmKCFsZWZ0KQotCQl2b2wgfD0gMHg4MDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUFTVEVSX0xFRlQsIHZvbCk7Ci0KLQl2b2wgPSBzY2FsZVtyaWdodF07Ci0KLQkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KLQlpZighcmlnaHQpCi0JCXZvbCB8PSAweDgwOwotCi0Jb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBMl9NQVNURVJfUklHSFQsIHZvbCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgb3BsM3NhMl9zZXRfbWljKG9wbDNzYTJfc3RhdGVfdCogZGV2YywgaW50IGxldmVsKQotewotCXVuc2lnbmVkIGNoYXIgdm9sID0gMHgxRjsKLQotCWlmKChsZXZlbCA+PSAwKSAmJiAobGV2ZWwgPD0gMTAwKSkKLQkJdm9sID0gMHgxRiAtICh1bnNpZ25lZCBjaGFyKSAoMzIgKiBsZXZlbCAvIDEwMSk7Ci0KLQkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KLQlpZighbGV2ZWwpCi0JCXZvbCB8PSAweDgwOwotCi0Jb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBMl9NSUMsIHZvbCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgb3BsM3NhM19zZXRfYmFzcyhvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZWZ0LCBpbnQgcmlnaHQpCi17Ci0JdW5zaWduZWQgY2hhciBiYXNzOwotCi0JYmFzcyA9IGxlZnQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogbGVmdCAvIDEwMSkpIDogMDsgCi0JYmFzcyB8PSAocmlnaHQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogcmlnaHQgLyAxMDEpKSA6IDApIDw8IDQ7Ci0KLQlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EzX0JBU1MsIGJhc3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTNfc2V0X3RyZWJsZShvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZWZ0LCBpbnQgcmlnaHQpCi17CQotCXVuc2lnbmVkIGNoYXIgdHJlYmxlOwotCi0JdHJlYmxlID0gbGVmdCA/ICgodW5zaWduZWQgY2hhcikgKDggKiBsZWZ0IC8gMTAxKSkgOiAwOyAKLQl0cmVibGUgfD0gKHJpZ2h0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIHJpZ2h0IC8gMTAxKSkgOiAwKSA8PCA0OwotCi0Jb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBM19UUkVCTEUsIHRyZWJsZSk7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTJfbWl4ZXJfcmVzZXQob3BsM3NhMl9zdGF0ZV90KiBkZXZjKQotewotCWlmIChkZXZjKSB7Ci0JCW9wbDNzYTJfc2V0X3ZvbHVtZShkZXZjLCBERUZBVUxUX1ZPTFVNRSwgREVGQVVMVF9WT0xVTUUpOwotCQlkZXZjLT52b2x1bWVfbCA9IGRldmMtPnZvbHVtZV9yID0gREVGQVVMVF9WT0xVTUU7Ci0KLQkJb3BsM3NhMl9zZXRfbWljKGRldmMsIERFRkFVTFRfTUlDKTsKLQkJZGV2Yy0+bWljID0gREVGQVVMVF9NSUM7Ci0KLQkJaWYgKGRldmMtPmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EzKSB7Ci0JCQlvcGwzc2EzX3NldF9iYXNzKGRldmMsIERFRkFVTFRfVElNQlJFLCBERUZBVUxUX1RJTUJSRSk7Ci0JCQlkZXZjLT5iYXNzX2wgPSBkZXZjLT5iYXNzX3IgPSBERUZBVUxUX1RJTUJSRTsKLQkJCW9wbDNzYTNfc2V0X3RyZWJsZShkZXZjLCBERUZBVUxUX1RJTUJSRSwgREVGQVVMVF9USU1CUkUpOwotCQkJZGV2Yy0+dHJlYmxlX2wgPSBkZXZjLT50cmVibGVfciA9IERFRkFVTFRfVElNQlJFOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJnX3RvX3ZvbF9tb25vKHVuc2lnbmVkIGludCB2b2wsIGludCogdmFsdWUpCi17Ci0JaW50IGxlZnQ7Ci0JCi0JbGVmdCA9IHZvbCAmIDB4MDBmZjsKLQlpZiAobGVmdCA+IDEwMCkKLQkJbGVmdCA9IDEwMDsKLQkqdmFsdWUgPSBsZWZ0OwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmdfdG9fdm9sX3N0ZXJlbyh1bnNpZ25lZCBpbnQgdm9sLCBpbnQqIGFsZWZ0LCBpbnQqIGFyaWdodCkKLXsKLQlhcmdfdG9fdm9sX21vbm8odm9sLCBhbGVmdCk7Ci0JYXJnX3RvX3ZvbF9tb25vKHZvbCA+PiA4LCBhcmlnaHQpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IHJldF92b2xfbW9ubyhpbnQgdm9sKQotewotCXJldHVybiAoKHZvbCA8PCA4KSB8IHZvbCk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBpbnQgcmV0X3ZvbF9zdGVyZW8oaW50IGxlZnQsIGludCByaWdodCkKLXsKLQlyZXR1cm4gKChyaWdodCA8PCA4KSB8IGxlZnQpOwotfQotCi0KLXN0YXRpYyBpbnQgb3BsM3NhMl9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWludCByZXR2YWwsIHZhbHVlLCBjbWRmID0gY21kICYgMHhmZjsKLQlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7Ci0KLQlvcGwzc2EyX3N0YXRlX3QqIGRldmMgPSAmb3BsM3NhMl9zdGF0ZVtkZXZdOwotCQotCXN3aXRjaCAoY21kZikgewotCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKLQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAKLQkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgotCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOiAKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JCi0JaWYgKCgoY21kID4+IDgpICYgMHhmZikgIT0gJ00nKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkJCi0JcmV0dmFsID0gMDsKLQlpZiAoX1NJT0NfRElSIChjbWQpICYgX1NJT0NfV1JJVEUpIHsKLQkJc3dpdGNoIChjbWRmKSB7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKLQkJCQlyZXR2YWwgPSBnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIF9fdXNlciAqKSBhcmcpOwotCQkJCWlmIChyZXR2YWwpCi0JCQkJCWJyZWFrOwotCQkJCWFyZ190b192b2xfc3RlcmVvKHZhbHVlLCAmZGV2Yy0+dm9sdW1lX2wsICZkZXZjLT52b2x1bWVfcik7Ci0JCQkJb3BsM3NhMl9zZXRfdm9sdW1lKGRldmMsIGRldmMtPnZvbHVtZV9sLCBkZXZjLT52b2x1bWVfcik7Ci0JCQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT52b2x1bWVfbCwgZGV2Yy0+dm9sdW1lX3IpOwotCQkJCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCBwKTsKLQkJCQlicmVhazsKLQkJICAKLQkJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQkJCXJldHZhbCA9IGdldF91c2VyKHZhbHVlLCAodW5zaWduZWQgX191c2VyICopIGFyZyk7Ci0JCQkJaWYgKHJldHZhbCkKLQkJCQkJYnJlYWs7Ci0JCQkJYXJnX3RvX3ZvbF9tb25vKHZhbHVlLCAmZGV2Yy0+bWljKTsKLQkJCQlvcGwzc2EyX3NldF9taWMoZGV2YywgZGV2Yy0+bWljKTsKLQkJCQl2YWx1ZSA9IHJldF92b2xfbW9ubyhkZXZjLT5taWMpOwotCQkJCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCBwKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR2YWwgPSAtRUlOVkFMOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKgotCQkgKiBSZXR1cm4gcGFyYW1ldGVycwotCQkgKi8KLQkJc3dpdGNoIChjbWRmKSB7Ci0JCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIoU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX01JQywgcCk7Ci0JCQkJYnJlYWs7Ci0JCSAgCi0JCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIoU09VTkRfTUFTS19WT0xVTUUsIHApOwotCQkJCWJyZWFrOwotCQkgIAotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgotCQkJCS8qIE5vIHJlY29yZGluZyBkZXZpY2VzICovCi0JCQkJcmV0dmFsID0gcHV0X3VzZXIoMCwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcihTT1VORF9DQVBfRVhDTF9JTlBVVCwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQkJCS8qIE5vIHJlY29yZGluZyBzb3VyY2UgKi8KLQkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCBwKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT52b2x1bWVfbCwgZGV2Yy0+dm9sdW1lX3IpOwotCQkJCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCBwKTsKLQkJCQlicmVhazsKLQkJCSAgCi0JCQljYXNlIFNPVU5EX01JWEVSX01JQzoKLQkJCQl2YWx1ZSA9IHJldF92b2xfbW9ubyhkZXZjLT5taWMpOwotCQkJCXB1dF91c2VyKHZhbHVlLCBwKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR2YWwgPSAtRUlOVkFMOwotCQl9Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0vKiBvcGwzc2EyX21peGVyX2lvY3RsIGVuZCAqLwotCi0KLXN0YXRpYyBpbnQgb3BsM3NhM19taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlpbnQgdmFsdWUsIHJldHZhbCwgY21kZiA9IGNtZCAmIDB4ZmY7Ci0KLQlvcGwzc2EyX3N0YXRlX3QqIGRldmMgPSAmb3BsM3NhMl9zdGF0ZVtkZXZdOwotCi0Jc3dpdGNoIChjbWRmKSB7Ci0JY2FzZSBTT1VORF9NSVhFUl9CQVNTOgotCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPmJhc3NfbCwgZGV2Yy0+YmFzc19yKTsKLQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIChpbnQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKLQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT50cmVibGVfbCwgZGV2Yy0+dHJlYmxlX3IpOwotCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX0RJR0lUQUwxOgotCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPndpZGVfbCwgZGV2Yy0+d2lkZV9yKTsKLQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIChpbnQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLS8qIG9wbDNzYTNfbWl4ZXJfaW9jdGwgZW5kICovCi0KLQotc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIG9wbDNzYTJfbWl4ZXJfb3BlcmF0aW9ucyA9Ci17Ci0JLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLmlkCT0gIk9QTDMtU0EyIiwKLQkubmFtZQk9ICJZYW1haGEgT1BMMy1TQTIiLAotCS5pb2N0bAk9IG9wbDNzYTJfbWl4ZXJfaW9jdGwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBvcGwzc2EzX21peGVyX29wZXJhdGlvbnMgPQotewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5pZAk9ICJPUEwzLVNBMyIsCi0JLm5hbWUJPSAiWWFtYWhhIE9QTDMtU0EzIiwKLQkuaW9jdGwJPSBvcGwzc2EzX21peGVyX2lvY3RsCi19OwotCi0vKiBFbmQgb2YgbWl4ZXItcmVsYXRlZCBzdHVmZiAqLwotCi0KLS8qCi0gKiBDb21wb25lbnQgcHJvYmUsIGF0dGFjaCwgdW5sb2FkIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgdW5sb2FkX29wbDNzYTJfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKLXsKLQl1bmxvYWRfbXB1NDAxKGh3X2NvbmZpZyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9vcGwzc2EyX21zcyhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMpCi17Ci0JaW50IGluaXRpYWxfbWl4ZXJzOwotCi0JaW5pdGlhbF9taXhlcnMgPSBudW1fbWl4ZXJzOwotCWF0dGFjaF9tc19zb3VuZChod19jb25maWcsIHBvcnRzLCBUSElTX01PRFVMRSk7CS8qIFNsb3QgMCAqLwotCWlmIChod19jb25maWctPnNsb3RzWzBdICE9IC0xKSB7Ci0JCS8qIERpZCB0aGUgTVNTIGRyaXZlciBpbnN0YWxsPyAqLwotCQlpZihudW1fbWl4ZXJzID09IChpbml0aWFsX21peGVycyArIDEpKSB7Ci0JCQkvKiBUaGUgTVNTIG1peGVyIGlzIGluc3RhbGxlZCwgcmVyb3V0ZSBtaXhlcnMgYXBwcm9wcmlhdGVseSAqLwotCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTEsIFNPVU5EX01JWEVSX0NEKTsKLQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUyLCBTT1VORF9NSVhFUl9TWU5USCk7Ci0JCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMywgU09VTkRfTUlYRVJfTElORSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJNU1MgbWl4ZXIgbm90IGluc3RhbGxlZD9cbiIpOwotCQl9Ci0JfQotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgdW5sb2FkX29wbDNzYTJfbXNzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZykKLXsKLQl1bmxvYWRfbXNfc291bmQoaHdfY29uZmlnKTsKLX0KLQotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9iZV9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCi17Ci0JdW5zaWduZWQgY2hhciBtaXNjOwotCXVuc2lnbmVkIGNoYXIgdG1wOwotCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKLQotCS8qCi0JICogVHJ5IGFuZCBhbGxvY2F0ZSBvdXIgSS9PIHBvcnQgcmFuZ2UuCi0JICovCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIsIE9QTDNTQTJfTU9EVUxFX05BTUUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkNvbnRyb2wgSS9PIHBvcnQgJSN4IG5vdCBmcmVlXG4iLAotCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKLQkJZ290byBvdXRfbm9kZXY7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayBpZiB3cml0aW5nIHRvIHRoZSByZWFkLW9ubHkgdmVyc2lvbiBiaXRzIG9mIHRoZSBtaXNjZWxsYW5lb3VzCi0JICogcmVnaXN0ZXIgc3VjY2VlZHMgb3Igbm90IChpdCBzaG91bGQgbm90KS4KLQkgKi8KLQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsICZtaXNjKTsKLQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCBtaXNjIF4gMHgwNyk7Ci0Jb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCAmdG1wKTsKLQlpZih0bXAgIT0gbWlzYykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBpcyBub3QgYSBZTUY3eHggY2hpcHNldCFcbiIsCi0JCSAgICAgICBod19jb25maWctPmlvX2Jhc2UpOwotCQlnb3RvIG91dF9yZWdpb247Ci0JfQotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgTUlDIHJlZ2lzdGVyIGlzIGFjY2Vzc2libGUuCi0JICovCi0Jb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsICZ0bXApOwotCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JQywgMHg4YSk7Ci0Jb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsICZ0bXApOwotCWlmKCh0bXAgJiAweDlmKSAhPSAweDhhKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBpcyBub3QgYSBZTUY3eHggY2hpcHNldCFcbiIsCi0JCSAgICAgICBod19jb25maWctPmlvX2Jhc2UpOwotCQlnb3RvIG91dF9yZWdpb247Ci0JfQotCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JQywgdG1wKTsKLQotCS8qCi0JICogRGV0ZXJtaW5lIGNoaXBzZXQgdHlwZSAoU0EyIG9yIFNBMykKLQkgKgotCSAqIFRoaXMgaXMgZG9uZSBieSBsb29raW5nIGF0IHRoZSBjaGlwc2V0IHZlcnNpb24gaW4gdGhlIGxvd2VyIDMgYml0cwotCSAqIG9mIHRoZSBtaXNjZWxsYW5lb3VzIHJlZ2lzdGVyLgotCSAqLwotCXZlcnNpb24gPSBtaXNjICYgMHgwNzsKLQlwcmludGsoS0VSTl9ERUJVRyBQRlggIkNoaXBzZXQgdmVyc2lvbiA9ICUjeFxuIiwgdmVyc2lvbik7Ci0Jc3dpdGNoICh2ZXJzaW9uKSB7Ci0JCWNhc2UgMDoKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfVU5LTk9XTjsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgIFBGWCAiVW5rbm93biBZYW1haGEgYXVkaW8gY29udHJvbGxlciB2ZXJzaW9uXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVkVSU0lPTl9ZTUY3MTE6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTI7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRm91bmQgT1BMMy1TQTIgKFlNRjcxMSlcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWRVJTSU9OX1lNRjcxNToKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTUgb3IgWU1GNzE5KVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFUlNJT05fWU1GNzE1QjoKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTVCIG9yIFlNRjcxOUIpXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVkVSU0lPTl9ZTUY3MTVFOgotCQlkZWZhdWx0OgotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EzOwotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgIFBGWCAiRm91bmQgT1BMMy1TQTMgKFlNRjcxNUUgb3IgWU1GNzE5RSlcbiIpOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCAhPSBDSElQU0VUX1VOS05PV04pIHsKLQkJLyogR2VuZXJhdGUgYSBwcmV0dHkgbmFtZSAqLwotCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRfbmFtZSA9IChjaGFyICopQ0hJUFNFVF9UQUJMRVtvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRdOwotCQlyZXR1cm4gMDsKLQl9Ci0KLW91dF9yZWdpb246Ci0JcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKLW91dF9ub2RldjoKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTIoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgY2FyZCkKLXsKLQkvKiBJbml0aWFsaXplIElSUSBjb25maWd1cmF0aW9uIHRvIElSUS1COiAtLCBJUlEtQTogV1NTK01QVStPUEwzICovCi0Jb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfSVJRX0NPTkZJRywgMHgwZCk7Ci0KLQkvKiBJbml0aWFsaXplIERNQSBjb25maWd1cmF0aW9uICovCi0JaWYoaHdfY29uZmlnLT5kbWEyID09IGh3X2NvbmZpZy0+ZG1hKSB7Ci0JCS8qIFdhbnQgRE1BIGNvbmZpZ3VyYXRpb24gRE1BLUI6IC0sIERNQS1BOiBXU1MtUCtXU1MtUiAqLwotCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9ETUFfQ09ORklHLCAweDAzKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFdhbnQgRE1BIGNvbmZpZ3VyYXRpb24gRE1BLUI6IFdTUy1SLCBETUEtQTogV1NTLVAgKi8KLQkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfRE1BX0NPTkZJRywgMHgyMSk7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfb3BsM3NhMl9taXhlcihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBjYXJkKQotewotCXN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKiBtaXhlcl9vcGVyYXRpb25zOwotCW9wbDNzYTJfc3RhdGVfdCogZGV2YyA9ICZvcGwzc2EyX3N0YXRlW2NhcmRdOwotCi0JLyogSW5zdGFsbCBtYXN0ZXIgbWl4ZXIgKi8KLQlpZiAoZGV2Yy0+Y2hpcHNldCA9PSBDSElQU0VUX09QTDNTQTMpIHsKLQkJbWl4ZXJfb3BlcmF0aW9ucyA9ICZvcGwzc2EzX21peGVyX29wZXJhdGlvbnM7Ci0JfQotCWVsc2UgewotCQltaXhlcl9vcGVyYXRpb25zID0gJm9wbDNzYTJfbWl4ZXJfb3BlcmF0aW9uczsKLQl9Ci0KLQlkZXZjLT5jZmdfcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKLQlkZXZjLT5taXhlciA9IHNvdW5kX2luc3RhbGxfbWl4ZXIoTUlYRVJfRFJJVkVSX1ZFUlNJT04sCi0JCQkJCSAgbWl4ZXJfb3BlcmF0aW9ucy0+bmFtZSwKLQkJCQkJICBtaXhlcl9vcGVyYXRpb25zLAotCQkJCQkgIHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyksCi0JCQkJCSAgZGV2Yyk7Ci0JaWYoZGV2Yy0+bWl4ZXIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBpbnN0YWxsICVzIG1hc3RlciBtaXhlclxuIiwKLQkJCSBtaXhlcl9vcGVyYXRpb25zLT5uYW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCQlvcGwzc2EyX21peGVyX3Jlc2V0KGRldmMpOwotCi0JfQotfQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTJfY2xlYXJfc2xvdHMoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnKQotewotCWludCBpOwotCi0JZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCWh3X2NvbmZpZy0+c2xvdHNbaV0gPSAtMTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IG9wbDNzYTJfc2V0X3ltb2RlKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IHltb2RlKQotewotCS8qCi0JICogU2V0IHRoZSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoYWthIFltZXJzaW9uKSBpZiBhc2tlZCB0byBhbmQKLQkgKiBpdCdzIHN1cHBvcnRlZC4KLQkgKgotCSAqIDA6IERlc2t0b3AgKGFrYSBub3JtYWwpICAgNS0xMiBjbSBzcGVha2VycwotCSAqIDE6IE5vdGVib29rIFBDIG1vZGUgMSAgICAgMyBjbSBzcGVha2VycwotCSAqIDI6IE5vdGVib29rIFBDIG1vZGUgMiAgICAgMS41IGNtIHNwZWFrZXJzCi0JICogMzogSGktZmkgICAgICAgICAgICAgICAgICAxNi0zOCBjbSBzcGVha2VycwotCSAqLwotCWlmKHltb2RlID49IDAgJiYgeW1vZGUgPD0gMykgewotCQl1bnNpZ25lZCBjaGFyIHN5c19jdHJsOwotCi0JCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfU1lTX0NUUkwsICZzeXNfY3RybCk7Ci0JCXN5c19jdHJsID0gKHN5c19jdHJsICYgMHhjZikgfCAoKHltb2RlICYgMykgPDwgNCk7Ci0JCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX1NZU19DVFJMLCBzeXNfY3RybCk7Ci0JfQotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJub3Qgc2V0dGluZyB5bW9kZSwgaXQgbXVzdCBiZSBvbmUgb2YgMCwxLDIsM1xuIik7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBvcGwzc2EyX3NldF9sb29wYmFjayhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBsb29wYmFjaykKLXsKLQlpZihsb29wYmFjayA+PSAwICYmIGxvb3BiYWNrIDw9IDEpIHsKLQkJdW5zaWduZWQgY2hhciBtaXNjOwotCi0JCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgJm1pc2MpOwotCQltaXNjID0gKG1pc2MgJiAweGVmKSB8ICgobG9vcGJhY2sgJiAxKSA8PCA0KTsKLQkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgbWlzYyk7Ci0JfQotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJub3Qgc2V0dGluZyBsb29wYmFjaywgaXQgbXVzdCBiZSBlaXRoZXIgMCBvciAxXG4iKTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCi17Ci0gICAgICAgIC8qIFJlbGVhc2UgY29udHJvbCBwb3J0cyAqLwotCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7Ci0KLQkvKiBVbmxvYWQgbWl4ZXIgKi8KLQlpZihvcGwzc2EyX3N0YXRlW2NhcmRdLm1peGVyID49IDApCi0JCXNvdW5kX3VubG9hZF9taXhlcmRldihvcGwzc2EyX3N0YXRlW2NhcmRdLm1peGVyKTsKLQotfQotCi0jaWZkZWYgQ09ORklHX1BOUAotc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIHBucF9vcGwzc2EyX2xpc3RbXSA9IHsKLQl7LmlkID0gIllNSDAwMjEiLCAuZHJpdmVyX2RhdGEgPSAwfSwKLQl7LmlkID0gIiJ9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgcG5wX29wbDNzYTJfbGlzdCk7Ci0KLXN0YXRpYyBpbnQgb3BsM3NhMl9wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKLXsKLQlpbnQgY2FyZCA9IG9wbDNzYTJfY2FyZHNfbnVtOwotCi0JLyogd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byByZXR1cm4gYW4gZXJyb3IgYXMgdGhlIHVzZXIgbWF5IGhhdmUgc3BlY2lmaWVkCi0JICogbm8gbXVsdGlwbGUgY2FyZCBzZWFyY2gKLQkgKi8KLQotCWlmIChvcGwzc2EyX2NhcmRzX251bSA9PSBPUEwzU0EyX0NBUkRTX01BWCkKLQkJcmV0dXJuIDA7Ci0Jb3BsM3NhMl9hY3RpdmF0ZWRbY2FyZF0gPSAxOwotCi0JLyogT3VyIG93biBjb25maWc6ICovCi0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwgNCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaXJxICAgICA9IHBucF9pcnEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEgICAgID0gcG5wX2RtYShkZXYsIDApOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYTIgICAgPSBwbnBfZG1hKGRldiwgMSk7Ci0KLQkvKiBUaGUgTVNTIGNvbmZpZzogKi8KLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZSAgICAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAxKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaXJxICAgICAgICAgID0gcG5wX2lycShkZXYsIDApOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEgICAgICAgICAgPSBwbnBfZG1hKGRldiwgMCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmRtYTIgICAgICAgICA9IHBucF9kbWEoZGV2LCAxKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuY2FyZF9zdWJ0eXBlID0gMTsgLyogTm8gSVJRIG9yIERNQSBzZXR1cCAqLwotCi0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlvX2Jhc2UgICAgICAgPSBwbnBfcG9ydF9zdGFydChkZXYsIDMpOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pcnEgICAgICAgICAgID0gcG5wX2lycShkZXYsIDApOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEgICAgICAgICAgID0gLTE7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmRtYTIgICAgICAgICAgPSAtMTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuYWx3YXlzX2RldGVjdCA9IDE7IC8qIEl0J3MgdGhlcmUsIHNvIHVzZSBzaGFyZWQgSVJRcyAqLwotCi0JLyogQ2FsbCBtZSBwYXJhbm9pZDogKi8KLQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZyk7Ci0Jb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzKTsKLQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOwotCi0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5wZGV2ID0gZGV2OwotCW9wbDNzYTJfY2FyZHNfbnVtKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIG9wbDNzYTJfZHJpdmVyID0gewotCS5uYW1lCQk9ICJvcGwzc2EyIiwKLQkuaWRfdGFibGUJPSBwbnBfb3BsM3NhMl9saXN0LAotCS5wcm9iZQkJPSBvcGwzc2EyX3BucF9wcm9iZSwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfUE5QICovCi0KLS8qIEVuZCBvZiBjb21wb25lbnQgZnVuY3Rpb25zICovCi0KLS8qCi0gKiBJbnN0YWxsIE9QTDMtU0EyIGJhc2VkIGNhcmQocykuCi0gKgotICogTmVlZCB0byBoYXZlIGFkMTg0OCBhbmQgbXB1NDAxIGxvYWRlZCByZWFkeS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgaW5pdF9vcGwzc2EyKHZvaWQpCi17Ci0JaW50IGNhcmQsIG1heDsKLQotCS8qIFNhbml0aXplIGlzYXBucCBhbmQgbXVsdGlwbGUgc2V0dGluZ3MgKi8KLQlpc2FwbnAgPSBpc2FwbnAgIT0gMCA/IDEgOiAwOwotCW11bHRpcGxlID0gbXVsdGlwbGUgIT0gMCA/IDEgOiAwOwotCi0JbWF4ID0gKG11bHRpcGxlICYmIGlzYXBucCkgPyBPUEwzU0EyX0NBUkRTX01BWCA6IDE7Ci0KLSNpZmRlZiBDT05GSUdfUE5QCi0JaWYgKGlzYXBucCl7Ci0JCXBucF9yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfZHJpdmVyKTsKLQkJaWYoIW9wbDNzYTJfY2FyZHNfbnVtKXsKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBQblAgY2FyZHMgZm91bmRcbiIpOwotCQkJaXNhcG5wID0gMDsKLQkJfQotCQltYXggPSBvcGwzc2EyX2NhcmRzX251bTsKLQl9Ci0jZW5kaWYKLQotCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBtYXg7IGNhcmQrKykgewotCQkvKiBJZiBhIHVzZXIgd2FudHMgYW4gSS9PIHRoZW4gYXNzdW1lIHRoZXkgbWVhbnQgaXQgKi8KLQkJc3RydWN0IHJlc291cmNlICpwb3J0czsKLQkJaW50IGJhc2U7Ci0JCQotCQlpZiAoIWlzYXBucCkgewotCQkJaWYgKGlvID09IC0xIHx8IGlycSA9PSAtMSB8fCBkbWEgPT0gLTEgfHwKLQkJCSAgICBkbWEyID09IC0xIHx8IG1zc19pbyA9PSAtMSkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICBQRlggImlvLCBtc3NfaW8sIGlycSwgZG1hLCBhbmQgZG1hMiBtdXN0IGJlIHNldFxuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlvcGwzc2EyX2NhcmRzX251bSsrOwotCi0JCQkvKgotCQkJICogT3VyIG93biBjb25maWc6Ci0JCQkgKiAoTk9URTogSVJRIGFuZCBETUEgYXJlbid0IHVzZWQsIHNvIHRoZXkncmUgc2V0IHRvCi0JCQkgKiAgZ2l2ZSBwcmV0dHkgb3V0cHV0IGZyb20gY29uZl9wcmludGYuIDopCi0JCQkgKi8KLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UgPSBpbzsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlycSAgICAgPSBpcnE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEgICAgID0gZG1hOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hMiAgICA9IGRtYTI7Ci0JCi0JCQkvKiBUaGUgTVNTIGNvbmZpZzogKi8KLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pb19iYXNlICAgICAgPSBtc3NfaW87Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaXJxICAgICAgICAgID0gaXJxOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmRtYSAgICAgICAgICA9IGRtYTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEyICAgICAgICAgPSBkbWEyOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmNhcmRfc3VidHlwZSA9IDE7IC8qIE5vIElSUSBvciBETUEgc2V0dXAgKi8KLQotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlvX2Jhc2UgICAgICAgPSBtcHVfaW87Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaXJxICAgICAgICAgICA9IGlycTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEgICAgICAgICAgID0gLTE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuYWx3YXlzX2RldGVjdCA9IDE7IC8qIFVzZSBzaGFyZWQgSVJRcyAqLwotCi0JCQkvKiBDYWxsIG1lIHBhcmFub2lkOiAqLwotCQkJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOwotCQkJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzKTsKLQkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSk7Ci0JCX0KLQotCQkvKiBGSVhNRTogbGVhayAqLwotCQlpZiAocHJvYmVfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJYmFzZSA9IG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pb19iYXNlOwotCi0JCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgNCwgIldTUyBjb25maWciKSkKLQkJCWdvdG8gZmFpbGVkOwotCi0JCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKLQkJaWYgKCFwb3J0cykKLQkJCWdvdG8gZmFpbGVkMjsKLQotCQlpZiAoIXByb2JlX21zX3NvdW5kKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MsIHBvcnRzKSkgewotCQkJLyoKLQkJCSAqIElmIG9uZSBvciBtb3JlIGNhcmRzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQsIGRvbid0Ci0JCQkgKiByZXR1cm4gYW4gZXJyb3IgYnV0IHByaW50IGEgd2FybmluZy4gIE5vdGUsIHRoaXMKLQkJCSAqIHNob3VsZCBuZXZlciByZWFsbHkgaGFwcGVuIHVubGVzcyB0aGUgaGFyZHdhcmUgb3IKLQkJCSAqIElTQSBQblAgc2NyZXdlZCB1cC4KLQkJCSAqLwotCQkJcmVsZWFzZV9yZWdpb24oYmFzZSArIDQsIDQpOwotCQlmYWlsZWQyOgotCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgNCk7Ci0JCWZhaWxlZDoKLQkJCXJlbGVhc2VfcmVnaW9uKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UsIDIpOwotCi0JCQlpZiAob3BsM3NhMl9jYXJkc19udW0pIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgICAgIFBGWCAiVGhlcmUgd2FzIGEgcHJvYmxlbSBwcm9iaW5nIG9uZSAiCi0JCQkJICAgICAgICIgb2YgdGhlIElTQSBQTlAgY2FyZHMsIGNvbnRpbnVpbmdcbiIpOwotCQkJCW9wbDNzYTJfY2FyZHNfbnVtLS07Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCWF0dGFjaF9vcGwzc2EyKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgY2FyZCk7Ci0JCWNvbmZfcHJpbnRmKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldF9uYW1lLCAmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOwotCQlhdHRhY2hfb3BsM3NhMl9taXhlcigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOwotCQlhdHRhY2hfb3BsM3NhMl9tc3MoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcywgcG9ydHMpOwotCi0JCS8qIGV3d3cgPSkgKi8KLQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jYXJkID0gY2FyZDsKLQotCQkvKgotCQkgKiBTZXQgdGhlIFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlIChha2EgWW1lcnNpb24pIGlmIGFza2VkIHRvIGFuZAotCQkgKiBpdCdzIHN1cHBvcnRlZC4KLQkJICovCi0JCWlmICh5bW9kZSAhPSAtMSkgewotCQkJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9PSBDSElQU0VUX09QTDNTQTIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgUEZYICJ5bW9kZSBub3Qgc3VwcG9ydGVkIG9uIE9QTDMtU0EyXG4iKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9wbDNzYTJfc2V0X3ltb2RlKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgeW1vZGUpOwotCQkJfQotCQl9Ci0KLQotCQkvKiBTZXQgQS9EIGlucHV0IHRvIE1vbm8gbG9vcGJhY2sgaWYgYXNrZWQgdG8uICovCi0JCWlmIChsb29wYmFjayAhPSAtMSkgewotCQkJb3BsM3NhMl9zZXRfbG9vcGJhY2soJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBsb29wYmFjayk7Ci0JCX0KLQkJCi0JCS8qIEF0dGFjaCBNUFUgaWYgd2UndmUgYmVlbiBhc2tlZCB0byBkbyBzbywgZmFpbHVyZSBpc24ndCBmYXRhbCAqLwotCQlpZiAob3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlvX2Jhc2UgIT0gLTEpIHsKLQkJCWludCBiYXNlID0gb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlvX2Jhc2U7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOwotCQkJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihiYXNlLCAyLCAibXB1NDAxIik7Ci0JCQlpZiAoIXBvcnRzKQotCQkJCWdvdG8gb3V0OwotCQkJaWYgKCFwcm9iZV9tcHU0MDEoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSwgcG9ydHMpKSB7Ci0JCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgMik7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlpZiAoYXR0YWNoX21wdTQwMSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LCBUSElTX01PRFVMRSkpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gYXR0YWNoIE1QVTQwMVxuIik7Ci0JCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LnNsb3RzWzFdID0gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLW91dDoKLQlpZiAoaXNhcG5wKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSBQRlggIiVkIFBuUCBjYXJkKHMpIGZvdW5kLlxuIiwgb3BsM3NhMl9jYXJkc19udW0pOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBVbmluc3RhbGwgT1BMMy1TQTIgYmFzZWQgY2FyZChzKS4KLSAqLwotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfb3BsM3NhMih2b2lkKQotewotCWludCBjYXJkOwotCi0JZm9yKGNhcmQgPSAwOyBjYXJkIDwgb3BsM3NhMl9jYXJkc19udW07IGNhcmQrKykgewotCSAgICAgICAgaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5zbG90c1sxXSAhPSAtMSkgewotCQkJdW5sb2FkX29wbDNzYTJfbXB1KCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOwotIAkJfQotCQl1bmxvYWRfb3BsM3NhMl9tc3MoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7Ci0JCXVubG9hZF9vcGwzc2EyKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgY2FyZCk7Ci0jaWZkZWYgQ09ORklHX1BOUAotCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfZHJpdmVyKTsKLSNlbmRpZgotCX0KLX0KLQotbW9kdWxlX2luaXQoaW5pdF9vcGwzc2EyKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfb3BsM3NhMik7Ci0KLSNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9vcGwzc2EyKGNoYXIgKnN0cikKLXsKLQkvKiBpbywgaXJxLCBkbWEsIGRtYTIsLi4uICovCi0jaWZkZWYgQ09ORklHX1BOUAotCWludCBpbnRzWzExXTsKLSNlbHNlCi0JaW50IGludHNbOV07Ci0jZW5kaWYKLQlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQotCWlvICAgICAgID0gaW50c1sxXTsKLQlpcnEgICAgICA9IGludHNbMl07Ci0JZG1hICAgICAgPSBpbnRzWzNdOwotCWRtYTIgICAgID0gaW50c1s0XTsKLQltc3NfaW8gICA9IGludHNbNV07Ci0JbXB1X2lvICAgPSBpbnRzWzZdOwotCXltb2RlICAgID0gaW50c1s3XTsKLQlsb29wYmFjayA9IGludHNbOF07Ci0jaWZkZWYgQ09ORklHX1BOUAotCWlzYXBucCAgID0gaW50c1s5XTsKLQltdWx0aXBsZSA9IGludHNbMTBdOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoIm9wbDNzYTI9Iiwgc2V0dXBfb3BsM3NhMik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy90cmlkZW50LmMgYi9zb3VuZC9vc3MvdHJpZGVudC5jCmluZGV4IDNiYzFmNmUuLjk2YWRjNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy90cmlkZW50LmMKKysrIGIvc291bmQvb3NzL3RyaWRlbnQuYwpAQCAtMTEsMTIgKzExLDEyIEBACiAgKiAgQnVpbHQgZnJvbToKICAqCUxvdyBsZXZlbCBjb2RlOiA8YXVkaW9AdHJpZGVudG1pY3JvLmNvbT4gZnJvbSBBTFNBCiAgKglGcmFtZXdvcms6IFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KLSAqCUV4dGVuZGVkIGJ5OiBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4gIAorICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgogICoKICAqICBIYWNrZWQgdXAgYnk6CiAgKglBYXJvbiBIb2x0em1hbiA8YWhvbHR6bWFAZXNzLmVuZ3IudXZpYy5jYT4KICAqCU9sbGllIExobyA8b2xsaWVAc2lzLmNvbS50dz4gU2lTIDcwMTggQXVkaW8gQ29yZSBTdXBwb3J0Ci0gKglDaGluZy1MaW5nIExlZSA8Y2xpbmctbGlAYWxpLmNvbS50dz4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0IAorICoJQ2hpbmctTGluZyBMZWUgPGNsaW5nLWxpQGFsaS5jb20udHc+IEFMaSA1NDUxIEF1ZGlvIENvcmUgU3VwcG9ydAogICoJTWF0dCBXdSA8bWF0dHd1QGFjZXJzb2Z0ZWNoLmNvbS5jbj4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0CiAgKglQZXRlciBXw6RjaHRsZXIgPHB3YWVjaHRsZXJAbG9ld2Uta29tcC5kZT4gQ3liZXJQcm81MDUwIHN1cHBvcnQKICAqICAgICAgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBtdWxpeC5vcmc+CkBAIC01NCwzMyArNTQsMzMgQEAKICAqCWFkYXB0IHRvIG5ldyBwY2kgam95c3RpY2sgYXR0YWNobWVudCBpbnRlcmZhY2UKICAqICB2MC4xNC4xMGYKICAqICAgICAgSnVseSAyNCAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgotICogICAgICBwYXRjaCBmcm9tIEVyaWMgTGVtYXIgKHZpYSBJYW4gU29ib3JvZmYpOiBpbiBzdXNwZW5kIGFuZCByZXN1bWUsIAotICogICAgICBmaXggd3JvbmcgY2FzdCBmcm9tIHBjaV9kZXYqIHRvIHN0cnVjdCB0cmlkZW50X2NhcmQqLiAKKyAqICAgICAgcGF0Y2ggZnJvbSBFcmljIExlbWFyICh2aWEgSWFuIFNvYm9yb2ZmKTogaW4gc3VzcGVuZCBhbmQgcmVzdW1lLAorICogICAgICBmaXggd3JvbmcgY2FzdCBmcm9tIHBjaV9kZXYqIHRvIHN0cnVjdCB0cmlkZW50X2NhcmQqLgogICogIHYwLjE0LjEwZQogICogICAgICBKdWx5IDE5IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+Ci0gKiAgICAgIHJld3JpdGUgdGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbi9kZWFsbGNvYXRpb24gZnVuY3Rpb25zLCB0byBtYWtlIGl0IAotICogICAgICBtb2R1bGFyIGFuZCBmaXggYSBidWcgd2hlcmUgd2Ugd291bGQgY2FsbCBmcmVlX3BhZ2VzIG9uIG1lbW9yeSAKLSAqICAgICAgb2J0YWluZWQgd2l0aCBwY2lfYWxsb2NfY29uc2lzdGVudC4gQWxzbyByZW1vdmUgdW5uZWNlc3NhcnkgI2lmZGVmIAorICogICAgICByZXdyaXRlIHRoZSBETUEgYnVmZmVyIGFsbG9jYXRpb24vZGVhbGxjb2F0aW9uIGZ1bmN0aW9ucywgdG8gbWFrZSBpdAorICogICAgICBtb2R1bGFyIGFuZCBmaXggYSBidWcgd2hlcmUgd2Ugd291bGQgY2FsbCBmcmVlX3BhZ2VzIG9uIG1lbW9yeQorICogICAgICBvYnRhaW5lZCB3aXRoIHBjaV9hbGxvY19jb25zaXN0ZW50LiBBbHNvIHJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWYKICAqICAgICAgQ09ORklHX1BST0NfRlMgYW5kIHZhcmlvdXMgb3RoZXIgY2xlYW51cHMuCiAgKiAgdjAuMTQuMTBkCiAgKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICAqICAgICAgbWFkZSBzZXZlcmFsIHByaW50ayhLRVJOX05PVElDRS4uLikgaW50byBUUkRCRyguLi4pLCB0byBhdm9pZCBzcGFtbWluZwotICogICAgICBteSBzeXNsb2cgd2l0aCBodW5kcmVkcyBvZiBtZXNzYWdlcy4gCisgKiAgICAgIG15IHN5c2xvZyB3aXRoIGh1bmRyZWRzIG9mIG1lc3NhZ2VzLgogICogIHYwLjE0LjEwYwogICogICAgICBKdWx5IDE2IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CiAgKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKLSAqICAgICAgYW5kIHRoZSBjb2Rpbmcgc3R5bGUgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gCisgKiAgICAgIGFuZCB0aGUgY29kaW5nIHN0eWxlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuCiAgKiAgdjAuMTQuMTBiCiAgKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KLSAqICAgICAgYWRkIGEgbWlzc2luZyB1bmxvY2tfc2V0X2ZtdCwgcmVtb3ZlIGEgc3VwZXJmbG91cyBsb2NrL3VubG9jayBwYWlyIAotICogICAgICB3aXRoIG5vdGhpbmcgaW4gYmV0d2Vlbi4gCisgKiAgICAgIGFkZCBhIG1pc3NpbmcgdW5sb2NrX3NldF9mbXQsIHJlbW92ZSBhIHN1cGVyZmxvdXMgbG9jay91bmxvY2sgcGFpcgorICogICAgICB3aXRoIG5vdGhpbmcgaW4gYmV0d2Vlbi4KICAqICB2MC4xNC4xMGEKLSAqICAgICAgSnVuZSAyMSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPiAKLSAqICAgICAgdXNlIGEgZGVidWcgbWFjcm8gaW5zdGVhZCBvZiAjaWZkZWYgQ09ORklHX0RFQlVHLCB0cmltIHRvIDgwIGNvbHVtbnMgCi0gKiAgICAgIHBlciBsaW5lLCB1c2UgJ2RvIHt9IHdoaWxlICgwKScgaW4gc3RhdGVtZW50IG1hY3Jvcy4gCisgKiAgICAgIEp1bmUgMjEgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgdXNlIGEgZGVidWcgbWFjcm8gaW5zdGVhZCBvZiAjaWZkZWYgQ09ORklHX0RFQlVHLCB0cmltIHRvIDgwIGNvbHVtbnMKKyAqICAgICAgcGVyIGxpbmUsIHVzZSAnZG8ge30gd2hpbGUgKDApJyBpbiBzdGF0ZW1lbnQgbWFjcm9zLgogICogIHYwLjE0LjEwCiAgKiAgICAgIEp1bmUgNiAyMDAyIExlaSBIdSA8TGVpX2h1QGFsaS5jb20udHc+Ci0gKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCisgKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEKICAqICB2MC4xNC45ZQogICogICAgICBKYW51YXJ5IDIgMjAwMiBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+IGFkZGVkIGdhbWVwb3J0CiAgKiAgICAgIHN1cHBvcnQgdG8gYXZvaWQgcmVzb3VyY2UgY29uZmxpY3Qgd2l0aCBwY2lnYW1lLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogICoJU2V0IEVCVUYxIGFuZCBFQlVGMiB0byBzdGlsbCBtb2RlCiAgKglBZGQgZGM5Ny9hYzk3IHJlc2V0IGZ1bmN0aW9uCiAgKglGaXggcG93ZXIgbWFuYWdlbWVudDogYWxpX3Jlc3RvcmVfcmVncwotICogIHVucmVsZWFzZWQgCisgKiAgdW5yZWxlYXNlZAogICoJTWFyIDA5IDIwMDEgTWF0dCBXdQogICoJQWRkIGNhY2hlIGZvciBhYzk3IGFjY2VzcwogICogIHYwLjE0LjcKQEAgLTEyMCw3ICsxMjAsNyBAQAogICoJRml4IGJ1ZzogYW4gZXh0cmEgdGFpbCB3aWxsIGJlIHBsYXllZCB3aGVuIHBsYXlpbmcKICAqCUphbiAwNSAyMDAxIE1hdHQgV3UKICAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KwotICogIHYwLjE0LjYgCisgKiAgdjAuMTQuNgogICoJTm92IDEgMjAwMCBDaGluZy1MaW5nIExlZQogICoJRml4IHRoZSBidWcgb2YgbWVtb3J5IGxlYWsgd2hlbiBzd2l0Y2hpbmcgNS4xLWNoYW5uZWxzIHRvIDIgY2hhbm5lbHMuCiAgKglBZGQgbG9jayBwcm90ZWN0aW9uIGludG8gZHluYW1pYyBjaGFuZ2luZyBmb3JtYXQgb2YgZGF0YS4KQEAgLTEzOCw3ICsxMzgsNyBAQAogICogIHYwLjE0LjMgTWF5IDEwIDIwMDAgT2xsaWUgTGhvCiAgKglmaXhlZCBhIHNtYWxsIGJ1ZyBpbiB0cmlkZW50X3VwZGF0ZV9wdHIsIHhtbXMgMS4wLjEgbm8gbG9uZ2VyIHVzZXMgMTAwJSBDUFUKICAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCi0gKglBZGQgY2xlYXIgdG8gc2lsZW5jZSBhZHZhbmNlIGluIHRyaWRlbnRfdXBkYXRlX3B0ciAKKyAqCUFkZCBjbGVhciB0byBzaWxlbmNlIGFkdmFuY2UgaW4gdHJpZGVudF91cGRhdGVfcHRyCiAgKglmaXggaW52YWxpZCBkYXRhIG9mIHRoZSBlbmQgb2YgdGhlIHNvdW5kCiAgKiAgdjAuMTQuMSBNYXIgMjQgMjAwMCBDaGluZy1MaW5nIExlZQogICoJQUxpIDU0NTEgc3VwcG9ydCBhZGRlZCwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBPLksuCkBAIC0xNzgsNyArMTc4LDcgQEAKICAqCVNpUyA3MDE4IHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIE8uSy4KICAqICB2MC4wMSBBbGFuIENveCBldC4gYWwuCiAgKglJbml0aWFsIFJlbGVhc2UgaW4ga2VybmVsIDIuMy4zMCwgZG9lcyBub3Qgd29yawotICogCisgKgogICogIFRvRG8KICAqCUNsZWFuIHVwIG9mIGxvdyBsZXZlbCBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLiAoZG9uZSkKICAqCUZpeCB0aGUgYnVnIG9uIGRtYSBidWZmZXIgbWFuYWdlbWVudCBpbiB1cGRhdGVfcHRyLCByZWFkL3dyaXRlLCBkcmFpbl9kYWMgKGRvbmUpCkBAIC0zMjYsNyArMzI2LDcgQEAKIAogCQl1bnNpZ25lZCBlcnJvcjsJLyogbnVtYmVyIG9mIG92ZXIvdW5kZXJydW5zICovCiAgICAgICAgICAgICAgICAgLyogcHV0IHByb2Nlc3Mgb24gd2FpdCBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgaW4gYnVmZmVyICovCi0JCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CQorCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwogCiAJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KIAkJdW5zaWduZWQgZnJhZ3NpemU7CkBAIC0zNTgsNyArMzU4LDcgQEAKIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgewogCWludCBudW07IC8qIGNoYW5uZWwgbnVtYmVyICovCiAJdTMyIGxiYTsgLyogTG9vcCBCZWdpbmUgQWRkcmVzcywgd2hlcmUgZG1hIGJ1ZmZlciBzdGFydHMgKi8KLQl1MzIgZXNvOyAvKiBFbmQgU2FtcGxlIE9mZnNldCwgd2VocmUgZG1hIGJ1ZmZlciBlbmRzICovIAorCXUzMiBlc287IC8qIEVuZCBTYW1wbGUgT2Zmc2V0LCB3ZWhyZSBkbWEgYnVmZmVyIGVuZHMgKi8KIAkgICAgICAgICAvKiAoaW4gdGhlIHVuaXQgb2Ygc2FtcGxlcykgKi8KIAl1MzIgZGVsdGE7IC8qIGRlbHRhIHZhbHVlLCBzYW1wbGUgcmF0ZSAvIDQ4ayBmb3IgcGxheWJhY2ssICovCiAJICAgICAgICAgICAvKiA0OGsvc2FtcGxlIHJhdGUgZm9yIHJlY29yZGluZyAqLwpAQCAtNDE3LDcgKzQxNyw3IEBACiAJLyogc291bmRjb3JlIHN0dWZmICovCiAJaW50IGRldl9hdWRpbzsKIAotCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgKi8gCisJLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCAqLwogCS8qIGJhbmtzIGFuZCBjaGFubmVscyAqLwogCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjW05SX0FDOTddOwogCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rIGJhbmtzW05SX0JBTktTXTsKQEAgLTQ3OSw3ICs0NzksNyBAQAogc3RhdGljIHUxNiB0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKIAogc3RhdGljIGludCB0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorc3RhdGljIGludCB0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIHN0YXRpYyB2b2lkIGFsaV9hYzk3X3NldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcsIHUxNiB2YWwpOwpAQCAtNDk2LDEwICs0OTYsMTAgQEAKIHN0YXRpYyB2b2lkIGFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2gpOwogc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZyk7CiBzdGF0aWMgaW50IGFsaV93cml0ZV81XzEoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLAotCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIAotCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCisJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsCiAJCQkgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpOwotc3RhdGljIGludCBhbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIAorc3RhdGljIGludCBhbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsCiAJCQkJCSAgICAgICBpbnQgY2hhbl9udW1zKTsKIHN0YXRpYyB2b2lkIGFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKTsKIApAQCAtNzIyLDcgKzcyMiw3IEBACiAJaWYgKGNoYW5uZWwgPCAzMSB8fCBjaGFubmVsID4gNjMpCiAJCXJldHVybjsKIAotCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCB8fCAKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFggfHwKIAkgICAgY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlgpIHsKIAkJYiA9IGluYihUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CiAJCWlmICgoYiAmIH4weDgwKSA9PSBjaGFubmVsKQpAQCAtNzQyLDcgKzc0Miw3IEBACiAJaW50IGlkeDsKIAogCS8qIFRoZSBjeWJlcnBybyA1MDUwIGhhcyBvbmx5IDMyIHZvaWNlcyBhbmQgb25lIGJhbmsgKi8KLQkvKiAuLiBhdCBsZWFzdCB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCAoaWYgeW91IHdhbnQgdG8gY2FsbCB0aGF0IAorCS8qIC4uIGF0IGxlYXN0IHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIChpZiB5b3Ugd2FudCB0byBjYWxsIHRoYXQKIAkgKiBjcmFwIGRvY3VtZW50YXRpb24pLCBwZXJoYXBzIGJyb2tlbiA/ICovCiAKIAliYW5rID0gJmNhcmQtPmJhbmtzW0JBTktfQV07CkBAIC04MDIsNyArODAyLDcgQEAKIAkvKiBlbmFibGUsIGlmIGl0IHdhcyBkaXNhYmxlZCAqLwogCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImN5YmVycHJvNTA1MDogZW5hYmxpbmcgYXVkaW8gY29udHJvbGxlclxuIik7Ci0JCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFLCAKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUsCiAJCQkgICAgIHBvcnREYXQgfCBDWUJFUl9CTVNLX0FVRU5aX0VOQUJMRSk7CiAJCS8qIGNoZWNrIGFnYWluIGlmIGhhcmR3YXJlIGlzIGVuYWJsZWQgbm93ICovCiAJCXBvcnREYXQgPSBjeWJlcl9pbmlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFKTsKQEAgLTgxMSw3ICs4MTEsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgImN5YmVycHJvNTA1MDogaW5pdEF1ZGlvQWNjZXNzOiBubyBzdWNjZXNzXG4iKTsKIAkJcmV0ID0gLTE7CiAJfSBlbHNlIHsKLQkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9JUlFfRU5BQkxFLCAKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9JUlFfRU5BQkxFLAogCQkJICAgICBDWUJFUl9CTVNLX0FVRElPX0lOVF9FTkFCTEUpOwogCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMSk7CiAJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJhLCAweDIwKTsKQEAgLTgyNyw3ICs4MjcsNyBAQAogLyogIGNhbGxlZCB3aXRoIHNwaW4gbG9jayBoZWxkICovCiAKIHN0YXRpYyBpbnQKLXRyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1MzIgKiBkYXRhLCAKK3RyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1MzIgKiBkYXRhLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsKQogewogCWludCBpOwpAQCAtODQ1LDcgKzg0NSw3IEBACiAJCQljb250aW51ZTsKIAkJb3V0bChkYXRhW2ldLCBUUklEX1JFRyhjYXJkLCBDSEFOTkVMX1NUQVJUICsgNCAqIGkpKTsKIAl9Ci0JaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8IAorCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fAogCSAgICBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewogCQlvdXRsKEFMSV9FTU9EX1N0aWxsLCBUUklEX1JFRyhjYXJkLCBBTElfRUJVRjEpKTsKIAkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYyKSk7CkBAIC04ODQsNyArODg0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgogCQlkYXRhWzBdID0gKGNoYW5uZWwtPmRlbHRhIDw8IDI0KTsKLQkJZGF0YVsyXSA9ICgoY2hhbm5lbC0+ZGVsdGEgPDwgMTYpICYgMHhmZjAwMDAwMCkgfCAKKwkJZGF0YVsyXSA9ICgoY2hhbm5lbC0+ZGVsdGEgPDwgMTYpICYgMHhmZjAwMDAwMCkgfAogCQkJKGNoYW5uZWwtPmVzbyAmIDB4MDBmZmZmZmYpOwogCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwogCQlicmVhazsKQEAgLTk4OSwxMyArOTg5LDEzIEBACiAJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CiAJCWNoYW5uZWwtPmF0dHJpYnV0ZSA9IDA7CiAJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKLQkJCWlmICgoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSB8fCAKKwkJCWlmICgoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSB8fAogCQkJICAgIChjaGFubmVsLT5udW0gPT0gQUxJX1BDTV9JTl9DSEFOTkVMKSkKIAkJCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGNoYW5uZWwtPm51bSk7Ci0JCQllbHNlIGlmICgoaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAKKwkJCWVsc2UgaWYgKChpbmwoVFJJRF9SRUcoc3RhdGUtPmNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpCiAJCQkJICAmIEFMSV9TUERJRl9PVVRfQ0hfRU5BQkxFKQogCQkJCSAmJiAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9PVVRfQ0hBTk5FTCkpIHsKLQkJCQlhbGlfc2V0X3NwZGlmX291dF9yYXRlKHN0YXRlLT5jYXJkLCAKKwkJCQlhbGlfc2V0X3NwZGlmX291dF9yYXRlKHN0YXRlLT5jYXJkLAogCQkJCQkJICAgICAgIHN0YXRlLT5kbWFidWYucmF0ZSk7CiAJCQkJc3RhdGUtPmRtYWJ1Zi5jaGFubmVsLT5kZWx0YSA9IDB4MTAwMDsKIAkJCX0KQEAgLTEwNjMsNyArMTA2Myw3IEBACiAKIAljaGFubmVsLT5sYmEgPSBkbWFidWYtPmRtYV9oYW5kbGU7CiAJY2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcmVjKGRtYWJ1Zi0+cmF0ZSk7Ci0JaWYgKChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgJiYgCisJaWYgKChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgJiYKIAkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkpIHsKIAkJcmF0ZSA9IGFsaV9nZXRfc3BkaWZfaW5fcmF0ZShjYXJkKTsKIAkJaWYgKHJhdGUgPT0gMCkgewpAQCAtMTE4MCw4ICsxMTgwLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IAotCSAgICAgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgJiYgCisJaWYgKChkbWFidWYtPm1hcHBlZCB8fAorCSAgICAgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgJiYKIAkgICAgZG1hYnVmLT5yZWFkeSkgewogCQlkbWFidWYtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKIAkJdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKQEAgLTEyNjEsNyArMTI2MSw3IEBACiAJdm9pZCAqcmF3YnVmID0gTlVMTDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CiAKLQlpZiAoIShyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsIAorCWlmICghKHJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwKIAkJCQkJICAgICZkbWFidWYtPmRtYV9oYW5kbGUpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEyNzIsNyArMTI3Miw3IEBACiAJZG1hYnVmLT5yYXdidWYgPSByYXdidWY7CiAJZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOwogCi0JLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgKi8gCisJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgKi8KIAkvKiByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KIAlwZW5kID0gdmlydF90b19wYWdlKHJhd2J1ZiArIChQQUdFX1NJWkUgPDwgb3JkZXIpIC0gMSk7CiAJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQpAQCAtMTMxMCw3ICsxMzEwLDcgQEAKIAkJcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKIAkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCiAJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwgCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsCiAJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOwogCQlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7CiAJfQpAQCAtMTM2OCw3ICsxMzY4LDcgQEAKIAkJCQkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKIAkJCQkJLyogcmVsZWFzZSB0aGUgYXV4aWxpYXJ5IERNQSBidWZmZXJzICovCiAJCQkJCWZvciAoaSAtPSAyOyBpID49IDA7IGktLSkKLQkJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWYsIAorCQkJCQkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZiwKIAkJCQkJCQkgICAgICAgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwogCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CiAJCQkJCXJldHVybiByZXQ7CkBAIC0xMzk4LDcgKzEzOTgsNyBAQAogCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwogCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CiAKLQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCisJCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODAsCiAJCSAgICAgICBkbWFidWYtPmRtYXNpemUpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CkBAIC0xNDUzLDcgKzE0NTMsNyBAQAogCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHN3cHRyID09IDAgfHwgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplIC8gMiB8fCAKKwlpZiAoc3dwdHIgPT0gMCB8fCBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUgLyAyIHx8CiAJICAgIHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSkKIAkJcmV0dXJuOwogCkBAIC0xNTExLDcgKzE1MTEsNyBAQAogCiAJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGlzIGxlZnQgaW4gdGhlIGJ1ZmZlciwgd2UgaGF2ZSB0byB3YWl0IHVudGlsCiAJCSAgIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwotCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8IAorCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8CiAJCSAgICBzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKIAkJCWRpZmYgPSBkbWFidWYtPnN3cHRyIC0gdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RhdGUpICsgZG1hYnVmLT5kbWFzaXplOwogCQkJZGlmZiA9IGRpZmYgJSAoZG1hYnVmLT5kbWFzaXplKTsKQEAgLTE1MzIsNyArMTUzMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHVwZGF0ZSBidWZmZXIgbWFuYW5nZW1lbnQgcG9pbnRlcnMsIGVzcGVjaWFsbHksICovIAorLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgKi8KIC8qIGRtYWJ1Zi0+Y291bnQgYW5kIGRtYWJ1Zi0+aHdwdHIgKi8KIHN0YXRpYyB2b2lkCiB0cmlkZW50X3VwZGF0ZV9wdHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQpAQCAtMTU1OSwxMSArMTU1OSwxMSBAQAogCQl9IGVsc2UgewogCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwogCi0JCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwKIAkJCSAgICBkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7Ci0JCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCAqLyAKLQkJCQkvKiB3ZSBoYXZlIG5vIHdheSB0byByZWNvdmVyIGl0IGhlcmUsIGp1c3QgKi8gCi0JCQkJLyogc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzICovIAorCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgKi8KKwkJCQkvKiB3ZSBoYXZlIG5vIHdheSB0byByZWNvdmVyIGl0IGhlcmUsIGp1c3QgKi8KKwkJCQkvKiBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgKi8KIAkJCQkvKiBmb3JjZSBod3B0ciBhbmQgc3dwdHIgdG8gc3luYyAqLwogCQkJCV9fc3RvcF9hZGMoc3RhdGUpOwogCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKQEAgLTE1ODIsNyArMTU4Miw3IEBACiAJCX0gZWxzZSB7CiAJCQlkbWFidWYtPmNvdW50IC09IGRpZmY7CiAKLQkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCAKKwkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fAogCQkJICAgIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKIAkJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIKIAkJCQkgICBpdCBoZXJlLCBqdXN0IHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyBmb3JjZSBod3B0cgpAQCAtMTYwOCwxMyArMTYwOCwxMyBAQAogCQkJCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewogCQkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CiAJCQkJCQkJc3dwdHIgPSBzd3B0ciAvIDI7Ci0JCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKIAkJCQkJCX0KIAkJCQkJCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDE7CkBAIC0xNjI3LDEzICsxNjI3LDEzIEBACiAJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKIAkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CiAJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKLQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwogCQkJCQl9CiAJCQkJCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDE7CkBAIC0xNjY1LDcgKzE2NjUsNyBAQAogCQkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgIT0gTlVMTCkgewogCQkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IHNwdXJpb3VzIGNoYW5uZWwgIiAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIKIAkJCQkgICAgICAgImlycSAlZC5cbiIsIGNoYW5uZWwpOwogCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKIAkJCQl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5uZWwpOwpAQCAtMTY5NCw3ICsxNjk0LDcgQEAKIAogCWlmIChvcHQgPT0gMSkgewkJLy8gTVVURQogCQlkd1RlbXAgXj0gMHg4MDAwOwotCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAKKwkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwKIAkJCSAgICAgICAweDAyLCBkd1RlbXApOwogCX0gZWxzZSBpZiAob3B0ID09IDIpIHsJLy8gRG93bgogCQlpZiAobXV0ZSkKQEAgLTE3MDYsNyArMTcwNiw3IEBACiAJCWR3VGVtcCAmPSAweGUwZTA7CiAJCWR3VGVtcCB8PSAodm9sdW1lWzBdKSB8ICh2b2x1bWVbMV0gPDwgOCk7CiAJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7Ci0JCWNhcmQtPmFjOTdfY29kZWNbMF0tPm1peGVyX3N0YXRlWzBdID0gKCgzMiAtIHZvbHVtZVswXSkgKiAyNSAvIDgpIHwgCisJCWNhcmQtPmFjOTdfY29kZWNbMF0tPm1peGVyX3N0YXRlWzBdID0gKCgzMiAtIHZvbHVtZVswXSkgKiAyNSAvIDgpIHwKIAkJCSgoKDMyIC0gdm9sdW1lWzFdKSAqIDI1IC8gOCkgPDwgOCk7CiAJfSBlbHNlIGlmIChvcHQgPT0gNCkgewkvLyBVcAogCQlpZiAobXV0ZSkKQEAgLTE3MTgsNyArMTcxOCw3IEBACiAJCWR3VGVtcCAmPSAweGUwZTA7CiAJCWR3VGVtcCB8PSAodm9sdW1lWzBdKSB8ICh2b2x1bWVbMV0gPDwgOCk7CiAJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7Ci0JCWNhcmQtPmFjOTdfY29kZWNbMF0tPm1peGVyX3N0YXRlWzBdID0gKCgzMiAtIHZvbHVtZVswXSkgKiAyNSAvIDgpIHwgCisJCWNhcmQtPmFjOTdfY29kZWNbMF0tPm1peGVyX3N0YXRlWzBdID0gKCgzMiAtIHZvbHVtZVswXSkgKiAyNSAvIDgpIHwKIAkJCSgoKDMyIC0gdm9sdW1lWzFdKSAqIDI1IC8gOCkgPDwgOCk7CiAJfSBlbHNlIHsKIAkJLyogTm90aGluZyBuZWVkcyBkb2luZyAqLwpAQCAtMTgwMSw3ICsxODAxLDcgQEAKIAkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKIAkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeWJlcjUwNTA6IHNwdXJpb3VzICIgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3liZXI1MDUwOiBzcHVyaW91cyAiCiAJCQkJICAgICAgICJjaGFubmVsIGlycSAlZC5cbiIsIGNoYW5uZWwpOwogCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKIAkJCQl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5uZWwpOwpAQCAtMTgzNiwyMSArMTgzNiwyMSBAQAogCQkJCWFsaV9xdWV1ZV90YXNrKGNhcmQsIGdwaW8gJiAweDA3KTsKIAkJfQogCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwotCQlvdXRsKGV2ZW50IHwgKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLCAKKwkJb3V0bChldmVudCB8IChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwKIAkJICAgICBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwogCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKIAkvKiBtYW51YWxseSBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzLCBiYWQgaGFyZHdhcmUgZGVzaWduLCBibGFtZSBUXjIgKi8KLQlvdXRsKChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwgCisJb3V0bCgoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksCiAJICAgICBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwogCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nICovIAotLyogdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCisvKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyAqLworLyogdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8KIC8qIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLwogc3RhdGljIHNzaXplX3QKIHRyaWRlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQpAQCAtMTg3OCw4ICsxODc4LDggQEAKIAl3aGlsZSAoY291bnQgPiAwKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG1hYnVmLT5jb3VudCA+IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgewotCQkJLyogYnVmZmVyIG92ZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCi0JCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyLCAqLyAKKwkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovCisJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyLCAqLwogCQkJLyogbWFrZSBwcm9jZXNzIGZsdXNoIHRoZSBidWZmZXIgKi8KIAkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CiAJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKQEAgLTE4OTQsNyArMTg5NCw3IEBACiAJCQljbnQgPSBjb3VudDsKIAkJaWYgKGNudCA8PSAwKSB7CiAJCQl1bnNpZ25lZCBsb25nIHRtbzsKLQkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLwogCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSByZWNvcmRlZCAqLwogCQkJc3RhcnRfYWRjKHN0YXRlKTsKIAkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewpAQCAtMTkwNCw4ICsxOTA0LDggQEAKIAkJCX0KIAogCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBzcGFjZSBsZWZ0IGluIHRoZSBidWZmZXIsICovIAotCQkJLyogd2UgaGF2ZSB0byB3YWl0IHVudGlsIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPICovIAorCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8KKwkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLwogCQkJLyogd2hlbiBhZGRyZXNzIGVuZ2luZSBpbnRlcnJ1cHRzICovCiAJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSAqIDIpOwogCQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwpAQCAtMjAwNSw3ICsyMDA1LDcgQEAKIAl3aGlsZSAoY291bnQgPiAwKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKLQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLyAKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLwogCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciAqLwogCQkJZG1hYnVmLT5jb3VudCA9IDA7CiAJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKQEAgLTIwMjAsNyArMjAyMCw3IEBACiAJCQljbnQgPSBjb3VudDsKIAkJaWYgKGNudCA8PSAwKSB7CiAJCQl1bnNpZ25lZCBsb25nIHRtbzsKLQkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAorCQkJLyogYnVmZmVyIGlzIGZ1bGwsIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8KIAkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkICovCiAJCQlzdGFydF9kYWMoc3RhdGUpOwogCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CkBAIC0yMDI4LDggKzIwMjgsOCBAQAogCQkJCQlyZXQgPSAtRUFHQUlOOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLyAKLQkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLyAKKwkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8KKwkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLwogCQkJLyogd2hlbiBhZGRyZXNzIGVuZ2luZSBpbnRlcnJ1cHRzICovCiAJCQlsb2NrX3NldF9mbXQoc3RhdGUpOwogCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIChkbWFidWYtPnJhdGUgKiAyKTsKQEAgLTIwMzcsMTUgKzIwMzcsMTUgQEAKIAkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKIAkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CiAKLQkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgKi8gCi0JCQkvKiByZXR1cm5zLCBvbmUgaXMgd2hlbiB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkICovIAotCQkJLyogY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieSBJU1IgKi8gCi0JCQkvKiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCAqLyAKLQkJCS8qIG1lYW5zIHRoYXQgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgKi8gCi0JCQkvKiBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdCBpcyBUT08gTEFURSAqLyAKLQkJCS8qIGZvciB0aGUgcHJvY2VzcyB0byBiZSBzY2hlZHVsZWQgdG8gcnVuICovIAotCQkJLyogKHNjaGVkdWxlciBsYXRlbmN5KSB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgKi8gCi0JCQkvKiBidWZmZXIgdW5kZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMgTk9USElORyB3ZSAqLyAKKwkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgKi8KKwkJCS8qIHJldHVybnMsIG9uZSBpcyB3aGVuIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgKi8KKwkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovCisJCQkvKiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCAqLworCQkJLyogbWVhbnMgdGhhdCBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCAqLworCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8KKwkJCS8qIGZvciB0aGUgcHJvY2VzcyB0byBiZSBzY2hlZHVsZWQgdG8gcnVuICovCisJCQkvKiAoc2NoZWR1bGVyIGxhdGVuY3kpIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSAqLworCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8KIAkJCS8qIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLwogCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRtYWJ1Zi0+d2FpdCwgdG1vKSkgewogCQkJCXByX2RlYnVnKEtFUk5fRVJSICJ0cmlkZW50OiBwbGF5YmFjayBzY2hlZHVsZSAiCkBAIC0yMDU0LDggKzIwNTQsOCBAQAogCQkJCQkgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5jb3VudCwKIAkJCQkJIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOwogCi0JCQkJLyogYSBidWZmZXIgdW5kZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSAqLyAKLQkJCQkvKiB1bnRpbCBuZXh0IHRpbWUgdGhlIHdoaWxlIGxvb3AgYmVnaW4gYW5kICovIAorCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8KKwkJCQkvKiB1bnRpbCBuZXh0IHRpbWUgdGhlIHdoaWxlIGxvb3AgYmVnaW4gYW5kICovCiAJCQkJLyogd2UgUkVBTExZIGhhdmUgZGF0YSB0byBwbGF5ICovCiAJCQl9CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKQEAgLTIwNzksNyArMjA3OSw3IEBACiAJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKIAkJCWNvcHlfY291bnQgPSAwOwogCQkJc3RhdGVfY250ID0gMDsKLQkJCWlmIChhbGlfd3JpdGVfNV8xKHN0YXRlLCBidWZmZXIsIGNudCwgJmNvcHlfY291bnQsIAorCQkJaWYgKGFsaV93cml0ZV81XzEoc3RhdGUsIGJ1ZmZlciwgY250LCAmY29weV9jb3VudCwKIAkJCQkJICAmc3RhdGVfY250KSA9PSAtRUZBVUxUKSB7CiAJCQkJaWYgKHN0YXRlX2NudCkgewogCQkJCQlzd3B0ciA9IChzd3B0ciArIHN0YXRlX2NudCkgJSBkbWFidWYtPmRtYXNpemU7CkBAIC0yMDk2LDcgKzIwOTYsNyBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgY250KSkgewogCQkJCWlmICghcmV0KQogCQkJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMjE3Miw3ICsyMTcyLDcgQEAKIAkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCiAJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAkJfSBlbHNlIHsKLQkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAorCQkJaWYgKChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50ICsKIAkJCSAgICAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQogCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CiAJCX0KQEAgLTIyMjcsNyArMjIyNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXRyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAordHJpZGVudF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC0yMzQ4LDcgKzIzNDgsNyBAQAogCiAKIAljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgb2Ygc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQgKi8KLQkJcmV0ID0gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzggfCAKKwkJcmV0ID0gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzggfAogCQkJICAgICAgIEFGTVRfVTgsIHApOwogCQlicmVhazsKIApAQCAtMjM3OSw3ICsyMzc5LDcgQEAKIAkJCX0KIAkJfQogCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7Ci0JCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDogCisJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDoKIAkJCSAgICAgICBBRk1UX1U4LCBwKTsKIAkJYnJlYWs7CiAKQEAgLTI0MzgsNyArMjQzOCw3IEBACiAJCQkJc3RvcF9hZGMoc3RhdGUpOwogCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwogCQkJCWlmICh2YWwgPj0gMikgewotCQkJCQlpZiAoISgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIAorCQkJCQlpZiAoISgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCiAJCQkJCSAgICAgICh2YWwgPT0gNikpKQogCQkJCQkJdmFsID0gMjsKIAkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOwpAQCAtMjUwNCw3ICsyNTA0LDcgQEAKIAkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CiAJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8KIAkJCS1FRkFVTFQgOiAwOwogCQlicmVhazsKIApAQCAtMjUyNCw3ICsyNTI0LDcgQEAKIAkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CiAJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8KIAkJCS1FRkFVTFQgOiAwOwogCQlicmVhazsKIApAQCAtMjUzMyw3ICsyNTMzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKLQkJcmV0ID0gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IAorCQlyZXQgPSBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwKIAkJCSAgICAgICBEU1BfQ0FQX01NQVAgfCBEU1BfQ0FQX0JJTkQsIHApOwogCQlicmVhazsKIApAQCAtMjU1Myw3ICsyNTUzLDcgQEAKIAkJfQogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewogCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKLQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgCisJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmCiAJCQkJICAgIChyZXQgPSBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RhdGUpKSkKIAkJCQkJYnJlYWs7CiAJCQkJc3RhcnRfYWRjKHN0YXRlKTsKQEAgLTI1NjIsNyArMjU2Miw3IEBACiAJCX0KIAkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CiAJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKLQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgCisJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmCiAJCQkJICAgIChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQogCQkJCQlicmVhazsKIAkJCQlzdGFydF9kYWMoc3RhdGUpOwpAQCAtMjU4OSw3ICsyNTg5LDcgQEAKIAkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQogCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmZyYWdzaXplIC0gMTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gCisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/CiAJCQktRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKQEAgLTI2MTIsNyArMjYxMiw3IEBACiAJCWlmIChkbWFidWYtPm1hcHBlZCkKIAkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPwogCQkJLUVGQVVMVCA6IDA7CiAJCWJyZWFrOwogCkBAIC0yNjQxLDE3ICsyNjQxLDE3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfU1RFUkVPKSA/IDIgOiAxLCAKKwkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfU1RFUkVPKSA/IDIgOiAxLAogCQkJICAgICAgIHApOwogCQlicmVhazsKIAogCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKKwkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOgogCQkJICAgICAgIEFGTVRfVTgsIHApOwogCQlicmVhazsKIAogCWNhc2UgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSzoKLQkJcmV0ID0gcHV0X3VzZXIoRFNQX0JJTkRfRlJPTlQgfCBEU1BfQklORF9TVVJSIHwgCisJCXJldCA9IHB1dF91c2VyKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8CiAJCQkgICAgICAgRFNQX0JJTkRfQ0VOVEVSX0xGRSwgIHApOwogCQlicmVhazsKIApAQCAtMjY3MSwxMCArMjY3MSwxMCBAQAogCQl9IGVsc2UgewogCQkJZG1hYnVmLT5yZWFkeSA9IDA7CiAJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IAorCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwKIAkJCQkJCQkgICAgICBTUkNfRU5BQkxFKTsKIAkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1NQQ19QQiB8IAorCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfU1BDX1BCIHwKIAkJCQkJCQkgICAgICBTUkNfRU5BQkxFKTsKIAkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlIHw9IG1hc2syYXR0cltmZnModmFsKV07CiAJCX0KQEAgLTI3MDIsNiArMjcwMiw3IEBACiAJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGRldnM7CiAJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gTlVMTDsKIAlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgKi8KIAkvKiBUT0RPOiB0aGVyZSdzIHNvbWUgcmVkdW5kYWN5IGhlcmUgd3J0IHRoZSBjaGVjayBiZWxvdyAqLwpAQCAtMjc2NSw4ICsyNzY2LDggQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHN0YXRlOwogCi0JLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgKi8gCi0JLyogR3VpZGUgIC9kZXYvZHNwIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgKi8gCisJLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgKi8KKwkvKiBHdWlkZSAgL2Rldi9kc3Agc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCAqLwogCS8qIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CiAJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9NQVNLOwpAQCAtMjc3OSwxMSArMjc4MCwxMyBAQAogCQkJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCBhdHRyaWJ1dGUgdG8gbm9ybWFsIHBsYXliYWNrICovCiAJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IENIQU5ORUxfUEI7CiAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJdHJpZGVudF9zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJfQogCiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJLyogRklYTUU6IFRyaWRlbnQgNGQgY2FuIG9ubHkgcmVjb3JkIGluIHNpZ25lZCAxNi1iaXRzIHN0ZXJlbywgKi8gCisJCS8qIEZJWE1FOiBUcmlkZW50IDRkIGNhbiBvbmx5IHJlY29yZCBpbiBzaWduZWQgMTYtYml0cyBzdGVyZW8sICovCiAJCS8qIDQ4a0h6IHNhbXBsZSwgdG8gYmUgZGVhbGVkIHdpdGggaW4gdHJpZGVudF9zZXRfYWRjX3JhdGUoKSA/PyAqLwogCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKIAkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCkBAIC0yNzk0LDEwICsyNzk3LDEyIEBACiAJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CiAJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byAweDhhODAsIHJlY29yZCBmcm9tCiAJCQkgICBQQ00gTC9SIEZJRk8gYW5kIG1vbm8gPSAobGVmdCArIHJpZ2h0ICsgMSkvMiAqLwotCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfCAKKwkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgUENNX0xSIHwKIAkJCQkJCSAgICAgIE1PTk9fTUlYKTsKIAkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAogCQkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgKi8KIAkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQpAQCAtMzAyMCw3ICszMDI1LDcgQEAKIAkJCWJyZWFrOwogCQlpZiAod3NlbWFiaXRzID09IDApIHsKIAkJICAgICAgdW5sb2NrOgotCQkJb3V0bCgoKHUzMikgKHdjb250cm9sICYgMHgxZWZmKSB8IDB4MDAwMDQwMDApLCAKKwkJCW91dGwoKCh1MzIpICh3Y29udHJvbCAmIDB4MWVmZikgfCAweDAwMDA0MDAwKSwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0zMTA0LDcgKzMxMDksNyBAQAogCW5jb3VudCA9IDEwOwogCiAJd2hpbGUgKDEpIHsKLQkJaWYgKChpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKSAmIEFMSV9BQzk3X0JVU1lfUkVBRCkgCisJCWlmICgoaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSkgJiBBTElfQUM5N19CVVNZX1JFQUQpCiAJCSAgICAhPSAwKQogCQkJYnJlYWs7CiAJCWlmIChuY291bnQgPD0gMCkKQEAgLTMxMTIsNyArMzExNyw3IEBACiAJCWlmIChuY291bnQtLSA9PSAxKSB7CiAJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfcmVhZCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZ1xuIik7CiAJCQlhdWRfcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7Ci0JCQlvdXRsKChhdWRfcmVnICYgMHhmZmZmN2ZmZiksIAorCQkJb3V0bCgoYXVkX3JlZyAmIDB4ZmZmZjdmZmYpLAogCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwogCQl9CiAJCXVkZWxheSgxMCk7CkBAIC0zMTU5LDcgKzMxNjQsNyBAQAogCiAJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIAl3Y29udHJvbCAmPSAweGZmMDA7Ci0Jd2NvbnRyb2wgfD0gKDB4ODEwMCB8IHJlZyk7IC8qIGJpdCA4PTE6IChhbGkxNTM1IClyZXNlcnZlZC8gKi8gCisJd2NvbnRyb2wgfD0gKDB4ODEwMCB8IHJlZyk7IC8qIGJpdCA4PTE6IChhbGkxNTM1IClyZXNlcnZlZC8gKi8KIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxpMTUzNSsgd3JpdGUgKi8KIAlvdXRsKChkYXRhIHwgd2NvbnRyb2wpLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwogCkBAIC0zMTc3LDcgKzMxODIsNyBAQAogCQkJYnJlYWs7CiAJCWlmIChuY291bnQtLSA9PSAxKSB7CiAJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfc2V0IDp0cnkgY2xlYXIgYnVzeSBmbGFnISFcbiIpOwotCQkJb3V0dyh3Y29udHJvbCAmIDB4N2ZmZiwgCisJCQlvdXR3KHdjb250cm9sICYgMHg3ZmZmLAogCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwogCQl9CiAJCXVkZWxheSgxMCk7CkBAIC0zMzgyLDcgKzMzODcsNyBAQAogCWJ2YWwgfD0gMHgxRjsKIAlvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwogCi0Jd2hpbGUgKCgoUjEgPCAweDBCKSB8fCAoUjEgPiAweDBFKSkgJiYgKFIxICE9IDB4MTIpICYmIAorCXdoaWxlICgoKFIxIDwgMHgwQikgfHwgKFIxID4gMHgwRSkpICYmIChSMSAhPSAweDEyKSAmJgogCSAgICAgICBjb3VudCA8PSA1MDAwMCkgewogCQljb3VudCsrOwogCkBAIC0zNjY5LDE0ICszNjc0LDE0IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAogCWFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyY10gPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKLQkvL2FsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0gPSBpbmwoVFJJRF9SRUcoY2FyZCxUNERfU1RBUlRfQSkpOyAgICAKKwkvL2FsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0gPSBpbmwoVFJJRF9SRUcoY2FyZCxUNERfU1RBUlRfQSkpOwogCWFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMV0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX1NUT1BfQSkpOwogCiAJLy9kaXNhYmxlIGFsbCBJUlEgYml0cwogCW91dGwoQUxJX0RJU0FCTEVfQUxMX0lSUSwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKIAogCWZvciAoaSA9IDE7IGkgPCBBTElfTUlYRVJfUkVHUzsgaSsrKQotCQlhbGlfcmVnaXN0ZXJzLm1peGVyX3JlZ3NbaV0gPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sIAorCQlhbGlfcmVnaXN0ZXJzLm1peGVyX3JlZ3NbaV0gPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sCiAJCQkJCQkJICAgIGkgKiAyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgewpAQCAtMzY4OCw3ICszNjkzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKIAkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwogCQlmb3IgKGogPSAwOyBqIDwgQUxJX0NIQU5ORUxfUkVHUzsgaisrKQotCQkJYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgCisJCQlhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSA9IGlubChUUklEX1JFRyhjYXJkLAogCQkJCQkJCQkJaiAqIDQgKyAweGUwKSk7CiAJfQogCkBAIC0zNzA3LDE4ICszNzEyLDE4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAogCWZvciAoaSA9IDE7IGkgPCBBTElfTUlYRVJfUkVHUzsgaSsrKQotCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCBpICogMiwgCisJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIGkgKiAyLAogCQkJICAgICAgIGFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKIAkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwogCQlmb3IgKGogPSAwOyBqIDwgQUxJX0NIQU5ORUxfUkVHUzsgaisrKQotCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwgCisJCQlvdXRsKGFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdLAogCQkJICAgICBUUklEX1JFRyhjYXJkLCBqICogNCArIDB4ZTApKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0dMT0JBTF9SRUdTOyBpKyspIHsKLQkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpIHx8IAorCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkgfHwKIAkJICAgIChpICogNCA9PSBUNERfU1RBUlRfQSkpCiAJCQljb250aW51ZTsKIAkJb3V0bChhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzW2ldLCBUUklEX1JFRyhjYXJkLCBpICogNCkpOwpAQCAtMzc2Myw3ICszNzY4LDcgQEAKIAogCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKIAotCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiAKKwlpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYKIAkgICAgKEFMSV9TUERJRl9PVVRfQ0hfRU5BQkxFKSkgewogCQlpZHggPSBBTElfU1BESUZfT1VUX0NIQU5ORUw7CiAJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CkBAIC0zNzc0LDcgKzM3NzksNyBAQAogCQl9CiAJfQogCi0JZm9yIChpZHggPSBBTElfUENNX09VVF9DSEFOTkVMX0ZJUlNUOyBpZHggPD0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9MQVNUOyAKKwlmb3IgKGlkeCA9IEFMSV9QQ01fT1VUX0NIQU5ORUxfRklSU1Q7IGlkeCA8PSBBTElfUENNX09VVF9DSEFOTkVMX0xBU1Q7CiAJICAgICBpZHgrKykgewogCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewogCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOwpAQCAtMzc4NSw5ICszNzkwLDkgQEAKIAl9CiAKIAkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhbGlhYmxlICovCi0jaWYgMCAKKyNpZiAwCiAJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOwotI2VuZGlmIC8qIDAgKi8gCisjZW5kaWYgLyogMCAqLwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zODEyLDkgKzM4MTcsOSBAQAogCX0KIAogCS8qIG5vIGZyZWUgcmVjb3JkYWJsZSBjaGFubmVscyBhdmFsaWFibGUgKi8KLSNpZiAwIAorI2lmIDAKIAlwcmludGsoS0VSTl9FUlIgImFsaTogbm8gcmVjb3JkYWJsZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7Ci0jZW5kaWYgLyogMCAqLyAKKyNlbmRpZiAvKiAwICovCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM4MzcsMTQgKzM4NDIsMTQgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogc2VsZWN0IHNwZGlmX291dCAqLyAKKwkvKiBzZWxlY3Qgc3BkaWZfb3V0ICovCiAJY2hfc3Rfc2VsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSkgJiBBTElfU1BESUZfT1VUX0NIX1NUQVRVUzsKIAotCWNoX3N0X3NlbCB8PSAweDgwOwkvKiBzZWxlY3QgcmlnaHQgKi8gCisJY2hfc3Rfc2VsIHw9IDB4ODA7CS8qIHNlbGVjdCByaWdodCAqLwogCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwogCW91dGIoc3RhdHVzX3JhdGUgfCAweDIwLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAyKSk7CiAKLQljaF9zdF9zZWwgJj0gKH4weDgwKTsJLyogc2VsZWN0IGxlZnQgKi8gCisJY2hfc3Rfc2VsICY9ICh+MHg4MCk7CS8qIHNlbGVjdCBsZWZ0ICovCiAJb3V0YihjaF9zdF9zZWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CiAJb3V0dyhzdGF0dXNfcmF0ZSB8IDB4MTAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKIH0KQEAgLTM4ODEsMTQgKzM4ODYsMTQgQEAKIAl9CiB9CiAKLS8qIFVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgY291bnRlcnMgb2Ygb3RoZXJfc3RhdGVzJyBETUFzIHdpdGhvdXQgbG9jayAKKy8qIFVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgY291bnRlcnMgb2Ygb3RoZXJfc3RhdGVzJyBETUFzIHdpdGhvdXQgbG9jawogcHJvdGVjdGlvbiBpcyBubyBoYXJtIGJlY2F1c2UgYWxsIERNQXMgb2YgbXVsdGktY2hhbm5lbHMgYW5kIGludGVycnVwdAogZGVwZW5kIG9uIGEgbWFzdGVyIHN0YXRlJ3MgRE1BLCBhbmQgY2hhbmdpbmcgdGhlIGNvdW50ZXJzIG9mIHRoZSBtYXN0ZXIKIHN0YXRlIERNQSBpcyBwcm90ZWN0ZWQgYnkgYSBzcGlubG9jay4KICovCiBzdGF0aWMgaW50Ci1hbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgCi0JICAgICAgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LCAKK2FsaV93cml0ZV81XzEoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCSAgICAgIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwKIAkgICAgICB1bnNpZ25lZCBpbnQgKnN0YXRlX2NudCkKIHsKIApAQCAtMzkwNCwxMCArMzkwOSwxMCBAQAogCiAJaWYgKChpID0gc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCkgPiAwKSB7CiAJCWlmIChpID09IDEpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCQlpLS07CiAJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CkBAIC0zOTE2LDEwICszOTIxLDEwIEBACiAJCQlpID0gaSAtIChzdGF0ZS0+Y2hhbnNfbnVtIC0gb3RoZXJfZG1hX251bXMpOwogCQlmb3IgKDsgKGkgPCBvdGhlcl9kbWFfbnVtcykgJiYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApOyBpKyspIHsKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJfQogCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID09IDApCkBAIC0zOTI4LDM5ICszOTMzLDM5IEBACiAJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApIHsKIAkJbG9vcCA9IGNudF9mb3JfbXVsdGlfY2hhbm5lbCAvIChzdGF0ZS0+Y2hhbnNfbnVtICogc2FtcGxlX3MpOwogCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsCiAJCQkJCSAgIHNhbXBsZV9zICogMikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcyAqIDIsICpjb3B5X2NvdW50KTsKIAkJCSgqc3RhdGVfY250KSArPSAoc2FtcGxlX3MgKiAyKTsKIAogCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAogCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQl9CiAKQEAgLTM5NjksMTUgKzM5NzQsMTUgQEAKIAogCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKIAogCQkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApIHsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKIApAQCAtMzk4NiwxMiArMzk5MSwxMiBAQAogCQkJCQlsb29wID0gc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCAtIGRpZmY7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKIAkJCQkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKLQkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgCi0JCQkJCQkJCSAgIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArCisJCQkJCQkJCSAgIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgCi0JCQkJCQkJICAgIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwKKwkJCQkJCQkgICAgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQkJCQl9CiAJCQkJfQpAQCAtNDA0OCwxMSArNDA1MywxMSBAQAogCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKIAkJYnJlYWs7CiAJY2FzZSAnMSc6Ci0JCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfCAKKwkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8CiAJCQkJICAgIEFMSV9TUERJRl9PVVRfUENNKTsKIAkJYnJlYWs7CiAJY2FzZSAnMic6Ci0JCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfCAKKwkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8CiAJCQkJICAgIEFMSV9TUERJRl9PVVRfTk9OX1BDTSk7CiAJCWJyZWFrOwogCWNhc2UgJzMnOgpAQCAtNDA3Nyw3ICs0MDgyLDcgQEAKIAogCWZvciAoY2FyZCA9IGRldnM7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHQpCiAJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCi0JCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmIAorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgogCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikKIAkJCQlnb3RvIG1hdGNoOwogCkBAIC00MDkxLDcgKzQwOTYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci10cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgCit0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtNDE4NSw5ICs0MTkwLDkgQEAKIAkJLyogZGlzYWJsZSBBQzk3IEdQSU8gaW50ZXJydXB0ICovCiAJCW91dGwoMHgwMCwgVFJJRF9SRUcoY2FyZCwgU0lfQUM5N19HUElPKSk7CiAJCS8qIHdoZW4gcG93ZXIgdXAgdGhlIEFDIGxpbmsgaXMgaW4gY29sZCByZXNldCBtb2RlIHNvIHN0b3AgaXQgKi8KLQkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VUIHwgU0VDT05EQVJZX0lELCAKKwkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VUIHwgU0VDT05EQVJZX0lELAogCQkgICAgIFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKLQkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0ICovIAorCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKi8KIAkJLyogKGVzcGVjaWFsbHkgd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLwogCQl1ZGVsYXkoMjAwMCk7CiAJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CkBAIC00MjA3LDkgKzQyMTIsOSBAQAogCQkvKiBkaXNhYmxlIEFDOTcgR1BJTyBpbnRlcnJ1cHQgKi8KIAkJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBTSV9BQzk3X0dQSU8pKTsKIAkJLyogd2hlbiBwb3dlciB1cCwgdGhlIEFDIGxpbmsgaXMgaW4gY29sZCByZXNldCBtb2RlLCBzbyBzdG9wIGl0ICovCi0JCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCwgCisJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCwKIAkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7Ci0JCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAoZXNwZWNpYWxseSAqLyAKKwkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0IChlc3BlY2lhbGx5ICovCiAJCS8qIHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KIAkJdWRlbGF5KDIwMDApOwogCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwpAQCAtNDIyMSw3ICs0MjI2LDcgQEAKIAkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzICovIAorCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyAqLwogCQkvKiB3aWxsIGJlIGZpbGxlZCBpbiBhYzk3X3Byb2JlX2NvZGVjICovCiAJCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOwogCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKQEAgLTQzNTIsOCArNDM1Nyw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGVudF91bnJlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpIHsgfQogI2VuZGlmIC8qIFNVUFBPUlRfSk9ZU1RJQ0sgKi8KIAotLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciAqLyAKLS8qIG5vdywgdGhleSBhcmUgZGVmZXJlZCB1bnRpbCAiQUNDRVNTIiB0aW1lIChpbiBwcm9nX2RtYWJ1ZiBjYWxsZWQgYnkgKi8gCisvKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyICovCisvKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovCiAvKiBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0CiB0cmlkZW50X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQpAQCAtNDM3Niw5ICs0MzgxLDkgQEAKIAllbHNlCiAJCWRtYV9tYXNrID0gVFJJREVOVF9ETUFfTUFTSzsKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBkbWFfbWFzaykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIgCi0JCSAgICAgICAiICVzIFBDSSBidXNtYXN0ZXIgRE1BXG4iLCAKLQkJICAgICAgIHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxID8gCisJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiCisJCSAgICAgICAiICVzIFBDSSBidXNtYXN0ZXIgRE1BXG4iLAorCQkgICAgICAgcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgPwogCQkgICAgICAgIjMyLWJpdCIgOiAiMzAtYml0Iik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQ0MjIsNyArNDQyNyw3IEBACiAKIAlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHgsIElSUSAlZFxuIiwgCisJcHJpbnRrKEtFUk5fSU5GTyAidHJpZGVudDogJXMgZm91bmQgYXQgSU8gMHglMDRseCwgSVJRICVkXG4iLAogCSAgICAgICBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkLT5pb2Jhc2UsIGNhcmQtPmlycSk7CiAKIAlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKQEAgLTQ0NDksOSArNDQ1NCw5IEBACiAKIAkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KIAkJY2FyZC0+aHd2b2xjdGwgPSAwOwotCQlwY2lfZGV2X20xNTMzID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIAotCQkJCQkJUENJX0RFVklDRV9JRF9BTF9NMTUzMywgCi0JCQkJCQlwY2lfZGV2X20xNTMzKTsKKwkJcGNpX2Rldl9tMTUzMyA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsCisJCQkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAorCQkJCQkgICAgICAgcGNpX2Rldl9tMTUzMyk7CiAJCXJjID0gLUVOT0RFVjsKIAkJaWYgKHBjaV9kZXZfbTE1MzMgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X3Byb2NfZnM7CkBAIC00NDY1LDYgKzQ0NzAsOCBAQAogCQkJYml0cyAmPSAweGJmOwkvKmNsZWFyIGJpdCA2ICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2Rldl9tMTUzMywgMHg3YiwgYml0cyk7CiAJCX0KKwkJcGNpX2Rldl9wdXQocGNpX2Rldl9tMTUzMyk7CisKIAl9IGVsc2UgaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CiAJCWNhcmQtPmFsbG9jX3BjbV9jaGFubmVsID0gY3liZXJfYWxsb2NfcGNtX2NoYW5uZWw7CiAJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwpAQCAtNDQ4Miw3ICs0NDg5LDcgQEAKIAlyYyA9IC1FTk9ERVY7CiAJaWYgKHJlcXVlc3RfaXJxKGNhcmQtPmlycSwgJnRyaWRlbnRfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwgCisJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwKIAkJICAgICAgIGNhcmQtPmlycSk7CiAJCWdvdG8gb3V0X3Byb2NfZnM7CiAJfQpAQCAtNDUzMyw3ICs0NTQwLDcgQEAKIAkJCQlwcmludGsoS0VSTl9JTkZPICJ0cmlkZW50OiBSdW5uaW5nIG9uIEFscGhhIHN5c3RlbSAiCiAJCQkJICAgICAgICJ0eXBlIE5hdXRpbHVzXG4iKTsKIAkJCQlhYzk3X2RhdGEgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJCQlhbGlfYWM5N19zZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MLCAKKwkJCQlhbGlfYWM5N19zZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MLAogCQkJCQkgICAgIGFjOTdfZGF0YSB8IEFMSV9FQVBEX1BPV0VSX0RPV04pOwogCQkJfQogCQl9CkBAIC00NTY2LDcgKzQ1NzMsNyBAQAogCWRldnMgPSBOVUxMOwogb3V0X3JlbGVhc2VfcmVnaW9uOgogCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgMjU2KTsKLQlyZXR1cm4gcmM7IAorCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZleGl0CkBAIC00NjM0LDggKzQ2NDEsOCBAQAogc3RhdGljIGludCBfX2luaXQKIHRyaWRlbnRfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSxUdmlhIEN5YmVyUHJvICIgCi0JICAgICAgICI1MDUwIFBDSSBBdWRpbywgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIAorCXByaW50ayhLRVJOX0lORk8gIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxLFR2aWEgQ3liZXJQcm8gIgorCSAgICAgICAiNTA1MCBQQ0kgQXVkaW8sIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiLCAiIF9fVElNRV9fICIgIgogCSAgICAgICBfX0RBVEVfXyAiXG4iKTsKIAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0cmlkZW50X3BjaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvdXNyLy5naXRpZ25vcmUgYi91c3IvLmdpdGlnbm9yZQppbmRleCBiZTE4NmE4Li42OWIyZTg5IDEwMDY0NAotLS0gYS91c3IvLmdpdGlnbm9yZQorKysgYi91c3IvLmdpdGlnbm9yZQpAQCAtNSwzICs1LDQgQEAKIGluaXRyYW1mc19kYXRhLmNwaW8KIGluaXRyYW1mc19kYXRhLmNwaW8uZ3oKIGluaXRyYW1mc19saXN0CitpbmNsdWRlCg==